blob: ca38c682c33c3b75a0e2133cb98c13fb3af46fe8 [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:
778 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
779 PyErr_SetString(PyExc_SystemError,
780 "invalid argument to DUP_TOPX");
781 x = NULL;
Thomas Wouters434d0822000-08-24 20:11:32 +0000782 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000783 }
Tim Peters35ba6892000-10-11 07:04:49 +0000784 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000785
Guido van Rossum374a9221991-04-04 10:40:29 +0000786 case UNARY_POSITIVE:
787 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000788 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000789 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000791 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 break;
793
794 case UNARY_NEGATIVE:
795 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000796 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000797 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000798 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000799 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000800 break;
801
802 case UNARY_NOT:
803 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000804 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000806 if (err == 0) {
807 Py_INCREF(Py_True);
808 PUSH(Py_True);
809 continue;
810 }
811 else if (err > 0) {
812 Py_INCREF(Py_False);
813 PUSH(Py_False);
814 err = 0;
815 continue;
816 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 break;
818
819 case UNARY_CONVERT:
820 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000821 x = PyObject_Repr(v);
822 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000824 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000826
827 case UNARY_INVERT:
828 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000829 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000830 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000831 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000832 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000833 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000834
Guido van Rossum50564e81996-01-12 01:13:16 +0000835 case BINARY_POWER:
836 w = POP();
837 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000838 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000839 Py_DECREF(v);
840 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000841 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000842 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000843 break;
844
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 case BINARY_MULTIPLY:
846 w = POP();
847 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000848 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000849 Py_DECREF(v);
850 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000852 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000853 break;
854
855 case BINARY_DIVIDE:
856 w = POP();
857 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000858 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000859 Py_DECREF(v);
860 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000862 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 break;
864
865 case BINARY_MODULO:
866 w = POP();
867 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000868 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000869 Py_DECREF(v);
870 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000872 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 break;
874
875 case BINARY_ADD:
876 w = POP();
877 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000878 if (PyInt_Check(v) && PyInt_Check(w)) {
879 /* INLINE: int + int */
880 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000881 a = PyInt_AS_LONG(v);
882 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000883 i = a + b;
884 if ((i^a) < 0 && (i^b) < 0) {
885 PyErr_SetString(PyExc_OverflowError,
886 "integer addition");
887 x = NULL;
888 }
889 else
890 x = PyInt_FromLong(i);
891 }
892 else
893 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000894 Py_DECREF(v);
895 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000897 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 break;
899
900 case BINARY_SUBTRACT:
901 w = POP();
902 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000903 if (PyInt_Check(v) && PyInt_Check(w)) {
904 /* INLINE: int - int */
905 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000906 a = PyInt_AS_LONG(v);
907 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000908 i = a - b;
909 if ((i^a) < 0 && (i^~b) < 0) {
910 PyErr_SetString(PyExc_OverflowError,
911 "integer subtraction");
912 x = NULL;
913 }
914 else
915 x = PyInt_FromLong(i);
916 }
917 else
918 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000919 Py_DECREF(v);
920 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000922 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 break;
924
925 case BINARY_SUBSCR:
926 w = POP();
927 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000928 if (PyList_Check(v) && PyInt_Check(w)) {
929 /* INLINE: list[int] */
930 long i = PyInt_AsLong(w);
931 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000932 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000933 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000934 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000935 PyErr_SetString(PyExc_IndexError,
936 "list index out of range");
937 x = NULL;
938 }
939 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000940 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000941 Py_INCREF(x);
942 }
943 }
944 else
945 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000946 Py_DECREF(v);
947 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000949 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 break;
951
Guido van Rossum7928cd71991-10-24 14:59:31 +0000952 case BINARY_LSHIFT:
953 w = POP();
954 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000955 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000956 Py_DECREF(v);
957 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000958 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000959 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000960 break;
961
962 case BINARY_RSHIFT:
963 w = POP();
964 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000965 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000966 Py_DECREF(v);
967 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000968 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000969 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000970 break;
971
972 case BINARY_AND:
973 w = POP();
974 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000975 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000976 Py_DECREF(v);
977 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000978 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000979 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000980 break;
981
982 case BINARY_XOR:
983 w = POP();
984 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000985 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(v);
987 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000988 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000990 break;
991
992 case BINARY_OR:
993 w = POP();
994 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000995 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000996 Py_DECREF(v);
997 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000998 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000999 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001001
1002 case INPLACE_POWER:
1003 w = POP();
1004 v = POP();
1005 x = PyNumber_InPlacePower(v, w, Py_None);
1006 Py_DECREF(v);
1007 Py_DECREF(w);
1008 PUSH(x);
1009 if (x != NULL) continue;
1010 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011
Thomas Wouters434d0822000-08-24 20:11:32 +00001012 case INPLACE_MULTIPLY:
1013 w = POP();
1014 v = POP();
1015 x = PyNumber_InPlaceMultiply(v, w);
1016 Py_DECREF(v);
1017 Py_DECREF(w);
1018 PUSH(x);
1019 if (x != NULL) continue;
1020 break;
1021
1022 case INPLACE_DIVIDE:
1023 w = POP();
1024 v = POP();
1025 x = PyNumber_InPlaceDivide(v, w);
1026 Py_DECREF(v);
1027 Py_DECREF(w);
1028 PUSH(x);
1029 if (x != NULL) continue;
1030 break;
1031
1032 case INPLACE_MODULO:
1033 w = POP();
1034 v = POP();
1035 x = PyNumber_InPlaceRemainder(v, w);
1036 Py_DECREF(v);
1037 Py_DECREF(w);
1038 PUSH(x);
1039 if (x != NULL) continue;
1040 break;
1041
1042 case INPLACE_ADD:
1043 w = POP();
1044 v = POP();
1045 if (PyInt_Check(v) && PyInt_Check(w)) {
1046 /* INLINE: int + int */
1047 register long a, b, i;
1048 a = PyInt_AS_LONG(v);
1049 b = PyInt_AS_LONG(w);
1050 i = a + b;
1051 if ((i^a) < 0 && (i^b) < 0) {
1052 PyErr_SetString(PyExc_OverflowError,
1053 "integer addition");
1054 x = NULL;
1055 }
1056 else
1057 x = PyInt_FromLong(i);
1058 }
1059 else
1060 x = PyNumber_InPlaceAdd(v, w);
1061 Py_DECREF(v);
1062 Py_DECREF(w);
1063 PUSH(x);
1064 if (x != NULL) continue;
1065 break;
1066
1067 case INPLACE_SUBTRACT:
1068 w = POP();
1069 v = POP();
1070 if (PyInt_Check(v) && PyInt_Check(w)) {
1071 /* INLINE: int - int */
1072 register long a, b, i;
1073 a = PyInt_AS_LONG(v);
1074 b = PyInt_AS_LONG(w);
1075 i = a - b;
1076 if ((i^a) < 0 && (i^~b) < 0) {
1077 PyErr_SetString(PyExc_OverflowError,
1078 "integer subtraction");
1079 x = NULL;
1080 }
1081 else
1082 x = PyInt_FromLong(i);
1083 }
1084 else
1085 x = PyNumber_InPlaceSubtract(v, w);
1086 Py_DECREF(v);
1087 Py_DECREF(w);
1088 PUSH(x);
1089 if (x != NULL) continue;
1090 break;
1091
1092 case INPLACE_LSHIFT:
1093 w = POP();
1094 v = POP();
1095 x = PyNumber_InPlaceLshift(v, w);
1096 Py_DECREF(v);
1097 Py_DECREF(w);
1098 PUSH(x);
1099 if (x != NULL) continue;
1100 break;
1101
1102 case INPLACE_RSHIFT:
1103 w = POP();
1104 v = POP();
1105 x = PyNumber_InPlaceRshift(v, w);
1106 Py_DECREF(v);
1107 Py_DECREF(w);
1108 PUSH(x);
1109 if (x != NULL) continue;
1110 break;
1111
1112 case INPLACE_AND:
1113 w = POP();
1114 v = POP();
1115 x = PyNumber_InPlaceAnd(v, w);
1116 Py_DECREF(v);
1117 Py_DECREF(w);
1118 PUSH(x);
1119 if (x != NULL) continue;
1120 break;
1121
1122 case INPLACE_XOR:
1123 w = POP();
1124 v = POP();
1125 x = PyNumber_InPlaceXor(v, w);
1126 Py_DECREF(v);
1127 Py_DECREF(w);
1128 PUSH(x);
1129 if (x != NULL) continue;
1130 break;
1131
1132 case INPLACE_OR:
1133 w = POP();
1134 v = POP();
1135 x = PyNumber_InPlaceOr(v, w);
1136 Py_DECREF(v);
1137 Py_DECREF(w);
1138 PUSH(x);
1139 if (x != NULL) continue;
1140 break;
1141
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 case SLICE+0:
1143 case SLICE+1:
1144 case SLICE+2:
1145 case SLICE+3:
1146 if ((opcode-SLICE) & 2)
1147 w = POP();
1148 else
1149 w = NULL;
1150 if ((opcode-SLICE) & 1)
1151 v = POP();
1152 else
1153 v = NULL;
1154 u = POP();
1155 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001156 Py_DECREF(u);
1157 Py_XDECREF(v);
1158 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001160 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 break;
1162
1163 case STORE_SLICE+0:
1164 case STORE_SLICE+1:
1165 case STORE_SLICE+2:
1166 case STORE_SLICE+3:
1167 if ((opcode-STORE_SLICE) & 2)
1168 w = POP();
1169 else
1170 w = NULL;
1171 if ((opcode-STORE_SLICE) & 1)
1172 v = POP();
1173 else
1174 v = NULL;
1175 u = POP();
1176 t = POP();
1177 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001178 Py_DECREF(t);
1179 Py_DECREF(u);
1180 Py_XDECREF(v);
1181 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001182 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 break;
1184
1185 case DELETE_SLICE+0:
1186 case DELETE_SLICE+1:
1187 case DELETE_SLICE+2:
1188 case DELETE_SLICE+3:
1189 if ((opcode-DELETE_SLICE) & 2)
1190 w = POP();
1191 else
1192 w = NULL;
1193 if ((opcode-DELETE_SLICE) & 1)
1194 v = POP();
1195 else
1196 v = NULL;
1197 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001198 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001200 Py_DECREF(u);
1201 Py_XDECREF(v);
1202 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001203 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 break;
1205
1206 case STORE_SUBSCR:
1207 w = POP();
1208 v = POP();
1209 u = POP();
1210 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001211 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001212 Py_DECREF(u);
1213 Py_DECREF(v);
1214 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001215 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 break;
1217
1218 case DELETE_SUBSCR:
1219 w = POP();
1220 v = POP();
1221 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001222 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001223 Py_DECREF(v);
1224 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001225 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001227
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 case PRINT_EXPR:
1229 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001230 /* Print value except if None */
1231 /* After printing, also assign to '_' */
1232 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001234 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001235 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001236 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001237 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001238 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001239 if (x == NULL) {
1240 PyErr_SetString(
1241 PyExc_RuntimeError,
1242 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001243 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001244 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001245 }
1246 if (err == 0)
1247 err = PyFile_WriteObject(v, x, 0);
1248 if (err == 0) {
1249 PyFile_SoftSpace(x, 1);
1250 err = Py_FlushLine();
1251 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001252 if (err == 0) {
1253 err = PyDict_SetItemString(
1254 f->f_builtins, "_", v);
1255 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001257 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 break;
1259
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001260 case PRINT_ITEM_TO:
1261 w = stream = POP();
1262 /* fall through to PRINT_ITEM */
1263
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 case PRINT_ITEM:
1265 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001266 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001267 w = PySys_GetObject("stdout");
1268 if (w == NULL) {
1269 PyErr_SetString(PyExc_RuntimeError,
1270 "lost sys.stdout");
1271 err = -1;
1272 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001273 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001274 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001275 err = PyFile_WriteString(" ", w);
1276 if (err == 0)
1277 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001279 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 char *s = PyString_AsString(v);
1281 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001282 if (len > 0 &&
1283 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001284 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001288 Py_XDECREF(stream);
1289 stream = NULL;
1290 if (err == 0)
1291 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 break;
1293
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001294 case PRINT_NEWLINE_TO:
1295 w = stream = POP();
1296 /* fall through to PRINT_NEWLINE */
1297
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001299 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001300 w = PySys_GetObject("stdout");
1301 if (w == NULL)
1302 PyErr_SetString(PyExc_RuntimeError,
1303 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001304 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001305 if (w != NULL) {
1306 err = PyFile_WriteString("\n", w);
1307 if (err == 0)
1308 PyFile_SoftSpace(w, 0);
1309 }
1310 Py_XDECREF(stream);
1311 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 break;
1313
Thomas Wouters434d0822000-08-24 20:11:32 +00001314
1315#ifdef CASE_TOO_BIG
1316 default: switch (opcode) {
1317#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 case BREAK_LOOP:
1319 why = WHY_BREAK;
1320 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001321
Guido van Rossumf10570b1995-07-07 22:53:21 +00001322 case RAISE_VARARGS:
1323 u = v = w = NULL;
1324 switch (oparg) {
1325 case 3:
1326 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001327 /* Fallthrough */
1328 case 2:
1329 v = POP(); /* value */
1330 /* Fallthrough */
1331 case 1:
1332 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001333 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001334 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001335 break;
1336 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001337 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001338 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001339 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001340 break;
1341 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 break;
1343
1344 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001345 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001346 PyErr_SetString(PyExc_SystemError,
1347 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001348 break;
1349 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001351 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 break;
1353
1354 case RETURN_VALUE:
1355 retval = POP();
1356 why = WHY_RETURN;
1357 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001358
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001359 case EXEC_STMT:
1360 w = POP();
1361 v = POP();
1362 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001363 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 Py_DECREF(u);
1365 Py_DECREF(v);
1366 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001367 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001368
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 case POP_BLOCK:
1370 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 while (STACK_LEVEL() > b->b_level) {
1373 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001374 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 }
1376 }
1377 break;
1378
1379 case END_FINALLY:
1380 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001381 if (PyInt_Check(v)) {
1382 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 if (why == WHY_RETURN)
1384 retval = POP();
1385 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001386 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001388 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001391 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001393 else if (v != Py_None) {
1394 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 "'finally' pops bad exception");
1396 why = WHY_EXCEPTION;
1397 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001398 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 break;
1400
1401 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001402 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001404 w = POP();
1405 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001407 Py_DECREF(u);
1408 Py_DECREF(v);
1409 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 break;
1411
1412 case STORE_NAME:
1413 w = GETNAMEV(oparg);
1414 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001415 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001416 PyErr_SetString(PyExc_SystemError,
1417 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001418 break;
1419 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 err = PyDict_SetItem(x, w, v);
1421 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 break;
1423
1424 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001425 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001426 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001427 PyErr_SetString(PyExc_SystemError,
1428 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001429 break;
1430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001432 format_exc_check_arg(PyExc_NameError,
1433 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001435
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001436 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001438 if (PyTuple_Check(v)) {
1439 if (PyTuple_Size(v) != oparg) {
1440 PyErr_SetString(PyExc_ValueError,
1441 "unpack tuple of wrong size");
1442 why = WHY_EXCEPTION;
1443 }
1444 else {
1445 for (; --oparg >= 0; ) {
1446 w = PyTuple_GET_ITEM(v, oparg);
1447 Py_INCREF(w);
1448 PUSH(w);
1449 }
1450 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001452 else if (PyList_Check(v)) {
1453 if (PyList_Size(v) != oparg) {
1454 PyErr_SetString(PyExc_ValueError,
1455 "unpack list of wrong size");
1456 why = WHY_EXCEPTION;
1457 }
1458 else {
1459 for (; --oparg >= 0; ) {
1460 w = PyList_GET_ITEM(v, oparg);
1461 Py_INCREF(w);
1462 PUSH(w);
1463 }
1464 }
1465 }
1466 else if (PySequence_Check(v)) {
1467 if (unpack_sequence(v, oparg,
1468 stack_pointer + oparg))
1469 stack_pointer += oparg;
1470 else
1471 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 }
1473 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001474 PyErr_SetString(PyExc_TypeError,
1475 "unpack non-sequence");
1476 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001478 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479 break;
1480
1481 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001482 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 v = POP();
1484 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1486 Py_DECREF(v);
1487 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 break;
1489
1490 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001491 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001493 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1494 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 break;
1497
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001498 case STORE_GLOBAL:
1499 w = GETNAMEV(oparg);
1500 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001501 err = PyDict_SetItem(f->f_globals, w, v);
1502 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001503 break;
1504
1505 case DELETE_GLOBAL:
1506 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001508 format_exc_check_arg(
1509 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001510 break;
1511
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 case LOAD_CONST:
1513 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001514 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 PUSH(x);
1516 break;
1517
1518 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001519 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001521 PyErr_SetString(PyExc_SystemError,
1522 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001523 break;
1524 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001531 format_exc_check_arg(
1532 PyExc_NameError,
1533 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 break;
1535 }
1536 }
1537 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 PUSH(x);
1540 break;
1541
1542 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001543 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001548 format_exc_check_arg(
1549 PyExc_NameError,
1550 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 break;
1552 }
1553 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001555 PUSH(x);
1556 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557
Guido van Rossum9bfef441993-03-29 10:43:31 +00001558 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001559 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001560 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001561 format_exc_check_arg(
1562 PyExc_UnboundLocalError,
1563 UNBOUNDLOCAL_ERROR_MSG,
1564 PyTuple_GetItem(co->co_varnames, oparg)
1565 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001566 break;
1567 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001569 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001570 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001571 break;
1572
1573 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001574 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001576 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001577
1578 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001579 x = GETLOCAL(oparg);
1580 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001581 format_exc_check_arg(
1582 PyExc_UnboundLocalError,
1583 UNBOUNDLOCAL_ERROR_MSG,
1584 PyTuple_GetItem(co->co_varnames, oparg)
1585 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001586 break;
1587 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001589 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001590
1591 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 if (x != NULL) {
1594 for (; --oparg >= 0;) {
1595 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 }
1598 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001599 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 }
1601 break;
1602
1603 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 if (x != NULL) {
1606 for (; --oparg >= 0;) {
1607 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001608 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001609 }
1610 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001611 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 }
1613 break;
1614
1615 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001617 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001618 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 break;
1620
1621 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001622 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001624 x = PyObject_GetAttr(v, w);
1625 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001627 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 break;
1629
1630 case COMPARE_OP:
1631 w = POP();
1632 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001633 if (PyInt_Check(v) && PyInt_Check(w)) {
1634 /* INLINE: cmp(int, int) */
1635 register long a, b;
1636 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001637 a = PyInt_AS_LONG(v);
1638 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001639 switch (oparg) {
1640 case LT: res = a < b; break;
1641 case LE: res = a <= b; break;
1642 case EQ: res = a == b; break;
1643 case NE: res = a != b; break;
1644 case GT: res = a > b; break;
1645 case GE: res = a >= b; break;
1646 case IS: res = v == w; break;
1647 case IS_NOT: res = v != w; break;
1648 default: goto slow_compare;
1649 }
1650 x = res ? Py_True : Py_False;
1651 Py_INCREF(x);
1652 }
1653 else {
1654 slow_compare:
1655 x = cmp_outcome(oparg, v, w);
1656 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 Py_DECREF(v);
1658 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001660 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 break;
1662
1663 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001664 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001665 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001668 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 break;
1670 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001671 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 w,
1674 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001675 f->f_locals == NULL ?
1676 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001677 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001679 if (w == NULL) {
1680 x = NULL;
1681 break;
1682 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 x = PyEval_CallObject(x, w);
1684 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001685 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001686 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 break;
1688
Thomas Wouters52152252000-08-17 22:55:00 +00001689 case IMPORT_STAR:
1690 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001692 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001693 PyErr_SetString(PyExc_SystemError,
1694 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001695 break;
1696 }
Thomas Wouters52152252000-08-17 22:55:00 +00001697 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001699 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001700 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001702
Thomas Wouters52152252000-08-17 22:55:00 +00001703 case IMPORT_FROM:
1704 w = GETNAMEV(oparg);
1705 v = TOP();
1706 x = import_from(v, w);
1707 PUSH(x);
1708 if (x != NULL) continue;
1709 break;
1710
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 case JUMP_FORWARD:
1712 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001713 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001714
1715 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001716 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001717 if (err > 0)
1718 err = 0;
1719 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001721 else
1722 break;
1723 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001724
1725 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001727 if (err > 0) {
1728 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001730 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001731 else if (err == 0)
1732 ;
1733 else
1734 break;
1735 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001736
1737 case JUMP_ABSOLUTE:
1738 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001739 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001740
1741 case FOR_LOOP:
1742 /* for v in s: ...
1743 On entry: stack contains s, i.
1744 On exit: stack contains s, i+1, s[i];
1745 but if loop exhausted:
1746 s, i are popped, and we jump */
1747 w = POP(); /* Loop index */
1748 v = POP(); /* Sequence object */
1749 u = loop_subscript(v, w);
1750 if (u != NULL) {
1751 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 }
1758 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 Py_DECREF(v);
1760 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 /* A NULL can mean "s exhausted"
1762 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001765 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001767 continue;
1768 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 }
1770 break;
1771
1772 case SETUP_LOOP:
1773 case SETUP_EXCEPT:
1774 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001775 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001777 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001778
1779 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001780#ifdef LLTRACE
1781 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001782 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001783#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001784 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001785 if (f->f_trace == NULL)
1786 continue;
1787 /* Trace each line of code reached */
1788 f->f_lasti = INSTR_OFFSET();
1789 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001792
1793 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001794 case CALL_FUNCTION_VAR:
1795 case CALL_FUNCTION_KW:
1796 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001797 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001798 int na = oparg & 0xff;
1799 int nk = (oparg>>8) & 0xff;
1800 int flags = (opcode - CALL_FUNCTION) & 3;
1801 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1802 PyObject **pfunc = stack_pointer - n - 1;
1803 PyObject *func = *pfunc;
1804 PyObject *self = NULL;
1805 PyObject *class = NULL;
1806 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1807 if (PyMethod_Check(func)) {
1808 self = PyMethod_Self(func);
1809 class = PyMethod_Class(func);
1810 func = PyMethod_Function(func);
1811 Py_INCREF(func);
1812 if (self != NULL) {
1813 Py_INCREF(self);
1814 Py_DECREF(*pfunc);
1815 *pfunc = self;
1816 na++;
1817 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001818 }
1819 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001820 /* Unbound methods must be called with an
1821 instance of the class (or a derived
1822 class) as first argument */
1823 if (na > 0 && (self = stack_pointer[-n]) != NULL
1824 && PyInstance_Check(self)
1825 && PyClass_IsSubclass((PyObject *)
1826 (((PyInstanceObject *)self)->in_class),
1827 class))
1828 /* Handy-dandy */ ;
1829 else {
1830 PyErr_SetString(PyExc_TypeError,
1831 "unbound method must be called with class instance 1st argument");
1832 x = NULL;
1833 break;
1834 }
1835 }
1836 }
1837 else
1838 Py_INCREF(func);
1839 if (PyFunction_Check(func) && flags == 0) {
1840 PyObject *co = PyFunction_GetCode(func);
1841 PyObject *globals = PyFunction_GetGlobals(func);
1842 PyObject *argdefs = PyFunction_GetDefaults(func);
1843 PyObject **d;
1844 int nd;
1845 if (argdefs != NULL) {
1846 d = &PyTuple_GET_ITEM(argdefs, 0);
1847 nd = ((PyTupleObject *)argdefs)->ob_size;
1848 }
1849 else {
1850 d = NULL;
1851 nd = 0;
1852 }
1853 x = eval_code2((PyCodeObject *)co, globals,
1854 (PyObject *)NULL, stack_pointer-n, na,
1855 stack_pointer-2*nk, nk, d, nd,
1856 class);
1857 }
1858 else {
1859 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001860 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001861 PyObject *stararg = 0;
1862 PyObject *kwdict = NULL;
1863 if (flags & 2) {
1864 kwdict = POP();
1865 if (!PyDict_Check(kwdict)) {
1866 PyErr_SetString(PyExc_TypeError,
1867 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001868 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001869 }
1870 }
1871 if (flags & 1) {
1872 stararg = POP();
1873 if (!PySequence_Check(stararg)) {
1874 PyErr_SetString(PyExc_TypeError,
1875 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001876 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001877 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001878 /* Convert abstract sequence to concrete tuple */
1879 if (!PyTuple_Check(stararg)) {
1880 PyObject *t = NULL;
1881 t = PySequence_Tuple(stararg);
1882 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001883 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001884 }
1885 Py_DECREF(stararg);
1886 stararg = t;
1887 }
1888 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001889 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001890 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001891 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001892 }
1893 if (nk > 0) {
1894 if (kwdict == NULL) {
1895 kwdict = PyDict_New();
1896 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001897 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001898 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001899 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001900 else {
1901 PyObject *d = PyDict_Copy(kwdict);
1902 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001903 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001904 }
1905 Py_DECREF(kwdict);
1906 kwdict = d;
1907 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001908 err = 0;
1909 while (--nk >= 0) {
1910 PyObject *value = POP();
1911 PyObject *key = POP();
1912 if (PyDict_GetItem(kwdict, key) != NULL) {
1913 err = 1;
1914 PyErr_Format(PyExc_TypeError,
1915 "keyword parameter redefined: %.400s",
1916 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001917 Py_DECREF(key);
1918 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001919 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001920 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001921 err = PyDict_SetItem(kwdict, key, value);
1922 Py_DECREF(key);
1923 Py_DECREF(value);
1924 if (err)
1925 break;
1926 }
1927 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001928 extcall_fail:
1929 Py_XDECREF(kwdict);
1930 Py_XDECREF(stararg);
1931 Py_DECREF(func);
1932 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001933 break;
1934 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001935 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001936 callargs = PyTuple_New(na + nstar);
1937 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001938 x = NULL;
1939 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001940 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001941 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001942 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001943 for (i = 0; i < nstar; i++) {
1944 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1945 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001946 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001947 }
1948 Py_DECREF(stararg);
1949 }
1950 while (--na >= 0) {
1951 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001952 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001953 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001954 x = PyEval_CallObjectWithKeywords(func,
1955 callargs,
1956 kwdict);
1957 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001958 Py_XDECREF(kwdict);
1959 }
1960 Py_DECREF(func);
1961 while (stack_pointer > pfunc) {
1962 w = POP();
1963 Py_DECREF(w);
1964 }
1965 PUSH(x);
1966 if (x != NULL) continue;
1967 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001968 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001969
Guido van Rossum681d79a1995-07-18 14:51:37 +00001970 case MAKE_FUNCTION:
1971 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 x = PyFunction_New(v, f->f_globals);
1973 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001974 /* XXX Maybe this should be a separate opcode? */
1975 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001976 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001977 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001978 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001979 x = NULL;
1980 break;
1981 }
1982 while (--oparg >= 0) {
1983 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001984 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001985 }
1986 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001988 }
1989 PUSH(x);
1990 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001991
1992 case BUILD_SLICE:
1993 if (oparg == 3)
1994 w = POP();
1995 else
1996 w = NULL;
1997 v = POP();
1998 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001999 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002000 Py_DECREF(u);
2001 Py_DECREF(v);
2002 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002003 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002004 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002005 break;
2006
Fred Drakeef8ace32000-08-24 00:32:09 +00002007 case EXTENDED_ARG:
2008 opcode = NEXTOP();
2009 oparg = oparg<<16 | NEXTARG();
2010 goto dispatch_opcode;
2011 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002012
Guido van Rossum374a9221991-04-04 10:40:29 +00002013 default:
2014 fprintf(stderr,
2015 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002016 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002018 why = WHY_EXCEPTION;
2019 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002020
2021#ifdef CASE_TOO_BIG
2022 }
2023#endif
2024
Guido van Rossum374a9221991-04-04 10:40:29 +00002025 } /* switch */
2026
2027 on_error:
2028
2029 /* Quickly continue if no error occurred */
2030
2031 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002032 if (err == 0 && x != NULL) {
2033#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002034 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002036 fprintf(stderr,
2037 "XXX undetected error\n");
2038 else
2039#endif
2040 continue; /* Normal, fast path */
2041 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002042 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002044 err = 0;
2045 }
2046
Guido van Rossum374a9221991-04-04 10:40:29 +00002047 /* Double-check exception status */
2048
2049 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002051 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002052 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002053 why = WHY_EXCEPTION;
2054 }
2055 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002056#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002057 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002058 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 fprintf(stderr,
2061 "XXX undetected error (why=%d)\n",
2062 why);
2063 why = WHY_EXCEPTION;
2064 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002065 }
2066#endif
2067
2068 /* Log traceback info if this is a real exception */
2069
2070 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002071 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002073 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002075
Guido van Rossume59214e1994-08-30 08:01:59 +00002076 if (f->f_trace)
2077 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002078 if (tstate->sys_profilefunc)
2079 call_exc_trace(&tstate->sys_profilefunc,
2080 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002081 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002082
2083 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2084
2085 if (why == WHY_RERAISE)
2086 why = WHY_EXCEPTION;
2087
2088 /* Unwind stacks if a (pseudo) exception occurred */
2089
2090 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 while (STACK_LEVEL() > b->b_level) {
2093 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002095 }
2096 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2097 why = WHY_NOT;
2098 JUMPTO(b->b_handler);
2099 break;
2100 }
2101 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002102 (b->b_type == SETUP_EXCEPT &&
2103 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002104 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002105 PyObject *exc, *val, *tb;
2106 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002107 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 val = Py_None;
2109 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002111 /* Make the raw exception data
2112 available to the handler,
2113 so a program can emulate the
2114 Python main loop. Don't do
2115 this for 'finally'. */
2116 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002117 PyErr_NormalizeException(
2118 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002119 set_exc_info(tstate,
2120 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002121 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002123 PUSH(val);
2124 PUSH(exc);
2125 }
2126 else {
2127 if (why == WHY_RETURN)
2128 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002130 PUSH(v);
2131 }
2132 why = WHY_NOT;
2133 JUMPTO(b->b_handler);
2134 break;
2135 }
2136 } /* unwind stack */
2137
2138 /* End the loop if we still have an error (or return) */
2139
2140 if (why != WHY_NOT)
2141 break;
2142
2143 } /* main loop */
2144
2145 /* Pop remaining stack entries */
2146
2147 while (!EMPTY()) {
2148 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002149 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 }
2151
Guido van Rossum96a42c81992-01-12 02:29:51 +00002152 if (why != WHY_RETURN)
2153 retval = NULL;
2154
Guido van Rossume59214e1994-08-30 08:01:59 +00002155 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002156 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002157 if (call_trace(&f->f_trace, &f->f_trace, f,
2158 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002160 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002161 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002162 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002163 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002164 }
2165
Guido van Rossuma027efa1997-05-05 20:56:21 +00002166 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2167 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002168 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002170 retval = NULL;
2171 why = WHY_EXCEPTION;
2172 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002173 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002174
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 reset_exc_info(tstate);
2176
2177 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002178
2179 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002180
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182
Guido van Rossuma027efa1997-05-05 20:56:21 +00002183 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002185
Guido van Rossum96a42c81992-01-12 02:29:51 +00002186 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002187}
2188
Guido van Rossuma027efa1997-05-05 20:56:21 +00002189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002190set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002191{
2192 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002193 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002194
Guido van Rossuma027efa1997-05-05 20:56:21 +00002195 frame = tstate->frame;
2196 if (frame->f_exc_type == NULL) {
2197 /* This frame didn't catch an exception before */
2198 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002199 if (tstate->exc_type == NULL) {
2200 Py_INCREF(Py_None);
2201 tstate->exc_type = Py_None;
2202 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002203 tmp_type = frame->f_exc_type;
2204 tmp_value = frame->f_exc_value;
2205 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002206 Py_XINCREF(tstate->exc_type);
2207 Py_XINCREF(tstate->exc_value);
2208 Py_XINCREF(tstate->exc_traceback);
2209 frame->f_exc_type = tstate->exc_type;
2210 frame->f_exc_value = tstate->exc_value;
2211 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002212 Py_XDECREF(tmp_type);
2213 Py_XDECREF(tmp_value);
2214 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002215 }
2216 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002217 tmp_type = tstate->exc_type;
2218 tmp_value = tstate->exc_value;
2219 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002220 Py_XINCREF(type);
2221 Py_XINCREF(value);
2222 Py_XINCREF(tb);
2223 tstate->exc_type = type;
2224 tstate->exc_value = value;
2225 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002226 Py_XDECREF(tmp_type);
2227 Py_XDECREF(tmp_value);
2228 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002229 /* For b/w compatibility */
2230 PySys_SetObject("exc_type", type);
2231 PySys_SetObject("exc_value", value);
2232 PySys_SetObject("exc_traceback", tb);
2233}
2234
2235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002236reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002237{
2238 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002239 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002240 frame = tstate->frame;
2241 if (frame->f_exc_type != NULL) {
2242 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002243 tmp_type = tstate->exc_type;
2244 tmp_value = tstate->exc_value;
2245 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002246 Py_XINCREF(frame->f_exc_type);
2247 Py_XINCREF(frame->f_exc_value);
2248 Py_XINCREF(frame->f_exc_traceback);
2249 tstate->exc_type = frame->f_exc_type;
2250 tstate->exc_value = frame->f_exc_value;
2251 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002252 Py_XDECREF(tmp_type);
2253 Py_XDECREF(tmp_value);
2254 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002255 /* For b/w compatibility */
2256 PySys_SetObject("exc_type", frame->f_exc_type);
2257 PySys_SetObject("exc_value", frame->f_exc_value);
2258 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2259 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002260 tmp_type = frame->f_exc_type;
2261 tmp_value = frame->f_exc_value;
2262 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002263 frame->f_exc_type = NULL;
2264 frame->f_exc_value = NULL;
2265 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002266 Py_XDECREF(tmp_type);
2267 Py_XDECREF(tmp_value);
2268 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002269}
2270
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002271/* Logic for the raise statement (too complicated for inlining).
2272 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002273static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002274do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002275{
Guido van Rossumd295f121998-04-09 21:39:57 +00002276 if (type == NULL) {
2277 /* Reraise */
2278 PyThreadState *tstate = PyThreadState_Get();
2279 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2280 value = tstate->exc_value;
2281 tb = tstate->exc_traceback;
2282 Py_XINCREF(type);
2283 Py_XINCREF(value);
2284 Py_XINCREF(tb);
2285 }
2286
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002287 /* We support the following forms of raise:
2288 raise <class>, <classinstance>
2289 raise <class>, <argument tuple>
2290 raise <class>, None
2291 raise <class>, <argument>
2292 raise <classinstance>, None
2293 raise <string>, <object>
2294 raise <string>, None
2295
2296 An omitted second argument is the same as None.
2297
2298 In addition, raise <tuple>, <anything> is the same as
2299 raising the tuple's first item (and it better have one!);
2300 this rule is applied recursively.
2301
2302 Finally, an optional third argument can be supplied, which
2303 gives the traceback to be substituted (useful when
2304 re-raising an exception after examining it). */
2305
2306 /* First, check the traceback argument, replacing None with
2307 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 if (tb == Py_None) {
2309 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002310 tb = NULL;
2311 }
2312 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002313 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002314 "raise 3rd arg must be traceback or None");
2315 goto raise_error;
2316 }
2317
2318 /* Next, replace a missing value with None */
2319 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 value = Py_None;
2321 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002322 }
2323
2324 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002325 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2326 PyObject *tmp = type;
2327 type = PyTuple_GET_ITEM(type, 0);
2328 Py_INCREF(type);
2329 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002330 }
2331
Barry Warsaw4249f541997-08-22 21:26:19 +00002332 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002333 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002334
2335 else if (PyClass_Check(type))
2336 PyErr_NormalizeException(&type, &value, &tb);
2337
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002339 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002340 if (value != Py_None) {
2341 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002342 "instance exception may not have a separate value");
2343 goto raise_error;
2344 }
2345 else {
2346 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002347 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002348 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002349 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2350 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002351 }
2352 }
2353 else {
2354 /* Not something you can raise. You get an exception
2355 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002357 "exceptions must be strings, classes, or instances");
2358 goto raise_error;
2359 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002361 if (tb == NULL)
2362 return WHY_EXCEPTION;
2363 else
2364 return WHY_RERAISE;
2365 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 Py_XDECREF(value);
2367 Py_XDECREF(type);
2368 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002369 return WHY_EXCEPTION;
2370}
2371
Barry Warsawe42b18f1997-08-25 22:13:04 +00002372static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002373unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002374{
2375 int i;
2376 PyObject *w;
2377
2378 for (i = 0; i < argcnt; i++) {
2379 if (! (w = PySequence_GetItem(v, i))) {
2380 if (PyErr_ExceptionMatches(PyExc_IndexError))
2381 PyErr_SetString(PyExc_ValueError,
2382 "unpack sequence of wrong size");
2383 goto finally;
2384 }
2385 *--sp = w;
2386 }
2387 /* we better get an IndexError now */
2388 if (PySequence_GetItem(v, i) == NULL) {
2389 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2390 PyErr_Clear();
2391 return 1;
2392 }
2393 /* some other exception occurred. fall through to finally */
2394 }
2395 else
2396 PyErr_SetString(PyExc_ValueError,
2397 "unpack sequence of wrong size");
2398 /* fall through */
2399finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002400 for (; i > 0; i--, sp++)
2401 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002402
2403 return 0;
2404}
2405
2406
Guido van Rossum96a42c81992-01-12 02:29:51 +00002407#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002409prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002412 if (PyObject_Print(v, stdout, 0) != 0)
2413 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002414 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002415 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002419static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002420call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002421{
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002423 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002424 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002425 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 value = Py_None;
2427 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002430 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002432 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002433 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002434 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002435 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002436 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002437 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002438 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002439 Py_XDECREF(type);
2440 Py_XDECREF(value);
2441 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002442 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002443}
2444
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002445/* PyObject **p_trace: in/out; may not be NULL;
2446 may not point to NULL variable initially
2447 PyObject **p_newtrace: in/out; may be NULL;
2448 may point to NULL variable;
2449 may be same variable as p_newtrace */
2450
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002451static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002452call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2453 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002454{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002455 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 PyObject *args, *what;
2457 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002458
Guido van Rossuma027efa1997-05-05 20:56:21 +00002459 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002460 /* Don't do recursive traces */
2461 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002463 *p_newtrace = NULL;
2464 }
2465 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002466 }
2467
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002469 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002470 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002472 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002473 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002474 Py_INCREF(f);
2475 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2476 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002477 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002478 arg = Py_None;
2479 Py_INCREF(arg);
2480 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002481 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 PyFrame_FastToLocals(f);
2483 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2484 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002485 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002486 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002488 if (res == NULL) {
2489 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 PyTraceBack_Here(f);
2491 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002492 *p_trace = NULL;
2493 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002494 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002495 *p_newtrace = NULL;
2496 }
Barry Warsawf6202631999-09-08 16:26:33 +00002497 /* to be extra double plus sure we don't get recursive
2498 * calls inf either tracefunc or profilefunc gets an
2499 * exception, zap the global variables.
2500 */
2501 Py_XDECREF(tstate->sys_tracefunc);
2502 tstate->sys_tracefunc = NULL;
2503 Py_XDECREF(tstate->sys_profilefunc);
2504 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002505 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002506 }
2507 else {
2508 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002509 Py_XDECREF(*p_newtrace);
2510 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002511 *p_newtrace = NULL;
2512 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002514 *p_newtrace = res;
2515 }
2516 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002517 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002518 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002519 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002520}
2521
Guido van Rossumb209a111997-04-29 18:18:01 +00002522PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002523PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002524{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002525 PyThreadState *tstate = PyThreadState_Get();
2526 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002527 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002528 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002529 else
2530 return current_frame->f_builtins;
2531}
2532
Guido van Rossumb209a111997-04-29 18:18:01 +00002533PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002534PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002535{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002536 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002537 if (current_frame == NULL)
2538 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002540 return current_frame->f_locals;
2541}
2542
Guido van Rossumb209a111997-04-29 18:18:01 +00002543PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002544PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002545{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002546 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547 if (current_frame == NULL)
2548 return NULL;
2549 else
2550 return current_frame->f_globals;
2551}
2552
Guido van Rossumb209a111997-04-29 18:18:01 +00002553PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002554PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002555{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002556 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002558}
2559
Guido van Rossum6135a871995-01-09 17:53:26 +00002560int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002561PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002562{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002563 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002564 return current_frame == NULL ? 0 : current_frame->f_restricted;
2565}
2566
Guido van Rossumbe270261997-05-22 22:26:18 +00002567int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569{
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002571 if (f == NULL)
2572 return 0;
2573 if (!PyFile_SoftSpace(f, 0))
2574 return 0;
2575 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576}
2577
Guido van Rossum3f5da241990-12-20 15:06:42 +00002578
Guido van Rossum681d79a1995-07-18 14:51:37 +00002579/* External interface to call any callable object.
2580 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002581
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002582#undef PyEval_CallObject
2583/* for backward compatibility: export this interface */
2584
Guido van Rossumb209a111997-04-29 18:18:01 +00002585PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002586PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002587{
Guido van Rossumb209a111997-04-29 18:18:01 +00002588 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002589}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002590#define PyEval_CallObject(func,arg) \
2591 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002592
Guido van Rossumb209a111997-04-29 18:18:01 +00002593PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002595{
2596 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002598
2599 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 arg = PyTuple_New(0);
2601 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602 PyErr_SetString(PyExc_TypeError,
2603 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002604 return NULL;
2605 }
2606 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002608
Guido van Rossumb209a111997-04-29 18:18:01 +00002609 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002610 PyErr_SetString(PyExc_TypeError,
2611 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002612 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002613 return NULL;
2614 }
2615
Guido van Rossum150b2df1996-12-05 23:17:11 +00002616 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002617 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002618 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002619 result = call_function(func, arg, kw);
2620 else
2621 result = call_builtin(func, arg, kw);
2622
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002624
Guido van Rossumb209a111997-04-29 18:18:01 +00002625 if (result == NULL && !PyErr_Occurred())
2626 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002627 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002628
2629 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002630}
2631
Guido van Rossumb209a111997-04-29 18:18:01 +00002632static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002633call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634{
Guido van Rossumb209a111997-04-29 18:18:01 +00002635 if (PyCFunction_Check(func)) {
2636 PyCFunction meth = PyCFunction_GetFunction(func);
2637 PyObject *self = PyCFunction_GetSelf(func);
2638 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002639 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002641 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002643 else if (size == 0)
2644 arg = NULL;
2645 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002646 if (flags & METH_KEYWORDS)
2647 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002648 if (kw != NULL && PyDict_Size(kw) != 0) {
2649 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002650 "this function takes no keyword arguments");
2651 return NULL;
2652 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002653 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 if (PyClass_Check(func)) {
2656 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 if (PyInstance_Check(func)) {
2659 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002660 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 PyErr_Clear();
2662 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002663 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002664 return NULL;
2665 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002666 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002668 return res;
2669 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002670 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002671 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 return NULL;
2673}
2674
Guido van Rossumb209a111997-04-29 18:18:01 +00002675static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002676call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677{
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 PyObject *class = NULL; /* == owner */
2679 PyObject *argdefs;
2680 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002681 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002683
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 if (kw != NULL && !PyDict_Check(kw)) {
2685 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002686 return NULL;
2687 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688
Guido van Rossumb209a111997-04-29 18:18:01 +00002689 if (PyMethod_Check(func)) {
2690 PyObject *self = PyMethod_Self(func);
2691 class = PyMethod_Class(func);
2692 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002693 if (self == NULL) {
2694 /* Unbound methods must be called with an instance of
2695 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 if (PyTuple_Size(arg) >= 1) {
2697 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002698 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 PyInstance_Check(self) &&
2700 PyClass_IsSubclass((PyObject *)
2701 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002702 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002703 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002704 else
2705 self = NULL;
2706 }
2707 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002709 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002710 return NULL;
2711 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002713 }
2714 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 int argcount = PyTuple_Size(arg);
2716 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002717 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002718 if (newarg == NULL)
2719 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 Py_INCREF(self);
2721 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002722 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 PyObject *v = PyTuple_GET_ITEM(arg, i);
2724 Py_XINCREF(v);
2725 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002726 }
2727 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002729 if (!PyFunction_Check(func)) {
2730 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2731 Py_DECREF(arg);
2732 return result;
2733 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 }
2735 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002737 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002738 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002739 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 return NULL;
2741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744
2745 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2747 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2748 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002749 }
2750 else {
2751 d = NULL;
2752 nd = 0;
2753 }
2754
2755 if (kw != NULL) {
2756 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 nk = PyDict_Size(kw);
2758 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 PyErr_NoMemory();
2761 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002762 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002763 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002764 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002766 i += 2;
2767 nk = i/2;
2768 /* XXX This is broken if the caller deletes dict items! */
2769 }
2770 else {
2771 k = NULL;
2772 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002773 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774
Guido van Rossum681d79a1995-07-18 14:51:37 +00002775 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 (PyCodeObject *)PyFunction_GetCode(func),
2777 PyFunction_GetGlobals(func), (PyObject *)NULL,
2778 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002779 k, nk,
2780 d, nd,
2781 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002784 if (k != NULL)
2785 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786
Guido van Rossum681d79a1995-07-18 14:51:37 +00002787 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788}
2789
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002790#define SLICE_ERROR_MSG \
2791 "standard sequence type does not support step size other than one"
2792
Guido van Rossumb209a111997-04-29 18:18:01 +00002793static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002797 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002798 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 return NULL;
2801 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002803 v = (*sq->sq_item)(v, i);
2804 if (v)
2805 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002806 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002808 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809}
2810
Guido van Rossum20c6add2000-05-08 14:06:50 +00002811/* Extract a slice index from a PyInt or PyLong, the index is bound to
2812 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2813 and error. Returns 1 on success.*/
2814
2815int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002816_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817{
2818 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002819 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002820 if (PyInt_Check(v)) {
2821 x = PyInt_AsLong(v);
2822 } else if (PyLong_Check(v)) {
2823 x = PyLong_AsLong(v);
2824 if (x==-1 && PyErr_Occurred()) {
2825 PyObject *long_zero;
2826
2827 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2828 /* It's not an overflow error, so just
2829 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002830 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002831 }
2832
2833 /* It's an overflow error, so we need to
2834 check the sign of the long integer,
2835 set the value to INT_MAX or 0, and clear
2836 the error. */
2837
2838 /* Create a long integer with a value of 0 */
2839 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002840 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002841
2842 /* Check sign */
2843 if (PyObject_Compare(long_zero, v) < 0)
2844 x = INT_MAX;
2845 else
2846 x = 0;
2847
2848 /* Free the long integer we created, and clear the
2849 OverflowError */
2850 Py_DECREF(long_zero);
2851 PyErr_Clear();
2852 }
2853 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002854 PyErr_SetString(PyExc_TypeError,
2855 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002856 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002858 /* Truncate -- very long indices are truncated anyway */
2859 if (x > INT_MAX)
2860 x = INT_MAX;
2861 else if (x < -INT_MAX)
2862 x = 0;
2863 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002865 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866}
2867
Guido van Rossumb209a111997-04-29 18:18:01 +00002868static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002869apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002871 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002872 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002874 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002875 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002876 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002878
2879static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002880assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002882 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002883 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002885 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002887 if (x == NULL)
2888 return PySequence_DelSlice(u, ilow, ihigh);
2889 else
2890 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891}
2892
Guido van Rossumb209a111997-04-29 18:18:01 +00002893static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002894cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895{
2896 register int cmp;
2897 register int res = 0;
2898 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002899 case IS:
2900 case IS_NOT:
2901 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002902 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002903 res = !res;
2904 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905 case IN:
2906 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002907 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002908 if (res < 0)
2909 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002910 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002911 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 break;
2913 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002914 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 break;
2916 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002917 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002918 if (cmp && PyErr_Occurred())
2919 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002920 switch (op) {
2921 case LT: res = cmp < 0; break;
2922 case LE: res = cmp <= 0; break;
2923 case EQ: res = cmp == 0; break;
2924 case NE: res = cmp != 0; break;
2925 case GT: res = cmp > 0; break;
2926 case GE: res = cmp >= 0; break;
2927 /* XXX no default? (res is initialized to 0 though) */
2928 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002930 v = res ? Py_True : Py_False;
2931 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932 return v;
2933}
2934
Thomas Wouters52152252000-08-17 22:55:00 +00002935static PyObject *
2936import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002937{
Guido van Rossumb209a111997-04-29 18:18:01 +00002938 PyObject *w, *x;
2939 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002940 PyErr_SetString(PyExc_TypeError,
2941 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002942 return NULL;
2943 }
2944 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2945 x = PyDict_GetItem(w, name);
2946 if (x == NULL) {
2947 PyErr_Format(PyExc_ImportError,
2948 "cannot import name %.230s",
2949 PyString_AsString(name));
2950 } else
2951 Py_INCREF(x);
2952 return x;
2953}
2954
2955static int
2956import_all_from(PyObject *locals, PyObject *v)
2957{
2958 int pos = 0, err;
2959 PyObject *name, *value;
2960 PyObject *w;
2961
2962 if (!PyModule_Check(v)) {
2963 PyErr_SetString(PyExc_TypeError,
2964 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002965 return -1;
2966 }
Thomas Wouters52152252000-08-17 22:55:00 +00002967 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2968
2969 while (PyDict_Next(w, &pos, &name, &value)) {
2970 if (!PyString_Check(name) ||
2971 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002972 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002973 Py_INCREF(value);
2974 err = PyDict_SetItem(locals, name, value);
2975 Py_DECREF(value);
2976 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002977 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002978 }
Thomas Wouters52152252000-08-17 22:55:00 +00002979 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002980}
2981
Guido van Rossumb209a111997-04-29 18:18:01 +00002982static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002983build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002984{
Guido van Rossumcd649651997-08-22 16:56:16 +00002985 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002986 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002987 PyErr_SetString(PyExc_SystemError,
2988 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002989 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002990 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002991 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002992 PyErr_SetString(PyExc_SystemError,
2993 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002994 return NULL;
2995 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002996 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002997 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002998 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002999 return NULL;
3000 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003001 n = PyTuple_Size(bases);
3002 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003003 PyObject *base = PyTuple_GET_ITEM(bases, i);
3004 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003005 /* Call the base's *type*, if it is callable.
3006 This code is a hook for Donald Beaudry's
3007 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003008 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003009 since its types are not callable.
3010 Ditto: call the bases's *class*, if it has
3011 one. This makes the same thing possible
3012 without writing C code. A true meta-object
3013 protocol! */
3014 PyObject *basetype = (PyObject *)base->ob_type;
3015 PyObject *callable = NULL;
3016 if (PyCallable_Check(basetype))
3017 callable = basetype;
3018 else
3019 callable = PyObject_GetAttrString(
3020 base, "__class__");
3021 if (callable) {
3022 PyObject *args;
3023 PyObject *newclass = NULL;
3024 args = Py_BuildValue(
3025 "(OOO)", name, bases, methods);
3026 if (args != NULL) {
3027 newclass = PyEval_CallObject(
3028 callable, args);
3029 Py_DECREF(args);
3030 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003031 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003032 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003033 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003034 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003035 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003036 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003037 "base is not a class object");
3038 return NULL;
3039 }
3040 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003041 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003042}
3043
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003044static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003045exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3046 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003047{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003048 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003049 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003050 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003051
Guido van Rossumb209a111997-04-29 18:18:01 +00003052 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3053 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003054 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003055 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003056 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003057 locals = PyTuple_GetItem(prog, 2);
3058 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003059 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003060 if (globals == Py_None) {
3061 globals = PyEval_GetGlobals();
3062 if (locals == Py_None) {
3063 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003064 plain = 1;
3065 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003066 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003067 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003068 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003069 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003070 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003071 !PyCode_Check(prog) &&
3072 !PyFile_Check(prog)) {
3073 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003074 "exec 1st arg must be string, code or file object");
3075 return -1;
3076 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003077 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3078 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003079 "exec 2nd/3rd args must be dict or None");
3080 return -1;
3081 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003082 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003083 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003084 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003085 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003086 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003087 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003088 FILE *fp = PyFile_AsFile(prog);
3089 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003090 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3091 }
3092 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003093 char *str;
3094 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003095 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003096 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003097 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003098 if (plain)
3099 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003100 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003101 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003102 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003103 return 0;
3104}
Guido van Rossum24c13741995-02-14 09:42:43 +00003105
Paul Prescode68140d2000-08-30 20:25:01 +00003106static void
3107format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3108{
3109 char *obj_str;
3110
3111 if (!obj)
3112 return;
3113
3114 obj_str = PyString_AsString(obj);
3115 if (!obj_str)
3116 return;
3117
3118 PyErr_Format(exc, format_str, obj_str);
3119}
Guido van Rossum950361c1997-01-24 13:49:28 +00003120
3121#ifdef DYNAMIC_EXECUTION_PROFILE
3122
3123PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003124getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003125{
3126 int i;
3127 PyObject *l = PyList_New(256);
3128 if (l == NULL) return NULL;
3129 for (i = 0; i < 256; i++) {
3130 PyObject *x = PyInt_FromLong(a[i]);
3131 if (x == NULL) {
3132 Py_DECREF(l);
3133 return NULL;
3134 }
3135 PyList_SetItem(l, i, x);
3136 }
3137 for (i = 0; i < 256; i++)
3138 a[i] = 0;
3139 return l;
3140}
3141
3142PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003143_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003144{
3145#ifndef DXPAIRS
3146 return getarray(dxp);
3147#else
3148 int i;
3149 PyObject *l = PyList_New(257);
3150 if (l == NULL) return NULL;
3151 for (i = 0; i < 257; i++) {
3152 PyObject *x = getarray(dxpairs[i]);
3153 if (x == NULL) {
3154 Py_DECREF(l);
3155 return NULL;
3156 }
3157 PyList_SetItem(l, i, x);
3158 }
3159 return l;
3160#endif
3161}
3162
3163#endif