blob: ce4b67a7b5be1ed27a0526b5876f12a5e38ea2bf [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Guido van Rossum5b722181993-03-30 17:46:03 +000032
Guido van Rossum374a9221991-04-04 10:40:29 +000033/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000034
Tim Petersdbd9ba62000-07-09 03:09:57 +000035static PyObject *eval_code2(PyCodeObject *,
36 PyObject *, PyObject *,
37 PyObject **, int,
38 PyObject **, int,
39 PyObject **, int,
40 PyObject *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000041#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000042static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000043#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000044static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
45static int call_trace(PyObject **, PyObject **,
46 PyFrameObject *, char *, PyObject *);
47static PyObject *call_builtin(PyObject *, PyObject *, PyObject *);
48static PyObject *call_function(PyObject *, PyObject *, PyObject *);
49static PyObject *loop_subscript(PyObject *, PyObject *);
50static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
51static int assign_slice(PyObject *, PyObject *,
52 PyObject *, PyObject *);
53static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000054static PyObject *import_from(PyObject *, PyObject *);
55static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000056static PyObject *build_class(PyObject *, PyObject *, PyObject *);
57static int exec_statement(PyFrameObject *,
58 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
60static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000061static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000062
Paul Prescode68140d2000-08-30 20:25:01 +000063#define NAME_ERROR_MSG \
64 "There is no variable named '%s'"
65#define UNBOUNDLOCAL_ERROR_MSG \
66 "Local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Guido van Rossum950361c1997-01-24 13:49:28 +000068/* Dynamic execution profile */
69#ifdef DYNAMIC_EXECUTION_PROFILE
70#ifdef DXPAIRS
71static long dxpairs[257][256];
72#define dxp dxpairs[256]
73#else
74static long dxp[256];
75#endif
76#endif
77
78
Guido van Rossume59214e1994-08-30 08:01:59 +000079#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000080
Guido van Rossum2571cc81999-04-07 16:07:23 +000081#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000083#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000084#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000085
Guido van Rossuma027efa1997-05-05 20:56:21 +000086extern int _PyThread_Started; /* Flag for Py_Exit */
87
Guido van Rossum65d5b571998-12-21 19:32:43 +000088static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +000089static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000090
91void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000092PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093{
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +000095 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +000096 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +000097 interpreter_lock = PyThread_allocate_lock();
98 PyThread_acquire_lock(interpreter_lock, 1);
99 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000102void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000104{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000105 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000106}
107
108void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000109PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000110{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000111 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000112}
113
114void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000116{
117 if (tstate == NULL)
118 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000119 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000120 if (PyThreadState_Swap(tstate) != NULL)
121 Py_FatalError(
122 "PyEval_AcquireThread: non-NULL old thread state");
123}
124
125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000127{
128 if (tstate == NULL)
129 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
130 if (PyThreadState_Swap(NULL) != tstate)
131 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000132 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000133}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000134
135/* This function is called from PyOS_AfterFork to ensure that newly
136 created child processes don't hold locks referring to threads which
137 are not running in the child process. (This could also be done using
138 pthread_atfork mechanism, at least for the pthreads implementation.) */
139
140void
141PyEval_ReInitThreads(void)
142{
143 if (!interpreter_lock)
144 return;
145 /*XXX Can't use PyThread_free_lock here because it does too
146 much error-checking. Doing this cleanly would require
147 adding a new function to each thread_*.h. Instead, just
148 create a new lock and waste a little bit of memory */
149 interpreter_lock = PyThread_allocate_lock();
150 PyThread_acquire_lock(interpreter_lock, 1);
151 main_thread = PyThread_get_thread_ident();
152}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153#endif
154
Guido van Rossumff4949e1992-08-05 19:58:53 +0000155/* Functions save_thread and restore_thread are always defined so
156 dynamically loaded modules needn't be compiled separately for use
157 with and without threads: */
158
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000159PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000160PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000161{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000162 PyThreadState *tstate = PyThreadState_Swap(NULL);
163 if (tstate == NULL)
164 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000165#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000166 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000167 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000169 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170}
171
172void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000175 if (tstate == NULL)
176 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000177#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000179 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000180 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182 }
183#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000184 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185}
186
187
Guido van Rossuma9672091994-09-14 13:31:22 +0000188/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
189 signal handlers or Mac I/O completion routines) can schedule calls
190 to a function to be called synchronously.
191 The synchronous function is called with one void* argument.
192 It should return 0 for success or -1 for failure -- failure should
193 be accompanied by an exception.
194
195 If registry succeeds, the registry function returns 0; if it fails
196 (e.g. due to too many pending calls) it returns -1 (without setting
197 an exception condition).
198
199 Note that because registry may occur from within signal handlers,
200 or other asynchronous events, calling malloc() is unsafe!
201
202#ifdef WITH_THREAD
203 Any thread can schedule pending calls, but only the main thread
204 will execute them.
205#endif
206
207 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
208 There are two possible race conditions:
209 (1) nested asynchronous registry calls;
210 (2) registry calls made while pending calls are being processed.
211 While (1) is very unlikely, (2) is a real possibility.
212 The current code is safe against (2), but not against (1).
213 The safety against (2) is derived from the fact that only one
214 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000215
Guido van Rossuma027efa1997-05-05 20:56:21 +0000216 XXX Darn! With the advent of thread state, we should have an array
217 of pending calls per thread in the thread state! Later...
218*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000219
Guido van Rossuma9672091994-09-14 13:31:22 +0000220#define NPENDINGCALLS 32
221static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000222 int (*func)(void *);
223 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000224} pendingcalls[NPENDINGCALLS];
225static volatile int pendingfirst = 0;
226static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000227static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000228
229int
Thomas Wouters334fb892000-07-25 12:56:38 +0000230Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000231{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000232 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000233 int i, j;
234 /* XXX Begin critical section */
235 /* XXX If you want this to be safe against nested
236 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000237 if (busy)
238 return -1;
239 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240 i = pendinglast;
241 j = (i + 1) % NPENDINGCALLS;
242 if (j == pendingfirst)
243 return -1; /* Queue full */
244 pendingcalls[i].func = func;
245 pendingcalls[i].arg = arg;
246 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 /* XXX End critical section */
250 return 0;
251}
252
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000255{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000257#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 return 0;
260#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000261 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 return 0;
263 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000264 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000265 for (;;) {
266 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000267 int (*func)(void *);
268 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 i = pendingfirst;
270 if (i == pendinglast)
271 break; /* Queue empty */
272 func = pendingcalls[i].func;
273 arg = pendingcalls[i].arg;
274 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000275 if (func(arg) < 0) {
276 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000278 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000279 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000281 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000282 return 0;
283}
284
285
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000286/* The interpreter's recursion limit */
287
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000288static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000289
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000290int
291Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000292{
293 return recursion_limit;
294}
295
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000296void
297Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000298{
299 recursion_limit = new_limit;
300}
301
Guido van Rossum374a9221991-04-04 10:40:29 +0000302/* Status code for main loop (reason for stack unwind) */
303
304enum why_code {
305 WHY_NOT, /* No error */
306 WHY_EXCEPTION, /* Exception occurred */
307 WHY_RERAISE, /* Exception re-raised by 'finally' */
308 WHY_RETURN, /* 'return' statement */
309 WHY_BREAK /* 'break' statement */
310};
311
Tim Petersdbd9ba62000-07-09 03:09:57 +0000312static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
313static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000314
Guido van Rossum374a9221991-04-04 10:40:29 +0000315
Guido van Rossumb209a111997-04-29 18:18:01 +0000316PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000317PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000318{
319 return eval_code2(co,
320 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000321 (PyObject **)NULL, 0,
322 (PyObject **)NULL, 0,
323 (PyObject **)NULL, 0,
324 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000325}
326
327
328/* Interpreter main loop */
329
Guido van Rossumb209a111997-04-29 18:18:01 +0000330static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
332 PyObject **args, int argcount, PyObject **kws, int kwcount,
333 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000334{
Guido van Rossum950361c1997-01-24 13:49:28 +0000335#ifdef DXPAIRS
336 int lastopcode = 0;
337#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000338 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000339 register int opcode=0; /* Current opcode */
340 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 register enum why_code why; /* Reason for block stack unwind */
343 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000344 register PyObject *x; /* Result object -- NULL if error */
345 register PyObject *v; /* Temporary objects popped off stack */
346 register PyObject *w;
347 register PyObject *u;
348 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000349 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000350 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000351 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000352 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000353 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000354 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000355#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000356 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000357#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000358#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000359 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000360 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000361#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000362
363/* Code access macros */
364
365#define GETCONST(i) Getconst(f, i)
366#define GETNAME(i) Getname(f, i)
367#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000368#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000369#define NEXTOP() (*next_instr++)
370#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000371#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#define JUMPBY(x) (next_instr += (x))
373
374/* Stack manipulation macros */
375
376#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
377#define EMPTY() (STACK_LEVEL() == 0)
378#define TOP() (stack_pointer[-1])
379#define BASIC_PUSH(v) (*stack_pointer++ = (v))
380#define BASIC_POP() (*--stack_pointer)
381
Guido van Rossum96a42c81992-01-12 02:29:51 +0000382#ifdef LLTRACE
383#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
384#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000385#else
386#define PUSH(v) BASIC_PUSH(v)
387#define POP() BASIC_POP()
388#endif
389
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390/* Local variable macros */
391
392#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000393#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394 GETLOCAL(i) = value; } while (0)
395
Guido van Rossuma027efa1997-05-05 20:56:21 +0000396/* Start of code */
397
Guido van Rossum8861b741996-07-30 16:49:37 +0000398#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000399 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000400 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000401 return NULL;
402 }
403#endif
404
Guido van Rossum681d79a1995-07-18 14:51:37 +0000405 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000406 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000407 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000408 }
409
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000410#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000411 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000412#endif
413
Guido van Rossumb209a111997-04-29 18:18:01 +0000414 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000416 co, /*code*/
417 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000418 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000419 if (f == NULL)
420 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000421
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000423 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424
425 if (co->co_argcount > 0 ||
426 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
427 int i;
428 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000431 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 if (kwdict == NULL)
433 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000434 i = co->co_argcount;
435 if (co->co_flags & CO_VARARGS)
436 i++;
437 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 }
439 if (argcount > co->co_argcount) {
440 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000441 PyErr_Format(PyExc_TypeError,
442 "too many arguments; expected %d, got %d",
443 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000444 goto fail;
445 }
446 n = co->co_argcount;
447 }
448 for (i = 0; i < n; i++) {
449 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000450 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 SETLOCAL(i, x);
452 }
453 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000454 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000455 if (u == NULL)
456 goto fail;
457 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000458 for (i = n; i < argcount; i++) {
459 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000460 Py_INCREF(x);
461 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 }
464 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 PyObject *keyword = kws[2*i];
466 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000468 if (keyword == NULL || !PyString_Check(keyword)) {
469 PyErr_SetString(PyExc_TypeError,
470 "keywords must be strings");
471 goto fail;
472 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 /* XXX slow -- speed up using dictionary? */
474 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000475 PyObject *nm = PyTuple_GET_ITEM(
476 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 break;
479 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000480 /* Check errors from Compare */
481 if (PyErr_Occurred())
482 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 if (j >= co->co_argcount) {
484 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000486 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000487 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 goto fail;
489 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000490 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 }
492 else {
493 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000494 PyErr_Format(PyExc_TypeError,
495 "keyword parameter redefined: %.400s",
496 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497 goto fail;
498 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000499 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 SETLOCAL(j, value);
501 }
502 }
503 if (argcount < co->co_argcount) {
504 int m = co->co_argcount - defcount;
505 for (i = argcount; i < m; i++) {
506 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000507 PyErr_Format(PyExc_TypeError,
508 "not enough arguments; expected %d, got %d",
509 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 goto fail;
511 }
512 }
513 if (n > m)
514 i = n - m;
515 else
516 i = 0;
517 for (; i < defcount; i++) {
518 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000519 PyObject *def = defs[i];
520 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 SETLOCAL(m+i, def);
522 }
523 }
524 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000525 }
526 else {
527 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000528 PyErr_SetString(PyExc_TypeError,
529 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000530 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 }
532 }
533
Guido van Rossuma027efa1997-05-05 20:56:21 +0000534 if (tstate->sys_tracefunc != NULL) {
535 /* tstate->sys_tracefunc, if defined, is a function that
536 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000537 Its return value, if not None, is a function that
538 will be called at the start of each executed line
539 of code. (Actually, the function must return
540 itself in order to continue tracing.)
541 The trace functions are called with three arguments:
542 a pointer to the current frame, a string indicating
543 why the function is called, and an argument which
544 depends on the situation. The global trace function
545 (sys.trace) is also called whenever an exception
546 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000547 if (call_trace(&tstate->sys_tracefunc,
548 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000549 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000550 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000551 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000552 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000553 }
554
Guido van Rossuma027efa1997-05-05 20:56:21 +0000555 if (tstate->sys_profilefunc != NULL) {
556 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000557 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000558 if (call_trace(&tstate->sys_profilefunc,
559 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000561 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000562 }
563 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000564
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000565 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 --tstate->recursion_depth;
567 PyErr_SetString(PyExc_RuntimeError,
568 "Maximum recursion depth exceeded");
569 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000570 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000571 return NULL;
572 }
573
Guido van Rossumd076c731998-10-07 19:42:25 +0000574 _PyCode_GETCODEPTR(co, &first_instr);
575 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000576 stack_pointer = f->f_valuestack;
577
Guido van Rossum374a9221991-04-04 10:40:29 +0000578 why = WHY_NOT;
579 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000580 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000581 w = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000582
583 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000584 /* Do periodic things. Doing this every time through
585 the loop would add too much overhead, so we do it
586 only every Nth instruction. We also do it if
587 ``things_to_do'' is set, i.e. when an asynchronous
588 event needs attention (e.g. a signal handler or
589 async I/O handler); see Py_AddPendingCall() and
590 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000591
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000593 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000594 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000595 if (Py_MakePendingCalls() < 0) {
596 why = WHY_EXCEPTION;
597 goto on_error;
598 }
599 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000600#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 /* If we have true signals, the signal handler
602 will call Py_AddPendingCall() so we don't
603 have to call sigcheck(). On the Mac and
604 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000605 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000607 goto on_error;
608 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000609#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000610
Guido van Rossume59214e1994-08-30 08:01:59 +0000611#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000612 if (interpreter_lock) {
613 /* Give another thread a chance */
614
Guido van Rossum25ce5661997-08-02 03:10:38 +0000615 if (PyThreadState_Swap(NULL) != tstate)
616 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000617 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000618
619 /* Other threads may run now */
620
Guido van Rossum65d5b571998-12-21 19:32:43 +0000621 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000622 if (PyThreadState_Swap(tstate) != NULL)
623 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000624 }
625#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000627
Guido van Rossum374a9221991-04-04 10:40:29 +0000628 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000629
Guido van Rossum408027e1996-12-30 16:17:54 +0000630#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000631 f->f_lasti = INSTR_OFFSET();
632#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000633
634 opcode = NEXTOP();
635 if (HAS_ARG(opcode))
636 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000637 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000638#ifdef DYNAMIC_EXECUTION_PROFILE
639#ifdef DXPAIRS
640 dxpairs[lastopcode][opcode]++;
641 lastopcode = opcode;
642#endif
643 dxp[opcode]++;
644#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000645
Guido van Rossum96a42c81992-01-12 02:29:51 +0000646#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 /* Instruction tracing */
648
Guido van Rossum96a42c81992-01-12 02:29:51 +0000649 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 if (HAS_ARG(opcode)) {
651 printf("%d: %d, %d\n",
652 (int) (INSTR_OFFSET() - 3),
653 opcode, oparg);
654 }
655 else {
656 printf("%d: %d\n",
657 (int) (INSTR_OFFSET() - 1), opcode);
658 }
659 }
660#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 /* Main switch on opcode */
662
663 switch (opcode) {
664
665 /* BEWARE!
666 It is essential that any operation that fails sets either
667 x to NULL, err to nonzero, or why to anything but WHY_NOT,
668 and that no operation that succeeds does this! */
669
670 /* case STOP_CODE: this is an error! */
671
672 case POP_TOP:
673 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000674 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000675 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000676
677 case ROT_TWO:
678 v = POP();
679 w = POP();
680 PUSH(v);
681 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000682 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000683
684 case ROT_THREE:
685 v = POP();
686 w = POP();
687 x = POP();
688 PUSH(v);
689 PUSH(x);
690 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000691 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000692
Thomas Wouters434d0822000-08-24 20:11:32 +0000693 case ROT_FOUR:
694 u = POP();
695 v = POP();
696 w = POP();
697 x = POP();
698 PUSH(u);
699 PUSH(x);
700 PUSH(w);
701 PUSH(v);
702 continue;
703
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 case DUP_TOP:
705 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000706 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000708 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000709
Thomas Wouters434d0822000-08-24 20:11:32 +0000710 case DUP_TOPX:
711 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000712 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000713 x = TOP();
714 Py_INCREF(x);
715 PUSH(x);
716 continue;
717 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000718 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000719 Py_INCREF(x);
720 w = TOP();
721 Py_INCREF(w);
722 PUSH(x);
723 PUSH(w);
724 PUSH(x);
725 continue;
726 case 3:
727 x = POP();
728 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000729 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000730 Py_INCREF(w);
731 v = TOP();
732 Py_INCREF(v);
733 PUSH(w);
734 PUSH(x);
735 PUSH(v);
736 PUSH(w);
737 PUSH(x);
738 continue;
739 case 4:
740 x = POP();
741 Py_INCREF(x);
742 w = POP();
743 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000744 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000745 Py_INCREF(v);
746 u = TOP();
747 Py_INCREF(u);
748 PUSH(v);
749 PUSH(w);
750 PUSH(x);
751 PUSH(u);
752 PUSH(v);
753 PUSH(w);
754 PUSH(x);
755 continue;
756 case 5:
757 x = POP();
758 Py_INCREF(x);
759 w = POP();
760 Py_INCREF(w);
761 v = POP();
762 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000764 Py_INCREF(u);
765 t = TOP();
766 Py_INCREF(t);
767 PUSH(u);
768 PUSH(v);
769 PUSH(w);
770 PUSH(x);
771 PUSH(t);
772 PUSH(u);
773 PUSH(v);
774 PUSH(w);
775 PUSH(x);
776 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000777 default:
Thomas Wouters8fb62a22000-10-11 23:20:09 +0000778 Py_FatalError("invalid argument to DUP_TOPX (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000779 }
Tim Peters35ba6892000-10-11 07:04:49 +0000780 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000781
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 case UNARY_POSITIVE:
783 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000784 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000785 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000786 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000787 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 break;
789
790 case UNARY_NEGATIVE:
791 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000792 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000793 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000795 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000796 break;
797
798 case UNARY_NOT:
799 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000800 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000801 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000802 if (err == 0) {
803 Py_INCREF(Py_True);
804 PUSH(Py_True);
805 continue;
806 }
807 else if (err > 0) {
808 Py_INCREF(Py_False);
809 PUSH(Py_False);
810 err = 0;
811 continue;
812 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 break;
814
815 case UNARY_CONVERT:
816 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000817 x = PyObject_Repr(v);
818 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000820 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000821 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000822
823 case UNARY_INVERT:
824 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000825 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000826 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000827 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000828 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000829 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000830
Guido van Rossum50564e81996-01-12 01:13:16 +0000831 case BINARY_POWER:
832 w = POP();
833 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000834 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000835 Py_DECREF(v);
836 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000837 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000838 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000839 break;
840
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 case BINARY_MULTIPLY:
842 w = POP();
843 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000844 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(v);
846 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000848 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 break;
850
851 case BINARY_DIVIDE:
852 w = POP();
853 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
856 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000858 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 break;
860
861 case BINARY_MODULO:
862 w = POP();
863 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000864 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000865 Py_DECREF(v);
866 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000868 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
870
871 case BINARY_ADD:
872 w = POP();
873 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000874 if (PyInt_Check(v) && PyInt_Check(w)) {
875 /* INLINE: int + int */
876 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000877 a = PyInt_AS_LONG(v);
878 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000879 i = a + b;
880 if ((i^a) < 0 && (i^b) < 0) {
881 PyErr_SetString(PyExc_OverflowError,
882 "integer addition");
883 x = NULL;
884 }
885 else
886 x = PyInt_FromLong(i);
887 }
888 else
889 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000890 Py_DECREF(v);
891 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 break;
895
896 case BINARY_SUBTRACT:
897 w = POP();
898 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000899 if (PyInt_Check(v) && PyInt_Check(w)) {
900 /* INLINE: int - int */
901 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000902 a = PyInt_AS_LONG(v);
903 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000904 i = a - b;
905 if ((i^a) < 0 && (i^~b) < 0) {
906 PyErr_SetString(PyExc_OverflowError,
907 "integer subtraction");
908 x = NULL;
909 }
910 else
911 x = PyInt_FromLong(i);
912 }
913 else
914 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 Py_DECREF(v);
916 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000918 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 break;
920
921 case BINARY_SUBSCR:
922 w = POP();
923 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000924 if (PyList_Check(v) && PyInt_Check(w)) {
925 /* INLINE: list[int] */
926 long i = PyInt_AsLong(w);
927 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000928 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000929 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000930 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000931 PyErr_SetString(PyExc_IndexError,
932 "list index out of range");
933 x = NULL;
934 }
935 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000936 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000937 Py_INCREF(x);
938 }
939 }
940 else
941 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 break;
947
Guido van Rossum7928cd71991-10-24 14:59:31 +0000948 case BINARY_LSHIFT:
949 w = POP();
950 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000951 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000954 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000956 break;
957
958 case BINARY_RSHIFT:
959 w = POP();
960 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000961 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(v);
963 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000964 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000965 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000966 break;
967
968 case BINARY_AND:
969 w = POP();
970 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000971 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000972 Py_DECREF(v);
973 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000974 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000975 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000976 break;
977
978 case BINARY_XOR:
979 w = POP();
980 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000981 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(v);
983 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000984 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000986 break;
987
988 case BINARY_OR:
989 w = POP();
990 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000991 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_DECREF(v);
993 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000995 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000996 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000997
998 case INPLACE_POWER:
999 w = POP();
1000 v = POP();
1001 x = PyNumber_InPlacePower(v, w, Py_None);
1002 Py_DECREF(v);
1003 Py_DECREF(w);
1004 PUSH(x);
1005 if (x != NULL) continue;
1006 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001007
Thomas Wouters434d0822000-08-24 20:11:32 +00001008 case INPLACE_MULTIPLY:
1009 w = POP();
1010 v = POP();
1011 x = PyNumber_InPlaceMultiply(v, w);
1012 Py_DECREF(v);
1013 Py_DECREF(w);
1014 PUSH(x);
1015 if (x != NULL) continue;
1016 break;
1017
1018 case INPLACE_DIVIDE:
1019 w = POP();
1020 v = POP();
1021 x = PyNumber_InPlaceDivide(v, w);
1022 Py_DECREF(v);
1023 Py_DECREF(w);
1024 PUSH(x);
1025 if (x != NULL) continue;
1026 break;
1027
1028 case INPLACE_MODULO:
1029 w = POP();
1030 v = POP();
1031 x = PyNumber_InPlaceRemainder(v, w);
1032 Py_DECREF(v);
1033 Py_DECREF(w);
1034 PUSH(x);
1035 if (x != NULL) continue;
1036 break;
1037
1038 case INPLACE_ADD:
1039 w = POP();
1040 v = POP();
1041 if (PyInt_Check(v) && PyInt_Check(w)) {
1042 /* INLINE: int + int */
1043 register long a, b, i;
1044 a = PyInt_AS_LONG(v);
1045 b = PyInt_AS_LONG(w);
1046 i = a + b;
1047 if ((i^a) < 0 && (i^b) < 0) {
1048 PyErr_SetString(PyExc_OverflowError,
1049 "integer addition");
1050 x = NULL;
1051 }
1052 else
1053 x = PyInt_FromLong(i);
1054 }
1055 else
1056 x = PyNumber_InPlaceAdd(v, w);
1057 Py_DECREF(v);
1058 Py_DECREF(w);
1059 PUSH(x);
1060 if (x != NULL) continue;
1061 break;
1062
1063 case INPLACE_SUBTRACT:
1064 w = POP();
1065 v = POP();
1066 if (PyInt_Check(v) && PyInt_Check(w)) {
1067 /* INLINE: int - int */
1068 register long a, b, i;
1069 a = PyInt_AS_LONG(v);
1070 b = PyInt_AS_LONG(w);
1071 i = a - b;
1072 if ((i^a) < 0 && (i^~b) < 0) {
1073 PyErr_SetString(PyExc_OverflowError,
1074 "integer subtraction");
1075 x = NULL;
1076 }
1077 else
1078 x = PyInt_FromLong(i);
1079 }
1080 else
1081 x = PyNumber_InPlaceSubtract(v, w);
1082 Py_DECREF(v);
1083 Py_DECREF(w);
1084 PUSH(x);
1085 if (x != NULL) continue;
1086 break;
1087
1088 case INPLACE_LSHIFT:
1089 w = POP();
1090 v = POP();
1091 x = PyNumber_InPlaceLshift(v, w);
1092 Py_DECREF(v);
1093 Py_DECREF(w);
1094 PUSH(x);
1095 if (x != NULL) continue;
1096 break;
1097
1098 case INPLACE_RSHIFT:
1099 w = POP();
1100 v = POP();
1101 x = PyNumber_InPlaceRshift(v, w);
1102 Py_DECREF(v);
1103 Py_DECREF(w);
1104 PUSH(x);
1105 if (x != NULL) continue;
1106 break;
1107
1108 case INPLACE_AND:
1109 w = POP();
1110 v = POP();
1111 x = PyNumber_InPlaceAnd(v, w);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
1117
1118 case INPLACE_XOR:
1119 w = POP();
1120 v = POP();
1121 x = PyNumber_InPlaceXor(v, w);
1122 Py_DECREF(v);
1123 Py_DECREF(w);
1124 PUSH(x);
1125 if (x != NULL) continue;
1126 break;
1127
1128 case INPLACE_OR:
1129 w = POP();
1130 v = POP();
1131 x = PyNumber_InPlaceOr(v, w);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
1134 PUSH(x);
1135 if (x != NULL) continue;
1136 break;
1137
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 case SLICE+0:
1139 case SLICE+1:
1140 case SLICE+2:
1141 case SLICE+3:
1142 if ((opcode-SLICE) & 2)
1143 w = POP();
1144 else
1145 w = NULL;
1146 if ((opcode-SLICE) & 1)
1147 v = POP();
1148 else
1149 v = NULL;
1150 u = POP();
1151 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 Py_DECREF(u);
1153 Py_XDECREF(v);
1154 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001156 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 break;
1158
1159 case STORE_SLICE+0:
1160 case STORE_SLICE+1:
1161 case STORE_SLICE+2:
1162 case STORE_SLICE+3:
1163 if ((opcode-STORE_SLICE) & 2)
1164 w = POP();
1165 else
1166 w = NULL;
1167 if ((opcode-STORE_SLICE) & 1)
1168 v = POP();
1169 else
1170 v = NULL;
1171 u = POP();
1172 t = POP();
1173 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001174 Py_DECREF(t);
1175 Py_DECREF(u);
1176 Py_XDECREF(v);
1177 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001178 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 break;
1180
1181 case DELETE_SLICE+0:
1182 case DELETE_SLICE+1:
1183 case DELETE_SLICE+2:
1184 case DELETE_SLICE+3:
1185 if ((opcode-DELETE_SLICE) & 2)
1186 w = POP();
1187 else
1188 w = NULL;
1189 if ((opcode-DELETE_SLICE) & 1)
1190 v = POP();
1191 else
1192 v = NULL;
1193 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001194 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 Py_DECREF(u);
1197 Py_XDECREF(v);
1198 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001199 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 break;
1201
1202 case STORE_SUBSCR:
1203 w = POP();
1204 v = POP();
1205 u = POP();
1206 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001207 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001208 Py_DECREF(u);
1209 Py_DECREF(v);
1210 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001211 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 break;
1213
1214 case DELETE_SUBSCR:
1215 w = POP();
1216 v = POP();
1217 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001218 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001219 Py_DECREF(v);
1220 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001221 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001223
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 case PRINT_EXPR:
1225 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001226 /* Print value except if None */
1227 /* After printing, also assign to '_' */
1228 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001230 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001231 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001232 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001233 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001234 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001235 if (x == NULL) {
1236 PyErr_SetString(
1237 PyExc_RuntimeError,
1238 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001239 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001240 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001241 }
1242 if (err == 0)
1243 err = PyFile_WriteObject(v, x, 0);
1244 if (err == 0) {
1245 PyFile_SoftSpace(x, 1);
1246 err = Py_FlushLine();
1247 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001248 if (err == 0) {
1249 err = PyDict_SetItemString(
1250 f->f_builtins, "_", v);
1251 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001253 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001254 break;
1255
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001256 case PRINT_ITEM_TO:
1257 w = stream = POP();
1258 /* fall through to PRINT_ITEM */
1259
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 case PRINT_ITEM:
1261 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001262 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001263 w = PySys_GetObject("stdout");
1264 if (w == NULL) {
1265 PyErr_SetString(PyExc_RuntimeError,
1266 "lost sys.stdout");
1267 err = -1;
1268 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001269 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001270 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001271 err = PyFile_WriteString(" ", w);
1272 if (err == 0)
1273 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001275 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 char *s = PyString_AsString(v);
1277 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001278 if (len > 0 &&
1279 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001280 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001281 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001284 Py_XDECREF(stream);
1285 stream = NULL;
1286 if (err == 0)
1287 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
1289
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001290 case PRINT_NEWLINE_TO:
1291 w = stream = POP();
1292 /* fall through to PRINT_NEWLINE */
1293
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001295 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001296 w = PySys_GetObject("stdout");
1297 if (w == NULL)
1298 PyErr_SetString(PyExc_RuntimeError,
1299 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001300 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001301 if (w != NULL) {
1302 err = PyFile_WriteString("\n", w);
1303 if (err == 0)
1304 PyFile_SoftSpace(w, 0);
1305 }
1306 Py_XDECREF(stream);
1307 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 break;
1309
Thomas Wouters434d0822000-08-24 20:11:32 +00001310
1311#ifdef CASE_TOO_BIG
1312 default: switch (opcode) {
1313#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 case BREAK_LOOP:
1315 why = WHY_BREAK;
1316 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001317
Guido van Rossumf10570b1995-07-07 22:53:21 +00001318 case RAISE_VARARGS:
1319 u = v = w = NULL;
1320 switch (oparg) {
1321 case 3:
1322 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001323 /* Fallthrough */
1324 case 2:
1325 v = POP(); /* value */
1326 /* Fallthrough */
1327 case 1:
1328 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001329 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001330 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001331 break;
1332 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001333 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001334 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001335 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001336 break;
1337 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 break;
1339
1340 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001341 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001342 PyErr_SetString(PyExc_SystemError,
1343 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001344 break;
1345 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001347 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 break;
1349
1350 case RETURN_VALUE:
1351 retval = POP();
1352 why = WHY_RETURN;
1353 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001354
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001355 case EXEC_STMT:
1356 w = POP();
1357 v = POP();
1358 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001359 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 Py_DECREF(u);
1361 Py_DECREF(v);
1362 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001363 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001364
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 case POP_BLOCK:
1366 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001367 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 while (STACK_LEVEL() > b->b_level) {
1369 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 }
1372 }
1373 break;
1374
1375 case END_FINALLY:
1376 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 if (PyInt_Check(v)) {
1378 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 if (why == WHY_RETURN)
1380 retval = POP();
1381 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001384 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001385 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001387 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 else if (v != Py_None) {
1390 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 "'finally' pops bad exception");
1392 why = WHY_EXCEPTION;
1393 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001394 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 break;
1396
1397 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001398 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001400 w = POP();
1401 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001403 Py_DECREF(u);
1404 Py_DECREF(v);
1405 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 break;
1407
1408 case STORE_NAME:
1409 w = GETNAMEV(oparg);
1410 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001411 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001412 PyErr_SetString(PyExc_SystemError,
1413 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001414 break;
1415 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 err = PyDict_SetItem(x, w, v);
1417 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 break;
1419
1420 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001421 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001422 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001423 PyErr_SetString(PyExc_SystemError,
1424 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001425 break;
1426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001428 format_exc_check_arg(PyExc_NameError,
1429 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001431
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001432 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001434 if (PyTuple_Check(v)) {
1435 if (PyTuple_Size(v) != oparg) {
1436 PyErr_SetString(PyExc_ValueError,
1437 "unpack tuple of wrong size");
1438 why = WHY_EXCEPTION;
1439 }
1440 else {
1441 for (; --oparg >= 0; ) {
1442 w = PyTuple_GET_ITEM(v, oparg);
1443 Py_INCREF(w);
1444 PUSH(w);
1445 }
1446 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001448 else if (PyList_Check(v)) {
1449 if (PyList_Size(v) != oparg) {
1450 PyErr_SetString(PyExc_ValueError,
1451 "unpack list of wrong size");
1452 why = WHY_EXCEPTION;
1453 }
1454 else {
1455 for (; --oparg >= 0; ) {
1456 w = PyList_GET_ITEM(v, oparg);
1457 Py_INCREF(w);
1458 PUSH(w);
1459 }
1460 }
1461 }
1462 else if (PySequence_Check(v)) {
1463 if (unpack_sequence(v, oparg,
1464 stack_pointer + oparg))
1465 stack_pointer += oparg;
1466 else
1467 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 }
1469 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001470 PyErr_SetString(PyExc_TypeError,
1471 "unpack non-sequence");
1472 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 break;
1476
1477 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001478 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 v = POP();
1480 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1482 Py_DECREF(v);
1483 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 break;
1485
1486 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001487 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001489 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1490 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 break;
1493
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001494 case STORE_GLOBAL:
1495 w = GETNAMEV(oparg);
1496 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 err = PyDict_SetItem(f->f_globals, w, v);
1498 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001499 break;
1500
1501 case DELETE_GLOBAL:
1502 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001504 format_exc_check_arg(
1505 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001506 break;
1507
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 case LOAD_CONST:
1509 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 PUSH(x);
1512 break;
1513
1514 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001515 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001516 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001517 PyErr_SetString(PyExc_SystemError,
1518 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 break;
1520 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001521 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001527 format_exc_check_arg(
1528 PyExc_NameError,
1529 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
1531 }
1532 }
1533 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 PUSH(x);
1536 break;
1537
1538 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001539 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001540 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001544 format_exc_check_arg(
1545 PyExc_NameError,
1546 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 break;
1548 }
1549 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 PUSH(x);
1552 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001553
Guido van Rossum9bfef441993-03-29 10:43:31 +00001554 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001556 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001557 format_exc_check_arg(
1558 PyExc_UnboundLocalError,
1559 UNBOUNDLOCAL_ERROR_MSG,
1560 PyTuple_GetItem(co->co_varnames, oparg)
1561 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001562 break;
1563 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001565 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001566 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001567 break;
1568
1569 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001570 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001571 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001572 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001573
1574 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001575 x = GETLOCAL(oparg);
1576 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001577 format_exc_check_arg(
1578 PyExc_UnboundLocalError,
1579 UNBOUNDLOCAL_ERROR_MSG,
1580 PyTuple_GetItem(co->co_varnames, oparg)
1581 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001582 break;
1583 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001585 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001586
1587 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 if (x != NULL) {
1590 for (; --oparg >= 0;) {
1591 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 }
1594 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001595 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 }
1597 break;
1598
1599 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 if (x != NULL) {
1602 for (; --oparg >= 0;) {
1603 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001604 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 }
1606 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001607 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 }
1609 break;
1610
1611 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001612 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001613 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001614 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 break;
1616
1617 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001618 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 x = PyObject_GetAttr(v, w);
1621 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001622 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001623 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001624 break;
1625
1626 case COMPARE_OP:
1627 w = POP();
1628 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001629 if (PyInt_Check(v) && PyInt_Check(w)) {
1630 /* INLINE: cmp(int, int) */
1631 register long a, b;
1632 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001633 a = PyInt_AS_LONG(v);
1634 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001635 switch (oparg) {
1636 case LT: res = a < b; break;
1637 case LE: res = a <= b; break;
1638 case EQ: res = a == b; break;
1639 case NE: res = a != b; break;
1640 case GT: res = a > b; break;
1641 case GE: res = a >= b; break;
1642 case IS: res = v == w; break;
1643 case IS_NOT: res = v != w; break;
1644 default: goto slow_compare;
1645 }
1646 x = res ? Py_True : Py_False;
1647 Py_INCREF(x);
1648 }
1649 else {
1650 slow_compare:
1651 x = cmp_outcome(oparg, v, w);
1652 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 Py_DECREF(v);
1654 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001656 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 break;
1658
1659 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001660 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001662 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001664 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001665 break;
1666 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001667 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001669 w,
1670 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001671 f->f_locals == NULL ?
1672 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001675 if (w == NULL) {
1676 x = NULL;
1677 break;
1678 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001679 x = PyEval_CallObject(x, w);
1680 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001681 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001682 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 break;
1684
Thomas Wouters52152252000-08-17 22:55:00 +00001685 case IMPORT_STAR:
1686 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001688 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001689 PyErr_SetString(PyExc_SystemError,
1690 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001691 break;
1692 }
Thomas Wouters52152252000-08-17 22:55:00 +00001693 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001694 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001695 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001696 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001698
Thomas Wouters52152252000-08-17 22:55:00 +00001699 case IMPORT_FROM:
1700 w = GETNAMEV(oparg);
1701 v = TOP();
1702 x = import_from(v, w);
1703 PUSH(x);
1704 if (x != NULL) continue;
1705 break;
1706
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 case JUMP_FORWARD:
1708 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001709 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001710
1711 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001712 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001713 if (err > 0)
1714 err = 0;
1715 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001717 else
1718 break;
1719 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001720
1721 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001723 if (err > 0) {
1724 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001726 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001727 else if (err == 0)
1728 ;
1729 else
1730 break;
1731 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001732
1733 case JUMP_ABSOLUTE:
1734 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001735 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001736
1737 case FOR_LOOP:
1738 /* for v in s: ...
1739 On entry: stack contains s, i.
1740 On exit: stack contains s, i+1, s[i];
1741 but if loop exhausted:
1742 s, i are popped, and we jump */
1743 w = POP(); /* Loop index */
1744 v = POP(); /* Sequence object */
1745 u = loop_subscript(v, w);
1746 if (u != NULL) {
1747 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001752 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 }
1754 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001755 Py_DECREF(v);
1756 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 /* A NULL can mean "s exhausted"
1758 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001761 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001763 continue;
1764 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 }
1766 break;
1767
1768 case SETUP_LOOP:
1769 case SETUP_EXCEPT:
1770 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001771 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001773 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001774
1775 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001776#ifdef LLTRACE
1777 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001778 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001779#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001780 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001781 if (f->f_trace == NULL)
1782 continue;
1783 /* Trace each line of code reached */
1784 f->f_lasti = INSTR_OFFSET();
1785 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001786 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001788
1789 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001790 case CALL_FUNCTION_VAR:
1791 case CALL_FUNCTION_KW:
1792 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001793 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001794 int na = oparg & 0xff;
1795 int nk = (oparg>>8) & 0xff;
1796 int flags = (opcode - CALL_FUNCTION) & 3;
1797 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1798 PyObject **pfunc = stack_pointer - n - 1;
1799 PyObject *func = *pfunc;
1800 PyObject *self = NULL;
1801 PyObject *class = NULL;
1802 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1803 if (PyMethod_Check(func)) {
1804 self = PyMethod_Self(func);
1805 class = PyMethod_Class(func);
1806 func = PyMethod_Function(func);
1807 Py_INCREF(func);
1808 if (self != NULL) {
1809 Py_INCREF(self);
1810 Py_DECREF(*pfunc);
1811 *pfunc = self;
1812 na++;
1813 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001814 }
1815 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001816 /* Unbound methods must be called with an
1817 instance of the class (or a derived
1818 class) as first argument */
1819 if (na > 0 && (self = stack_pointer[-n]) != NULL
1820 && PyInstance_Check(self)
1821 && PyClass_IsSubclass((PyObject *)
1822 (((PyInstanceObject *)self)->in_class),
1823 class))
1824 /* Handy-dandy */ ;
1825 else {
1826 PyErr_SetString(PyExc_TypeError,
1827 "unbound method must be called with class instance 1st argument");
1828 x = NULL;
1829 break;
1830 }
1831 }
1832 }
1833 else
1834 Py_INCREF(func);
1835 if (PyFunction_Check(func) && flags == 0) {
1836 PyObject *co = PyFunction_GetCode(func);
1837 PyObject *globals = PyFunction_GetGlobals(func);
1838 PyObject *argdefs = PyFunction_GetDefaults(func);
1839 PyObject **d;
1840 int nd;
1841 if (argdefs != NULL) {
1842 d = &PyTuple_GET_ITEM(argdefs, 0);
1843 nd = ((PyTupleObject *)argdefs)->ob_size;
1844 }
1845 else {
1846 d = NULL;
1847 nd = 0;
1848 }
1849 x = eval_code2((PyCodeObject *)co, globals,
1850 (PyObject *)NULL, stack_pointer-n, na,
1851 stack_pointer-2*nk, nk, d, nd,
1852 class);
1853 }
1854 else {
1855 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001856 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001857 PyObject *stararg = 0;
1858 PyObject *kwdict = NULL;
1859 if (flags & 2) {
1860 kwdict = POP();
1861 if (!PyDict_Check(kwdict)) {
1862 PyErr_SetString(PyExc_TypeError,
1863 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001864 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001865 }
1866 }
1867 if (flags & 1) {
1868 stararg = POP();
1869 if (!PySequence_Check(stararg)) {
1870 PyErr_SetString(PyExc_TypeError,
1871 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001872 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001873 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001874 /* Convert abstract sequence to concrete tuple */
1875 if (!PyTuple_Check(stararg)) {
1876 PyObject *t = NULL;
1877 t = PySequence_Tuple(stararg);
1878 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001879 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001880 }
1881 Py_DECREF(stararg);
1882 stararg = t;
1883 }
1884 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001885 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001886 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001887 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001888 }
1889 if (nk > 0) {
1890 if (kwdict == NULL) {
1891 kwdict = PyDict_New();
1892 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001893 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001894 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001895 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001896 else {
1897 PyObject *d = PyDict_Copy(kwdict);
1898 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001899 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001900 }
1901 Py_DECREF(kwdict);
1902 kwdict = d;
1903 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001904 err = 0;
1905 while (--nk >= 0) {
1906 PyObject *value = POP();
1907 PyObject *key = POP();
1908 if (PyDict_GetItem(kwdict, key) != NULL) {
1909 err = 1;
1910 PyErr_Format(PyExc_TypeError,
1911 "keyword parameter redefined: %.400s",
1912 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001913 Py_DECREF(key);
1914 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001915 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001916 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001917 err = PyDict_SetItem(kwdict, key, value);
1918 Py_DECREF(key);
1919 Py_DECREF(value);
1920 if (err)
1921 break;
1922 }
1923 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001924 extcall_fail:
1925 Py_XDECREF(kwdict);
1926 Py_XDECREF(stararg);
1927 Py_DECREF(func);
1928 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001929 break;
1930 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001931 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001932 callargs = PyTuple_New(na + nstar);
1933 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001934 x = NULL;
1935 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001936 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001937 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001938 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001939 for (i = 0; i < nstar; i++) {
1940 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1941 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001942 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001943 }
1944 Py_DECREF(stararg);
1945 }
1946 while (--na >= 0) {
1947 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001948 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001949 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001950 x = PyEval_CallObjectWithKeywords(func,
1951 callargs,
1952 kwdict);
1953 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001954 Py_XDECREF(kwdict);
1955 }
1956 Py_DECREF(func);
1957 while (stack_pointer > pfunc) {
1958 w = POP();
1959 Py_DECREF(w);
1960 }
1961 PUSH(x);
1962 if (x != NULL) continue;
1963 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001964 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001965
Guido van Rossum681d79a1995-07-18 14:51:37 +00001966 case MAKE_FUNCTION:
1967 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001968 x = PyFunction_New(v, f->f_globals);
1969 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001970 /* XXX Maybe this should be a separate opcode? */
1971 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001973 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001974 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001975 x = NULL;
1976 break;
1977 }
1978 while (--oparg >= 0) {
1979 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001980 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001981 }
1982 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001983 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001984 }
1985 PUSH(x);
1986 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001987
1988 case BUILD_SLICE:
1989 if (oparg == 3)
1990 w = POP();
1991 else
1992 w = NULL;
1993 v = POP();
1994 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001995 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 Py_DECREF(u);
1997 Py_DECREF(v);
1998 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001999 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002000 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002001 break;
2002
Fred Drakeef8ace32000-08-24 00:32:09 +00002003 case EXTENDED_ARG:
2004 opcode = NEXTOP();
2005 oparg = oparg<<16 | NEXTARG();
2006 goto dispatch_opcode;
2007 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002008
Guido van Rossum374a9221991-04-04 10:40:29 +00002009 default:
2010 fprintf(stderr,
2011 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002012 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002014 why = WHY_EXCEPTION;
2015 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002016
2017#ifdef CASE_TOO_BIG
2018 }
2019#endif
2020
Guido van Rossum374a9221991-04-04 10:40:29 +00002021 } /* switch */
2022
2023 on_error:
2024
2025 /* Quickly continue if no error occurred */
2026
2027 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002028 if (err == 0 && x != NULL) {
2029#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002030 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002031 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032 fprintf(stderr,
2033 "XXX undetected error\n");
2034 else
2035#endif
2036 continue; /* Normal, fast path */
2037 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002038 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002039 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002040 err = 0;
2041 }
2042
Guido van Rossum374a9221991-04-04 10:40:29 +00002043 /* Double-check exception status */
2044
2045 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002046 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002047 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002048 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002049 why = WHY_EXCEPTION;
2050 }
2051 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002052#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002053 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002054 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002055 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002056 fprintf(stderr,
2057 "XXX undetected error (why=%d)\n",
2058 why);
2059 why = WHY_EXCEPTION;
2060 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002061 }
2062#endif
2063
2064 /* Log traceback info if this is a real exception */
2065
2066 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002067 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002068 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002069 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002071
Guido van Rossume59214e1994-08-30 08:01:59 +00002072 if (f->f_trace)
2073 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002074 if (tstate->sys_profilefunc)
2075 call_exc_trace(&tstate->sys_profilefunc,
2076 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002077 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002078
2079 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2080
2081 if (why == WHY_RERAISE)
2082 why = WHY_EXCEPTION;
2083
2084 /* Unwind stacks if a (pseudo) exception occurred */
2085
2086 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 while (STACK_LEVEL() > b->b_level) {
2089 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 }
2092 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2093 why = WHY_NOT;
2094 JUMPTO(b->b_handler);
2095 break;
2096 }
2097 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002098 (b->b_type == SETUP_EXCEPT &&
2099 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002100 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002101 PyObject *exc, *val, *tb;
2102 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 val = Py_None;
2105 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002106 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002107 /* Make the raw exception data
2108 available to the handler,
2109 so a program can emulate the
2110 Python main loop. Don't do
2111 this for 'finally'. */
2112 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002113 PyErr_NormalizeException(
2114 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002115 set_exc_info(tstate,
2116 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002117 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 PUSH(val);
2120 PUSH(exc);
2121 }
2122 else {
2123 if (why == WHY_RETURN)
2124 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002126 PUSH(v);
2127 }
2128 why = WHY_NOT;
2129 JUMPTO(b->b_handler);
2130 break;
2131 }
2132 } /* unwind stack */
2133
2134 /* End the loop if we still have an error (or return) */
2135
2136 if (why != WHY_NOT)
2137 break;
2138
2139 } /* main loop */
2140
2141 /* Pop remaining stack entries */
2142
2143 while (!EMPTY()) {
2144 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002146 }
2147
Guido van Rossum96a42c81992-01-12 02:29:51 +00002148 if (why != WHY_RETURN)
2149 retval = NULL;
2150
Guido van Rossume59214e1994-08-30 08:01:59 +00002151 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002152 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002153 if (call_trace(&f->f_trace, &f->f_trace, f,
2154 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002155 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002156 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002157 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002158 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002159 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002160 }
2161
Guido van Rossuma027efa1997-05-05 20:56:21 +00002162 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2163 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002164 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002166 retval = NULL;
2167 why = WHY_EXCEPTION;
2168 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002169 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002170
Guido van Rossuma027efa1997-05-05 20:56:21 +00002171 reset_exc_info(tstate);
2172
2173 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002174
2175 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002176
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002178
Guido van Rossuma027efa1997-05-05 20:56:21 +00002179 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002181
Guido van Rossum96a42c81992-01-12 02:29:51 +00002182 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002183}
2184
Guido van Rossuma027efa1997-05-05 20:56:21 +00002185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002186set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002187{
2188 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002189 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002190
Guido van Rossuma027efa1997-05-05 20:56:21 +00002191 frame = tstate->frame;
2192 if (frame->f_exc_type == NULL) {
2193 /* This frame didn't catch an exception before */
2194 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002195 if (tstate->exc_type == NULL) {
2196 Py_INCREF(Py_None);
2197 tstate->exc_type = Py_None;
2198 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002199 tmp_type = frame->f_exc_type;
2200 tmp_value = frame->f_exc_value;
2201 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002202 Py_XINCREF(tstate->exc_type);
2203 Py_XINCREF(tstate->exc_value);
2204 Py_XINCREF(tstate->exc_traceback);
2205 frame->f_exc_type = tstate->exc_type;
2206 frame->f_exc_value = tstate->exc_value;
2207 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002208 Py_XDECREF(tmp_type);
2209 Py_XDECREF(tmp_value);
2210 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002211 }
2212 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002213 tmp_type = tstate->exc_type;
2214 tmp_value = tstate->exc_value;
2215 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002216 Py_XINCREF(type);
2217 Py_XINCREF(value);
2218 Py_XINCREF(tb);
2219 tstate->exc_type = type;
2220 tstate->exc_value = value;
2221 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002222 Py_XDECREF(tmp_type);
2223 Py_XDECREF(tmp_value);
2224 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002225 /* For b/w compatibility */
2226 PySys_SetObject("exc_type", type);
2227 PySys_SetObject("exc_value", value);
2228 PySys_SetObject("exc_traceback", tb);
2229}
2230
2231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002232reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002233{
2234 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002235 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 frame = tstate->frame;
2237 if (frame->f_exc_type != NULL) {
2238 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002239 tmp_type = tstate->exc_type;
2240 tmp_value = tstate->exc_value;
2241 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002242 Py_XINCREF(frame->f_exc_type);
2243 Py_XINCREF(frame->f_exc_value);
2244 Py_XINCREF(frame->f_exc_traceback);
2245 tstate->exc_type = frame->f_exc_type;
2246 tstate->exc_value = frame->f_exc_value;
2247 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002248 Py_XDECREF(tmp_type);
2249 Py_XDECREF(tmp_value);
2250 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002251 /* For b/w compatibility */
2252 PySys_SetObject("exc_type", frame->f_exc_type);
2253 PySys_SetObject("exc_value", frame->f_exc_value);
2254 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2255 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002256 tmp_type = frame->f_exc_type;
2257 tmp_value = frame->f_exc_value;
2258 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002259 frame->f_exc_type = NULL;
2260 frame->f_exc_value = NULL;
2261 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002262 Py_XDECREF(tmp_type);
2263 Py_XDECREF(tmp_value);
2264 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002265}
2266
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002267/* Logic for the raise statement (too complicated for inlining).
2268 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002269static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002270do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002271{
Guido van Rossumd295f121998-04-09 21:39:57 +00002272 if (type == NULL) {
2273 /* Reraise */
2274 PyThreadState *tstate = PyThreadState_Get();
2275 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2276 value = tstate->exc_value;
2277 tb = tstate->exc_traceback;
2278 Py_XINCREF(type);
2279 Py_XINCREF(value);
2280 Py_XINCREF(tb);
2281 }
2282
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002283 /* We support the following forms of raise:
2284 raise <class>, <classinstance>
2285 raise <class>, <argument tuple>
2286 raise <class>, None
2287 raise <class>, <argument>
2288 raise <classinstance>, None
2289 raise <string>, <object>
2290 raise <string>, None
2291
2292 An omitted second argument is the same as None.
2293
2294 In addition, raise <tuple>, <anything> is the same as
2295 raising the tuple's first item (and it better have one!);
2296 this rule is applied recursively.
2297
2298 Finally, an optional third argument can be supplied, which
2299 gives the traceback to be substituted (useful when
2300 re-raising an exception after examining it). */
2301
2302 /* First, check the traceback argument, replacing None with
2303 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002304 if (tb == Py_None) {
2305 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002306 tb = NULL;
2307 }
2308 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002310 "raise 3rd arg must be traceback or None");
2311 goto raise_error;
2312 }
2313
2314 /* Next, replace a missing value with None */
2315 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 value = Py_None;
2317 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002318 }
2319
2320 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2322 PyObject *tmp = type;
2323 type = PyTuple_GET_ITEM(type, 0);
2324 Py_INCREF(type);
2325 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002326 }
2327
Barry Warsaw4249f541997-08-22 21:26:19 +00002328 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002329 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002330
2331 else if (PyClass_Check(type))
2332 PyErr_NormalizeException(&type, &value, &tb);
2333
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002335 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002336 if (value != Py_None) {
2337 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002338 "instance exception may not have a separate value");
2339 goto raise_error;
2340 }
2341 else {
2342 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002343 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002344 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002345 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2346 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002347 }
2348 }
2349 else {
2350 /* Not something you can raise. You get an exception
2351 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002353 "exceptions must be strings, classes, or instances");
2354 goto raise_error;
2355 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002357 if (tb == NULL)
2358 return WHY_EXCEPTION;
2359 else
2360 return WHY_RERAISE;
2361 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 Py_XDECREF(value);
2363 Py_XDECREF(type);
2364 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002365 return WHY_EXCEPTION;
2366}
2367
Barry Warsawe42b18f1997-08-25 22:13:04 +00002368static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002369unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002370{
2371 int i;
2372 PyObject *w;
2373
2374 for (i = 0; i < argcnt; i++) {
2375 if (! (w = PySequence_GetItem(v, i))) {
2376 if (PyErr_ExceptionMatches(PyExc_IndexError))
2377 PyErr_SetString(PyExc_ValueError,
2378 "unpack sequence of wrong size");
2379 goto finally;
2380 }
2381 *--sp = w;
2382 }
2383 /* we better get an IndexError now */
2384 if (PySequence_GetItem(v, i) == NULL) {
2385 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2386 PyErr_Clear();
2387 return 1;
2388 }
2389 /* some other exception occurred. fall through to finally */
2390 }
2391 else
2392 PyErr_SetString(PyExc_ValueError,
2393 "unpack sequence of wrong size");
2394 /* fall through */
2395finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002396 for (; i > 0; i--, sp++)
2397 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002398
2399 return 0;
2400}
2401
2402
Guido van Rossum96a42c81992-01-12 02:29:51 +00002403#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002405prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002407 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 if (PyObject_Print(v, stdout, 0) != 0)
2409 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002410 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002411 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002413#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002415static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002416call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002417{
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002419 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002421 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 value = Py_None;
2423 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002424 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002426 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002428 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002429 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002430 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002432 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002434 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002435 Py_XDECREF(type);
2436 Py_XDECREF(value);
2437 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002438 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002439}
2440
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441/* PyObject **p_trace: in/out; may not be NULL;
2442 may not point to NULL variable initially
2443 PyObject **p_newtrace: in/out; may be NULL;
2444 may point to NULL variable;
2445 may be same variable as p_newtrace */
2446
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002447static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002448call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2449 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002450{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002451 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 PyObject *args, *what;
2453 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002454
Guido van Rossuma027efa1997-05-05 20:56:21 +00002455 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002456 /* Don't do recursive traces */
2457 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002459 *p_newtrace = NULL;
2460 }
2461 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002462 }
2463
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002465 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002466 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002467 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002468 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002469 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 Py_INCREF(f);
2471 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2472 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002473 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002474 arg = Py_None;
2475 Py_INCREF(arg);
2476 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002477 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002478 PyFrame_FastToLocals(f);
2479 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2480 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002481 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002482 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002484 if (res == NULL) {
2485 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002486 PyTraceBack_Here(f);
2487 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002488 *p_trace = NULL;
2489 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002491 *p_newtrace = NULL;
2492 }
Barry Warsawf6202631999-09-08 16:26:33 +00002493 /* to be extra double plus sure we don't get recursive
2494 * calls inf either tracefunc or profilefunc gets an
2495 * exception, zap the global variables.
2496 */
2497 Py_XDECREF(tstate->sys_tracefunc);
2498 tstate->sys_tracefunc = NULL;
2499 Py_XDECREF(tstate->sys_profilefunc);
2500 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002501 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002502 }
2503 else {
2504 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002505 Py_XDECREF(*p_newtrace);
2506 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002507 *p_newtrace = NULL;
2508 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002509 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002510 *p_newtrace = res;
2511 }
2512 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002514 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002515 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002516}
2517
Guido van Rossumb209a111997-04-29 18:18:01 +00002518PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002519PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002520{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002521 PyThreadState *tstate = PyThreadState_Get();
2522 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002523 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002524 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002525 else
2526 return current_frame->f_builtins;
2527}
2528
Guido van Rossumb209a111997-04-29 18:18:01 +00002529PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002531{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002532 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002533 if (current_frame == NULL)
2534 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002536 return current_frame->f_locals;
2537}
2538
Guido van Rossumb209a111997-04-29 18:18:01 +00002539PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002540PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002541{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002542 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002543 if (current_frame == NULL)
2544 return NULL;
2545 else
2546 return current_frame->f_globals;
2547}
2548
Guido van Rossumb209a111997-04-29 18:18:01 +00002549PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002550PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002551{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002552 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002554}
2555
Guido van Rossum6135a871995-01-09 17:53:26 +00002556int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002557PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002558{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002559 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002560 return current_frame == NULL ? 0 : current_frame->f_restricted;
2561}
2562
Guido van Rossumbe270261997-05-22 22:26:18 +00002563int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002564Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565{
Guido van Rossumb209a111997-04-29 18:18:01 +00002566 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002567 if (f == NULL)
2568 return 0;
2569 if (!PyFile_SoftSpace(f, 0))
2570 return 0;
2571 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572}
2573
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574
Guido van Rossum681d79a1995-07-18 14:51:37 +00002575/* External interface to call any callable object.
2576 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002577
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002578#undef PyEval_CallObject
2579/* for backward compatibility: export this interface */
2580
Guido van Rossumb209a111997-04-29 18:18:01 +00002581PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002583{
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002585}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002586#define PyEval_CallObject(func,arg) \
2587 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002588
Guido van Rossumb209a111997-04-29 18:18:01 +00002589PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002590PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002591{
2592 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002593 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002594
2595 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002596 arg = PyTuple_New(0);
2597 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598 PyErr_SetString(PyExc_TypeError,
2599 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002600 return NULL;
2601 }
2602 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002603 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002604
Guido van Rossumb209a111997-04-29 18:18:01 +00002605 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002606 PyErr_SetString(PyExc_TypeError,
2607 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002608 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002609 return NULL;
2610 }
2611
Guido van Rossum150b2df1996-12-05 23:17:11 +00002612 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002613 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002614 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002615 result = call_function(func, arg, kw);
2616 else
2617 result = call_builtin(func, arg, kw);
2618
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002620
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 if (result == NULL && !PyErr_Occurred())
2622 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002623 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002624
2625 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002626}
2627
Guido van Rossumb209a111997-04-29 18:18:01 +00002628static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 if (PyCFunction_Check(func)) {
2632 PyCFunction meth = PyCFunction_GetFunction(func);
2633 PyObject *self = PyCFunction_GetSelf(func);
2634 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002635 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002637 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002639 else if (size == 0)
2640 arg = NULL;
2641 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002642 if (flags & METH_KEYWORDS)
2643 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 if (kw != NULL && PyDict_Size(kw) != 0) {
2645 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002646 "this function takes no keyword arguments");
2647 return NULL;
2648 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002651 if (PyClass_Check(func)) {
2652 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 if (PyInstance_Check(func)) {
2655 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002656 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 PyErr_Clear();
2658 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002659 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002660 return NULL;
2661 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002662 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002663 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002664 return res;
2665 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002666 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002667 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 return NULL;
2669}
2670
Guido van Rossumb209a111997-04-29 18:18:01 +00002671static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002672call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673{
Guido van Rossumb209a111997-04-29 18:18:01 +00002674 PyObject *class = NULL; /* == owner */
2675 PyObject *argdefs;
2676 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002677 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002679
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 if (kw != NULL && !PyDict_Check(kw)) {
2681 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002682 return NULL;
2683 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002684
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 if (PyMethod_Check(func)) {
2686 PyObject *self = PyMethod_Self(func);
2687 class = PyMethod_Class(func);
2688 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002689 if (self == NULL) {
2690 /* Unbound methods must be called with an instance of
2691 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 if (PyTuple_Size(arg) >= 1) {
2693 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002694 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 PyInstance_Check(self) &&
2696 PyClass_IsSubclass((PyObject *)
2697 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002698 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002699 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002700 else
2701 self = NULL;
2702 }
2703 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002705 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002706 return NULL;
2707 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002709 }
2710 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 int argcount = PyTuple_Size(arg);
2712 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002713 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002714 if (newarg == NULL)
2715 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 Py_INCREF(self);
2717 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002718 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002719 PyObject *v = PyTuple_GET_ITEM(arg, i);
2720 Py_XINCREF(v);
2721 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002722 }
2723 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002725 if (!PyFunction_Check(func)) {
2726 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2727 Py_DECREF(arg);
2728 return result;
2729 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730 }
2731 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002733 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002734 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002735 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736 return NULL;
2737 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002740
2741 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2743 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2744 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002745 }
2746 else {
2747 d = NULL;
2748 nd = 0;
2749 }
2750
2751 if (kw != NULL) {
2752 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002753 nk = PyDict_Size(kw);
2754 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002755 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002756 PyErr_NoMemory();
2757 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002758 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002759 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002760 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002762 i += 2;
2763 nk = i/2;
2764 /* XXX This is broken if the caller deletes dict items! */
2765 }
2766 else {
2767 k = NULL;
2768 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002769 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770
Guido van Rossum681d79a1995-07-18 14:51:37 +00002771 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002772 (PyCodeObject *)PyFunction_GetCode(func),
2773 PyFunction_GetGlobals(func), (PyObject *)NULL,
2774 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002775 k, nk,
2776 d, nd,
2777 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002780 if (k != NULL)
2781 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782
Guido van Rossum681d79a1995-07-18 14:51:37 +00002783 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784}
2785
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002786#define SLICE_ERROR_MSG \
2787 "standard sequence type does not support step size other than one"
2788
Guido van Rossumb209a111997-04-29 18:18:01 +00002789static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002790loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791{
Guido van Rossumb209a111997-04-29 18:18:01 +00002792 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002793 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002794 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002795 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796 return NULL;
2797 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002798 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002799 v = (*sq->sq_item)(v, i);
2800 if (v)
2801 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002802 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002804 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805}
2806
Guido van Rossum20c6add2000-05-08 14:06:50 +00002807/* Extract a slice index from a PyInt or PyLong, the index is bound to
2808 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2809 and error. Returns 1 on success.*/
2810
2811int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813{
2814 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002815 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002816 if (PyInt_Check(v)) {
2817 x = PyInt_AsLong(v);
2818 } else if (PyLong_Check(v)) {
2819 x = PyLong_AsLong(v);
2820 if (x==-1 && PyErr_Occurred()) {
2821 PyObject *long_zero;
2822
2823 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2824 /* It's not an overflow error, so just
2825 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002826 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002827 }
2828
2829 /* It's an overflow error, so we need to
2830 check the sign of the long integer,
2831 set the value to INT_MAX or 0, and clear
2832 the error. */
2833
2834 /* Create a long integer with a value of 0 */
2835 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002836 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002837
2838 /* Check sign */
2839 if (PyObject_Compare(long_zero, v) < 0)
2840 x = INT_MAX;
2841 else
2842 x = 0;
2843
2844 /* Free the long integer we created, and clear the
2845 OverflowError */
2846 Py_DECREF(long_zero);
2847 PyErr_Clear();
2848 }
2849 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002850 PyErr_SetString(PyExc_TypeError,
2851 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002852 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002854 /* Truncate -- very long indices are truncated anyway */
2855 if (x > INT_MAX)
2856 x = INT_MAX;
2857 else if (x < -INT_MAX)
2858 x = 0;
2859 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002861 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862}
2863
Guido van Rossumb209a111997-04-29 18:18:01 +00002864static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002865apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002867 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002868 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002870 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002871 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002872 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002874
2875static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002876assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002878 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002879 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002881 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002882 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002883 if (x == NULL)
2884 return PySequence_DelSlice(u, ilow, ihigh);
2885 else
2886 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887}
2888
Guido van Rossumb209a111997-04-29 18:18:01 +00002889static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002890cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891{
2892 register int cmp;
2893 register int res = 0;
2894 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002895 case IS:
2896 case IS_NOT:
2897 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002898 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002899 res = !res;
2900 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 case IN:
2902 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002903 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002904 if (res < 0)
2905 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002906 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002907 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908 break;
2909 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002910 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 break;
2912 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002913 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002914 if (cmp && PyErr_Occurred())
2915 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002916 switch (op) {
2917 case LT: res = cmp < 0; break;
2918 case LE: res = cmp <= 0; break;
2919 case EQ: res = cmp == 0; break;
2920 case NE: res = cmp != 0; break;
2921 case GT: res = cmp > 0; break;
2922 case GE: res = cmp >= 0; break;
2923 /* XXX no default? (res is initialized to 0 though) */
2924 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002926 v = res ? Py_True : Py_False;
2927 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002928 return v;
2929}
2930
Thomas Wouters52152252000-08-17 22:55:00 +00002931static PyObject *
2932import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002933{
Guido van Rossumb209a111997-04-29 18:18:01 +00002934 PyObject *w, *x;
2935 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002936 PyErr_SetString(PyExc_TypeError,
2937 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002938 return NULL;
2939 }
2940 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2941 x = PyDict_GetItem(w, name);
2942 if (x == NULL) {
2943 PyErr_Format(PyExc_ImportError,
2944 "cannot import name %.230s",
2945 PyString_AsString(name));
2946 } else
2947 Py_INCREF(x);
2948 return x;
2949}
2950
2951static int
2952import_all_from(PyObject *locals, PyObject *v)
2953{
2954 int pos = 0, err;
2955 PyObject *name, *value;
2956 PyObject *w;
2957
2958 if (!PyModule_Check(v)) {
2959 PyErr_SetString(PyExc_TypeError,
2960 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002961 return -1;
2962 }
Thomas Wouters52152252000-08-17 22:55:00 +00002963 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2964
2965 while (PyDict_Next(w, &pos, &name, &value)) {
2966 if (!PyString_Check(name) ||
2967 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002968 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002969 Py_INCREF(value);
2970 err = PyDict_SetItem(locals, name, value);
2971 Py_DECREF(value);
2972 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002973 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002974 }
Thomas Wouters52152252000-08-17 22:55:00 +00002975 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002976}
2977
Guido van Rossumb209a111997-04-29 18:18:01 +00002978static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002979build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002980{
Guido van Rossumcd649651997-08-22 16:56:16 +00002981 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002982 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002983 PyErr_SetString(PyExc_SystemError,
2984 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002985 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002986 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002987 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002988 PyErr_SetString(PyExc_SystemError,
2989 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002990 return NULL;
2991 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002992 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002993 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002994 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002995 return NULL;
2996 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002997 n = PyTuple_Size(bases);
2998 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 PyObject *base = PyTuple_GET_ITEM(bases, i);
3000 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003001 /* Call the base's *type*, if it is callable.
3002 This code is a hook for Donald Beaudry's
3003 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003004 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003005 since its types are not callable.
3006 Ditto: call the bases's *class*, if it has
3007 one. This makes the same thing possible
3008 without writing C code. A true meta-object
3009 protocol! */
3010 PyObject *basetype = (PyObject *)base->ob_type;
3011 PyObject *callable = NULL;
3012 if (PyCallable_Check(basetype))
3013 callable = basetype;
3014 else
3015 callable = PyObject_GetAttrString(
3016 base, "__class__");
3017 if (callable) {
3018 PyObject *args;
3019 PyObject *newclass = NULL;
3020 args = Py_BuildValue(
3021 "(OOO)", name, bases, methods);
3022 if (args != NULL) {
3023 newclass = PyEval_CallObject(
3024 callable, args);
3025 Py_DECREF(args);
3026 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003027 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003028 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003029 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003030 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003031 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003032 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003033 "base is not a class object");
3034 return NULL;
3035 }
3036 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003037 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003038}
3039
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003040static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3042 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003044 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003045 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003047
Guido van Rossumb209a111997-04-29 18:18:01 +00003048 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3049 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003050 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003051 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003052 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003053 locals = PyTuple_GetItem(prog, 2);
3054 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003055 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003056 if (globals == Py_None) {
3057 globals = PyEval_GetGlobals();
3058 if (locals == Py_None) {
3059 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003060 plain = 1;
3061 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003062 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003063 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003064 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003065 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003066 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003067 !PyCode_Check(prog) &&
3068 !PyFile_Check(prog)) {
3069 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003070 "exec 1st arg must be string, code or file object");
3071 return -1;
3072 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003073 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3074 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003075 "exec 2nd/3rd args must be dict or None");
3076 return -1;
3077 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003078 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003079 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003080 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003081 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003082 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003083 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003084 FILE *fp = PyFile_AsFile(prog);
3085 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003086 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3087 }
3088 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003089 char *str;
3090 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003091 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003092 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003093 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003094 if (plain)
3095 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003096 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003097 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003098 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003099 return 0;
3100}
Guido van Rossum24c13741995-02-14 09:42:43 +00003101
Paul Prescode68140d2000-08-30 20:25:01 +00003102static void
3103format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3104{
3105 char *obj_str;
3106
3107 if (!obj)
3108 return;
3109
3110 obj_str = PyString_AsString(obj);
3111 if (!obj_str)
3112 return;
3113
3114 PyErr_Format(exc, format_str, obj_str);
3115}
Guido van Rossum950361c1997-01-24 13:49:28 +00003116
3117#ifdef DYNAMIC_EXECUTION_PROFILE
3118
3119PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003120getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003121{
3122 int i;
3123 PyObject *l = PyList_New(256);
3124 if (l == NULL) return NULL;
3125 for (i = 0; i < 256; i++) {
3126 PyObject *x = PyInt_FromLong(a[i]);
3127 if (x == NULL) {
3128 Py_DECREF(l);
3129 return NULL;
3130 }
3131 PyList_SetItem(l, i, x);
3132 }
3133 for (i = 0; i < 256; i++)
3134 a[i] = 0;
3135 return l;
3136}
3137
3138PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003139_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003140{
3141#ifndef DXPAIRS
3142 return getarray(dxp);
3143#else
3144 int i;
3145 PyObject *l = PyList_New(257);
3146 if (l == NULL) return NULL;
3147 for (i = 0; i < 257; i++) {
3148 PyObject *x = getarray(dxpairs[i]);
3149 if (x == NULL) {
3150 Py_DECREF(l);
3151 return NULL;
3152 }
3153 PyList_SetItem(l, i, x);
3154 }
3155 return l;
3156#endif
3157}
3158
3159#endif