blob: ab1e90f2a9c4a8f4c1c008c7bcdcbf2d9a141605 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossumb209a111997-04-29 18:18:01 +000040#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
46
Guido van Rossumc6004111993-11-05 10:22:19 +000047#include <ctype.h>
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049#ifdef HAVE_LIMITS_H
50#include <limits.h>
51#else
52#define INT_MAX 2147483647
53#endif
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossum408027e1996-12-30 16:17:54 +000058#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000059/* For debugging the interpreter: */
60#define LLTRACE 1 /* Low-level trace feature */
61#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062#endif
63
Guido van Rossum5b722181993-03-30 17:46:03 +000064
Guido van Rossum374a9221991-04-04 10:40:29 +000065/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
68 PyObject *, PyObject *,
69 PyObject **, int,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000073#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000074static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000076static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
77 PyFrameObject *));
78static int call_trace Py_PROTO((PyObject **, PyObject **,
79 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000080static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
81static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000082static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000083static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000084static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000085static int assign_slice Py_PROTO((PyObject *, PyObject *,
86 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000087static int cmp_exception Py_PROTO((PyObject *, PyObject *));
88static int cmp_member Py_PROTO((PyObject *, PyObject *));
89static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
90static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
91static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000092static int exec_statement Py_PROTO((PyFrameObject *,
93 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000094static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000095static void set_exc_info Py_PROTO((PyThreadState *,
96 PyObject *, PyObject *, PyObject *));
97static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000098
99
Guido van Rossum950361c1997-01-24 13:49:28 +0000100/* Dynamic execution profile */
101#ifdef DYNAMIC_EXECUTION_PROFILE
102#ifdef DXPAIRS
103static long dxpairs[257][256];
104#define dxp dxpairs[256]
105#else
106static long dxp[256];
107#endif
108#endif
109
110
Guido van Rossume59214e1994-08-30 08:01:59 +0000111#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113#include <errno.h>
114#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116extern int _PyThread_Started; /* Flag for Py_Exit */
117
Guido van Rossuma9672091994-09-14 13:31:22 +0000118static type_lock interpreter_lock = 0;
119static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120
121void
Guido van Rossumb209a111997-04-29 18:18:01 +0000122PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000125 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126 _PyThread_Started = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127 interpreter_lock = allocate_lock();
128 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000129 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132#endif
133
Guido van Rossumff4949e1992-08-05 19:58:53 +0000134/* Functions save_thread and restore_thread are always defined so
135 dynamically loaded modules needn't be compiled separately for use
136 with and without threads: */
137
Guido van Rossumb209a111997-04-29 18:18:01 +0000138PyObject *
139PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000140{
Guido van Rossume59214e1994-08-30 08:01:59 +0000141#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142 if (interpreter_lock) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143 PyThreadState *tstate = PyThreadState_Swap(NULL);
144 PyObject *res = tstate ? (PyObject *) (tstate->frame) : NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145 release_lock(interpreter_lock);
146 return res;
147 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000149 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000150}
151
152void
Guido van Rossumb209a111997-04-29 18:18:01 +0000153PyEval_RestoreThread(x)
154 PyObject *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000155{
Guido van Rossume59214e1994-08-30 08:01:59 +0000156#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000157 if (interpreter_lock) {
158 int err;
159 err = errno;
160 acquire_lock(interpreter_lock, 1);
161 errno = err;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000162 PyThreadState_Swap(x ? ((PyFrameObject *)x)->f_tstate : NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163 }
164#endif
165}
166
167
Guido van Rossuma9672091994-09-14 13:31:22 +0000168/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
169 signal handlers or Mac I/O completion routines) can schedule calls
170 to a function to be called synchronously.
171 The synchronous function is called with one void* argument.
172 It should return 0 for success or -1 for failure -- failure should
173 be accompanied by an exception.
174
175 If registry succeeds, the registry function returns 0; if it fails
176 (e.g. due to too many pending calls) it returns -1 (without setting
177 an exception condition).
178
179 Note that because registry may occur from within signal handlers,
180 or other asynchronous events, calling malloc() is unsafe!
181
182#ifdef WITH_THREAD
183 Any thread can schedule pending calls, but only the main thread
184 will execute them.
185#endif
186
187 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
188 There are two possible race conditions:
189 (1) nested asynchronous registry calls;
190 (2) registry calls made while pending calls are being processed.
191 While (1) is very unlikely, (2) is a real possibility.
192 The current code is safe against (2), but not against (1).
193 The safety against (2) is derived from the fact that only one
194 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000195
Guido van Rossuma027efa1997-05-05 20:56:21 +0000196 XXX Darn! With the advent of thread state, we should have an array
197 of pending calls per thread in the thread state! Later...
198*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000199
Guido van Rossuma9672091994-09-14 13:31:22 +0000200#define NPENDINGCALLS 32
201static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000202 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000203 ANY *arg;
204} pendingcalls[NPENDINGCALLS];
205static volatile int pendingfirst = 0;
206static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000207static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000208
209int
210Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000211 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000212 ANY *arg;
213{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000215 int i, j;
216 /* XXX Begin critical section */
217 /* XXX If you want this to be safe against nested
218 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000219 if (busy)
220 return -1;
221 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000222 i = pendinglast;
223 j = (i + 1) % NPENDINGCALLS;
224 if (j == pendingfirst)
225 return -1; /* Queue full */
226 pendingcalls[i].func = func;
227 pendingcalls[i].arg = arg;
228 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000230 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000231 /* XXX End critical section */
232 return 0;
233}
234
Guido van Rossum180d7b41994-09-29 09:45:57 +0000235int
236Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000237{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000238 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000239#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000240 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000241 return 0;
242#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 return 0;
245 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000247 for (;;) {
248 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000249 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000250 ANY *arg;
251 i = pendingfirst;
252 if (i == pendinglast)
253 break; /* Queue empty */
254 func = pendingcalls[i].func;
255 arg = pendingcalls[i].arg;
256 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000257 if (func(arg) < 0) {
258 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000259 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000260 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000261 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000262 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 return 0;
265}
266
267
Guido van Rossum374a9221991-04-04 10:40:29 +0000268/* Status code for main loop (reason for stack unwind) */
269
270enum why_code {
271 WHY_NOT, /* No error */
272 WHY_EXCEPTION, /* Exception occurred */
273 WHY_RERAISE, /* Exception re-raised by 'finally' */
274 WHY_RETURN, /* 'return' statement */
275 WHY_BREAK /* 'break' statement */
276};
277
Guido van Rossumb209a111997-04-29 18:18:01 +0000278static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000279
Guido van Rossum374a9221991-04-04 10:40:29 +0000280
Guido van Rossum681d79a1995-07-18 14:51:37 +0000281/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000282
Guido van Rossumb209a111997-04-29 18:18:01 +0000283PyObject *
284PyEval_EvalCode(co, globals, locals)
285 PyCodeObject *co;
286 PyObject *globals;
287 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000288{
289 return eval_code2(co,
290 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000291 (PyObject **)NULL, 0,
292 (PyObject **)NULL, 0,
293 (PyObject **)NULL, 0,
294 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000295}
296
297
298/* Interpreter main loop */
299
Guido van Rossum8861b741996-07-30 16:49:37 +0000300#ifndef MAX_RECURSION_DEPTH
301#define MAX_RECURSION_DEPTH 10000
302#endif
303
Guido van Rossumb209a111997-04-29 18:18:01 +0000304static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305eval_code2(co, globals, locals,
306 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000307 PyCodeObject *co;
308 PyObject *globals;
309 PyObject *locals;
310 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000311 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000312 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000313 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000314 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000315 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000316 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000317{
Guido van Rossum950361c1997-01-24 13:49:28 +0000318#ifdef DXPAIRS
319 int lastopcode = 0;
320#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000321 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000322 register int opcode = 0; /* Current opcode */
323 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000325 register enum why_code why; /* Reason for block stack unwind */
326 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000327 register PyObject *x; /* Result object -- NULL if error */
328 register PyObject *v; /* Temporary objects popped off stack */
329 register PyObject *w;
330 register PyObject *u;
331 register PyObject *t;
332 register PyFrameObject *f; /* Current frame */
333 register PyObject **fastlocals = NULL;
334 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000335 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000336#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000337 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000338#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000339#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000340 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000342#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000343
344/* Code access macros */
345
346#define GETCONST(i) Getconst(f, i)
347#define GETNAME(i) Getname(f, i)
348#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000349#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000350#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
351#define NEXTOP() (*next_instr++)
352#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
353#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
354#define JUMPBY(x) (next_instr += (x))
355
356/* Stack manipulation macros */
357
358#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
359#define EMPTY() (STACK_LEVEL() == 0)
360#define TOP() (stack_pointer[-1])
361#define BASIC_PUSH(v) (*stack_pointer++ = (v))
362#define BASIC_POP() (*--stack_pointer)
363
Guido van Rossum96a42c81992-01-12 02:29:51 +0000364#ifdef LLTRACE
365#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
366#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000367#else
368#define PUSH(v) BASIC_PUSH(v)
369#define POP() BASIC_POP()
370#endif
371
Guido van Rossum681d79a1995-07-18 14:51:37 +0000372/* Local variable macros */
373
374#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000375#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 GETLOCAL(i) = value; } while (0)
377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378/* Start of code */
379
380 if (tstate == NULL)
381 Py_FatalError("eval_code2 called without a current thread");
382
Guido van Rossum8861b741996-07-30 16:49:37 +0000383#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000384 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000385 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000386 return NULL;
387 }
388#endif
389
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000391 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000392 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000393 }
394
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000395#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000396 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000397#endif
398
Guido van Rossumb209a111997-04-29 18:18:01 +0000399 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000401 co, /*code*/
402 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000403 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000404 if (f == NULL)
405 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000406
Guido van Rossuma027efa1997-05-05 20:56:21 +0000407 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000408 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409
410 if (co->co_argcount > 0 ||
411 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
412 int i;
413 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000414 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000415 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000416 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000417 if (kwdict == NULL)
418 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000419 i = co->co_argcount;
420 if (co->co_flags & CO_VARARGS)
421 i++;
422 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 }
424 if (argcount > co->co_argcount) {
425 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 PyErr_SetString(PyExc_TypeError,
427 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000428 goto fail;
429 }
430 n = co->co_argcount;
431 }
432 for (i = 0; i < n; i++) {
433 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000434 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000435 SETLOCAL(i, x);
436 }
437 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000438 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000439 if (u == NULL)
440 goto fail;
441 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 for (i = n; i < argcount; i++) {
443 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 Py_INCREF(x);
445 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 }
448 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000449 PyObject *keyword = kws[2*i];
450 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 int j;
452 /* XXX slow -- speed up using dictionary? */
453 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000454 PyObject *nm = PyTuple_GET_ITEM(
455 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000456 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 break;
458 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000459 /* Check errors from Compare */
460 if (PyErr_Occurred())
461 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 if (j >= co->co_argcount) {
463 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000464 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000465 "unexpected keyword argument: %.400s",
466 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 goto fail;
468 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000470 }
471 else {
472 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000473 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 "keyword parameter redefined");
475 goto fail;
476 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 SETLOCAL(j, value);
479 }
480 }
481 if (argcount < co->co_argcount) {
482 int m = co->co_argcount - defcount;
483 for (i = argcount; i < m; i++) {
484 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 "not enough arguments");
487 goto fail;
488 }
489 }
490 if (n > m)
491 i = n - m;
492 else
493 i = 0;
494 for (; i < defcount; i++) {
495 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000496 PyObject *def = defs[i];
497 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 SETLOCAL(m+i, def);
499 }
500 }
501 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000502 }
503 else {
504 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000505 PyErr_SetString(PyExc_TypeError,
506 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000507 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 }
509 }
510
Guido van Rossuma027efa1997-05-05 20:56:21 +0000511 if (tstate->sys_tracefunc != NULL) {
512 /* tstate->sys_tracefunc, if defined, is a function that
513 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000514 Its return value, if not None, is a function that
515 will be called at the start of each executed line
516 of code. (Actually, the function must return
517 itself in order to continue tracing.)
518 The trace functions are called with three arguments:
519 a pointer to the current frame, a string indicating
520 why the function is called, and an argument which
521 depends on the situation. The global trace function
522 (sys.trace) is also called whenever an exception
523 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000524 if (call_trace(&tstate->sys_tracefunc,
525 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000526 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000528 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000529 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000530 }
531
Guido van Rossuma027efa1997-05-05 20:56:21 +0000532 if (tstate->sys_profilefunc != NULL) {
533 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000534 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000535 if (call_trace(&tstate->sys_profilefunc,
536 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000537 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000538 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000539 }
540 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000541
Guido van Rossuma027efa1997-05-05 20:56:21 +0000542 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
543 --tstate->recursion_depth;
544 PyErr_SetString(PyExc_RuntimeError,
545 "Maximum recursion depth exceeded");
546 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000547 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000548 return NULL;
549 }
550
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000551 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000552 stack_pointer = f->f_valuestack;
553
Guido van Rossum374a9221991-04-04 10:40:29 +0000554 why = WHY_NOT;
555 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000556 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000557
558 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000559 /* Do periodic things. Doing this every time through
560 the loop would add too much overhead, so we do it
561 only every Nth instruction. We also do it if
562 ``things_to_do'' is set, i.e. when an asynchronous
563 event needs attention (e.g. a signal handler or
564 async I/O handler); see Py_AddPendingCall() and
565 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000566
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 if (things_to_do || --tstate->ticker < 0) {
568 tstate->ticker = tstate->sys_checkinterval;
569 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000570 if (Py_MakePendingCalls() < 0) {
571 why = WHY_EXCEPTION;
572 goto on_error;
573 }
574 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000575#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 /* If we have true signals, the signal handler
577 will call Py_AddPendingCall() so we don't
578 have to call sigcheck(). On the Mac and
579 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000580 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000581 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000582 goto on_error;
583 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000584#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585
Guido van Rossume59214e1994-08-30 08:01:59 +0000586#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 if (interpreter_lock) {
588 /* Give another thread a chance */
589
Guido van Rossuma027efa1997-05-05 20:56:21 +0000590 PyThreadState *tstate =
591 PyThreadState_Swap(NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000592 release_lock(interpreter_lock);
593
594 /* Other threads may run now */
595
596 acquire_lock(interpreter_lock, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000598 }
599#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000601
Guido van Rossum374a9221991-04-04 10:40:29 +0000602 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000603
Guido van Rossum408027e1996-12-30 16:17:54 +0000604#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000605 f->f_lasti = INSTR_OFFSET();
606#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000607
608 opcode = NEXTOP();
609 if (HAS_ARG(opcode))
610 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000611#ifdef DYNAMIC_EXECUTION_PROFILE
612#ifdef DXPAIRS
613 dxpairs[lastopcode][opcode]++;
614 lastopcode = opcode;
615#endif
616 dxp[opcode]++;
617#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000618
Guido van Rossum96a42c81992-01-12 02:29:51 +0000619#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000620 /* Instruction tracing */
621
Guido van Rossum96a42c81992-01-12 02:29:51 +0000622 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000623 if (HAS_ARG(opcode)) {
624 printf("%d: %d, %d\n",
625 (int) (INSTR_OFFSET() - 3),
626 opcode, oparg);
627 }
628 else {
629 printf("%d: %d\n",
630 (int) (INSTR_OFFSET() - 1), opcode);
631 }
632 }
633#endif
634
635 /* Main switch on opcode */
636
637 switch (opcode) {
638
639 /* BEWARE!
640 It is essential that any operation that fails sets either
641 x to NULL, err to nonzero, or why to anything but WHY_NOT,
642 and that no operation that succeeds does this! */
643
644 /* case STOP_CODE: this is an error! */
645
646 case POP_TOP:
647 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000648 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000649 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000650
651 case ROT_TWO:
652 v = POP();
653 w = POP();
654 PUSH(v);
655 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000656 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000657
658 case ROT_THREE:
659 v = POP();
660 w = POP();
661 x = POP();
662 PUSH(v);
663 PUSH(x);
664 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000665 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000666
667 case DUP_TOP:
668 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000669 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000671 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000672
673 case UNARY_POSITIVE:
674 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000675 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000676 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000678 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 break;
680
681 case UNARY_NEGATIVE:
682 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000683 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000684 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000686 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 break;
688
689 case UNARY_NOT:
690 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000691 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000692 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000693 if (err == 0) {
694 Py_INCREF(Py_True);
695 PUSH(Py_True);
696 continue;
697 }
698 else if (err > 0) {
699 Py_INCREF(Py_False);
700 PUSH(Py_False);
701 err = 0;
702 continue;
703 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 break;
705
706 case UNARY_CONVERT:
707 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000708 x = PyObject_Repr(v);
709 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000711 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000713
714 case UNARY_INVERT:
715 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000716 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000718 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000719 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000720 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000721
Guido van Rossum50564e81996-01-12 01:13:16 +0000722 case BINARY_POWER:
723 w = POP();
724 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000725 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_DECREF(v);
727 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000728 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000730 break;
731
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 case BINARY_MULTIPLY:
733 w = POP();
734 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000735 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000736 Py_DECREF(v);
737 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000739 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000740 break;
741
742 case BINARY_DIVIDE:
743 w = POP();
744 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000745 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000746 Py_DECREF(v);
747 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000748 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000749 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 break;
751
752 case BINARY_MODULO:
753 w = POP();
754 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000755 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000756 Py_DECREF(v);
757 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000759 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 break;
761
762 case BINARY_ADD:
763 w = POP();
764 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000765 if (PyInt_Check(v) && PyInt_Check(w)) {
766 /* INLINE: int + int */
767 register long a, b, i;
768 a = ((PyIntObject*) v)->ob_ival;
769 b = ((PyIntObject*) w)->ob_ival;
770 i = a + b;
771 if ((i^a) < 0 && (i^b) < 0) {
772 PyErr_SetString(PyExc_OverflowError,
773 "integer addition");
774 x = NULL;
775 }
776 else
777 x = PyInt_FromLong(i);
778 }
779 else
780 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000781 Py_DECREF(v);
782 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000784 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 break;
786
787 case BINARY_SUBTRACT:
788 w = POP();
789 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000790 if (PyInt_Check(v) && PyInt_Check(w)) {
791 /* INLINE: int - int */
792 register long a, b, i;
793 a = ((PyIntObject*) v)->ob_ival;
794 b = ((PyIntObject*) w)->ob_ival;
795 i = a - b;
796 if ((i^a) < 0 && (i^~b) < 0) {
797 PyErr_SetString(PyExc_OverflowError,
798 "integer subtraction");
799 x = NULL;
800 }
801 else
802 x = PyInt_FromLong(i);
803 }
804 else
805 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000806 Py_DECREF(v);
807 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000808 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000809 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 break;
811
812 case BINARY_SUBSCR:
813 w = POP();
814 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000815 if (PyList_Check(v) && PyInt_Check(w)) {
816 /* INLINE: list[int] */
817 long i = PyInt_AsLong(w);
818 if (i < 0)
819 i += ((PyListObject*) v)->ob_size;
820 if (i < 0 ||
821 i >= ((PyListObject*) v)->ob_size) {
822 PyErr_SetString(PyExc_IndexError,
823 "list index out of range");
824 x = NULL;
825 }
826 else {
827 x = ((PyListObject*) v)->ob_item[i];
828 Py_INCREF(x);
829 }
830 }
831 else
832 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000833 Py_DECREF(v);
834 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000836 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 break;
838
Guido van Rossum7928cd71991-10-24 14:59:31 +0000839 case BINARY_LSHIFT:
840 w = POP();
841 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000842 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000843 Py_DECREF(v);
844 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000845 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000846 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000847 break;
848
849 case BINARY_RSHIFT:
850 w = POP();
851 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000852 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_DECREF(v);
854 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000855 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000856 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000857 break;
858
859 case BINARY_AND:
860 w = POP();
861 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000862 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000863 Py_DECREF(v);
864 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000865 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000866 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000867 break;
868
869 case BINARY_XOR:
870 w = POP();
871 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000872 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000873 Py_DECREF(v);
874 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000875 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000876 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000877 break;
878
879 case BINARY_OR:
880 w = POP();
881 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000882 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000883 Py_DECREF(v);
884 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000885 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000886 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000887 break;
888
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 case SLICE+0:
890 case SLICE+1:
891 case SLICE+2:
892 case SLICE+3:
893 if ((opcode-SLICE) & 2)
894 w = POP();
895 else
896 w = NULL;
897 if ((opcode-SLICE) & 1)
898 v = POP();
899 else
900 v = NULL;
901 u = POP();
902 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000903 Py_DECREF(u);
904 Py_XDECREF(v);
905 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000907 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 break;
909
910 case STORE_SLICE+0:
911 case STORE_SLICE+1:
912 case STORE_SLICE+2:
913 case STORE_SLICE+3:
914 if ((opcode-STORE_SLICE) & 2)
915 w = POP();
916 else
917 w = NULL;
918 if ((opcode-STORE_SLICE) & 1)
919 v = POP();
920 else
921 v = NULL;
922 u = POP();
923 t = POP();
924 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000925 Py_DECREF(t);
926 Py_DECREF(u);
927 Py_XDECREF(v);
928 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000929 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 break;
931
932 case DELETE_SLICE+0:
933 case DELETE_SLICE+1:
934 case DELETE_SLICE+2:
935 case DELETE_SLICE+3:
936 if ((opcode-DELETE_SLICE) & 2)
937 w = POP();
938 else
939 w = NULL;
940 if ((opcode-DELETE_SLICE) & 1)
941 v = POP();
942 else
943 v = NULL;
944 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000947 Py_DECREF(u);
948 Py_XDECREF(v);
949 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000950 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 break;
952
953 case STORE_SUBSCR:
954 w = POP();
955 v = POP();
956 u = POP();
957 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000958 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(u);
960 Py_DECREF(v);
961 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
964
965 case DELETE_SUBSCR:
966 w = POP();
967 v = POP();
968 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000969 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000970 Py_DECREF(v);
971 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000972 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 break;
974
975 case PRINT_EXPR:
976 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000978 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000980 (err = PyDict_SetItemString(
981 f->f_builtins, "_", v)) == 0 &&
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 !Py_SuppressPrintingFlag) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000983 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +0000984 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000985 x = PySys_GetObject("stdout");
986 if (x == NULL)
987 err = -1;
988 }
989 if (err == 0)
990 err = PyFile_WriteObject(v, x, 0);
991 if (err == 0) {
992 PyFile_SoftSpace(x, 1);
993 err = Py_FlushLine();
994 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000996 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 break;
998
999 case PRINT_ITEM:
1000 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001001 w = PySys_GetObject("stdout");
1002 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001003 err = PyFile_WriteString(" ", w);
1004 if (err == 0)
1005 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001006 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001007 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001008 char *s = PyString_AsString(v);
1009 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001010 if (len > 0 &&
1011 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001012 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001015 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001016 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 break;
1018
1019 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001020 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001021 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001022 PyErr_SetString(PyExc_RuntimeError,
1023 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001024 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001025 err = PyFile_WriteString("\n", x);
1026 if (err == 0)
1027 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001028 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 break;
1030
1031 case BREAK_LOOP:
1032 why = WHY_BREAK;
1033 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001034
Guido van Rossumf10570b1995-07-07 22:53:21 +00001035 case RAISE_VARARGS:
1036 u = v = w = NULL;
1037 switch (oparg) {
1038 case 3:
1039 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001040 /* Fallthrough */
1041 case 2:
1042 v = POP(); /* value */
1043 /* Fallthrough */
1044 case 1:
1045 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001046 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001047 break;
1048 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001049 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001050 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001051 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001052 break;
1053 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001054 break;
1055
1056 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001057 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001058 PyErr_SetString(PyExc_SystemError,
1059 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001060 break;
1061 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001062 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001063 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 break;
1065
1066 case RETURN_VALUE:
1067 retval = POP();
1068 why = WHY_RETURN;
1069 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001070
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001071 case EXEC_STMT:
1072 w = POP();
1073 v = POP();
1074 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001075 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001076 Py_DECREF(u);
1077 Py_DECREF(v);
1078 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001079 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001080
Guido van Rossum374a9221991-04-04 10:40:29 +00001081 case POP_BLOCK:
1082 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001083 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001084 while (STACK_LEVEL() > b->b_level) {
1085 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001086 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 }
1088 }
1089 break;
1090
1091 case END_FINALLY:
1092 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001093 if (PyInt_Check(v)) {
1094 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 if (why == WHY_RETURN)
1096 retval = POP();
1097 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001098 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001100 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001101 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001103 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001104 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001105 else if (v != Py_None) {
1106 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 "'finally' pops bad exception");
1108 why = WHY_EXCEPTION;
1109 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001110 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 break;
1112
1113 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001114 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001115 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001116 w = POP();
1117 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001119 Py_DECREF(u);
1120 Py_DECREF(v);
1121 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 break;
1123
1124 case STORE_NAME:
1125 w = GETNAMEV(oparg);
1126 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001127 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001128 PyErr_SetString(PyExc_SystemError,
1129 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001130 break;
1131 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001132 err = PyDict_SetItem(x, w, v);
1133 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 break;
1135
1136 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001137 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001138 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001139 PyErr_SetString(PyExc_SystemError,
1140 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001141 break;
1142 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001143 if ((err = PyDict_DelItem(x, w)) != 0)
1144 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001146
1147#ifdef CASE_TOO_BIG
1148 default: switch (opcode) {
1149#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001150
1151 case UNPACK_TUPLE:
1152 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001153 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001154 PyErr_SetString(PyExc_TypeError,
1155 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 why = WHY_EXCEPTION;
1157 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001158 else if (PyTuple_Size(v) != oparg) {
1159 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 "unpack tuple of wrong size");
1161 why = WHY_EXCEPTION;
1162 }
1163 else {
1164 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001165 w = PyTuple_GET_ITEM(v, oparg);
1166 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 PUSH(w);
1168 }
1169 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001170 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 break;
1172
1173 case UNPACK_LIST:
1174 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001175 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001176 PyErr_SetString(PyExc_TypeError,
1177 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 why = WHY_EXCEPTION;
1179 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001180 else if (PyList_Size(v) != oparg) {
1181 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 "unpack list of wrong size");
1183 why = WHY_EXCEPTION;
1184 }
1185 else {
1186 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001187 w = PyList_GetItem(v, oparg);
1188 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 PUSH(w);
1190 }
1191 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001192 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 break;
1194
1195 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001196 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001197 v = POP();
1198 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001199 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1200 Py_DECREF(v);
1201 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001202 break;
1203
1204 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001205 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001207 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1208 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001209 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 break;
1211
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001212 case STORE_GLOBAL:
1213 w = GETNAMEV(oparg);
1214 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001215 err = PyDict_SetItem(f->f_globals, w, v);
1216 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001217 break;
1218
1219 case DELETE_GLOBAL:
1220 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001221 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1222 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001223 break;
1224
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 case LOAD_CONST:
1226 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 PUSH(x);
1229 break;
1230
1231 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001232 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001233 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001234 PyErr_SetString(PyExc_SystemError,
1235 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001236 break;
1237 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001238 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 PyErr_Clear();
1241 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001243 PyErr_Clear();
1244 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001246 PyErr_SetObject(
1247 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 break;
1249 }
1250 }
1251 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 PUSH(x);
1254 break;
1255
1256 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001257 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001258 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 PyErr_Clear();
1261 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
1265 }
1266 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001267 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 PUSH(x);
1269 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001270
Guido van Rossum9bfef441993-03-29 10:43:31 +00001271 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001272 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001273 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 PyErr_SetObject(PyExc_NameError,
1275 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001276 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001277 break;
1278 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001279 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001280 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001281 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001282 break;
1283
1284 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001285 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001286 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001287 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001288
1289 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001290 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001291 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001292
1293 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 if (x != NULL) {
1296 for (; --oparg >= 0;) {
1297 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001298 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 }
1300 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001301 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 }
1303 break;
1304
1305 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 if (x != NULL) {
1308 for (; --oparg >= 0;) {
1309 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 if (err != 0)
1312 break;
1313 }
1314 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001315 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 }
1317 break;
1318
1319 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001322 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001323 break;
1324
1325 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001326 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001327 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 x = PyObject_GetAttr(v, w);
1329 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001331 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 break;
1333
1334 case COMPARE_OP:
1335 w = POP();
1336 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001337 if (PyInt_Check(v) && PyInt_Check(w)) {
1338 /* INLINE: cmp(int, int) */
1339 register long a, b;
1340 register int res;
1341 a = ((PyIntObject*) v)->ob_ival;
1342 b = ((PyIntObject*) w)->ob_ival;
1343 switch (oparg) {
1344 case LT: res = a < b; break;
1345 case LE: res = a <= b; break;
1346 case EQ: res = a == b; break;
1347 case NE: res = a != b; break;
1348 case GT: res = a > b; break;
1349 case GE: res = a >= b; break;
1350 case IS: res = v == w; break;
1351 case IS_NOT: res = v != w; break;
1352 default: goto slow_compare;
1353 }
1354 x = res ? Py_True : Py_False;
1355 Py_INCREF(x);
1356 }
1357 else {
1358 slow_compare:
1359 x = cmp_outcome(oparg, v, w);
1360 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 Py_DECREF(v);
1362 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001364 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
1366
1367 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001369 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001372 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001373 break;
1374 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001375 if (PyCFunction_Check(x)) {
1376 u = Py_None;
1377 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001378 }
1379 else {
1380 u = find_from_args(f, INSTR_OFFSET());
1381 if (u == NULL) {
1382 x = u;
1383 break;
1384 }
1385 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001386 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001387 w,
1388 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001389 f->f_locals == NULL ?
1390 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001391 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001392 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001393 if (w == NULL) {
1394 x = NULL;
1395 break;
1396 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001397 x = PyEval_CallObject(x, w);
1398 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001399 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001400 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
1402
1403 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001404 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001406 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001407 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001408 PyErr_SetString(PyExc_SystemError,
1409 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001410 break;
1411 }
1412 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001414 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001416
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 case JUMP_FORWARD:
1418 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001419 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001420
1421 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001423 if (err > 0)
1424 err = 0;
1425 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001427 else
1428 break;
1429 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001430
1431 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001433 if (err > 0) {
1434 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001436 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001437 else if (err == 0)
1438 ;
1439 else
1440 break;
1441 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001442
1443 case JUMP_ABSOLUTE:
1444 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001445 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001446
1447 case FOR_LOOP:
1448 /* for v in s: ...
1449 On entry: stack contains s, i.
1450 On exit: stack contains s, i+1, s[i];
1451 but if loop exhausted:
1452 s, i are popped, and we jump */
1453 w = POP(); /* Loop index */
1454 v = POP(); /* Sequence object */
1455 u = loop_subscript(v, w);
1456 if (u != NULL) {
1457 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001462 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 }
1464 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 Py_DECREF(v);
1466 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 /* A NULL can mean "s exhausted"
1468 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001469 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001471 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001473 continue;
1474 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 }
1476 break;
1477
1478 case SETUP_LOOP:
1479 case SETUP_EXCEPT:
1480 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001483 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001484
1485 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001486#ifdef LLTRACE
1487 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001488 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001490 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001491 if (f->f_trace == NULL)
1492 continue;
1493 /* Trace each line of code reached */
1494 f->f_lasti = INSTR_OFFSET();
1495 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001498
1499 case CALL_FUNCTION:
1500 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001501 int na = oparg & 0xff;
1502 int nk = (oparg>>8) & 0xff;
1503 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001504 PyObject **pfunc = stack_pointer - n - 1;
1505 PyObject *func = *pfunc;
1506 PyObject *self = NULL;
1507 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 if (PyMethod_Check(func)) {
1510 self = PyMethod_Self(func);
1511 class = PyMethod_Class(func);
1512 func = PyMethod_Function(func);
1513 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001514 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 Py_INCREF(self);
1516 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001517 *pfunc = self;
1518 na++;
1519 n++;
1520 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001521 else {
1522 /* Unbound methods must be
1523 called with an instance of
1524 the class (or a derived
1525 class) as first argument */
1526 if (na > 0 &&
1527 (self = stack_pointer[-n])
1528 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 PyInstance_Check(self) &&
1530 PyClass_IsSubclass(
1531 (PyObject *)
1532 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001533 ->in_class),
1534 class))
1535 /* Handy-dandy */ ;
1536 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001537 PyErr_SetString(
1538 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001539 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001540 x = NULL;
1541 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001542 }
1543 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001544 }
1545 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 Py_INCREF(func);
1547 if (PyFunction_Check(func)) {
1548 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001549 PyObject *globals =
1550 PyFunction_GetGlobals(func);
1551 PyObject *argdefs =
1552 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001554 int nd;
1555 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001557 nd = ((PyTupleObject *)argdefs) ->
1558 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001559 }
1560 else {
1561 d = NULL;
1562 nd = 0;
1563 }
1564 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 (PyCodeObject *)co,
1566 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 stack_pointer-n, na,
1568 stack_pointer-2*nk, nk,
1569 d, nd,
1570 class);
1571 }
1572 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 PyObject *args = PyTuple_New(na);
1574 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001575 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001577 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001579 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001581 if (kwdict == NULL) {
1582 x = NULL;
1583 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001585 err = 0;
1586 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 PyObject *value = POP();
1588 PyObject *key = POP();
1589 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001590 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001591 Py_DECREF(key);
1592 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001593 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001594 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001595 }
1596 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 Py_DECREF(args);
1598 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001599 break;
1600 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001602 while (--na >= 0) {
1603 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001605 }
1606 x = PyEval_CallObjectWithKeywords(
1607 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001608 Py_DECREF(args);
1609 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001610 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 while (stack_pointer > pfunc) {
1613 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001615 }
1616 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001617 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001618 break;
1619 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001620
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 case MAKE_FUNCTION:
1622 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001623 x = PyFunction_New(v, f->f_globals);
1624 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001625 /* XXX Maybe this should be a separate opcode? */
1626 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001627 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001628 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001629 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001630 x = NULL;
1631 break;
1632 }
1633 while (--oparg >= 0) {
1634 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001636 }
1637 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001639 }
1640 PUSH(x);
1641 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001642
1643 case BUILD_SLICE:
1644 if (oparg == 3)
1645 w = POP();
1646 else
1647 w = NULL;
1648 v = POP();
1649 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001650 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 Py_DECREF(u);
1652 Py_DECREF(v);
1653 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001654 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001655 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001656 break;
1657
1658
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 default:
1660 fprintf(stderr,
1661 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001662 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 why = WHY_EXCEPTION;
1665 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001666
1667#ifdef CASE_TOO_BIG
1668 }
1669#endif
1670
Guido van Rossum374a9221991-04-04 10:40:29 +00001671 } /* switch */
1672
1673 on_error:
1674
1675 /* Quickly continue if no error occurred */
1676
1677 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001678 if (err == 0 && x != NULL) {
1679#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 fprintf(stderr,
1682 "XXX undetected error\n");
1683 else
1684#endif
1685 continue; /* Normal, fast path */
1686 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 err = 0;
1690 }
1691
Guido van Rossum801dcae1992-04-08 11:32:32 +00001692#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 /* Double-check exception status */
1694
1695 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001698 PyErr_SetString(PyExc_SystemError,
1699 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001700 why = WHY_EXCEPTION;
1701 }
1702 }
1703 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001704 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001705 fprintf(stderr,
1706 "XXX undetected error (why=%d)\n",
1707 why);
1708 why = WHY_EXCEPTION;
1709 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 }
1711#endif
1712
1713 /* Log traceback info if this is a real exception */
1714
1715 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001716 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001718 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001719 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001720
Guido van Rossume59214e1994-08-30 08:01:59 +00001721 if (f->f_trace)
1722 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001723 if (tstate->sys_profilefunc)
1724 call_exc_trace(&tstate->sys_profilefunc,
1725 (PyObject**)0, f);
1726}
Guido van Rossum374a9221991-04-04 10:40:29 +00001727
1728 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1729
1730 if (why == WHY_RERAISE)
1731 why = WHY_EXCEPTION;
1732
1733 /* Unwind stacks if a (pseudo) exception occurred */
1734
1735 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 while (STACK_LEVEL() > b->b_level) {
1738 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 }
1741 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1742 why = WHY_NOT;
1743 JUMPTO(b->b_handler);
1744 break;
1745 }
1746 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001747 (b->b_type == SETUP_EXCEPT &&
1748 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 PyObject *exc, *val, *tb;
1751 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 val = Py_None;
1754 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 /* Make the raw exception data
1757 available to the handler,
1758 so a program can emulate the
1759 Python main loop. Don't do
1760 this for 'finally'. */
1761 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001762 set_exc_info(tstate,
1763 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001765 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 PUSH(val);
1767 PUSH(exc);
1768 }
1769 else {
1770 if (why == WHY_RETURN)
1771 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 PUSH(v);
1774 }
1775 why = WHY_NOT;
1776 JUMPTO(b->b_handler);
1777 break;
1778 }
1779 } /* unwind stack */
1780
1781 /* End the loop if we still have an error (or return) */
1782
1783 if (why != WHY_NOT)
1784 break;
1785
1786 } /* main loop */
1787
1788 /* Pop remaining stack entries */
1789
1790 while (!EMPTY()) {
1791 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001792 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 }
1794
Guido van Rossum96a42c81992-01-12 02:29:51 +00001795 if (why != WHY_RETURN)
1796 retval = NULL;
1797
Guido van Rossume59214e1994-08-30 08:01:59 +00001798 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001799 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001800 if (call_trace(&f->f_trace, &f->f_trace, f,
1801 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001802 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001803 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001804 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001805 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001806 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001807 }
1808
Guido van Rossuma027efa1997-05-05 20:56:21 +00001809 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1810 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001811 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001812 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001813 retval = NULL;
1814 why = WHY_EXCEPTION;
1815 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001816 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001817
Guido van Rossuma027efa1997-05-05 20:56:21 +00001818 reset_exc_info(tstate);
1819
1820 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001821
1822 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001823
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001825
Guido van Rossuma027efa1997-05-05 20:56:21 +00001826 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001827 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001828
Guido van Rossum96a42c81992-01-12 02:29:51 +00001829 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001830}
1831
Guido van Rossuma027efa1997-05-05 20:56:21 +00001832static void
1833set_exc_info(tstate, type, value, tb)
1834 PyThreadState *tstate;
1835 PyObject *type;
1836 PyObject *value;
1837 PyObject *tb;
1838{
1839 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001840 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001841 frame = tstate->frame;
1842 if (frame->f_exc_type == NULL) {
1843 /* This frame didn't catch an exception before */
1844 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001845 if (tstate->exc_type == NULL) {
1846 Py_INCREF(Py_None);
1847 tstate->exc_type = Py_None;
1848 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001849 tmp_type = frame->f_exc_type;
1850 tmp_value = frame->f_exc_value;
1851 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001852 Py_XINCREF(tstate->exc_type);
1853 Py_XINCREF(tstate->exc_value);
1854 Py_XINCREF(tstate->exc_traceback);
1855 frame->f_exc_type = tstate->exc_type;
1856 frame->f_exc_value = tstate->exc_value;
1857 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001858 Py_XDECREF(tmp_type);
1859 Py_XDECREF(tmp_value);
1860 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001861 }
1862 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001863 tmp_type = tstate->exc_type;
1864 tmp_value = tstate->exc_value;
1865 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001866 Py_XINCREF(type);
1867 Py_XINCREF(value);
1868 Py_XINCREF(tb);
1869 tstate->exc_type = type;
1870 tstate->exc_value = value;
1871 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001872 Py_XDECREF(tmp_type);
1873 Py_XDECREF(tmp_value);
1874 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001875 /* For b/w compatibility */
1876 PySys_SetObject("exc_type", type);
1877 PySys_SetObject("exc_value", value);
1878 PySys_SetObject("exc_traceback", tb);
1879}
1880
1881static void
1882reset_exc_info(tstate)
1883 PyThreadState *tstate;
1884{
1885 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001886 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001887 frame = tstate->frame;
1888 if (frame->f_exc_type != NULL) {
1889 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001890 tmp_type = tstate->exc_type;
1891 tmp_value = tstate->exc_value;
1892 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001893 Py_XINCREF(frame->f_exc_type);
1894 Py_XINCREF(frame->f_exc_value);
1895 Py_XINCREF(frame->f_exc_traceback);
1896 tstate->exc_type = frame->f_exc_type;
1897 tstate->exc_value = frame->f_exc_value;
1898 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001899 Py_XDECREF(tmp_type);
1900 Py_XDECREF(tmp_value);
1901 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001902 /* For b/w compatibility */
1903 PySys_SetObject("exc_type", frame->f_exc_type);
1904 PySys_SetObject("exc_value", frame->f_exc_value);
1905 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1906 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001907 tmp_type = frame->f_exc_type;
1908 tmp_value = frame->f_exc_value;
1909 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001910 frame->f_exc_type = NULL;
1911 frame->f_exc_value = NULL;
1912 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001913 Py_XDECREF(tmp_type);
1914 Py_XDECREF(tmp_value);
1915 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001916}
1917
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001918/* Logic for the raise statement (too complicated for inlining).
1919 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001920static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001921do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001922 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001923{
1924 /* We support the following forms of raise:
1925 raise <class>, <classinstance>
1926 raise <class>, <argument tuple>
1927 raise <class>, None
1928 raise <class>, <argument>
1929 raise <classinstance>, None
1930 raise <string>, <object>
1931 raise <string>, None
1932
1933 An omitted second argument is the same as None.
1934
1935 In addition, raise <tuple>, <anything> is the same as
1936 raising the tuple's first item (and it better have one!);
1937 this rule is applied recursively.
1938
1939 Finally, an optional third argument can be supplied, which
1940 gives the traceback to be substituted (useful when
1941 re-raising an exception after examining it). */
1942
1943 /* First, check the traceback argument, replacing None with
1944 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001945 if (tb == Py_None) {
1946 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001947 tb = NULL;
1948 }
1949 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001950 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001951 "raise 3rd arg must be traceback or None");
1952 goto raise_error;
1953 }
1954
1955 /* Next, replace a missing value with None */
1956 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001957 value = Py_None;
1958 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001959 }
1960
1961 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001962 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1963 PyObject *tmp = type;
1964 type = PyTuple_GET_ITEM(type, 0);
1965 Py_INCREF(type);
1966 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001967 }
1968
1969 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001970 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001971 ;
1972 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001973 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001974 /* Raising a class. If the value is an instance, it
1975 better be an instance of the class. If it is not,
1976 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001977 if (PyInstance_Check(value)) {
1978 PyObject *inclass = (PyObject*)
1979 (((PyInstanceObject*)value)->in_class);
1980 if (!PyClass_IsSubclass(inclass, type)) {
1981 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001982 "raise <class>, <instance> requires that <instance> is a member of <class>");
1983 goto raise_error;
1984 }
1985 }
1986 else {
1987 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 PyObject *args, *res;
1989 if (value == Py_None)
1990 args = Py_BuildValue("()");
1991 else if (PyTuple_Check(value)) {
1992 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001993 args = value;
1994 }
1995 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001997 if (args == NULL)
1998 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 res = PyEval_CallObject(type, args);
2000 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002001 if (res == NULL)
2002 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00002003 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002004 value = res;
2005 }
2006 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002008 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 if (value != Py_None) {
2010 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002011 "instance exception may not have a separate value");
2012 goto raise_error;
2013 }
2014 else {
2015 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002016 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002017 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2019 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002020 }
2021 }
2022 else {
2023 /* Not something you can raise. You get an exception
2024 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002026 "exceptions must be strings, classes, or instances");
2027 goto raise_error;
2028 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002030 if (tb == NULL)
2031 return WHY_EXCEPTION;
2032 else
2033 return WHY_RERAISE;
2034 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 Py_XDECREF(value);
2036 Py_XDECREF(type);
2037 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002038 return WHY_EXCEPTION;
2039}
2040
Guido van Rossum96a42c81992-01-12 02:29:51 +00002041#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002042static int
2043prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002045 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002047 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 if (PyObject_Print(v, stdout, 0) != 0)
2049 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002050 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002052#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002054static void
2055call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 PyObject **p_trace, **p_newtrace;
2057 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002058{
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002060 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002062 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 value = Py_None;
2064 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002065 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002067 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002069 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002070 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002076 Py_XDECREF(type);
2077 Py_XDECREF(value);
2078 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002080}
2081
2082static int
2083call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002085 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002086 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002087 may point to NULL variable;
2088 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002089 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002090 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002092{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002093 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 PyObject *args, *what;
2095 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002096
Guido van Rossuma027efa1997-05-05 20:56:21 +00002097 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002098 /* Don't do recursive traces */
2099 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002101 *p_newtrace = NULL;
2102 }
2103 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002104 }
2105
Guido van Rossumb209a111997-04-29 18:18:01 +00002106 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002107 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 goto Py_Cleanup;
2109 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002110 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 goto Py_Cleanup;
2112 Py_INCREF(f);
2113 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2114 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002115 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 arg = Py_None;
2117 Py_INCREF(arg);
2118 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002119 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 PyFrame_FastToLocals(f);
2121 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2122 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002123 tstate->tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 Py_Cleanup:
2125 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002126 if (res == NULL) {
2127 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyTraceBack_Here(f);
2129 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002130 *p_trace = NULL;
2131 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002133 *p_newtrace = NULL;
2134 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002135 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002136 }
2137 else {
2138 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 Py_XDECREF(*p_newtrace);
2140 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002141 *p_newtrace = NULL;
2142 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002144 *p_newtrace = res;
2145 }
2146 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002148 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002149 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002150}
2151
Guido van Rossumb209a111997-04-29 18:18:01 +00002152PyObject *
2153PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002154{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002155 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002156 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002157 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00002158 else
2159 return current_frame->f_builtins;
2160}
2161
Guido van Rossumb209a111997-04-29 18:18:01 +00002162PyObject *
2163PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002164{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002165 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002166 if (current_frame == NULL)
2167 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002169 return current_frame->f_locals;
2170}
2171
Guido van Rossumb209a111997-04-29 18:18:01 +00002172PyObject *
2173PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002174{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002176 if (current_frame == NULL)
2177 return NULL;
2178 else
2179 return current_frame->f_globals;
2180}
2181
Guido van Rossumb209a111997-04-29 18:18:01 +00002182PyObject *
2183PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002184{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002185 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002187}
2188
Guido van Rossum6135a871995-01-09 17:53:26 +00002189int
Guido van Rossumb209a111997-04-29 18:18:01 +00002190PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002191{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002192 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002193 return current_frame == NULL ? 0 : current_frame->f_restricted;
2194}
2195
Guido van Rossumbe270261997-05-22 22:26:18 +00002196int
Guido van Rossumb209a111997-04-29 18:18:01 +00002197Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198{
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002200 if (f == NULL)
2201 return 0;
2202 if (!PyFile_SoftSpace(f, 0))
2203 return 0;
2204 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002205}
2206
Guido van Rossum3f5da241990-12-20 15:06:42 +00002207
Guido van Rossum681d79a1995-07-18 14:51:37 +00002208/* External interface to call any callable object.
2209 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002210
Guido van Rossumb209a111997-04-29 18:18:01 +00002211PyObject *
2212PyEval_CallObject(func, arg)
2213 PyObject *func;
2214 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002215{
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002217}
Guido van Rossume59214e1994-08-30 08:01:59 +00002218
Guido van Rossumb209a111997-04-29 18:18:01 +00002219PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002220PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 PyObject *func;
2222 PyObject *arg;
2223 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224{
2225 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002227
2228 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 arg = PyTuple_New(0);
2230 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002231 PyErr_SetString(PyExc_TypeError,
2232 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002233 return NULL;
2234 }
2235 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002236 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002237
Guido van Rossumb209a111997-04-29 18:18:01 +00002238 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002239 PyErr_SetString(PyExc_TypeError,
2240 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002241 return NULL;
2242 }
2243
Guido van Rossum150b2df1996-12-05 23:17:11 +00002244 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002245 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002246 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002247 result = call_function(func, arg, kw);
2248 else
2249 result = call_builtin(func, arg, kw);
2250
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002252
Guido van Rossumb209a111997-04-29 18:18:01 +00002253 if (result == NULL && !PyErr_Occurred())
2254 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002255 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002256
2257 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002258}
2259
Guido van Rossumb209a111997-04-29 18:18:01 +00002260static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002261call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 PyObject *func;
2263 PyObject *arg;
2264 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265{
Guido van Rossumb209a111997-04-29 18:18:01 +00002266 if (PyCFunction_Check(func)) {
2267 PyCFunction meth = PyCFunction_GetFunction(func);
2268 PyObject *self = PyCFunction_GetSelf(func);
2269 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002270 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002272 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002273 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002274 else if (size == 0)
2275 arg = NULL;
2276 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002277 if (flags & METH_KEYWORDS)
2278 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002279 if (kw != NULL && PyDict_Size(kw) != 0) {
2280 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002281 "this function takes no keyword arguments");
2282 return NULL;
2283 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002286 if (PyClass_Check(func)) {
2287 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002289 if (PyInstance_Check(func)) {
2290 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002291 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002292 PyErr_Clear();
2293 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002294 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002295 return NULL;
2296 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002297 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002298 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002299 return res;
2300 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002301 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302 return NULL;
2303}
2304
Guido van Rossumb209a111997-04-29 18:18:01 +00002305static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 PyObject *func;
2308 PyObject *arg;
2309 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310{
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 PyObject *class = NULL; /* == owner */
2312 PyObject *argdefs;
2313 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002314 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002315 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002316
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 if (kw != NULL && !PyDict_Check(kw)) {
2318 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319 return NULL;
2320 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 if (PyMethod_Check(func)) {
2323 PyObject *self = PyMethod_Self(func);
2324 class = PyMethod_Class(func);
2325 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002326 if (self == NULL) {
2327 /* Unbound methods must be called with an instance of
2328 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 if (PyTuple_Size(arg) >= 1) {
2330 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002331 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002332 PyInstance_Check(self) &&
2333 PyClass_IsSubclass((PyObject *)
2334 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002335 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002337 else
2338 self = NULL;
2339 }
2340 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002342 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002343 return NULL;
2344 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002345 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002346 }
2347 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 int argcount = PyTuple_Size(arg);
2349 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002350 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002351 if (newarg == NULL)
2352 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002353 Py_INCREF(self);
2354 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002355 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 PyObject *v = PyTuple_GET_ITEM(arg, i);
2357 Py_XINCREF(v);
2358 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002359 }
2360 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 }
2362 }
2363 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002365 PyErr_SetString(PyExc_TypeError,
2366 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 return NULL;
2368 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002369 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002371
2372 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2374 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2375 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002376 }
2377 else {
2378 d = NULL;
2379 nd = 0;
2380 }
2381
2382 if (kw != NULL) {
2383 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 nk = PyDict_Size(kw);
2385 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002386 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 PyErr_NoMemory();
2388 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002389 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002390 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002392 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002393 i += 2;
2394 nk = i/2;
2395 /* XXX This is broken if the caller deletes dict items! */
2396 }
2397 else {
2398 k = NULL;
2399 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002400 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401
Guido van Rossum681d79a1995-07-18 14:51:37 +00002402 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002403 (PyCodeObject *)PyFunction_GetCode(func),
2404 PyFunction_GetGlobals(func), (PyObject *)NULL,
2405 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002406 k, nk,
2407 d, nd,
2408 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409
Guido van Rossumb209a111997-04-29 18:18:01 +00002410 Py_DECREF(arg);
2411 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414}
2415
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002416#define SLICE_ERROR_MSG \
2417 "standard sequence type does not support step size other than one"
2418
Guido van Rossumb209a111997-04-29 18:18:01 +00002419static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002420loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422{
Guido van Rossumb209a111997-04-29 18:18:01 +00002423 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002424 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 return NULL;
2428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002430 v = (*sq->sq_item)(v, i);
2431 if (v)
2432 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 if (PyErr_Occurred() == PyExc_IndexError)
2434 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002435 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436}
2437
2438static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002439slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 int *pi;
2442{
2443 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002444 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002446 PyErr_SetString(PyExc_TypeError,
2447 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002450 x = PyInt_AsLong(v);
2451 /* Truncate -- very long indices are truncated anyway */
2452 if (x > INT_MAX)
2453 x = INT_MAX;
2454 else if (x < -INT_MAX)
2455 x = 0;
2456 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002458 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459}
2460
Guido van Rossumb209a111997-04-29 18:18:01 +00002461static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002465 int ilow = 0, ihigh = INT_MAX;
2466 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002468 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002469 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002470 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472
2473static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002474assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002475 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002477 int ilow = 0, ihigh = INT_MAX;
2478 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002480 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002481 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002482 if (x == NULL)
2483 return PySequence_DelSlice(u, ilow, ihigh);
2484 else
2485 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486}
2487
2488static int
2489cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491{
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002494 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002496 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 return 1;
2499 }
2500 return 0;
2501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002502 if (PyClass_Check(v) && PyClass_Check(err))
2503 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 return err == v;
2505}
2506
Guido van Rossum3f5da241990-12-20 15:06:42 +00002507static int
2508cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002509 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510{
Guido van Rossume59214e1994-08-30 08:01:59 +00002511 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002512 PyObject *x;
2513 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002515 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516 register char *s, *end;
2517 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2519 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002520 "string member test needs char left operand");
2521 return -1;
2522 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002523 c = PyString_AsString(v)[0];
2524 s = PyString_AsString(w);
2525 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002526 while (s < end) {
2527 if (c == *s++)
2528 return 1;
2529 }
2530 return 0;
2531 }
2532 sq = w->ob_type->tp_as_sequence;
2533 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002535 "'in' or 'not in' needs sequence right argument");
2536 return -1;
2537 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002538 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002539 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002540 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 if (PyErr_Occurred() == PyExc_IndexError) {
2542 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002543 break;
2544 }
2545 return -1;
2546 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002547 cmp = PyObject_Compare(v, x);
2548 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549 if (cmp == 0)
2550 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002551 if (PyErr_Occurred())
2552 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002553 }
2554 return 0;
2555}
2556
Guido van Rossumb209a111997-04-29 18:18:01 +00002557static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002559 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 register PyObject *v;
2561 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562{
2563 register int cmp;
2564 register int res = 0;
2565 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002566 case IS:
2567 case IS_NOT:
2568 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002569 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570 res = !res;
2571 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 case IN:
2573 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574 res = cmp_member(v, w);
2575 if (res < 0)
2576 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002577 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002578 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 break;
2580 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002581 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 break;
2583 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002585 if (cmp && PyErr_Occurred())
2586 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 switch (op) {
2588 case LT: res = cmp < 0; break;
2589 case LE: res = cmp <= 0; break;
2590 case EQ: res = cmp == 0; break;
2591 case NE: res = cmp != 0; break;
2592 case GT: res = cmp > 0; break;
2593 case GE: res = cmp >= 0; break;
2594 /* XXX no default? (res is initialized to 0 though) */
2595 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 v = res ? Py_True : Py_False;
2598 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 return v;
2600}
2601
Guido van Rossum3f5da241990-12-20 15:06:42 +00002602static int
2603import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002604 PyObject *locals;
2605 PyObject *v;
2606 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002607{
Guido van Rossumb209a111997-04-29 18:18:01 +00002608 PyObject *w, *x;
2609 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002610 PyErr_SetString(PyExc_TypeError,
2611 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002612 return -1;
2613 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002614 w = PyModule_GetDict(v);
2615 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002616 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002617 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002618 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 while (PyDict_Next(w, &pos, &name, &value)) {
2620 if (!PyString_Check(name) ||
2621 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002622 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 Py_INCREF(value);
2624 err = PyDict_SetItem(locals, name, value);
2625 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002626 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002628 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002629 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002630 }
2631 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002634 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002635 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 PyString_AsString(name));
2637 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002638 return -1;
2639 }
2640 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002642 }
2643}
2644
Guido van Rossumb209a111997-04-29 18:18:01 +00002645static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002646build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 PyObject *methods; /* dictionary */
2648 PyObject *bases; /* tuple containing classes */
2649 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002650{
Guido van Rossum25831651993-05-19 14:50:45 +00002651 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002653 PyErr_SetString(PyExc_SystemError,
2654 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002655 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002656 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002658 PyErr_SetString(PyExc_SystemError,
2659 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002660 return NULL;
2661 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002663 PyErr_SetString(PyExc_SystemError,
2664 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002665 return NULL;
2666 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 for (i = PyTuple_Size(bases); --i >= 0; ) {
2668 PyObject *base = PyTuple_GET_ITEM(bases, i);
2669 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002670 /* Call the base's *type*, if it is callable.
2671 This code is a hook for Donald Beaudry's
2672 and Jim Fulton's type extensions. In
2673 unexended Python it will never be triggered
2674 since its types are not callable. */
2675 if (base->ob_type->ob_type->tp_call) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 PyObject *args;
2677 PyObject *class;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002678 args = Py_BuildValue("(OOO)",
2679 name, bases, methods);
2680 class = PyEval_CallObject(
2681 (PyObject *)base->ob_type, args);
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 Py_DECREF(args);
Guido van Rossum150b2df1996-12-05 23:17:11 +00002683 return class;
2684 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002686 "base is not a class object");
2687 return NULL;
2688 }
2689 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002691}
2692
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002693static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002694exec_statement(f, prog, globals, locals)
2695 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 PyObject *prog;
2697 PyObject *globals;
2698 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002699{
2700 char *s;
2701 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002702 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002703 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002704
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2706 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002707 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002709 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 locals = PyTuple_GetItem(prog, 2);
2711 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002712 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 if (globals == Py_None) {
2714 globals = PyEval_GetGlobals();
2715 if (locals == Py_None) {
2716 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002717 plain = 1;
2718 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002719 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002721 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002722 if (!PyString_Check(prog) &&
2723 !PyCode_Check(prog) &&
2724 !PyFile_Check(prog)) {
2725 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002726 "exec 1st arg must be string, code or file object");
2727 return -1;
2728 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2730 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002731 "exec 2nd/3rd args must be dict or None");
2732 return -1;
2733 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002735 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002737 if (PyEval_EvalCode((PyCodeObject *) prog,
2738 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002739 return -1;
2740 return 0;
2741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 if (PyFile_Check(prog)) {
2743 FILE *fp = PyFile_AsFile(prog);
2744 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002745 if (PyRun_File(fp, name, Py_file_input,
2746 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002747 return -1;
2748 return 0;
2749 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002751 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002752 PyErr_SetString(PyExc_ValueError,
2753 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002754 return -1;
2755 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002756 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002757 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002758 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002759 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002760 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002761 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002762 return 0;
2763}
Guido van Rossum24c13741995-02-14 09:42:43 +00002764
Guido van Rossum1aa14831997-01-21 05:34:20 +00002765/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002766static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002767find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002769 int nexti;
2770{
2771 int opcode;
2772 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002774 unsigned char *next_instr;
2775
2776 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2777 opcode = (*next_instr++);
2778 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 Py_INCREF(Py_None);
2780 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002781 }
2782
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002784 if (list == NULL)
2785 return NULL;
2786
2787 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002788 oparg = (next_instr[1]<<8) + next_instr[0];
2789 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002790 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 if (PyList_Append(list, name) < 0) {
2792 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002793 break;
2794 }
2795 opcode = (*next_instr++);
2796 } while (opcode == IMPORT_FROM);
2797
2798 return list;
2799}
Guido van Rossum950361c1997-01-24 13:49:28 +00002800
2801
2802#ifdef DYNAMIC_EXECUTION_PROFILE
2803
2804PyObject *
2805getarray(a)
2806 long a[256];
2807{
2808 int i;
2809 PyObject *l = PyList_New(256);
2810 if (l == NULL) return NULL;
2811 for (i = 0; i < 256; i++) {
2812 PyObject *x = PyInt_FromLong(a[i]);
2813 if (x == NULL) {
2814 Py_DECREF(l);
2815 return NULL;
2816 }
2817 PyList_SetItem(l, i, x);
2818 }
2819 for (i = 0; i < 256; i++)
2820 a[i] = 0;
2821 return l;
2822}
2823
2824PyObject *
2825_Py_GetDXProfile(self, args)
2826 PyObject *self, *args;
2827{
2828#ifndef DXPAIRS
2829 return getarray(dxp);
2830#else
2831 int i;
2832 PyObject *l = PyList_New(257);
2833 if (l == NULL) return NULL;
2834 for (i = 0; i < 257; i++) {
2835 PyObject *x = getarray(dxpairs[i]);
2836 if (x == NULL) {
2837 Py_DECREF(l);
2838 return NULL;
2839 }
2840 PyList_SetItem(l, i, x);
2841 }
2842 return l;
2843#endif
2844}
2845
2846#endif