blob: ad6e7920a593a1298265168200891d0c98aed431 [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 \
Fred Drake661ea262000-10-24 19:57:45 +000064 "name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000065#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000066 "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,
Fred Drake661ea262000-10-24 19:57:45 +0000442 "too many arguments to %s(); "
443 "expected %d, got %d",
444 PyString_AsString(co->co_name),
445 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 goto fail;
447 }
448 n = co->co_argcount;
449 }
450 for (i = 0; i < n; i++) {
451 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000452 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 SETLOCAL(i, x);
454 }
455 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000456 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000457 if (u == NULL)
458 goto fail;
459 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 for (i = n; i < argcount; i++) {
461 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000462 Py_INCREF(x);
463 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 }
466 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000467 PyObject *keyword = kws[2*i];
468 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000470 if (keyword == NULL || !PyString_Check(keyword)) {
471 PyErr_SetString(PyExc_TypeError,
472 "keywords must be strings");
473 goto fail;
474 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 /* XXX slow -- speed up using dictionary? */
476 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000477 PyObject *nm = PyTuple_GET_ITEM(
478 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000479 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 break;
481 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000482 /* Check errors from Compare */
483 if (PyErr_Occurred())
484 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 if (j >= co->co_argcount) {
486 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000488 "%.200s() got an unexpected "
489 "keyword argument '%.400s'",
490 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000491 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 goto fail;
493 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000494 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000495 }
496 else {
497 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000498 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000499 "keyword parameter '%.400s' "
500 "redefined in call to %.200s()",
501 PyString_AsString(keyword),
502 PyString_AsString(co->co_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 goto fail;
504 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 SETLOCAL(j, value);
507 }
508 }
509 if (argcount < co->co_argcount) {
510 int m = co->co_argcount - defcount;
511 for (i = argcount; i < m; i++) {
512 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000513 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000514 "not enough arguments to "
515 "%.200s(); expected %d, got %d",
516 PyString_AsString(co->co_name),
517 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000518 goto fail;
519 }
520 }
521 if (n > m)
522 i = n - m;
523 else
524 i = 0;
525 for (; i < defcount; i++) {
526 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000527 PyObject *def = defs[i];
528 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 SETLOCAL(m+i, def);
530 }
531 }
532 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000533 }
534 else {
535 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000536 PyErr_Format(PyExc_TypeError,
537 "%.200s() expected no arguments",
538 PyString_AsString(co->co_name));
Guido van Rossum8c5df061997-01-24 04:19:24 +0000539 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000540 }
541 }
542
Guido van Rossuma027efa1997-05-05 20:56:21 +0000543 if (tstate->sys_tracefunc != NULL) {
544 /* tstate->sys_tracefunc, if defined, is a function that
545 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000546 Its return value, if not None, is a function that
547 will be called at the start of each executed line
548 of code. (Actually, the function must return
549 itself in order to continue tracing.)
550 The trace functions are called with three arguments:
551 a pointer to the current frame, a string indicating
552 why the function is called, and an argument which
553 depends on the situation. The global trace function
554 (sys.trace) is also called whenever an exception
555 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000556 if (call_trace(&tstate->sys_tracefunc,
557 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000558 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000559 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000560 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000562 }
563
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 if (tstate->sys_profilefunc != NULL) {
565 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000566 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 if (call_trace(&tstate->sys_profilefunc,
568 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000569 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000571 }
572 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000573
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000574 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000575 --tstate->recursion_depth;
576 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000577 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000578 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000579 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000580 return NULL;
581 }
582
Guido van Rossumd076c731998-10-07 19:42:25 +0000583 _PyCode_GETCODEPTR(co, &first_instr);
584 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 stack_pointer = f->f_valuestack;
586
Guido van Rossum374a9221991-04-04 10:40:29 +0000587 why = WHY_NOT;
588 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000589 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000590 w = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000591
592 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000593 /* Do periodic things. Doing this every time through
594 the loop would add too much overhead, so we do it
595 only every Nth instruction. We also do it if
596 ``things_to_do'' is set, i.e. when an asynchronous
597 event needs attention (e.g. a signal handler or
598 async I/O handler); see Py_AddPendingCall() and
599 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000600
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000602 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000604 if (Py_MakePendingCalls() < 0) {
605 why = WHY_EXCEPTION;
606 goto on_error;
607 }
608 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000609#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000610 /* If we have true signals, the signal handler
611 will call Py_AddPendingCall() so we don't
612 have to call sigcheck(). On the Mac and
613 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000614 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 goto on_error;
617 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000618#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619
Guido van Rossume59214e1994-08-30 08:01:59 +0000620#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000621 if (interpreter_lock) {
622 /* Give another thread a chance */
623
Guido van Rossum25ce5661997-08-02 03:10:38 +0000624 if (PyThreadState_Swap(NULL) != tstate)
625 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000626 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000627
628 /* Other threads may run now */
629
Guido van Rossum65d5b571998-12-21 19:32:43 +0000630 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000631 if (PyThreadState_Swap(tstate) != NULL)
632 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000633 }
634#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000638
Guido van Rossum408027e1996-12-30 16:17:54 +0000639#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000640 f->f_lasti = INSTR_OFFSET();
641#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000642
643 opcode = NEXTOP();
644 if (HAS_ARG(opcode))
645 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000646 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000647#ifdef DYNAMIC_EXECUTION_PROFILE
648#ifdef DXPAIRS
649 dxpairs[lastopcode][opcode]++;
650 lastopcode = opcode;
651#endif
652 dxp[opcode]++;
653#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000654
Guido van Rossum96a42c81992-01-12 02:29:51 +0000655#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 /* Instruction tracing */
657
Guido van Rossum96a42c81992-01-12 02:29:51 +0000658 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 if (HAS_ARG(opcode)) {
660 printf("%d: %d, %d\n",
661 (int) (INSTR_OFFSET() - 3),
662 opcode, oparg);
663 }
664 else {
665 printf("%d: %d\n",
666 (int) (INSTR_OFFSET() - 1), opcode);
667 }
668 }
669#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 /* Main switch on opcode */
671
672 switch (opcode) {
673
674 /* BEWARE!
675 It is essential that any operation that fails sets either
676 x to NULL, err to nonzero, or why to anything but WHY_NOT,
677 and that no operation that succeeds does this! */
678
679 /* case STOP_CODE: this is an error! */
680
681 case POP_TOP:
682 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000683 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000684 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685
686 case ROT_TWO:
687 v = POP();
688 w = POP();
689 PUSH(v);
690 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000691 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000692
693 case ROT_THREE:
694 v = POP();
695 w = POP();
696 x = POP();
697 PUSH(v);
698 PUSH(x);
699 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000700 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000701
Thomas Wouters434d0822000-08-24 20:11:32 +0000702 case ROT_FOUR:
703 u = POP();
704 v = POP();
705 w = POP();
706 x = POP();
707 PUSH(u);
708 PUSH(x);
709 PUSH(w);
710 PUSH(v);
711 continue;
712
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 case DUP_TOP:
714 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000715 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000717 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000718
Thomas Wouters434d0822000-08-24 20:11:32 +0000719 case DUP_TOPX:
720 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000721 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000722 x = TOP();
723 Py_INCREF(x);
724 PUSH(x);
725 continue;
726 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000727 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000728 Py_INCREF(x);
729 w = TOP();
730 Py_INCREF(w);
731 PUSH(x);
732 PUSH(w);
733 PUSH(x);
734 continue;
735 case 3:
736 x = POP();
737 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000738 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000739 Py_INCREF(w);
740 v = TOP();
741 Py_INCREF(v);
742 PUSH(w);
743 PUSH(x);
744 PUSH(v);
745 PUSH(w);
746 PUSH(x);
747 continue;
748 case 4:
749 x = POP();
750 Py_INCREF(x);
751 w = POP();
752 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000753 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000754 Py_INCREF(v);
755 u = TOP();
756 Py_INCREF(u);
757 PUSH(v);
758 PUSH(w);
759 PUSH(x);
760 PUSH(u);
761 PUSH(v);
762 PUSH(w);
763 PUSH(x);
764 continue;
765 case 5:
766 x = POP();
767 Py_INCREF(x);
768 w = POP();
769 Py_INCREF(w);
770 v = POP();
771 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000772 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000773 Py_INCREF(u);
774 t = TOP();
775 Py_INCREF(t);
776 PUSH(u);
777 PUSH(v);
778 PUSH(w);
779 PUSH(x);
780 PUSH(t);
781 PUSH(u);
782 PUSH(v);
783 PUSH(w);
784 PUSH(x);
785 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000786 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000787 Py_FatalError("invalid argument to DUP_TOPX"
788 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000789 }
Tim Peters35ba6892000-10-11 07:04:49 +0000790 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000791
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 case UNARY_POSITIVE:
793 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000794 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000795 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000796 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000797 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000798 break;
799
800 case UNARY_NEGATIVE:
801 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000802 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000803 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000804 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000805 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000806 break;
807
808 case UNARY_NOT:
809 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000810 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000811 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000812 if (err == 0) {
813 Py_INCREF(Py_True);
814 PUSH(Py_True);
815 continue;
816 }
817 else if (err > 0) {
818 Py_INCREF(Py_False);
819 PUSH(Py_False);
820 err = 0;
821 continue;
822 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 break;
824
825 case UNARY_CONVERT:
826 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000827 x = PyObject_Repr(v);
828 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000830 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000832
833 case UNARY_INVERT:
834 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000835 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000836 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000837 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000838 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000839 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000840
Guido van Rossum50564e81996-01-12 01:13:16 +0000841 case BINARY_POWER:
842 w = POP();
843 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000844 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(v);
846 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000847 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000848 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000849 break;
850
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 case BINARY_MULTIPLY:
852 w = POP();
853 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
856 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000858 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 break;
860
861 case BINARY_DIVIDE:
862 w = POP();
863 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000864 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000865 Py_DECREF(v);
866 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000868 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
870
871 case BINARY_MODULO:
872 w = POP();
873 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000874 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000875 Py_DECREF(v);
876 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000878 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 break;
880
881 case BINARY_ADD:
882 w = POP();
883 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000884 if (PyInt_Check(v) && PyInt_Check(w)) {
885 /* INLINE: int + int */
886 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000887 a = PyInt_AS_LONG(v);
888 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000889 i = a + b;
890 if ((i^a) < 0 && (i^b) < 0) {
891 PyErr_SetString(PyExc_OverflowError,
892 "integer addition");
893 x = NULL;
894 }
895 else
896 x = PyInt_FromLong(i);
897 }
898 else
899 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(v);
901 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000903 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 break;
905
906 case BINARY_SUBTRACT:
907 w = POP();
908 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000909 if (PyInt_Check(v) && PyInt_Check(w)) {
910 /* INLINE: int - int */
911 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000912 a = PyInt_AS_LONG(v);
913 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000914 i = a - b;
915 if ((i^a) < 0 && (i^~b) < 0) {
916 PyErr_SetString(PyExc_OverflowError,
917 "integer subtraction");
918 x = NULL;
919 }
920 else
921 x = PyInt_FromLong(i);
922 }
923 else
924 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000925 Py_DECREF(v);
926 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000928 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 break;
930
931 case BINARY_SUBSCR:
932 w = POP();
933 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000934 if (PyList_Check(v) && PyInt_Check(w)) {
935 /* INLINE: list[int] */
936 long i = PyInt_AsLong(w);
937 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000938 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000939 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000940 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000941 PyErr_SetString(PyExc_IndexError,
942 "list index out of range");
943 x = NULL;
944 }
945 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000946 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000947 Py_INCREF(x);
948 }
949 }
950 else
951 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(v);
953 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
957
Guido van Rossum7928cd71991-10-24 14:59:31 +0000958 case BINARY_LSHIFT:
959 w = POP();
960 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000961 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(v);
963 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000964 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000965 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000966 break;
967
968 case BINARY_RSHIFT:
969 w = POP();
970 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000971 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000972 Py_DECREF(v);
973 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000974 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000975 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000976 break;
977
978 case BINARY_AND:
979 w = POP();
980 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000981 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(v);
983 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000984 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000986 break;
987
988 case BINARY_XOR:
989 w = POP();
990 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000991 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_DECREF(v);
993 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000995 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000996 break;
997
998 case BINARY_OR:
999 w = POP();
1000 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001001 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001002 Py_DECREF(v);
1003 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001004 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001005 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001006 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001007
1008 case INPLACE_POWER:
1009 w = POP();
1010 v = POP();
1011 x = PyNumber_InPlacePower(v, w, Py_None);
1012 Py_DECREF(v);
1013 Py_DECREF(w);
1014 PUSH(x);
1015 if (x != NULL) continue;
1016 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001017
Thomas Wouters434d0822000-08-24 20:11:32 +00001018 case INPLACE_MULTIPLY:
1019 w = POP();
1020 v = POP();
1021 x = PyNumber_InPlaceMultiply(v, w);
1022 Py_DECREF(v);
1023 Py_DECREF(w);
1024 PUSH(x);
1025 if (x != NULL) continue;
1026 break;
1027
1028 case INPLACE_DIVIDE:
1029 w = POP();
1030 v = POP();
1031 x = PyNumber_InPlaceDivide(v, w);
1032 Py_DECREF(v);
1033 Py_DECREF(w);
1034 PUSH(x);
1035 if (x != NULL) continue;
1036 break;
1037
1038 case INPLACE_MODULO:
1039 w = POP();
1040 v = POP();
1041 x = PyNumber_InPlaceRemainder(v, w);
1042 Py_DECREF(v);
1043 Py_DECREF(w);
1044 PUSH(x);
1045 if (x != NULL) continue;
1046 break;
1047
1048 case INPLACE_ADD:
1049 w = POP();
1050 v = POP();
1051 if (PyInt_Check(v) && PyInt_Check(w)) {
1052 /* INLINE: int + int */
1053 register long a, b, i;
1054 a = PyInt_AS_LONG(v);
1055 b = PyInt_AS_LONG(w);
1056 i = a + b;
1057 if ((i^a) < 0 && (i^b) < 0) {
1058 PyErr_SetString(PyExc_OverflowError,
1059 "integer addition");
1060 x = NULL;
1061 }
1062 else
1063 x = PyInt_FromLong(i);
1064 }
1065 else
1066 x = PyNumber_InPlaceAdd(v, w);
1067 Py_DECREF(v);
1068 Py_DECREF(w);
1069 PUSH(x);
1070 if (x != NULL) continue;
1071 break;
1072
1073 case INPLACE_SUBTRACT:
1074 w = POP();
1075 v = POP();
1076 if (PyInt_Check(v) && PyInt_Check(w)) {
1077 /* INLINE: int - int */
1078 register long a, b, i;
1079 a = PyInt_AS_LONG(v);
1080 b = PyInt_AS_LONG(w);
1081 i = a - b;
1082 if ((i^a) < 0 && (i^~b) < 0) {
1083 PyErr_SetString(PyExc_OverflowError,
1084 "integer subtraction");
1085 x = NULL;
1086 }
1087 else
1088 x = PyInt_FromLong(i);
1089 }
1090 else
1091 x = PyNumber_InPlaceSubtract(v, w);
1092 Py_DECREF(v);
1093 Py_DECREF(w);
1094 PUSH(x);
1095 if (x != NULL) continue;
1096 break;
1097
1098 case INPLACE_LSHIFT:
1099 w = POP();
1100 v = POP();
1101 x = PyNumber_InPlaceLshift(v, w);
1102 Py_DECREF(v);
1103 Py_DECREF(w);
1104 PUSH(x);
1105 if (x != NULL) continue;
1106 break;
1107
1108 case INPLACE_RSHIFT:
1109 w = POP();
1110 v = POP();
1111 x = PyNumber_InPlaceRshift(v, w);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
1117
1118 case INPLACE_AND:
1119 w = POP();
1120 v = POP();
1121 x = PyNumber_InPlaceAnd(v, w);
1122 Py_DECREF(v);
1123 Py_DECREF(w);
1124 PUSH(x);
1125 if (x != NULL) continue;
1126 break;
1127
1128 case INPLACE_XOR:
1129 w = POP();
1130 v = POP();
1131 x = PyNumber_InPlaceXor(v, w);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
1134 PUSH(x);
1135 if (x != NULL) continue;
1136 break;
1137
1138 case INPLACE_OR:
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceOr(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
1147
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 case SLICE+0:
1149 case SLICE+1:
1150 case SLICE+2:
1151 case SLICE+3:
1152 if ((opcode-SLICE) & 2)
1153 w = POP();
1154 else
1155 w = NULL;
1156 if ((opcode-SLICE) & 1)
1157 v = POP();
1158 else
1159 v = NULL;
1160 u = POP();
1161 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001162 Py_DECREF(u);
1163 Py_XDECREF(v);
1164 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001166 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 break;
1168
1169 case STORE_SLICE+0:
1170 case STORE_SLICE+1:
1171 case STORE_SLICE+2:
1172 case STORE_SLICE+3:
1173 if ((opcode-STORE_SLICE) & 2)
1174 w = POP();
1175 else
1176 w = NULL;
1177 if ((opcode-STORE_SLICE) & 1)
1178 v = POP();
1179 else
1180 v = NULL;
1181 u = POP();
1182 t = POP();
1183 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001184 Py_DECREF(t);
1185 Py_DECREF(u);
1186 Py_XDECREF(v);
1187 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001188 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 break;
1190
1191 case DELETE_SLICE+0:
1192 case DELETE_SLICE+1:
1193 case DELETE_SLICE+2:
1194 case DELETE_SLICE+3:
1195 if ((opcode-DELETE_SLICE) & 2)
1196 w = POP();
1197 else
1198 w = NULL;
1199 if ((opcode-DELETE_SLICE) & 1)
1200 v = POP();
1201 else
1202 v = NULL;
1203 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001204 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001206 Py_DECREF(u);
1207 Py_XDECREF(v);
1208 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 break;
1211
1212 case STORE_SUBSCR:
1213 w = POP();
1214 v = POP();
1215 u = POP();
1216 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001217 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001218 Py_DECREF(u);
1219 Py_DECREF(v);
1220 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001221 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 break;
1223
1224 case DELETE_SUBSCR:
1225 w = POP();
1226 v = POP();
1227 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001228 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 Py_DECREF(v);
1230 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001231 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001233
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 case PRINT_EXPR:
1235 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001236 /* Print value except if None */
1237 /* After printing, also assign to '_' */
1238 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001240 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001241 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001242 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001243 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001244 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001245 if (x == NULL) {
1246 PyErr_SetString(
1247 PyExc_RuntimeError,
1248 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001249 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001250 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001251 }
1252 if (err == 0)
1253 err = PyFile_WriteObject(v, x, 0);
1254 if (err == 0) {
1255 PyFile_SoftSpace(x, 1);
1256 err = Py_FlushLine();
1257 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001258 if (err == 0) {
1259 err = PyDict_SetItemString(
1260 f->f_builtins, "_", v);
1261 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
1265
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001266 case PRINT_ITEM_TO:
1267 w = stream = POP();
1268 /* fall through to PRINT_ITEM */
1269
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 case PRINT_ITEM:
1271 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001272 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001273 w = PySys_GetObject("stdout");
1274 if (w == NULL) {
1275 PyErr_SetString(PyExc_RuntimeError,
1276 "lost sys.stdout");
1277 err = -1;
1278 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001279 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001280 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001281 err = PyFile_WriteString(" ", w);
1282 if (err == 0)
1283 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001284 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001285 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001286 char *s = PyString_AsString(v);
1287 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001288 if (len > 0 &&
1289 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001290 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001294 Py_XDECREF(stream);
1295 stream = NULL;
1296 if (err == 0)
1297 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
1299
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001300 case PRINT_NEWLINE_TO:
1301 w = stream = POP();
1302 /* fall through to PRINT_NEWLINE */
1303
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001305 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001306 w = PySys_GetObject("stdout");
1307 if (w == NULL)
1308 PyErr_SetString(PyExc_RuntimeError,
1309 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001310 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001311 if (w != NULL) {
1312 err = PyFile_WriteString("\n", w);
1313 if (err == 0)
1314 PyFile_SoftSpace(w, 0);
1315 }
1316 Py_XDECREF(stream);
1317 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 break;
1319
Thomas Wouters434d0822000-08-24 20:11:32 +00001320
1321#ifdef CASE_TOO_BIG
1322 default: switch (opcode) {
1323#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 case BREAK_LOOP:
1325 why = WHY_BREAK;
1326 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001327
Guido van Rossumf10570b1995-07-07 22:53:21 +00001328 case RAISE_VARARGS:
1329 u = v = w = NULL;
1330 switch (oparg) {
1331 case 3:
1332 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001333 /* Fallthrough */
1334 case 2:
1335 v = POP(); /* value */
1336 /* Fallthrough */
1337 case 1:
1338 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001339 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001340 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001341 break;
1342 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001344 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001345 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001346 break;
1347 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 break;
1349
1350 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001351 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001352 PyErr_SetString(PyExc_SystemError,
1353 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001354 break;
1355 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001357 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 break;
1359
1360 case RETURN_VALUE:
1361 retval = POP();
1362 why = WHY_RETURN;
1363 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001364
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001365 case EXEC_STMT:
1366 w = POP();
1367 v = POP();
1368 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001369 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 Py_DECREF(u);
1371 Py_DECREF(v);
1372 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001373 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 case POP_BLOCK:
1376 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 while (STACK_LEVEL() > b->b_level) {
1379 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 }
1382 }
1383 break;
1384
1385 case END_FINALLY:
1386 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 if (PyInt_Check(v)) {
1388 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 if (why == WHY_RETURN)
1390 retval = POP();
1391 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001392 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001394 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001397 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 else if (v != Py_None) {
1400 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 "'finally' pops bad exception");
1402 why = WHY_EXCEPTION;
1403 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 break;
1406
1407 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001408 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001410 w = POP();
1411 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 Py_DECREF(u);
1414 Py_DECREF(v);
1415 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 break;
1417
1418 case STORE_NAME:
1419 w = GETNAMEV(oparg);
1420 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001422 PyErr_SetString(PyExc_SystemError,
1423 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001424 break;
1425 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 err = PyDict_SetItem(x, w, v);
1427 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 break;
1429
1430 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001431 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001432 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001433 PyErr_SetString(PyExc_SystemError,
1434 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001435 break;
1436 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001438 format_exc_check_arg(PyExc_NameError,
1439 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001441
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001442 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001444 if (PyTuple_Check(v)) {
1445 if (PyTuple_Size(v) != oparg) {
1446 PyErr_SetString(PyExc_ValueError,
1447 "unpack tuple of wrong size");
1448 why = WHY_EXCEPTION;
1449 }
1450 else {
1451 for (; --oparg >= 0; ) {
1452 w = PyTuple_GET_ITEM(v, oparg);
1453 Py_INCREF(w);
1454 PUSH(w);
1455 }
1456 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001458 else if (PyList_Check(v)) {
1459 if (PyList_Size(v) != oparg) {
1460 PyErr_SetString(PyExc_ValueError,
1461 "unpack list of wrong size");
1462 why = WHY_EXCEPTION;
1463 }
1464 else {
1465 for (; --oparg >= 0; ) {
1466 w = PyList_GET_ITEM(v, oparg);
1467 Py_INCREF(w);
1468 PUSH(w);
1469 }
1470 }
1471 }
1472 else if (PySequence_Check(v)) {
1473 if (unpack_sequence(v, oparg,
1474 stack_pointer + oparg))
1475 stack_pointer += oparg;
1476 else
1477 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 }
1479 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001480 PyErr_SetString(PyExc_TypeError,
1481 "unpack non-sequence");
1482 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001484 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 break;
1486
1487 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001488 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 v = POP();
1490 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1492 Py_DECREF(v);
1493 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 break;
1495
1496 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001497 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001499 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1500 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001501 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 break;
1503
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001504 case STORE_GLOBAL:
1505 w = GETNAMEV(oparg);
1506 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 err = PyDict_SetItem(f->f_globals, w, v);
1508 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001509 break;
1510
1511 case DELETE_GLOBAL:
1512 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001514 format_exc_check_arg(
1515 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001516 break;
1517
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 case LOAD_CONST:
1519 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 PUSH(x);
1522 break;
1523
1524 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001525 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001526 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001527 PyErr_SetString(PyExc_SystemError,
1528 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001529 break;
1530 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001535 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001537 format_exc_check_arg(
1538 PyExc_NameError,
1539 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 break;
1541 }
1542 }
1543 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 PUSH(x);
1546 break;
1547
1548 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001549 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001554 format_exc_check_arg(
1555 PyExc_NameError,
1556 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 break;
1558 }
1559 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 PUSH(x);
1562 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001563
Guido van Rossum9bfef441993-03-29 10:43:31 +00001564 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001565 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001566 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001567 format_exc_check_arg(
1568 PyExc_UnboundLocalError,
1569 UNBOUNDLOCAL_ERROR_MSG,
1570 PyTuple_GetItem(co->co_varnames, oparg)
1571 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001572 break;
1573 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001575 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001576 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001577 break;
1578
1579 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001580 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001582 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001583
1584 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001585 x = GETLOCAL(oparg);
1586 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001587 format_exc_check_arg(
1588 PyExc_UnboundLocalError,
1589 UNBOUNDLOCAL_ERROR_MSG,
1590 PyTuple_GetItem(co->co_varnames, oparg)
1591 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001592 break;
1593 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001594 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001595 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001596
1597 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 if (x != NULL) {
1600 for (; --oparg >= 0;) {
1601 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 }
1604 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001605 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 }
1607 break;
1608
1609 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001610 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001611 if (x != NULL) {
1612 for (; --oparg >= 0;) {
1613 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001614 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 }
1616 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001617 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 }
1619 break;
1620
1621 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001622 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001624 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001625 break;
1626
1627 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001628 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001630 x = PyObject_GetAttr(v, w);
1631 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001633 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 break;
1635
1636 case COMPARE_OP:
1637 w = POP();
1638 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001639 if (PyInt_Check(v) && PyInt_Check(w)) {
1640 /* INLINE: cmp(int, int) */
1641 register long a, b;
1642 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001643 a = PyInt_AS_LONG(v);
1644 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001645 switch (oparg) {
1646 case LT: res = a < b; break;
1647 case LE: res = a <= b; break;
1648 case EQ: res = a == b; break;
1649 case NE: res = a != b; break;
1650 case GT: res = a > b; break;
1651 case GE: res = a >= b; break;
1652 case IS: res = v == w; break;
1653 case IS_NOT: res = v != w; break;
1654 default: goto slow_compare;
1655 }
1656 x = res ? Py_True : Py_False;
1657 Py_INCREF(x);
1658 }
1659 else {
1660 slow_compare:
1661 x = cmp_outcome(oparg, v, w);
1662 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 Py_DECREF(v);
1664 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001666 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 break;
1668
1669 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001670 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001671 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001672 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001673 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001674 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001675 break;
1676 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001677 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 w,
1680 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001681 f->f_locals == NULL ?
1682 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001683 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001685 if (w == NULL) {
1686 x = NULL;
1687 break;
1688 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 x = PyEval_CallObject(x, w);
1690 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001692 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
1694
Thomas Wouters52152252000-08-17 22:55:00 +00001695 case IMPORT_STAR:
1696 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001698 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001699 PyErr_SetString(PyExc_SystemError,
1700 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001701 break;
1702 }
Thomas Wouters52152252000-08-17 22:55:00 +00001703 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001704 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001705 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001706 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001708
Thomas Wouters52152252000-08-17 22:55:00 +00001709 case IMPORT_FROM:
1710 w = GETNAMEV(oparg);
1711 v = TOP();
1712 x = import_from(v, w);
1713 PUSH(x);
1714 if (x != NULL) continue;
1715 break;
1716
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 case JUMP_FORWARD:
1718 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001719 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001720
1721 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001723 if (err > 0)
1724 err = 0;
1725 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001727 else
1728 break;
1729 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001730
1731 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001733 if (err > 0) {
1734 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001736 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001737 else if (err == 0)
1738 ;
1739 else
1740 break;
1741 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001742
1743 case JUMP_ABSOLUTE:
1744 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001745 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001746
1747 case FOR_LOOP:
1748 /* for v in s: ...
1749 On entry: stack contains s, i.
1750 On exit: stack contains s, i+1, s[i];
1751 but if loop exhausted:
1752 s, i are popped, and we jump */
1753 w = POP(); /* Loop index */
1754 v = POP(); /* Sequence object */
1755 u = loop_subscript(v, w);
1756 if (u != NULL) {
1757 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001762 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 }
1764 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 Py_DECREF(v);
1766 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 /* A NULL can mean "s exhausted"
1768 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001770 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001771 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001773 continue;
1774 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 }
1776 break;
1777
1778 case SETUP_LOOP:
1779 case SETUP_EXCEPT:
1780 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001783 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001784
1785 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001786#ifdef LLTRACE
1787 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001788 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001789#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001790 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001791 if (f->f_trace == NULL)
1792 continue;
1793 /* Trace each line of code reached */
1794 f->f_lasti = INSTR_OFFSET();
1795 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001796 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001798
1799 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001800 case CALL_FUNCTION_VAR:
1801 case CALL_FUNCTION_KW:
1802 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001803 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001804 int na = oparg & 0xff;
1805 int nk = (oparg>>8) & 0xff;
1806 int flags = (opcode - CALL_FUNCTION) & 3;
1807 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1808 PyObject **pfunc = stack_pointer - n - 1;
1809 PyObject *func = *pfunc;
1810 PyObject *self = NULL;
1811 PyObject *class = NULL;
1812 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1813 if (PyMethod_Check(func)) {
1814 self = PyMethod_Self(func);
1815 class = PyMethod_Class(func);
1816 func = PyMethod_Function(func);
1817 Py_INCREF(func);
1818 if (self != NULL) {
1819 Py_INCREF(self);
1820 Py_DECREF(*pfunc);
1821 *pfunc = self;
1822 na++;
1823 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001824 }
Jeremy Hylton6b4ec512000-10-30 17:15:20 +00001825 else if (!((flags & 1) && na == 0)) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001826 /* Unbound methods must be called with an
1827 instance of the class (or a derived
1828 class) as first argument */
1829 if (na > 0 && (self = stack_pointer[-n]) != NULL
1830 && PyInstance_Check(self)
1831 && PyClass_IsSubclass((PyObject *)
1832 (((PyInstanceObject *)self)->in_class),
1833 class))
1834 /* Handy-dandy */ ;
1835 else {
1836 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001837 "unbound method must be called with instance as first argument");
Jeremy Hylton76901512000-03-28 23:49:17 +00001838 x = NULL;
1839 break;
1840 }
1841 }
1842 }
1843 else
1844 Py_INCREF(func);
1845 if (PyFunction_Check(func) && flags == 0) {
1846 PyObject *co = PyFunction_GetCode(func);
1847 PyObject *globals = PyFunction_GetGlobals(func);
1848 PyObject *argdefs = PyFunction_GetDefaults(func);
1849 PyObject **d;
1850 int nd;
1851 if (argdefs != NULL) {
1852 d = &PyTuple_GET_ITEM(argdefs, 0);
1853 nd = ((PyTupleObject *)argdefs)->ob_size;
1854 }
1855 else {
1856 d = NULL;
1857 nd = 0;
1858 }
1859 x = eval_code2((PyCodeObject *)co, globals,
1860 (PyObject *)NULL, stack_pointer-n, na,
1861 stack_pointer-2*nk, nk, d, nd,
1862 class);
1863 }
1864 else {
1865 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001866 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001867 PyObject *stararg = 0;
1868 PyObject *kwdict = NULL;
1869 if (flags & 2) {
1870 kwdict = POP();
1871 if (!PyDict_Check(kwdict)) {
1872 PyErr_SetString(PyExc_TypeError,
1873 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001874 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001875 }
1876 }
1877 if (flags & 1) {
1878 stararg = POP();
1879 if (!PySequence_Check(stararg)) {
1880 PyErr_SetString(PyExc_TypeError,
1881 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001882 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001883 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001884 /* Convert abstract sequence to concrete tuple */
1885 if (!PyTuple_Check(stararg)) {
1886 PyObject *t = NULL;
1887 t = PySequence_Tuple(stararg);
1888 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001889 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001890 }
1891 Py_DECREF(stararg);
1892 stararg = t;
1893 }
1894 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001895 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001896 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001897 }
Jeremy Hylton6b4ec512000-10-30 17:15:20 +00001898 if (class && self == NULL && na == 0) {
1899 /* * arg is first argument of method,
1900 so check it is isinstance of class */
1901 self = PyTuple_GET_ITEM(stararg, 0);
1902 if (!(PyInstance_Check(self) &&
1903 PyClass_IsSubclass((PyObject *)
1904 (((PyInstanceObject *)self)->in_class),
1905 class))) {
1906 PyErr_SetString(PyExc_TypeError,
1907 "unbound method must be called with instance as first argument");
1908 x = NULL;
1909 break;
1910 }
1911 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001912 }
1913 if (nk > 0) {
1914 if (kwdict == NULL) {
1915 kwdict = PyDict_New();
1916 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001917 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001918 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001919 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001920 else {
1921 PyObject *d = PyDict_Copy(kwdict);
1922 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001923 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001924 }
1925 Py_DECREF(kwdict);
1926 kwdict = d;
1927 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001928 err = 0;
1929 while (--nk >= 0) {
1930 PyObject *value = POP();
1931 PyObject *key = POP();
1932 if (PyDict_GetItem(kwdict, key) != NULL) {
1933 err = 1;
Fred Drake661ea262000-10-24 19:57:45 +00001934 PyErr_Format(PyExc_TypeError,
1935 "keyword parameter '%.400s' "
1936 "redefined in function call",
1937 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001938 Py_DECREF(key);
1939 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001940 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001941 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001942 err = PyDict_SetItem(kwdict, key, value);
1943 Py_DECREF(key);
1944 Py_DECREF(value);
1945 if (err)
1946 break;
1947 }
1948 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001949 extcall_fail:
1950 Py_XDECREF(kwdict);
1951 Py_XDECREF(stararg);
1952 Py_DECREF(func);
1953 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001954 break;
1955 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001956 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001957 callargs = PyTuple_New(na + nstar);
1958 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001959 x = NULL;
1960 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001961 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001962 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001963 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001964 for (i = 0; i < nstar; i++) {
1965 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1966 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001967 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001968 }
1969 Py_DECREF(stararg);
1970 }
1971 while (--na >= 0) {
1972 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001973 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001974 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001975 x = PyEval_CallObjectWithKeywords(func,
1976 callargs,
1977 kwdict);
1978 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001979 Py_XDECREF(kwdict);
1980 }
1981 Py_DECREF(func);
1982 while (stack_pointer > pfunc) {
1983 w = POP();
1984 Py_DECREF(w);
1985 }
1986 PUSH(x);
1987 if (x != NULL) continue;
1988 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001989 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001990
Guido van Rossum681d79a1995-07-18 14:51:37 +00001991 case MAKE_FUNCTION:
1992 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001993 x = PyFunction_New(v, f->f_globals);
1994 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001995 /* XXX Maybe this should be a separate opcode? */
1996 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001997 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001998 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002000 x = NULL;
2001 break;
2002 }
2003 while (--oparg >= 0) {
2004 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002005 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002006 }
2007 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002008 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002009 }
2010 PUSH(x);
2011 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002012
2013 case BUILD_SLICE:
2014 if (oparg == 3)
2015 w = POP();
2016 else
2017 w = NULL;
2018 v = POP();
2019 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002020 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 Py_DECREF(u);
2022 Py_DECREF(v);
2023 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002024 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002025 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002026 break;
2027
Fred Drakeef8ace32000-08-24 00:32:09 +00002028 case EXTENDED_ARG:
2029 opcode = NEXTOP();
2030 oparg = oparg<<16 | NEXTARG();
2031 goto dispatch_opcode;
2032 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002033
Guido van Rossum374a9221991-04-04 10:40:29 +00002034 default:
2035 fprintf(stderr,
2036 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002037 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002039 why = WHY_EXCEPTION;
2040 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002041
2042#ifdef CASE_TOO_BIG
2043 }
2044#endif
2045
Guido van Rossum374a9221991-04-04 10:40:29 +00002046 } /* switch */
2047
2048 on_error:
2049
2050 /* Quickly continue if no error occurred */
2051
2052 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002053 if (err == 0 && x != NULL) {
2054#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002055 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002057 fprintf(stderr,
2058 "XXX undetected error\n");
2059 else
2060#endif
2061 continue; /* Normal, fast path */
2062 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002063 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002065 err = 0;
2066 }
2067
Guido van Rossum374a9221991-04-04 10:40:29 +00002068 /* Double-check exception status */
2069
2070 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002072 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002073 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002074 why = WHY_EXCEPTION;
2075 }
2076 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002077#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002078 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002079 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081 fprintf(stderr,
2082 "XXX undetected error (why=%d)\n",
2083 why);
2084 why = WHY_EXCEPTION;
2085 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 }
2087#endif
2088
2089 /* Log traceback info if this is a real exception */
2090
2091 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002092 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002094 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002095 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002096
Guido van Rossume59214e1994-08-30 08:01:59 +00002097 if (f->f_trace)
2098 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002099 if (tstate->sys_profilefunc)
2100 call_exc_trace(&tstate->sys_profilefunc,
2101 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002102 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002103
2104 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2105
2106 if (why == WHY_RERAISE)
2107 why = WHY_EXCEPTION;
2108
2109 /* Unwind stacks if a (pseudo) exception occurred */
2110
2111 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002112 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002113 while (STACK_LEVEL() > b->b_level) {
2114 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 }
2117 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2118 why = WHY_NOT;
2119 JUMPTO(b->b_handler);
2120 break;
2121 }
2122 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002123 (b->b_type == SETUP_EXCEPT &&
2124 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002125 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 PyObject *exc, *val, *tb;
2127 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002128 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 val = Py_None;
2130 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002131 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 /* Make the raw exception data
2133 available to the handler,
2134 so a program can emulate the
2135 Python main loop. Don't do
2136 this for 'finally'. */
2137 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002138 PyErr_NormalizeException(
2139 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002140 set_exc_info(tstate,
2141 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002143 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 PUSH(val);
2145 PUSH(exc);
2146 }
2147 else {
2148 if (why == WHY_RETURN)
2149 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 PUSH(v);
2152 }
2153 why = WHY_NOT;
2154 JUMPTO(b->b_handler);
2155 break;
2156 }
2157 } /* unwind stack */
2158
2159 /* End the loop if we still have an error (or return) */
2160
2161 if (why != WHY_NOT)
2162 break;
2163
2164 } /* main loop */
2165
2166 /* Pop remaining stack entries */
2167
2168 while (!EMPTY()) {
2169 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 }
2172
Guido van Rossum96a42c81992-01-12 02:29:51 +00002173 if (why != WHY_RETURN)
2174 retval = NULL;
2175
Guido van Rossume59214e1994-08-30 08:01:59 +00002176 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002177 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002178 if (call_trace(&f->f_trace, &f->f_trace, f,
2179 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002181 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002182 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002183 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002184 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002185 }
2186
Guido van Rossuma027efa1997-05-05 20:56:21 +00002187 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2188 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002189 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002191 retval = NULL;
2192 why = WHY_EXCEPTION;
2193 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002194 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002195
Guido van Rossuma027efa1997-05-05 20:56:21 +00002196 reset_exc_info(tstate);
2197
2198 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002199
2200 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002201
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002203
Guido van Rossuma027efa1997-05-05 20:56:21 +00002204 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002206
Guido van Rossum96a42c81992-01-12 02:29:51 +00002207 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002208}
2209
Guido van Rossuma027efa1997-05-05 20:56:21 +00002210static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002211set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002212{
2213 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002214 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002215
Guido van Rossuma027efa1997-05-05 20:56:21 +00002216 frame = tstate->frame;
2217 if (frame->f_exc_type == NULL) {
2218 /* This frame didn't catch an exception before */
2219 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002220 if (tstate->exc_type == NULL) {
2221 Py_INCREF(Py_None);
2222 tstate->exc_type = Py_None;
2223 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002224 tmp_type = frame->f_exc_type;
2225 tmp_value = frame->f_exc_value;
2226 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002227 Py_XINCREF(tstate->exc_type);
2228 Py_XINCREF(tstate->exc_value);
2229 Py_XINCREF(tstate->exc_traceback);
2230 frame->f_exc_type = tstate->exc_type;
2231 frame->f_exc_value = tstate->exc_value;
2232 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002233 Py_XDECREF(tmp_type);
2234 Py_XDECREF(tmp_value);
2235 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 }
2237 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002238 tmp_type = tstate->exc_type;
2239 tmp_value = tstate->exc_value;
2240 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002241 Py_XINCREF(type);
2242 Py_XINCREF(value);
2243 Py_XINCREF(tb);
2244 tstate->exc_type = type;
2245 tstate->exc_value = value;
2246 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002247 Py_XDECREF(tmp_type);
2248 Py_XDECREF(tmp_value);
2249 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002250 /* For b/w compatibility */
2251 PySys_SetObject("exc_type", type);
2252 PySys_SetObject("exc_value", value);
2253 PySys_SetObject("exc_traceback", tb);
2254}
2255
2256static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002257reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002258{
2259 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002260 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002261 frame = tstate->frame;
2262 if (frame->f_exc_type != NULL) {
2263 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002264 tmp_type = tstate->exc_type;
2265 tmp_value = tstate->exc_value;
2266 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002267 Py_XINCREF(frame->f_exc_type);
2268 Py_XINCREF(frame->f_exc_value);
2269 Py_XINCREF(frame->f_exc_traceback);
2270 tstate->exc_type = frame->f_exc_type;
2271 tstate->exc_value = frame->f_exc_value;
2272 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002273 Py_XDECREF(tmp_type);
2274 Py_XDECREF(tmp_value);
2275 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002276 /* For b/w compatibility */
2277 PySys_SetObject("exc_type", frame->f_exc_type);
2278 PySys_SetObject("exc_value", frame->f_exc_value);
2279 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2280 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002281 tmp_type = frame->f_exc_type;
2282 tmp_value = frame->f_exc_value;
2283 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002284 frame->f_exc_type = NULL;
2285 frame->f_exc_value = NULL;
2286 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002287 Py_XDECREF(tmp_type);
2288 Py_XDECREF(tmp_value);
2289 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002290}
2291
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002292/* Logic for the raise statement (too complicated for inlining).
2293 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002294static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002295do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002296{
Guido van Rossumd295f121998-04-09 21:39:57 +00002297 if (type == NULL) {
2298 /* Reraise */
2299 PyThreadState *tstate = PyThreadState_Get();
2300 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2301 value = tstate->exc_value;
2302 tb = tstate->exc_traceback;
2303 Py_XINCREF(type);
2304 Py_XINCREF(value);
2305 Py_XINCREF(tb);
2306 }
2307
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002308 /* We support the following forms of raise:
2309 raise <class>, <classinstance>
2310 raise <class>, <argument tuple>
2311 raise <class>, None
2312 raise <class>, <argument>
2313 raise <classinstance>, None
2314 raise <string>, <object>
2315 raise <string>, None
2316
2317 An omitted second argument is the same as None.
2318
2319 In addition, raise <tuple>, <anything> is the same as
2320 raising the tuple's first item (and it better have one!);
2321 this rule is applied recursively.
2322
2323 Finally, an optional third argument can be supplied, which
2324 gives the traceback to be substituted (useful when
2325 re-raising an exception after examining it). */
2326
2327 /* First, check the traceback argument, replacing None with
2328 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 if (tb == Py_None) {
2330 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002331 tb = NULL;
2332 }
2333 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002335 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002336 goto raise_error;
2337 }
2338
2339 /* Next, replace a missing value with None */
2340 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 value = Py_None;
2342 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002343 }
2344
2345 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2347 PyObject *tmp = type;
2348 type = PyTuple_GET_ITEM(type, 0);
2349 Py_INCREF(type);
2350 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002351 }
2352
Barry Warsaw4249f541997-08-22 21:26:19 +00002353 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002354 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002355
2356 else if (PyClass_Check(type))
2357 PyErr_NormalizeException(&type, &value, &tb);
2358
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002360 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002361 if (value != Py_None) {
2362 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002363 "instance exception may not have a separate value");
2364 goto raise_error;
2365 }
2366 else {
2367 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002368 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002369 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2371 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002372 }
2373 }
2374 else {
2375 /* Not something you can raise. You get an exception
2376 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002377 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002378 "exceptions must be strings, classes, or instances");
2379 goto raise_error;
2380 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002382 if (tb == NULL)
2383 return WHY_EXCEPTION;
2384 else
2385 return WHY_RERAISE;
2386 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 Py_XDECREF(value);
2388 Py_XDECREF(type);
2389 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002390 return WHY_EXCEPTION;
2391}
2392
Barry Warsawe42b18f1997-08-25 22:13:04 +00002393static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002394unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002395{
2396 int i;
2397 PyObject *w;
2398
2399 for (i = 0; i < argcnt; i++) {
2400 if (! (w = PySequence_GetItem(v, i))) {
2401 if (PyErr_ExceptionMatches(PyExc_IndexError))
2402 PyErr_SetString(PyExc_ValueError,
2403 "unpack sequence of wrong size");
2404 goto finally;
2405 }
2406 *--sp = w;
2407 }
2408 /* we better get an IndexError now */
2409 if (PySequence_GetItem(v, i) == NULL) {
2410 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2411 PyErr_Clear();
2412 return 1;
2413 }
2414 /* some other exception occurred. fall through to finally */
2415 }
2416 else
2417 PyErr_SetString(PyExc_ValueError,
2418 "unpack sequence of wrong size");
2419 /* fall through */
2420finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002421 for (; i > 0; i--, sp++)
2422 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002423
2424 return 0;
2425}
2426
2427
Guido van Rossum96a42c81992-01-12 02:29:51 +00002428#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002429static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002430prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002432 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 if (PyObject_Print(v, stdout, 0) != 0)
2434 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002435 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002436 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002438#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002441call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002442{
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002444 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002446 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002447 value = Py_None;
2448 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002449 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002451 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002453 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002454 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002455 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002457 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002459 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002460 Py_XDECREF(type);
2461 Py_XDECREF(value);
2462 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002463 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002464}
2465
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002466/* PyObject **p_trace: in/out; may not be NULL;
2467 may not point to NULL variable initially
2468 PyObject **p_newtrace: in/out; may be NULL;
2469 may point to NULL variable;
2470 may be same variable as p_newtrace */
2471
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002472static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002473call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2474 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002475{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002476 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 PyObject *args, *what;
2478 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002479
Guido van Rossuma027efa1997-05-05 20:56:21 +00002480 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002481 /* Don't do recursive traces */
2482 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002484 *p_newtrace = NULL;
2485 }
2486 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002487 }
2488
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002490 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002491 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002493 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002494 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002495 Py_INCREF(f);
2496 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2497 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002498 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002499 arg = Py_None;
2500 Py_INCREF(arg);
2501 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002502 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002503 PyFrame_FastToLocals(f);
2504 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2505 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002506 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002507 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002509 if (res == NULL) {
2510 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002511 PyTraceBack_Here(f);
2512 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002513 *p_trace = NULL;
2514 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002515 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002516 *p_newtrace = NULL;
2517 }
Barry Warsawf6202631999-09-08 16:26:33 +00002518 /* to be extra double plus sure we don't get recursive
2519 * calls inf either tracefunc or profilefunc gets an
2520 * exception, zap the global variables.
2521 */
2522 Py_XDECREF(tstate->sys_tracefunc);
2523 tstate->sys_tracefunc = NULL;
2524 Py_XDECREF(tstate->sys_profilefunc);
2525 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002526 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002527 }
2528 else {
2529 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002530 Py_XDECREF(*p_newtrace);
2531 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002532 *p_newtrace = NULL;
2533 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002535 *p_newtrace = res;
2536 }
2537 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002538 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002539 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002540 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002541}
2542
Guido van Rossumb209a111997-04-29 18:18:01 +00002543PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002544PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002545{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002546 PyThreadState *tstate = PyThreadState_Get();
2547 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002548 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002549 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002550 else
2551 return current_frame->f_builtins;
2552}
2553
Guido van Rossumb209a111997-04-29 18:18:01 +00002554PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002555PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002556{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002558 if (current_frame == NULL)
2559 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002561 return current_frame->f_locals;
2562}
2563
Guido van Rossumb209a111997-04-29 18:18:01 +00002564PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002566{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002567 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568 if (current_frame == NULL)
2569 return NULL;
2570 else
2571 return current_frame->f_globals;
2572}
2573
Guido van Rossumb209a111997-04-29 18:18:01 +00002574PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002575PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002576{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002577 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002578 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002579}
2580
Guido van Rossum6135a871995-01-09 17:53:26 +00002581int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002583{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002585 return current_frame == NULL ? 0 : current_frame->f_restricted;
2586}
2587
Guido van Rossumbe270261997-05-22 22:26:18 +00002588int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002589Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590{
Guido van Rossumb209a111997-04-29 18:18:01 +00002591 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002592 if (f == NULL)
2593 return 0;
2594 if (!PyFile_SoftSpace(f, 0))
2595 return 0;
2596 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597}
2598
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599
Guido van Rossum681d79a1995-07-18 14:51:37 +00002600/* External interface to call any callable object.
2601 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002602
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002603#undef PyEval_CallObject
2604/* for backward compatibility: export this interface */
2605
Guido van Rossumb209a111997-04-29 18:18:01 +00002606PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002608{
Guido van Rossumb209a111997-04-29 18:18:01 +00002609 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002610}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002611#define PyEval_CallObject(func,arg) \
2612 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002613
Guido van Rossumb209a111997-04-29 18:18:01 +00002614PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002615PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002616{
2617 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002618 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002619
2620 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 arg = PyTuple_New(0);
2622 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002623 PyErr_SetString(PyExc_TypeError,
2624 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002625 return NULL;
2626 }
2627 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002629
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002631 PyErr_SetString(PyExc_TypeError,
2632 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002633 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002634 return NULL;
2635 }
2636
Guido van Rossum150b2df1996-12-05 23:17:11 +00002637 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002638 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002639 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002640 result = call_function(func, arg, kw);
2641 else
2642 result = call_builtin(func, arg, kw);
2643
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002645
Guido van Rossumb209a111997-04-29 18:18:01 +00002646 if (result == NULL && !PyErr_Occurred())
2647 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002648 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002649
2650 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002651}
2652
Guido van Rossumb209a111997-04-29 18:18:01 +00002653static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002654call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655{
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 if (PyCFunction_Check(func)) {
Fred Drake661ea262000-10-24 19:57:45 +00002657 PyCFunctionObject* f = (PyCFunctionObject*) func;
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 PyCFunction meth = PyCFunction_GetFunction(func);
2659 PyObject *self = PyCFunction_GetSelf(func);
2660 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002661 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002663 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002665 else if (size == 0)
2666 arg = NULL;
2667 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002668 if (flags & METH_KEYWORDS)
2669 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002670 if (kw != NULL && PyDict_Size(kw) != 0) {
Fred Drake661ea262000-10-24 19:57:45 +00002671 PyErr_Format(PyExc_TypeError,
2672 "%.200s() takes no keyword arguments",
2673 f->m_ml->ml_name);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002674 return NULL;
2675 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002676 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002677 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 if (PyClass_Check(func)) {
2679 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 if (PyInstance_Check(func)) {
Fred Drake661ea262000-10-24 19:57:45 +00002682 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002683 if (call == NULL) {
Fred Drake661ea262000-10-24 19:57:45 +00002684 PyInstanceObject *inst = (PyInstanceObject*) func;
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 PyErr_Clear();
Fred Drake661ea262000-10-24 19:57:45 +00002686 PyErr_Format(PyExc_AttributeError,
2687 "%.200s instance has no __call__ method",
2688 PyString_AsString(inst->in_class->cl_name));
Guido van Rossume59214e1994-08-30 08:01:59 +00002689 return NULL;
2690 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002691 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002693 return res;
2694 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002695 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002696 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 return NULL;
2698}
2699
Guido van Rossumb209a111997-04-29 18:18:01 +00002700static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002701call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702{
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 PyObject *class = NULL; /* == owner */
2704 PyObject *argdefs;
2705 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002706 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002707 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002708
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 if (kw != NULL && !PyDict_Check(kw)) {
2710 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002711 return NULL;
2712 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 if (PyMethod_Check(func)) {
2715 PyObject *self = PyMethod_Self(func);
2716 class = PyMethod_Class(func);
2717 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002718 if (self == NULL) {
2719 /* Unbound methods must be called with an instance of
2720 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002721 if (PyTuple_Size(arg) >= 1) {
2722 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002723 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 PyInstance_Check(self) &&
2725 PyClass_IsSubclass((PyObject *)
2726 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002727 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002728 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002729 else
2730 self = NULL;
2731 }
2732 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002734 "unbound method must be called with instance as first argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002735 return NULL;
2736 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002738 }
2739 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 int argcount = PyTuple_Size(arg);
2741 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002743 if (newarg == NULL)
2744 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 Py_INCREF(self);
2746 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002747 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 PyObject *v = PyTuple_GET_ITEM(arg, i);
2749 Py_XINCREF(v);
2750 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002751 }
2752 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002754 if (!PyFunction_Check(func)) {
2755 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2756 Py_DECREF(arg);
2757 return result;
2758 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 }
2760 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002762 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002763 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002764 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 return NULL;
2766 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769
2770 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2772 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2773 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002774 }
2775 else {
2776 d = NULL;
2777 nd = 0;
2778 }
2779
2780 if (kw != NULL) {
2781 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 nk = PyDict_Size(kw);
2783 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002784 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002785 PyErr_NoMemory();
2786 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002787 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002788 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002789 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002791 i += 2;
2792 nk = i/2;
2793 /* XXX This is broken if the caller deletes dict items! */
2794 }
2795 else {
2796 k = NULL;
2797 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002798 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799
Guido van Rossum681d79a1995-07-18 14:51:37 +00002800 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 (PyCodeObject *)PyFunction_GetCode(func),
2802 PyFunction_GetGlobals(func), (PyObject *)NULL,
2803 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002804 k, nk,
2805 d, nd,
2806 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002809 if (k != NULL)
2810 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811
Guido van Rossum681d79a1995-07-18 14:51:37 +00002812 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813}
2814
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002815#define SLICE_ERROR_MSG \
2816 "standard sequence type does not support step size other than one"
2817
Guido van Rossumb209a111997-04-29 18:18:01 +00002818static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002819loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820{
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002822 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002823 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 return NULL;
2826 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002828 v = (*sq->sq_item)(v, i);
2829 if (v)
2830 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002831 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002833 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834}
2835
Guido van Rossum20c6add2000-05-08 14:06:50 +00002836/* Extract a slice index from a PyInt or PyLong, the index is bound to
2837 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2838 and error. Returns 1 on success.*/
2839
2840int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002841_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842{
2843 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002844 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002845 if (PyInt_Check(v)) {
2846 x = PyInt_AsLong(v);
2847 } else if (PyLong_Check(v)) {
2848 x = PyLong_AsLong(v);
2849 if (x==-1 && PyErr_Occurred()) {
2850 PyObject *long_zero;
2851
2852 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2853 /* It's not an overflow error, so just
2854 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002855 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002856 }
2857
2858 /* It's an overflow error, so we need to
2859 check the sign of the long integer,
2860 set the value to INT_MAX or 0, and clear
2861 the error. */
2862
2863 /* Create a long integer with a value of 0 */
2864 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002865 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002866
2867 /* Check sign */
2868 if (PyObject_Compare(long_zero, v) < 0)
2869 x = INT_MAX;
2870 else
2871 x = 0;
2872
2873 /* Free the long integer we created, and clear the
2874 OverflowError */
2875 Py_DECREF(long_zero);
2876 PyErr_Clear();
2877 }
2878 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002879 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002880 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002881 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002883 /* Truncate -- very long indices are truncated anyway */
2884 if (x > INT_MAX)
2885 x = INT_MAX;
2886 else if (x < -INT_MAX)
2887 x = 0;
2888 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002890 return 1;
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 +00002894apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002896 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002897 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002899 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002900 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002901 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002903
2904static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002907 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002908 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002909 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002910 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002911 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002912 if (x == NULL)
2913 return PySequence_DelSlice(u, ilow, ihigh);
2914 else
2915 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916}
2917
Guido van Rossumb209a111997-04-29 18:18:01 +00002918static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002919cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920{
2921 register int cmp;
2922 register int res = 0;
2923 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002924 case IS:
2925 case IS_NOT:
2926 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002927 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002928 res = !res;
2929 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 case IN:
2931 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002932 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002933 if (res < 0)
2934 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002935 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002936 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937 break;
2938 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002939 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 break;
2941 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002942 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002943 if (cmp && PyErr_Occurred())
2944 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002945 switch (op) {
2946 case LT: res = cmp < 0; break;
2947 case LE: res = cmp <= 0; break;
2948 case EQ: res = cmp == 0; break;
2949 case NE: res = cmp != 0; break;
2950 case GT: res = cmp > 0; break;
2951 case GE: res = cmp >= 0; break;
2952 /* XXX no default? (res is initialized to 0 though) */
2953 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002955 v = res ? Py_True : Py_False;
2956 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957 return v;
2958}
2959
Thomas Wouters52152252000-08-17 22:55:00 +00002960static PyObject *
2961import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002962{
Guido van Rossumb209a111997-04-29 18:18:01 +00002963 PyObject *w, *x;
2964 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002965 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002966 "import-from requires a module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002967 return NULL;
2968 }
2969 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2970 x = PyDict_GetItem(w, name);
2971 if (x == NULL) {
2972 PyErr_Format(PyExc_ImportError,
2973 "cannot import name %.230s",
2974 PyString_AsString(name));
2975 } else
2976 Py_INCREF(x);
2977 return x;
2978}
2979
2980static int
2981import_all_from(PyObject *locals, PyObject *v)
2982{
2983 int pos = 0, err;
2984 PyObject *name, *value;
2985 PyObject *w;
2986
2987 if (!PyModule_Check(v)) {
2988 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002989 "import-from requires a module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002990 return -1;
2991 }
Thomas Wouters52152252000-08-17 22:55:00 +00002992 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2993
2994 while (PyDict_Next(w, &pos, &name, &value)) {
2995 if (!PyString_Check(name) ||
2996 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002997 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002998 Py_INCREF(value);
2999 err = PyDict_SetItem(locals, name, value);
3000 Py_DECREF(value);
3001 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003002 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003003 }
Thomas Wouters52152252000-08-17 22:55:00 +00003004 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003005}
3006
Guido van Rossumb209a111997-04-29 18:18:01 +00003007static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003009{
Guido van Rossumcd649651997-08-22 16:56:16 +00003010 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003011 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003012 PyErr_SetString(PyExc_SystemError,
3013 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003014 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003015 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003016 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003017 PyErr_SetString(PyExc_SystemError,
3018 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003019 return NULL;
3020 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003021 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003022 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003023 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003024 return NULL;
3025 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003026 n = PyTuple_Size(bases);
3027 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003028 PyObject *base = PyTuple_GET_ITEM(bases, i);
3029 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003030 /* Call the base's *type*, if it is callable.
3031 This code is a hook for Donald Beaudry's
3032 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003033 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003034 since its types are not callable.
3035 Ditto: call the bases's *class*, if it has
3036 one. This makes the same thing possible
3037 without writing C code. A true meta-object
3038 protocol! */
3039 PyObject *basetype = (PyObject *)base->ob_type;
3040 PyObject *callable = NULL;
3041 if (PyCallable_Check(basetype))
3042 callable = basetype;
3043 else
3044 callable = PyObject_GetAttrString(
3045 base, "__class__");
3046 if (callable) {
3047 PyObject *args;
3048 PyObject *newclass = NULL;
3049 args = Py_BuildValue(
3050 "(OOO)", name, bases, methods);
3051 if (args != NULL) {
3052 newclass = PyEval_CallObject(
3053 callable, args);
3054 Py_DECREF(args);
3055 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003056 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003057 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003058 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003059 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003060 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003061 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003062 "base is not a class object");
3063 return NULL;
3064 }
3065 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003066 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003067}
3068
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003069static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003070exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3071 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003072{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003073 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003074 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003075 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003076
Guido van Rossumb209a111997-04-29 18:18:01 +00003077 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3078 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003079 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003080 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003081 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003082 locals = PyTuple_GetItem(prog, 2);
3083 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003084 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003085 if (globals == Py_None) {
3086 globals = PyEval_GetGlobals();
3087 if (locals == Py_None) {
3088 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003089 plain = 1;
3090 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003091 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003092 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003093 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003094 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003095 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003096 !PyCode_Check(prog) &&
3097 !PyFile_Check(prog)) {
3098 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003099 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003100 return -1;
3101 }
Fred Drake661ea262000-10-24 19:57:45 +00003102 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003103 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003104 "exec: arg 2 must be a dictionary or None");
3105 return -1;
3106 }
3107 if (!PyDict_Check(locals)) {
3108 PyErr_SetString(PyExc_TypeError,
3109 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003110 return -1;
3111 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003112 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003113 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003114 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003115 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003116 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003117 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003118 FILE *fp = PyFile_AsFile(prog);
3119 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003120 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3121 }
3122 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003123 char *str;
3124 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003125 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003126 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003127 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003128 if (plain)
3129 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003130 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003131 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003132 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003133 return 0;
3134}
Guido van Rossum24c13741995-02-14 09:42:43 +00003135
Paul Prescode68140d2000-08-30 20:25:01 +00003136static void
3137format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3138{
3139 char *obj_str;
3140
3141 if (!obj)
3142 return;
3143
3144 obj_str = PyString_AsString(obj);
3145 if (!obj_str)
3146 return;
3147
3148 PyErr_Format(exc, format_str, obj_str);
3149}
Guido van Rossum950361c1997-01-24 13:49:28 +00003150
3151#ifdef DYNAMIC_EXECUTION_PROFILE
3152
3153PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003154getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003155{
3156 int i;
3157 PyObject *l = PyList_New(256);
3158 if (l == NULL) return NULL;
3159 for (i = 0; i < 256; i++) {
3160 PyObject *x = PyInt_FromLong(a[i]);
3161 if (x == NULL) {
3162 Py_DECREF(l);
3163 return NULL;
3164 }
3165 PyList_SetItem(l, i, x);
3166 }
3167 for (i = 0; i < 256; i++)
3168 a[i] = 0;
3169 return l;
3170}
3171
3172PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003173_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003174{
3175#ifndef DXPAIRS
3176 return getarray(dxp);
3177#else
3178 int i;
3179 PyObject *l = PyList_New(257);
3180 if (l == NULL) return NULL;
3181 for (i = 0; i < 257; i++) {
3182 PyObject *x = getarray(dxpairs[i]);
3183 if (x == NULL) {
3184 Py_DECREF(l);
3185 return NULL;
3186 }
3187 PyList_SetItem(l, i, x);
3188 }
3189 return l;
3190#endif
3191}
3192
3193#endif