blob: a1c8190c752ce9404a446c2054505bbb27f6f949 [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 Wouters0be483f2000-10-11 23:26:11 +0000778 Py_FatalError("invalid argument to DUP_TOPX"
779 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000780 }
Tim Peters35ba6892000-10-11 07:04:49 +0000781 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000782
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 case UNARY_POSITIVE:
784 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000785 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000786 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 break;
790
791 case UNARY_NEGATIVE:
792 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000793 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000794 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000796 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000797 break;
798
799 case UNARY_NOT:
800 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000801 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000802 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000803 if (err == 0) {
804 Py_INCREF(Py_True);
805 PUSH(Py_True);
806 continue;
807 }
808 else if (err > 0) {
809 Py_INCREF(Py_False);
810 PUSH(Py_False);
811 err = 0;
812 continue;
813 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 break;
815
816 case UNARY_CONVERT:
817 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000818 x = PyObject_Repr(v);
819 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000821 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000823
824 case UNARY_INVERT:
825 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000826 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000827 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000828 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000829 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000830 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000831
Guido van Rossum50564e81996-01-12 01:13:16 +0000832 case BINARY_POWER:
833 w = POP();
834 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000835 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000836 Py_DECREF(v);
837 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000840 break;
841
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 case BINARY_MULTIPLY:
843 w = POP();
844 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000845 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000846 Py_DECREF(v);
847 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
851
852 case BINARY_DIVIDE:
853 w = POP();
854 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(v);
857 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000858 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000859 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 break;
861
862 case BINARY_MODULO:
863 w = POP();
864 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000865 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000866 Py_DECREF(v);
867 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
871
872 case BINARY_ADD:
873 w = POP();
874 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000875 if (PyInt_Check(v) && PyInt_Check(w)) {
876 /* INLINE: int + int */
877 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000878 a = PyInt_AS_LONG(v);
879 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000880 i = a + b;
881 if ((i^a) < 0 && (i^b) < 0) {
882 PyErr_SetString(PyExc_OverflowError,
883 "integer addition");
884 x = NULL;
885 }
886 else
887 x = PyInt_FromLong(i);
888 }
889 else
890 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
896
897 case BINARY_SUBTRACT:
898 w = POP();
899 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000900 if (PyInt_Check(v) && PyInt_Check(w)) {
901 /* INLINE: int - int */
902 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000903 a = PyInt_AS_LONG(v);
904 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000905 i = a - b;
906 if ((i^a) < 0 && (i^~b) < 0) {
907 PyErr_SetString(PyExc_OverflowError,
908 "integer subtraction");
909 x = NULL;
910 }
911 else
912 x = PyInt_FromLong(i);
913 }
914 else
915 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000916 Py_DECREF(v);
917 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000918 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000919 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 break;
921
922 case BINARY_SUBSCR:
923 w = POP();
924 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000925 if (PyList_Check(v) && PyInt_Check(w)) {
926 /* INLINE: list[int] */
927 long i = PyInt_AsLong(w);
928 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000929 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000930 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000931 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000932 PyErr_SetString(PyExc_IndexError,
933 "list index out of range");
934 x = NULL;
935 }
936 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000937 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000938 Py_INCREF(x);
939 }
940 }
941 else
942 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000943 Py_DECREF(v);
944 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000946 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 break;
948
Guido van Rossum7928cd71991-10-24 14:59:31 +0000949 case BINARY_LSHIFT:
950 w = POP();
951 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000952 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000953 Py_DECREF(v);
954 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000955 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000956 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000957 break;
958
959 case BINARY_RSHIFT:
960 w = POP();
961 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000962 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 Py_DECREF(v);
964 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000965 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000966 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000967 break;
968
969 case BINARY_AND:
970 w = POP();
971 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000972 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000973 Py_DECREF(v);
974 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000975 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000976 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000977 break;
978
979 case BINARY_XOR:
980 w = POP();
981 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000982 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000983 Py_DECREF(v);
984 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000985 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000986 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000987 break;
988
989 case BINARY_OR:
990 w = POP();
991 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000992 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000993 Py_DECREF(v);
994 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000996 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000997 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000998
999 case INPLACE_POWER:
1000 w = POP();
1001 v = POP();
1002 x = PyNumber_InPlacePower(v, w, Py_None);
1003 Py_DECREF(v);
1004 Py_DECREF(w);
1005 PUSH(x);
1006 if (x != NULL) continue;
1007 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008
Thomas Wouters434d0822000-08-24 20:11:32 +00001009 case INPLACE_MULTIPLY:
1010 w = POP();
1011 v = POP();
1012 x = PyNumber_InPlaceMultiply(v, w);
1013 Py_DECREF(v);
1014 Py_DECREF(w);
1015 PUSH(x);
1016 if (x != NULL) continue;
1017 break;
1018
1019 case INPLACE_DIVIDE:
1020 w = POP();
1021 v = POP();
1022 x = PyNumber_InPlaceDivide(v, w);
1023 Py_DECREF(v);
1024 Py_DECREF(w);
1025 PUSH(x);
1026 if (x != NULL) continue;
1027 break;
1028
1029 case INPLACE_MODULO:
1030 w = POP();
1031 v = POP();
1032 x = PyNumber_InPlaceRemainder(v, w);
1033 Py_DECREF(v);
1034 Py_DECREF(w);
1035 PUSH(x);
1036 if (x != NULL) continue;
1037 break;
1038
1039 case INPLACE_ADD:
1040 w = POP();
1041 v = POP();
1042 if (PyInt_Check(v) && PyInt_Check(w)) {
1043 /* INLINE: int + int */
1044 register long a, b, i;
1045 a = PyInt_AS_LONG(v);
1046 b = PyInt_AS_LONG(w);
1047 i = a + b;
1048 if ((i^a) < 0 && (i^b) < 0) {
1049 PyErr_SetString(PyExc_OverflowError,
1050 "integer addition");
1051 x = NULL;
1052 }
1053 else
1054 x = PyInt_FromLong(i);
1055 }
1056 else
1057 x = PyNumber_InPlaceAdd(v, w);
1058 Py_DECREF(v);
1059 Py_DECREF(w);
1060 PUSH(x);
1061 if (x != NULL) continue;
1062 break;
1063
1064 case INPLACE_SUBTRACT:
1065 w = POP();
1066 v = POP();
1067 if (PyInt_Check(v) && PyInt_Check(w)) {
1068 /* INLINE: int - int */
1069 register long a, b, i;
1070 a = PyInt_AS_LONG(v);
1071 b = PyInt_AS_LONG(w);
1072 i = a - b;
1073 if ((i^a) < 0 && (i^~b) < 0) {
1074 PyErr_SetString(PyExc_OverflowError,
1075 "integer subtraction");
1076 x = NULL;
1077 }
1078 else
1079 x = PyInt_FromLong(i);
1080 }
1081 else
1082 x = PyNumber_InPlaceSubtract(v, w);
1083 Py_DECREF(v);
1084 Py_DECREF(w);
1085 PUSH(x);
1086 if (x != NULL) continue;
1087 break;
1088
1089 case INPLACE_LSHIFT:
1090 w = POP();
1091 v = POP();
1092 x = PyNumber_InPlaceLshift(v, w);
1093 Py_DECREF(v);
1094 Py_DECREF(w);
1095 PUSH(x);
1096 if (x != NULL) continue;
1097 break;
1098
1099 case INPLACE_RSHIFT:
1100 w = POP();
1101 v = POP();
1102 x = PyNumber_InPlaceRshift(v, w);
1103 Py_DECREF(v);
1104 Py_DECREF(w);
1105 PUSH(x);
1106 if (x != NULL) continue;
1107 break;
1108
1109 case INPLACE_AND:
1110 w = POP();
1111 v = POP();
1112 x = PyNumber_InPlaceAnd(v, w);
1113 Py_DECREF(v);
1114 Py_DECREF(w);
1115 PUSH(x);
1116 if (x != NULL) continue;
1117 break;
1118
1119 case INPLACE_XOR:
1120 w = POP();
1121 v = POP();
1122 x = PyNumber_InPlaceXor(v, w);
1123 Py_DECREF(v);
1124 Py_DECREF(w);
1125 PUSH(x);
1126 if (x != NULL) continue;
1127 break;
1128
1129 case INPLACE_OR:
1130 w = POP();
1131 v = POP();
1132 x = PyNumber_InPlaceOr(v, w);
1133 Py_DECREF(v);
1134 Py_DECREF(w);
1135 PUSH(x);
1136 if (x != NULL) continue;
1137 break;
1138
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 case SLICE+0:
1140 case SLICE+1:
1141 case SLICE+2:
1142 case SLICE+3:
1143 if ((opcode-SLICE) & 2)
1144 w = POP();
1145 else
1146 w = NULL;
1147 if ((opcode-SLICE) & 1)
1148 v = POP();
1149 else
1150 v = NULL;
1151 u = POP();
1152 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001153 Py_DECREF(u);
1154 Py_XDECREF(v);
1155 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001157 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 break;
1159
1160 case STORE_SLICE+0:
1161 case STORE_SLICE+1:
1162 case STORE_SLICE+2:
1163 case STORE_SLICE+3:
1164 if ((opcode-STORE_SLICE) & 2)
1165 w = POP();
1166 else
1167 w = NULL;
1168 if ((opcode-STORE_SLICE) & 1)
1169 v = POP();
1170 else
1171 v = NULL;
1172 u = POP();
1173 t = POP();
1174 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001175 Py_DECREF(t);
1176 Py_DECREF(u);
1177 Py_XDECREF(v);
1178 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001179 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 break;
1181
1182 case DELETE_SLICE+0:
1183 case DELETE_SLICE+1:
1184 case DELETE_SLICE+2:
1185 case DELETE_SLICE+3:
1186 if ((opcode-DELETE_SLICE) & 2)
1187 w = POP();
1188 else
1189 w = NULL;
1190 if ((opcode-DELETE_SLICE) & 1)
1191 v = POP();
1192 else
1193 v = NULL;
1194 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001195 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001197 Py_DECREF(u);
1198 Py_XDECREF(v);
1199 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001200 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 break;
1202
1203 case STORE_SUBSCR:
1204 w = POP();
1205 v = POP();
1206 u = POP();
1207 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001208 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001209 Py_DECREF(u);
1210 Py_DECREF(v);
1211 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001212 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 break;
1214
1215 case DELETE_SUBSCR:
1216 w = POP();
1217 v = POP();
1218 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001219 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001220 Py_DECREF(v);
1221 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001224
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 case PRINT_EXPR:
1226 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001227 /* Print value except if None */
1228 /* After printing, also assign to '_' */
1229 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001230 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001231 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001232 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001233 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001234 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001235 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001236 if (x == NULL) {
1237 PyErr_SetString(
1238 PyExc_RuntimeError,
1239 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001240 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001241 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001242 }
1243 if (err == 0)
1244 err = PyFile_WriteObject(v, x, 0);
1245 if (err == 0) {
1246 PyFile_SoftSpace(x, 1);
1247 err = Py_FlushLine();
1248 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001249 if (err == 0) {
1250 err = PyDict_SetItemString(
1251 f->f_builtins, "_", v);
1252 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001254 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 break;
1256
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001257 case PRINT_ITEM_TO:
1258 w = stream = POP();
1259 /* fall through to PRINT_ITEM */
1260
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 case PRINT_ITEM:
1262 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001263 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001264 w = PySys_GetObject("stdout");
1265 if (w == NULL) {
1266 PyErr_SetString(PyExc_RuntimeError,
1267 "lost sys.stdout");
1268 err = -1;
1269 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001270 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001271 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001272 err = PyFile_WriteString(" ", w);
1273 if (err == 0)
1274 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001276 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001277 char *s = PyString_AsString(v);
1278 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001279 if (len > 0 &&
1280 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001281 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001284 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001285 Py_XDECREF(stream);
1286 stream = NULL;
1287 if (err == 0)
1288 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 break;
1290
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001291 case PRINT_NEWLINE_TO:
1292 w = stream = POP();
1293 /* fall through to PRINT_NEWLINE */
1294
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001296 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001297 w = PySys_GetObject("stdout");
1298 if (w == NULL)
1299 PyErr_SetString(PyExc_RuntimeError,
1300 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001301 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001302 if (w != NULL) {
1303 err = PyFile_WriteString("\n", w);
1304 if (err == 0)
1305 PyFile_SoftSpace(w, 0);
1306 }
1307 Py_XDECREF(stream);
1308 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 break;
1310
Thomas Wouters434d0822000-08-24 20:11:32 +00001311
1312#ifdef CASE_TOO_BIG
1313 default: switch (opcode) {
1314#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 case BREAK_LOOP:
1316 why = WHY_BREAK;
1317 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001318
Guido van Rossumf10570b1995-07-07 22:53:21 +00001319 case RAISE_VARARGS:
1320 u = v = w = NULL;
1321 switch (oparg) {
1322 case 3:
1323 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001324 /* Fallthrough */
1325 case 2:
1326 v = POP(); /* value */
1327 /* Fallthrough */
1328 case 1:
1329 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001330 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001331 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001332 break;
1333 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001335 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001336 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001337 break;
1338 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 break;
1340
1341 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001342 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001343 PyErr_SetString(PyExc_SystemError,
1344 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001345 break;
1346 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001347 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001348 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 break;
1350
1351 case RETURN_VALUE:
1352 retval = POP();
1353 why = WHY_RETURN;
1354 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001355
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001356 case EXEC_STMT:
1357 w = POP();
1358 v = POP();
1359 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001360 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 Py_DECREF(u);
1362 Py_DECREF(v);
1363 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001364 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 case POP_BLOCK:
1367 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001368 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 while (STACK_LEVEL() > b->b_level) {
1370 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 }
1373 }
1374 break;
1375
1376 case END_FINALLY:
1377 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001378 if (PyInt_Check(v)) {
1379 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 if (why == WHY_RETURN)
1381 retval = POP();
1382 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001383 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001385 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001386 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001388 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001390 else if (v != Py_None) {
1391 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 "'finally' pops bad exception");
1393 why = WHY_EXCEPTION;
1394 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 break;
1397
1398 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001399 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001401 w = POP();
1402 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 Py_DECREF(u);
1405 Py_DECREF(v);
1406 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 break;
1408
1409 case STORE_NAME:
1410 w = GETNAMEV(oparg);
1411 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001412 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001413 PyErr_SetString(PyExc_SystemError,
1414 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001415 break;
1416 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001417 err = PyDict_SetItem(x, w, v);
1418 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001419 break;
1420
1421 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001422 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001423 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001424 PyErr_SetString(PyExc_SystemError,
1425 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001426 break;
1427 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001429 format_exc_check_arg(PyExc_NameError,
1430 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001432
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001433 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001435 if (PyTuple_Check(v)) {
1436 if (PyTuple_Size(v) != oparg) {
1437 PyErr_SetString(PyExc_ValueError,
1438 "unpack tuple of wrong size");
1439 why = WHY_EXCEPTION;
1440 }
1441 else {
1442 for (; --oparg >= 0; ) {
1443 w = PyTuple_GET_ITEM(v, oparg);
1444 Py_INCREF(w);
1445 PUSH(w);
1446 }
1447 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001449 else if (PyList_Check(v)) {
1450 if (PyList_Size(v) != oparg) {
1451 PyErr_SetString(PyExc_ValueError,
1452 "unpack list of wrong size");
1453 why = WHY_EXCEPTION;
1454 }
1455 else {
1456 for (; --oparg >= 0; ) {
1457 w = PyList_GET_ITEM(v, oparg);
1458 Py_INCREF(w);
1459 PUSH(w);
1460 }
1461 }
1462 }
1463 else if (PySequence_Check(v)) {
1464 if (unpack_sequence(v, oparg,
1465 stack_pointer + oparg))
1466 stack_pointer += oparg;
1467 else
1468 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 }
1470 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001471 PyErr_SetString(PyExc_TypeError,
1472 "unpack non-sequence");
1473 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 break;
1477
1478 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001479 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 v = POP();
1481 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1483 Py_DECREF(v);
1484 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 break;
1486
1487 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001488 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001490 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1491 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 break;
1494
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001495 case STORE_GLOBAL:
1496 w = GETNAMEV(oparg);
1497 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 err = PyDict_SetItem(f->f_globals, w, v);
1499 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001500 break;
1501
1502 case DELETE_GLOBAL:
1503 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001504 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001505 format_exc_check_arg(
1506 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001507 break;
1508
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 case LOAD_CONST:
1510 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 PUSH(x);
1513 break;
1514
1515 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001516 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001517 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001518 PyErr_SetString(PyExc_SystemError,
1519 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 break;
1521 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001528 format_exc_check_arg(
1529 PyExc_NameError,
1530 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 break;
1532 }
1533 }
1534 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001535 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 PUSH(x);
1537 break;
1538
1539 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001540 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001545 format_exc_check_arg(
1546 PyExc_NameError,
1547 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 break;
1549 }
1550 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 PUSH(x);
1553 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001554
Guido van Rossum9bfef441993-03-29 10:43:31 +00001555 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001556 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001557 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001558 format_exc_check_arg(
1559 PyExc_UnboundLocalError,
1560 UNBOUNDLOCAL_ERROR_MSG,
1561 PyTuple_GetItem(co->co_varnames, oparg)
1562 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001563 break;
1564 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001566 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001567 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001568 break;
1569
1570 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001571 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001573 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001574
1575 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001576 x = GETLOCAL(oparg);
1577 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001578 format_exc_check_arg(
1579 PyExc_UnboundLocalError,
1580 UNBOUNDLOCAL_ERROR_MSG,
1581 PyTuple_GetItem(co->co_varnames, oparg)
1582 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001583 break;
1584 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001585 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001586 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001587
1588 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 if (x != NULL) {
1591 for (; --oparg >= 0;) {
1592 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 }
1595 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001596 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 }
1598 break;
1599
1600 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001601 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001602 if (x != NULL) {
1603 for (; --oparg >= 0;) {
1604 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001605 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 }
1607 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001608 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001609 }
1610 break;
1611
1612 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001613 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001614 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001615 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 break;
1617
1618 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001619 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001621 x = PyObject_GetAttr(v, w);
1622 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001624 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 break;
1626
1627 case COMPARE_OP:
1628 w = POP();
1629 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001630 if (PyInt_Check(v) && PyInt_Check(w)) {
1631 /* INLINE: cmp(int, int) */
1632 register long a, b;
1633 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001634 a = PyInt_AS_LONG(v);
1635 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001636 switch (oparg) {
1637 case LT: res = a < b; break;
1638 case LE: res = a <= b; break;
1639 case EQ: res = a == b; break;
1640 case NE: res = a != b; break;
1641 case GT: res = a > b; break;
1642 case GE: res = a >= b; break;
1643 case IS: res = v == w; break;
1644 case IS_NOT: res = v != w; break;
1645 default: goto slow_compare;
1646 }
1647 x = res ? Py_True : Py_False;
1648 Py_INCREF(x);
1649 }
1650 else {
1651 slow_compare:
1652 x = cmp_outcome(oparg, v, w);
1653 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 Py_DECREF(v);
1655 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001657 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 break;
1659
1660 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001661 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001663 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001664 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001665 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666 break;
1667 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001668 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 w,
1671 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001672 f->f_locals == NULL ?
1673 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001674 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001676 if (w == NULL) {
1677 x = NULL;
1678 break;
1679 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 x = PyEval_CallObject(x, w);
1681 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 break;
1685
Thomas Wouters52152252000-08-17 22:55:00 +00001686 case IMPORT_STAR:
1687 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001689 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001690 PyErr_SetString(PyExc_SystemError,
1691 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001692 break;
1693 }
Thomas Wouters52152252000-08-17 22:55:00 +00001694 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001696 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001697 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001699
Thomas Wouters52152252000-08-17 22:55:00 +00001700 case IMPORT_FROM:
1701 w = GETNAMEV(oparg);
1702 v = TOP();
1703 x = import_from(v, w);
1704 PUSH(x);
1705 if (x != NULL) continue;
1706 break;
1707
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 case JUMP_FORWARD:
1709 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001710 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001711
1712 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001714 if (err > 0)
1715 err = 0;
1716 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001718 else
1719 break;
1720 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001721
1722 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001724 if (err > 0) {
1725 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001727 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001728 else if (err == 0)
1729 ;
1730 else
1731 break;
1732 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001733
1734 case JUMP_ABSOLUTE:
1735 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001736 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001737
1738 case FOR_LOOP:
1739 /* for v in s: ...
1740 On entry: stack contains s, i.
1741 On exit: stack contains s, i+1, s[i];
1742 but if loop exhausted:
1743 s, i are popped, and we jump */
1744 w = POP(); /* Loop index */
1745 v = POP(); /* Sequence object */
1746 u = loop_subscript(v, w);
1747 if (u != NULL) {
1748 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001753 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 }
1755 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 Py_DECREF(v);
1757 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 /* A NULL can mean "s exhausted"
1759 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001762 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001764 continue;
1765 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 }
1767 break;
1768
1769 case SETUP_LOOP:
1770 case SETUP_EXCEPT:
1771 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001774 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001775
1776 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001777#ifdef LLTRACE
1778 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001779 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001780#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001781 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001782 if (f->f_trace == NULL)
1783 continue;
1784 /* Trace each line of code reached */
1785 f->f_lasti = INSTR_OFFSET();
1786 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001789
1790 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001791 case CALL_FUNCTION_VAR:
1792 case CALL_FUNCTION_KW:
1793 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001794 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001795 int na = oparg & 0xff;
1796 int nk = (oparg>>8) & 0xff;
1797 int flags = (opcode - CALL_FUNCTION) & 3;
1798 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1799 PyObject **pfunc = stack_pointer - n - 1;
1800 PyObject *func = *pfunc;
1801 PyObject *self = NULL;
1802 PyObject *class = NULL;
1803 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1804 if (PyMethod_Check(func)) {
1805 self = PyMethod_Self(func);
1806 class = PyMethod_Class(func);
1807 func = PyMethod_Function(func);
1808 Py_INCREF(func);
1809 if (self != NULL) {
1810 Py_INCREF(self);
1811 Py_DECREF(*pfunc);
1812 *pfunc = self;
1813 na++;
1814 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001815 }
1816 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001817 /* Unbound methods must be called with an
1818 instance of the class (or a derived
1819 class) as first argument */
1820 if (na > 0 && (self = stack_pointer[-n]) != NULL
1821 && PyInstance_Check(self)
1822 && PyClass_IsSubclass((PyObject *)
1823 (((PyInstanceObject *)self)->in_class),
1824 class))
1825 /* Handy-dandy */ ;
1826 else {
1827 PyErr_SetString(PyExc_TypeError,
1828 "unbound method must be called with class instance 1st argument");
1829 x = NULL;
1830 break;
1831 }
1832 }
1833 }
1834 else
1835 Py_INCREF(func);
1836 if (PyFunction_Check(func) && flags == 0) {
1837 PyObject *co = PyFunction_GetCode(func);
1838 PyObject *globals = PyFunction_GetGlobals(func);
1839 PyObject *argdefs = PyFunction_GetDefaults(func);
1840 PyObject **d;
1841 int nd;
1842 if (argdefs != NULL) {
1843 d = &PyTuple_GET_ITEM(argdefs, 0);
1844 nd = ((PyTupleObject *)argdefs)->ob_size;
1845 }
1846 else {
1847 d = NULL;
1848 nd = 0;
1849 }
1850 x = eval_code2((PyCodeObject *)co, globals,
1851 (PyObject *)NULL, stack_pointer-n, na,
1852 stack_pointer-2*nk, nk, d, nd,
1853 class);
1854 }
1855 else {
1856 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001857 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001858 PyObject *stararg = 0;
1859 PyObject *kwdict = NULL;
1860 if (flags & 2) {
1861 kwdict = POP();
1862 if (!PyDict_Check(kwdict)) {
1863 PyErr_SetString(PyExc_TypeError,
1864 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001865 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001866 }
1867 }
1868 if (flags & 1) {
1869 stararg = POP();
1870 if (!PySequence_Check(stararg)) {
1871 PyErr_SetString(PyExc_TypeError,
1872 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001873 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001874 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001875 /* Convert abstract sequence to concrete tuple */
1876 if (!PyTuple_Check(stararg)) {
1877 PyObject *t = NULL;
1878 t = PySequence_Tuple(stararg);
1879 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001880 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001881 }
1882 Py_DECREF(stararg);
1883 stararg = t;
1884 }
1885 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001886 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001887 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001888 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001889 }
1890 if (nk > 0) {
1891 if (kwdict == NULL) {
1892 kwdict = PyDict_New();
1893 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001894 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001895 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001896 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001897 else {
1898 PyObject *d = PyDict_Copy(kwdict);
1899 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001900 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001901 }
1902 Py_DECREF(kwdict);
1903 kwdict = d;
1904 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001905 err = 0;
1906 while (--nk >= 0) {
1907 PyObject *value = POP();
1908 PyObject *key = POP();
1909 if (PyDict_GetItem(kwdict, key) != NULL) {
1910 err = 1;
1911 PyErr_Format(PyExc_TypeError,
1912 "keyword parameter redefined: %.400s",
1913 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001914 Py_DECREF(key);
1915 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001916 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001917 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001918 err = PyDict_SetItem(kwdict, key, value);
1919 Py_DECREF(key);
1920 Py_DECREF(value);
1921 if (err)
1922 break;
1923 }
1924 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001925 extcall_fail:
1926 Py_XDECREF(kwdict);
1927 Py_XDECREF(stararg);
1928 Py_DECREF(func);
1929 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001930 break;
1931 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001932 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001933 callargs = PyTuple_New(na + nstar);
1934 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001935 x = NULL;
1936 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001937 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001938 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001939 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001940 for (i = 0; i < nstar; i++) {
1941 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1942 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001943 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001944 }
1945 Py_DECREF(stararg);
1946 }
1947 while (--na >= 0) {
1948 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001949 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001950 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001951 x = PyEval_CallObjectWithKeywords(func,
1952 callargs,
1953 kwdict);
1954 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001955 Py_XDECREF(kwdict);
1956 }
1957 Py_DECREF(func);
1958 while (stack_pointer > pfunc) {
1959 w = POP();
1960 Py_DECREF(w);
1961 }
1962 PUSH(x);
1963 if (x != NULL) continue;
1964 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001965 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001966
Guido van Rossum681d79a1995-07-18 14:51:37 +00001967 case MAKE_FUNCTION:
1968 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 x = PyFunction_New(v, f->f_globals);
1970 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001971 /* XXX Maybe this should be a separate opcode? */
1972 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001973 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001974 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001975 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001976 x = NULL;
1977 break;
1978 }
1979 while (--oparg >= 0) {
1980 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001981 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001982 }
1983 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001984 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001985 }
1986 PUSH(x);
1987 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001988
1989 case BUILD_SLICE:
1990 if (oparg == 3)
1991 w = POP();
1992 else
1993 w = NULL;
1994 v = POP();
1995 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001996 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001997 Py_DECREF(u);
1998 Py_DECREF(v);
1999 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002000 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002001 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002002 break;
2003
Fred Drakeef8ace32000-08-24 00:32:09 +00002004 case EXTENDED_ARG:
2005 opcode = NEXTOP();
2006 oparg = oparg<<16 | NEXTARG();
2007 goto dispatch_opcode;
2008 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002009
Guido van Rossum374a9221991-04-04 10:40:29 +00002010 default:
2011 fprintf(stderr,
2012 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002013 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002014 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002015 why = WHY_EXCEPTION;
2016 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002017
2018#ifdef CASE_TOO_BIG
2019 }
2020#endif
2021
Guido van Rossum374a9221991-04-04 10:40:29 +00002022 } /* switch */
2023
2024 on_error:
2025
2026 /* Quickly continue if no error occurred */
2027
2028 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 if (err == 0 && x != NULL) {
2030#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002031 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002033 fprintf(stderr,
2034 "XXX undetected error\n");
2035 else
2036#endif
2037 continue; /* Normal, fast path */
2038 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002039 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002041 err = 0;
2042 }
2043
Guido van Rossum374a9221991-04-04 10:40:29 +00002044 /* Double-check exception status */
2045
2046 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002047 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002048 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002049 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002050 why = WHY_EXCEPTION;
2051 }
2052 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002053#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002054 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002055 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002057 fprintf(stderr,
2058 "XXX undetected error (why=%d)\n",
2059 why);
2060 why = WHY_EXCEPTION;
2061 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002062 }
2063#endif
2064
2065 /* Log traceback info if this is a real exception */
2066
2067 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002068 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002069 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002070 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002072
Guido van Rossume59214e1994-08-30 08:01:59 +00002073 if (f->f_trace)
2074 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002075 if (tstate->sys_profilefunc)
2076 call_exc_trace(&tstate->sys_profilefunc,
2077 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002078 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002079
2080 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2081
2082 if (why == WHY_RERAISE)
2083 why = WHY_EXCEPTION;
2084
2085 /* Unwind stacks if a (pseudo) exception occurred */
2086
2087 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002088 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002089 while (STACK_LEVEL() > b->b_level) {
2090 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 }
2093 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2094 why = WHY_NOT;
2095 JUMPTO(b->b_handler);
2096 break;
2097 }
2098 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002099 (b->b_type == SETUP_EXCEPT &&
2100 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 PyObject *exc, *val, *tb;
2103 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002104 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002105 val = Py_None;
2106 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002107 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002108 /* Make the raw exception data
2109 available to the handler,
2110 so a program can emulate the
2111 Python main loop. Don't do
2112 this for 'finally'. */
2113 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002114 PyErr_NormalizeException(
2115 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002116 set_exc_info(tstate,
2117 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002119 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002120 PUSH(val);
2121 PUSH(exc);
2122 }
2123 else {
2124 if (why == WHY_RETURN)
2125 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 PUSH(v);
2128 }
2129 why = WHY_NOT;
2130 JUMPTO(b->b_handler);
2131 break;
2132 }
2133 } /* unwind stack */
2134
2135 /* End the loop if we still have an error (or return) */
2136
2137 if (why != WHY_NOT)
2138 break;
2139
2140 } /* main loop */
2141
2142 /* Pop remaining stack entries */
2143
2144 while (!EMPTY()) {
2145 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 }
2148
Guido van Rossum96a42c81992-01-12 02:29:51 +00002149 if (why != WHY_RETURN)
2150 retval = NULL;
2151
Guido van Rossume59214e1994-08-30 08:01:59 +00002152 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002153 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002154 if (call_trace(&f->f_trace, &f->f_trace, f,
2155 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002158 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002159 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002160 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002161 }
2162
Guido van Rossuma027efa1997-05-05 20:56:21 +00002163 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2164 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002165 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002167 retval = NULL;
2168 why = WHY_EXCEPTION;
2169 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002170 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002171
Guido van Rossuma027efa1997-05-05 20:56:21 +00002172 reset_exc_info(tstate);
2173
2174 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002175
2176 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002177
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002179
Guido van Rossuma027efa1997-05-05 20:56:21 +00002180 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002182
Guido van Rossum96a42c81992-01-12 02:29:51 +00002183 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002184}
2185
Guido van Rossuma027efa1997-05-05 20:56:21 +00002186static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002187set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188{
2189 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002190 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002191
Guido van Rossuma027efa1997-05-05 20:56:21 +00002192 frame = tstate->frame;
2193 if (frame->f_exc_type == NULL) {
2194 /* This frame didn't catch an exception before */
2195 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002196 if (tstate->exc_type == NULL) {
2197 Py_INCREF(Py_None);
2198 tstate->exc_type = Py_None;
2199 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002200 tmp_type = frame->f_exc_type;
2201 tmp_value = frame->f_exc_value;
2202 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002203 Py_XINCREF(tstate->exc_type);
2204 Py_XINCREF(tstate->exc_value);
2205 Py_XINCREF(tstate->exc_traceback);
2206 frame->f_exc_type = tstate->exc_type;
2207 frame->f_exc_value = tstate->exc_value;
2208 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002209 Py_XDECREF(tmp_type);
2210 Py_XDECREF(tmp_value);
2211 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002212 }
2213 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002214 tmp_type = tstate->exc_type;
2215 tmp_value = tstate->exc_value;
2216 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002217 Py_XINCREF(type);
2218 Py_XINCREF(value);
2219 Py_XINCREF(tb);
2220 tstate->exc_type = type;
2221 tstate->exc_value = value;
2222 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002223 Py_XDECREF(tmp_type);
2224 Py_XDECREF(tmp_value);
2225 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002226 /* For b/w compatibility */
2227 PySys_SetObject("exc_type", type);
2228 PySys_SetObject("exc_value", value);
2229 PySys_SetObject("exc_traceback", tb);
2230}
2231
2232static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002233reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002234{
2235 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002236 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002237 frame = tstate->frame;
2238 if (frame->f_exc_type != NULL) {
2239 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002240 tmp_type = tstate->exc_type;
2241 tmp_value = tstate->exc_value;
2242 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 Py_XINCREF(frame->f_exc_type);
2244 Py_XINCREF(frame->f_exc_value);
2245 Py_XINCREF(frame->f_exc_traceback);
2246 tstate->exc_type = frame->f_exc_type;
2247 tstate->exc_value = frame->f_exc_value;
2248 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002249 Py_XDECREF(tmp_type);
2250 Py_XDECREF(tmp_value);
2251 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002252 /* For b/w compatibility */
2253 PySys_SetObject("exc_type", frame->f_exc_type);
2254 PySys_SetObject("exc_value", frame->f_exc_value);
2255 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2256 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002257 tmp_type = frame->f_exc_type;
2258 tmp_value = frame->f_exc_value;
2259 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 frame->f_exc_type = NULL;
2261 frame->f_exc_value = NULL;
2262 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002263 Py_XDECREF(tmp_type);
2264 Py_XDECREF(tmp_value);
2265 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002266}
2267
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002268/* Logic for the raise statement (too complicated for inlining).
2269 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002270static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002271do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002272{
Guido van Rossumd295f121998-04-09 21:39:57 +00002273 if (type == NULL) {
2274 /* Reraise */
2275 PyThreadState *tstate = PyThreadState_Get();
2276 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2277 value = tstate->exc_value;
2278 tb = tstate->exc_traceback;
2279 Py_XINCREF(type);
2280 Py_XINCREF(value);
2281 Py_XINCREF(tb);
2282 }
2283
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002284 /* We support the following forms of raise:
2285 raise <class>, <classinstance>
2286 raise <class>, <argument tuple>
2287 raise <class>, None
2288 raise <class>, <argument>
2289 raise <classinstance>, None
2290 raise <string>, <object>
2291 raise <string>, None
2292
2293 An omitted second argument is the same as None.
2294
2295 In addition, raise <tuple>, <anything> is the same as
2296 raising the tuple's first item (and it better have one!);
2297 this rule is applied recursively.
2298
2299 Finally, an optional third argument can be supplied, which
2300 gives the traceback to be substituted (useful when
2301 re-raising an exception after examining it). */
2302
2303 /* First, check the traceback argument, replacing None with
2304 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002305 if (tb == Py_None) {
2306 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002307 tb = NULL;
2308 }
2309 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002311 "raise 3rd arg must be traceback or None");
2312 goto raise_error;
2313 }
2314
2315 /* Next, replace a missing value with None */
2316 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 value = Py_None;
2318 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002319 }
2320
2321 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2323 PyObject *tmp = type;
2324 type = PyTuple_GET_ITEM(type, 0);
2325 Py_INCREF(type);
2326 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002327 }
2328
Barry Warsaw4249f541997-08-22 21:26:19 +00002329 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002330 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002331
2332 else if (PyClass_Check(type))
2333 PyErr_NormalizeException(&type, &value, &tb);
2334
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002336 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 if (value != Py_None) {
2338 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002339 "instance exception may not have a separate value");
2340 goto raise_error;
2341 }
2342 else {
2343 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002345 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2347 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002348 }
2349 }
2350 else {
2351 /* Not something you can raise. You get an exception
2352 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002353 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002354 "exceptions must be strings, classes, or instances");
2355 goto raise_error;
2356 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002357 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002358 if (tb == NULL)
2359 return WHY_EXCEPTION;
2360 else
2361 return WHY_RERAISE;
2362 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 Py_XDECREF(value);
2364 Py_XDECREF(type);
2365 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002366 return WHY_EXCEPTION;
2367}
2368
Barry Warsawe42b18f1997-08-25 22:13:04 +00002369static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002370unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002371{
2372 int i;
2373 PyObject *w;
2374
2375 for (i = 0; i < argcnt; i++) {
2376 if (! (w = PySequence_GetItem(v, i))) {
2377 if (PyErr_ExceptionMatches(PyExc_IndexError))
2378 PyErr_SetString(PyExc_ValueError,
2379 "unpack sequence of wrong size");
2380 goto finally;
2381 }
2382 *--sp = w;
2383 }
2384 /* we better get an IndexError now */
2385 if (PySequence_GetItem(v, i) == NULL) {
2386 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2387 PyErr_Clear();
2388 return 1;
2389 }
2390 /* some other exception occurred. fall through to finally */
2391 }
2392 else
2393 PyErr_SetString(PyExc_ValueError,
2394 "unpack sequence of wrong size");
2395 /* fall through */
2396finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002397 for (; i > 0; i--, sp++)
2398 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002399
2400 return 0;
2401}
2402
2403
Guido van Rossum96a42c81992-01-12 02:29:51 +00002404#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002406prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002409 if (PyObject_Print(v, stdout, 0) != 0)
2410 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002412 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002414#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002417call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002418{
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002420 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002422 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002423 value = Py_None;
2424 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002425 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002427 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002429 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002430 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002431 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002433 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002435 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 Py_XDECREF(type);
2437 Py_XDECREF(value);
2438 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002439 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002440}
2441
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002442/* PyObject **p_trace: in/out; may not be NULL;
2443 may not point to NULL variable initially
2444 PyObject **p_newtrace: in/out; may be NULL;
2445 may point to NULL variable;
2446 may be same variable as p_newtrace */
2447
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002448static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002449call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2450 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002451{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002452 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 PyObject *args, *what;
2454 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002455
Guido van Rossuma027efa1997-05-05 20:56:21 +00002456 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002457 /* Don't do recursive traces */
2458 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002460 *p_newtrace = NULL;
2461 }
2462 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002463 }
2464
Guido van Rossumb209a111997-04-29 18:18:01 +00002465 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002466 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002467 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002469 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002470 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 Py_INCREF(f);
2472 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2473 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002474 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002475 arg = Py_None;
2476 Py_INCREF(arg);
2477 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002478 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002479 PyFrame_FastToLocals(f);
2480 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2481 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002482 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002483 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002484 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002485 if (res == NULL) {
2486 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 PyTraceBack_Here(f);
2488 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002489 *p_trace = NULL;
2490 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002491 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002492 *p_newtrace = NULL;
2493 }
Barry Warsawf6202631999-09-08 16:26:33 +00002494 /* to be extra double plus sure we don't get recursive
2495 * calls inf either tracefunc or profilefunc gets an
2496 * exception, zap the global variables.
2497 */
2498 Py_XDECREF(tstate->sys_tracefunc);
2499 tstate->sys_tracefunc = NULL;
2500 Py_XDECREF(tstate->sys_profilefunc);
2501 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002502 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002503 }
2504 else {
2505 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002506 Py_XDECREF(*p_newtrace);
2507 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002508 *p_newtrace = NULL;
2509 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002510 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002511 *p_newtrace = res;
2512 }
2513 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002515 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002516 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002517}
2518
Guido van Rossumb209a111997-04-29 18:18:01 +00002519PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002520PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002521{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002522 PyThreadState *tstate = PyThreadState_Get();
2523 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002524 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002525 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002526 else
2527 return current_frame->f_builtins;
2528}
2529
Guido van Rossumb209a111997-04-29 18:18:01 +00002530PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002531PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002532{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002533 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002534 if (current_frame == NULL)
2535 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002536 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002537 return current_frame->f_locals;
2538}
2539
Guido van Rossumb209a111997-04-29 18:18:01 +00002540PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002541PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002542{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 if (current_frame == NULL)
2545 return NULL;
2546 else
2547 return current_frame->f_globals;
2548}
2549
Guido van Rossumb209a111997-04-29 18:18:01 +00002550PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002551PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002552{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002554 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002555}
2556
Guido van Rossum6135a871995-01-09 17:53:26 +00002557int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002558PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002559{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002561 return current_frame == NULL ? 0 : current_frame->f_restricted;
2562}
2563
Guido van Rossumbe270261997-05-22 22:26:18 +00002564int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566{
Guido van Rossumb209a111997-04-29 18:18:01 +00002567 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002568 if (f == NULL)
2569 return 0;
2570 if (!PyFile_SoftSpace(f, 0))
2571 return 0;
2572 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573}
2574
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575
Guido van Rossum681d79a1995-07-18 14:51:37 +00002576/* External interface to call any callable object.
2577 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002578
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002579#undef PyEval_CallObject
2580/* for backward compatibility: export this interface */
2581
Guido van Rossumb209a111997-04-29 18:18:01 +00002582PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002583PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002584{
Guido van Rossumb209a111997-04-29 18:18:01 +00002585 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002586}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002587#define PyEval_CallObject(func,arg) \
2588 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002589
Guido van Rossumb209a111997-04-29 18:18:01 +00002590PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002591PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002592{
2593 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002594 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002595
2596 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 arg = PyTuple_New(0);
2598 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002599 PyErr_SetString(PyExc_TypeError,
2600 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002601 return NULL;
2602 }
2603 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002604 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002605
Guido van Rossumb209a111997-04-29 18:18:01 +00002606 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 PyErr_SetString(PyExc_TypeError,
2608 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002609 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002610 return NULL;
2611 }
2612
Guido van Rossum150b2df1996-12-05 23:17:11 +00002613 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002614 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002616 result = call_function(func, arg, kw);
2617 else
2618 result = call_builtin(func, arg, kw);
2619
Guido van Rossumb209a111997-04-29 18:18:01 +00002620 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 if (result == NULL && !PyErr_Occurred())
2623 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002624 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002625
2626 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002627}
2628
Guido van Rossumb209a111997-04-29 18:18:01 +00002629static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002630call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631{
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 if (PyCFunction_Check(func)) {
2633 PyCFunction meth = PyCFunction_GetFunction(func);
2634 PyObject *self = PyCFunction_GetSelf(func);
2635 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002636 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002637 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002638 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002639 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002640 else if (size == 0)
2641 arg = NULL;
2642 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002643 if (flags & METH_KEYWORDS)
2644 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 if (kw != NULL && PyDict_Size(kw) != 0) {
2646 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002647 "this function takes no keyword arguments");
2648 return NULL;
2649 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 if (PyClass_Check(func)) {
2653 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 if (PyInstance_Check(func)) {
2656 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002657 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 PyErr_Clear();
2659 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002660 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002661 return NULL;
2662 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002663 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002665 return res;
2666 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002667 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002668 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 return NULL;
2670}
2671
Guido van Rossumb209a111997-04-29 18:18:01 +00002672static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002673call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674{
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 PyObject *class = NULL; /* == owner */
2676 PyObject *argdefs;
2677 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002678 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002680
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 if (kw != NULL && !PyDict_Check(kw)) {
2682 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002683 return NULL;
2684 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002685
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 if (PyMethod_Check(func)) {
2687 PyObject *self = PyMethod_Self(func);
2688 class = PyMethod_Class(func);
2689 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002690 if (self == NULL) {
2691 /* Unbound methods must be called with an instance of
2692 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002693 if (PyTuple_Size(arg) >= 1) {
2694 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002695 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 PyInstance_Check(self) &&
2697 PyClass_IsSubclass((PyObject *)
2698 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002699 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002700 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002701 else
2702 self = NULL;
2703 }
2704 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002706 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002707 return NULL;
2708 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002710 }
2711 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 int argcount = PyTuple_Size(arg);
2713 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002714 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002715 if (newarg == NULL)
2716 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 Py_INCREF(self);
2718 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002719 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 PyObject *v = PyTuple_GET_ITEM(arg, i);
2721 Py_XINCREF(v);
2722 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002723 }
2724 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002726 if (!PyFunction_Check(func)) {
2727 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2728 Py_DECREF(arg);
2729 return result;
2730 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 }
2732 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002734 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002735 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002736 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 return NULL;
2738 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002741
2742 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2744 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2745 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002746 }
2747 else {
2748 d = NULL;
2749 nd = 0;
2750 }
2751
2752 if (kw != NULL) {
2753 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 nk = PyDict_Size(kw);
2755 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002756 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 PyErr_NoMemory();
2758 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002760 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002761 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002763 i += 2;
2764 nk = i/2;
2765 /* XXX This is broken if the caller deletes dict items! */
2766 }
2767 else {
2768 k = NULL;
2769 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002770 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771
Guido van Rossum681d79a1995-07-18 14:51:37 +00002772 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 (PyCodeObject *)PyFunction_GetCode(func),
2774 PyFunction_GetGlobals(func), (PyObject *)NULL,
2775 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002776 k, nk,
2777 d, nd,
2778 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779
Guido van Rossumb209a111997-04-29 18:18:01 +00002780 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002781 if (k != NULL)
2782 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783
Guido van Rossum681d79a1995-07-18 14:51:37 +00002784 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785}
2786
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002787#define SLICE_ERROR_MSG \
2788 "standard sequence type does not support step size other than one"
2789
Guido van Rossumb209a111997-04-29 18:18:01 +00002790static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002791loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002792{
Guido van Rossumb209a111997-04-29 18:18:01 +00002793 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002794 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002795 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 return NULL;
2798 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002800 v = (*sq->sq_item)(v, i);
2801 if (v)
2802 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002803 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002804 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002805 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806}
2807
Guido van Rossum20c6add2000-05-08 14:06:50 +00002808/* Extract a slice index from a PyInt or PyLong, the index is bound to
2809 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2810 and error. Returns 1 on success.*/
2811
2812int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002813_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814{
2815 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002816 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002817 if (PyInt_Check(v)) {
2818 x = PyInt_AsLong(v);
2819 } else if (PyLong_Check(v)) {
2820 x = PyLong_AsLong(v);
2821 if (x==-1 && PyErr_Occurred()) {
2822 PyObject *long_zero;
2823
2824 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2825 /* It's not an overflow error, so just
2826 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002827 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002828 }
2829
2830 /* It's an overflow error, so we need to
2831 check the sign of the long integer,
2832 set the value to INT_MAX or 0, and clear
2833 the error. */
2834
2835 /* Create a long integer with a value of 0 */
2836 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002837 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002838
2839 /* Check sign */
2840 if (PyObject_Compare(long_zero, v) < 0)
2841 x = INT_MAX;
2842 else
2843 x = 0;
2844
2845 /* Free the long integer we created, and clear the
2846 OverflowError */
2847 Py_DECREF(long_zero);
2848 PyErr_Clear();
2849 }
2850 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002851 PyErr_SetString(PyExc_TypeError,
2852 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002853 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002855 /* Truncate -- very long indices are truncated anyway */
2856 if (x > INT_MAX)
2857 x = INT_MAX;
2858 else if (x < -INT_MAX)
2859 x = 0;
2860 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002862 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863}
2864
Guido van Rossumb209a111997-04-29 18:18:01 +00002865static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002866apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002868 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002869 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002871 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002872 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002873 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002875
2876static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002877assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002879 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002880 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002882 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002884 if (x == NULL)
2885 return PySequence_DelSlice(u, ilow, ihigh);
2886 else
2887 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888}
2889
Guido van Rossumb209a111997-04-29 18:18:01 +00002890static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002891cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892{
2893 register int cmp;
2894 register int res = 0;
2895 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002896 case IS:
2897 case IS_NOT:
2898 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002899 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002900 res = !res;
2901 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 case IN:
2903 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002904 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002905 if (res < 0)
2906 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002907 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002908 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 break;
2910 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002911 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 break;
2913 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002914 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002915 if (cmp && PyErr_Occurred())
2916 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002917 switch (op) {
2918 case LT: res = cmp < 0; break;
2919 case LE: res = cmp <= 0; break;
2920 case EQ: res = cmp == 0; break;
2921 case NE: res = cmp != 0; break;
2922 case GT: res = cmp > 0; break;
2923 case GE: res = cmp >= 0; break;
2924 /* XXX no default? (res is initialized to 0 though) */
2925 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002927 v = res ? Py_True : Py_False;
2928 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 return v;
2930}
2931
Thomas Wouters52152252000-08-17 22:55:00 +00002932static PyObject *
2933import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002934{
Guido van Rossumb209a111997-04-29 18:18:01 +00002935 PyObject *w, *x;
2936 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002937 PyErr_SetString(PyExc_TypeError,
2938 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002939 return NULL;
2940 }
2941 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2942 x = PyDict_GetItem(w, name);
2943 if (x == NULL) {
2944 PyErr_Format(PyExc_ImportError,
2945 "cannot import name %.230s",
2946 PyString_AsString(name));
2947 } else
2948 Py_INCREF(x);
2949 return x;
2950}
2951
2952static int
2953import_all_from(PyObject *locals, PyObject *v)
2954{
2955 int pos = 0, err;
2956 PyObject *name, *value;
2957 PyObject *w;
2958
2959 if (!PyModule_Check(v)) {
2960 PyErr_SetString(PyExc_TypeError,
2961 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002962 return -1;
2963 }
Thomas Wouters52152252000-08-17 22:55:00 +00002964 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2965
2966 while (PyDict_Next(w, &pos, &name, &value)) {
2967 if (!PyString_Check(name) ||
2968 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002969 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002970 Py_INCREF(value);
2971 err = PyDict_SetItem(locals, name, value);
2972 Py_DECREF(value);
2973 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002974 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002975 }
Thomas Wouters52152252000-08-17 22:55:00 +00002976 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002977}
2978
Guido van Rossumb209a111997-04-29 18:18:01 +00002979static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002981{
Guido van Rossumcd649651997-08-22 16:56:16 +00002982 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002983 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002984 PyErr_SetString(PyExc_SystemError,
2985 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002986 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002987 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002988 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002989 PyErr_SetString(PyExc_SystemError,
2990 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002991 return NULL;
2992 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002993 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002994 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002995 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002996 return NULL;
2997 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002998 n = PyTuple_Size(bases);
2999 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003000 PyObject *base = PyTuple_GET_ITEM(bases, i);
3001 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003002 /* Call the base's *type*, if it is callable.
3003 This code is a hook for Donald Beaudry's
3004 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003005 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003006 since its types are not callable.
3007 Ditto: call the bases's *class*, if it has
3008 one. This makes the same thing possible
3009 without writing C code. A true meta-object
3010 protocol! */
3011 PyObject *basetype = (PyObject *)base->ob_type;
3012 PyObject *callable = NULL;
3013 if (PyCallable_Check(basetype))
3014 callable = basetype;
3015 else
3016 callable = PyObject_GetAttrString(
3017 base, "__class__");
3018 if (callable) {
3019 PyObject *args;
3020 PyObject *newclass = NULL;
3021 args = Py_BuildValue(
3022 "(OOO)", name, bases, methods);
3023 if (args != NULL) {
3024 newclass = PyEval_CallObject(
3025 callable, args);
3026 Py_DECREF(args);
3027 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003028 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003029 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003030 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003031 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003032 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003033 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003034 "base is not a class object");
3035 return NULL;
3036 }
3037 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003038 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003039}
3040
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003041static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003042exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3043 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003044{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003045 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003046 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003048
Guido van Rossumb209a111997-04-29 18:18:01 +00003049 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3050 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003051 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003052 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003053 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003054 locals = PyTuple_GetItem(prog, 2);
3055 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003056 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003057 if (globals == Py_None) {
3058 globals = PyEval_GetGlobals();
3059 if (locals == Py_None) {
3060 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003061 plain = 1;
3062 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003063 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003064 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003065 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003066 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003067 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003068 !PyCode_Check(prog) &&
3069 !PyFile_Check(prog)) {
3070 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003071 "exec 1st arg must be string, code or file object");
3072 return -1;
3073 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003074 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3075 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003076 "exec 2nd/3rd args must be dict or None");
3077 return -1;
3078 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003079 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003080 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003081 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003082 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003083 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003084 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003085 FILE *fp = PyFile_AsFile(prog);
3086 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003087 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3088 }
3089 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003090 char *str;
3091 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003092 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003093 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003094 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003095 if (plain)
3096 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003097 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003098 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003099 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003100 return 0;
3101}
Guido van Rossum24c13741995-02-14 09:42:43 +00003102
Paul Prescode68140d2000-08-30 20:25:01 +00003103static void
3104format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3105{
3106 char *obj_str;
3107
3108 if (!obj)
3109 return;
3110
3111 obj_str = PyString_AsString(obj);
3112 if (!obj_str)
3113 return;
3114
3115 PyErr_Format(exc, format_str, obj_str);
3116}
Guido van Rossum950361c1997-01-24 13:49:28 +00003117
3118#ifdef DYNAMIC_EXECUTION_PROFILE
3119
3120PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003121getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003122{
3123 int i;
3124 PyObject *l = PyList_New(256);
3125 if (l == NULL) return NULL;
3126 for (i = 0; i < 256; i++) {
3127 PyObject *x = PyInt_FromLong(a[i]);
3128 if (x == NULL) {
3129 Py_DECREF(l);
3130 return NULL;
3131 }
3132 PyList_SetItem(l, i, x);
3133 }
3134 for (i = 0; i < 256; i++)
3135 a[i] = 0;
3136 return l;
3137}
3138
3139PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003140_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003141{
3142#ifndef DXPAIRS
3143 return getarray(dxp);
3144#else
3145 int i;
3146 PyObject *l = PyList_New(257);
3147 if (l == NULL) return NULL;
3148 for (i = 0; i < 257; i++) {
3149 PyObject *x = getarray(dxpairs[i]);
3150 if (x == NULL) {
3151 Py_DECREF(l);
3152 return NULL;
3153 }
3154 PyList_SetItem(l, i, x);
3155 }
3156 return l;
3157#endif
3158}
3159
3160#endif