blob: 36cdab84e5839de04d7d7623ec3b7acb02af38fd [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Guido van Rossum5b722181993-03-30 17:46:03 +000032
Guido van Rossum374a9221991-04-04 10:40:29 +000033/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000034
Tim Petersdbd9ba62000-07-09 03:09:57 +000035static PyObject *eval_code2(PyCodeObject *,
36 PyObject *, PyObject *,
37 PyObject **, int,
38 PyObject **, int,
39 PyObject **, int,
40 PyObject *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000041#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000042static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000043#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000044static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
45static int call_trace(PyObject **, PyObject **,
46 PyFrameObject *, char *, PyObject *);
47static PyObject *call_builtin(PyObject *, PyObject *, PyObject *);
48static PyObject *call_function(PyObject *, PyObject *, PyObject *);
49static PyObject *loop_subscript(PyObject *, PyObject *);
50static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
51static int assign_slice(PyObject *, PyObject *,
52 PyObject *, PyObject *);
53static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000054static PyObject *import_from(PyObject *, PyObject *);
55static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000056static PyObject *build_class(PyObject *, PyObject *, PyObject *);
57static int exec_statement(PyFrameObject *,
58 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
60static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000061static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000062
Paul Prescode68140d2000-08-30 20:25:01 +000063#define NAME_ERROR_MSG \
64 "There is no variable named '%s'"
65#define UNBOUNDLOCAL_ERROR_MSG \
66 "Local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Guido van Rossum950361c1997-01-24 13:49:28 +000068/* Dynamic execution profile */
69#ifdef DYNAMIC_EXECUTION_PROFILE
70#ifdef DXPAIRS
71static long dxpairs[257][256];
72#define dxp dxpairs[256]
73#else
74static long dxp[256];
75#endif
76#endif
77
78
Guido van Rossume59214e1994-08-30 08:01:59 +000079#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000080
Guido van Rossum2571cc81999-04-07 16:07:23 +000081#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000083#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000084#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000085
Guido van Rossuma027efa1997-05-05 20:56:21 +000086extern int _PyThread_Started; /* Flag for Py_Exit */
87
Guido van Rossum65d5b571998-12-21 19:32:43 +000088static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +000089static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000090
91void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000092PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093{
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +000095 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +000096 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +000097 interpreter_lock = PyThread_allocate_lock();
98 PyThread_acquire_lock(interpreter_lock, 1);
99 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000102void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000104{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000105 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000106}
107
108void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000109PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000110{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000111 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000112}
113
114void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000116{
117 if (tstate == NULL)
118 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000119 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000120 if (PyThreadState_Swap(tstate) != NULL)
121 Py_FatalError(
122 "PyEval_AcquireThread: non-NULL old thread state");
123}
124
125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000127{
128 if (tstate == NULL)
129 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
130 if (PyThreadState_Swap(NULL) != tstate)
131 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000132 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000133}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000134
135/* This function is called from PyOS_AfterFork to ensure that newly
136 created child processes don't hold locks referring to threads which
137 are not running in the child process. (This could also be done using
138 pthread_atfork mechanism, at least for the pthreads implementation.) */
139
140void
141PyEval_ReInitThreads(void)
142{
143 if (!interpreter_lock)
144 return;
145 /*XXX Can't use PyThread_free_lock here because it does too
146 much error-checking. Doing this cleanly would require
147 adding a new function to each thread_*.h. Instead, just
148 create a new lock and waste a little bit of memory */
149 interpreter_lock = PyThread_allocate_lock();
150 PyThread_acquire_lock(interpreter_lock, 1);
151 main_thread = PyThread_get_thread_ident();
152}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153#endif
154
Guido van Rossumff4949e1992-08-05 19:58:53 +0000155/* Functions save_thread and restore_thread are always defined so
156 dynamically loaded modules needn't be compiled separately for use
157 with and without threads: */
158
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000159PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000160PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000161{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000162 PyThreadState *tstate = PyThreadState_Swap(NULL);
163 if (tstate == NULL)
164 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000165#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000166 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000167 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000169 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170}
171
172void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000175 if (tstate == NULL)
176 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000177#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000179 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000180 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182 }
183#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000184 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185}
186
187
Guido van Rossuma9672091994-09-14 13:31:22 +0000188/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
189 signal handlers or Mac I/O completion routines) can schedule calls
190 to a function to be called synchronously.
191 The synchronous function is called with one void* argument.
192 It should return 0 for success or -1 for failure -- failure should
193 be accompanied by an exception.
194
195 If registry succeeds, the registry function returns 0; if it fails
196 (e.g. due to too many pending calls) it returns -1 (without setting
197 an exception condition).
198
199 Note that because registry may occur from within signal handlers,
200 or other asynchronous events, calling malloc() is unsafe!
201
202#ifdef WITH_THREAD
203 Any thread can schedule pending calls, but only the main thread
204 will execute them.
205#endif
206
207 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
208 There are two possible race conditions:
209 (1) nested asynchronous registry calls;
210 (2) registry calls made while pending calls are being processed.
211 While (1) is very unlikely, (2) is a real possibility.
212 The current code is safe against (2), but not against (1).
213 The safety against (2) is derived from the fact that only one
214 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000215
Guido van Rossuma027efa1997-05-05 20:56:21 +0000216 XXX Darn! With the advent of thread state, we should have an array
217 of pending calls per thread in the thread state! Later...
218*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000219
Guido van Rossuma9672091994-09-14 13:31:22 +0000220#define NPENDINGCALLS 32
221static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000222 int (*func)(void *);
223 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000224} pendingcalls[NPENDINGCALLS];
225static volatile int pendingfirst = 0;
226static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000227static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000228
229int
Thomas Wouters334fb892000-07-25 12:56:38 +0000230Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000231{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000232 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000233 int i, j;
234 /* XXX Begin critical section */
235 /* XXX If you want this to be safe against nested
236 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000237 if (busy)
238 return -1;
239 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240 i = pendinglast;
241 j = (i + 1) % NPENDINGCALLS;
242 if (j == pendingfirst)
243 return -1; /* Queue full */
244 pendingcalls[i].func = func;
245 pendingcalls[i].arg = arg;
246 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 /* XXX End critical section */
250 return 0;
251}
252
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000254Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000255{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000257#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000258 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 return 0;
260#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000261 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 return 0;
263 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000264 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000265 for (;;) {
266 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000267 int (*func)(void *);
268 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 i = pendingfirst;
270 if (i == pendinglast)
271 break; /* Queue empty */
272 func = pendingcalls[i].func;
273 arg = pendingcalls[i].arg;
274 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000275 if (func(arg) < 0) {
276 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000278 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000279 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000281 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000282 return 0;
283}
284
285
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000286/* The interpreter's recursion limit */
287
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000288static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000289
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000290int
291Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000292{
293 return recursion_limit;
294}
295
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000296void
297Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000298{
299 recursion_limit = new_limit;
300}
301
Guido van Rossum374a9221991-04-04 10:40:29 +0000302/* Status code for main loop (reason for stack unwind) */
303
304enum why_code {
305 WHY_NOT, /* No error */
306 WHY_EXCEPTION, /* Exception occurred */
307 WHY_RERAISE, /* Exception re-raised by 'finally' */
308 WHY_RETURN, /* 'return' statement */
309 WHY_BREAK /* 'break' statement */
310};
311
Tim Petersdbd9ba62000-07-09 03:09:57 +0000312static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
313static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000314
Guido van Rossum374a9221991-04-04 10:40:29 +0000315
Guido van Rossumb209a111997-04-29 18:18:01 +0000316PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000317PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000318{
319 return eval_code2(co,
320 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000321 (PyObject **)NULL, 0,
322 (PyObject **)NULL, 0,
323 (PyObject **)NULL, 0,
324 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000325}
326
327
328/* Interpreter main loop */
329
Guido van Rossumb209a111997-04-29 18:18:01 +0000330static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
332 PyObject **args, int argcount, PyObject **kws, int kwcount,
333 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000334{
Guido van Rossum950361c1997-01-24 13:49:28 +0000335#ifdef DXPAIRS
336 int lastopcode = 0;
337#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000338 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000339 register int opcode=0; /* Current opcode */
340 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 register enum why_code why; /* Reason for block stack unwind */
343 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000344 register PyObject *x; /* Result object -- NULL if error */
345 register PyObject *v; /* Temporary objects popped off stack */
346 register PyObject *w;
347 register PyObject *u;
348 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000349 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000350 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000351 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000352 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000353 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000354 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000355#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000356 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000357#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000358#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000359 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000360 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000361#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000362
363/* Code access macros */
364
365#define GETCONST(i) Getconst(f, i)
366#define GETNAME(i) Getname(f, i)
367#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000368#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000369#define NEXTOP() (*next_instr++)
370#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000371#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#define JUMPBY(x) (next_instr += (x))
373
374/* Stack manipulation macros */
375
376#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
377#define EMPTY() (STACK_LEVEL() == 0)
378#define TOP() (stack_pointer[-1])
379#define BASIC_PUSH(v) (*stack_pointer++ = (v))
380#define BASIC_POP() (*--stack_pointer)
381
Guido van Rossum96a42c81992-01-12 02:29:51 +0000382#ifdef LLTRACE
383#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
384#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000385#else
386#define PUSH(v) BASIC_PUSH(v)
387#define POP() BASIC_POP()
388#endif
389
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390/* Local variable macros */
391
392#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000393#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394 GETLOCAL(i) = value; } while (0)
395
Guido van Rossuma027efa1997-05-05 20:56:21 +0000396/* Start of code */
397
Guido van Rossum8861b741996-07-30 16:49:37 +0000398#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000399 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000400 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000401 return NULL;
402 }
403#endif
404
Guido van Rossum681d79a1995-07-18 14:51:37 +0000405 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000406 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000407 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000408 }
409
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000410#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000411 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000412#endif
413
Guido van Rossumb209a111997-04-29 18:18:01 +0000414 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000416 co, /*code*/
417 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000418 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000419 if (f == NULL)
420 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000421
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000423 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424
425 if (co->co_argcount > 0 ||
426 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
427 int i;
428 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000431 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000432 if (kwdict == NULL)
433 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000434 i = co->co_argcount;
435 if (co->co_flags & CO_VARARGS)
436 i++;
437 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 }
439 if (argcount > co->co_argcount) {
440 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000441 PyErr_Format(PyExc_TypeError,
442 "too many arguments; expected %d, got %d",
443 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000444 goto fail;
445 }
446 n = co->co_argcount;
447 }
448 for (i = 0; i < n; i++) {
449 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000450 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 SETLOCAL(i, x);
452 }
453 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000454 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000455 if (u == NULL)
456 goto fail;
457 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000458 for (i = n; i < argcount; i++) {
459 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000460 Py_INCREF(x);
461 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 }
464 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 PyObject *keyword = kws[2*i];
466 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000468 if (keyword == NULL || !PyString_Check(keyword)) {
469 PyErr_SetString(PyExc_TypeError,
470 "keywords must be strings");
471 goto fail;
472 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 /* XXX slow -- speed up using dictionary? */
474 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000475 PyObject *nm = PyTuple_GET_ITEM(
476 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 break;
479 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000480 /* Check errors from Compare */
481 if (PyErr_Occurred())
482 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 if (j >= co->co_argcount) {
484 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000486 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000487 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 goto fail;
489 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000490 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 }
492 else {
493 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000494 PyErr_Format(PyExc_TypeError,
495 "keyword parameter redefined: %.400s",
496 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497 goto fail;
498 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000499 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 SETLOCAL(j, value);
501 }
502 }
503 if (argcount < co->co_argcount) {
504 int m = co->co_argcount - defcount;
505 for (i = argcount; i < m; i++) {
506 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000507 PyErr_Format(PyExc_TypeError,
508 "not enough arguments; expected %d, got %d",
509 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 goto fail;
511 }
512 }
513 if (n > m)
514 i = n - m;
515 else
516 i = 0;
517 for (; i < defcount; i++) {
518 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000519 PyObject *def = defs[i];
520 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 SETLOCAL(m+i, def);
522 }
523 }
524 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000525 }
526 else {
527 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000528 PyErr_SetString(PyExc_TypeError,
529 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000530 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 }
532 }
533
Guido van Rossuma027efa1997-05-05 20:56:21 +0000534 if (tstate->sys_tracefunc != NULL) {
535 /* tstate->sys_tracefunc, if defined, is a function that
536 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000537 Its return value, if not None, is a function that
538 will be called at the start of each executed line
539 of code. (Actually, the function must return
540 itself in order to continue tracing.)
541 The trace functions are called with three arguments:
542 a pointer to the current frame, a string indicating
543 why the function is called, and an argument which
544 depends on the situation. The global trace function
545 (sys.trace) is also called whenever an exception
546 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000547 if (call_trace(&tstate->sys_tracefunc,
548 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000549 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000550 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000551 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000552 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000553 }
554
Guido van Rossuma027efa1997-05-05 20:56:21 +0000555 if (tstate->sys_profilefunc != NULL) {
556 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000557 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000558 if (call_trace(&tstate->sys_profilefunc,
559 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000561 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000562 }
563 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000564
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000565 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 --tstate->recursion_depth;
567 PyErr_SetString(PyExc_RuntimeError,
568 "Maximum recursion depth exceeded");
569 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000570 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000571 return NULL;
572 }
573
Guido van Rossumd076c731998-10-07 19:42:25 +0000574 _PyCode_GETCODEPTR(co, &first_instr);
575 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000576 stack_pointer = f->f_valuestack;
577
Guido van Rossum374a9221991-04-04 10:40:29 +0000578 why = WHY_NOT;
579 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000580 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000581
582 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000583 /* Do periodic things. Doing this every time through
584 the loop would add too much overhead, so we do it
585 only every Nth instruction. We also do it if
586 ``things_to_do'' is set, i.e. when an asynchronous
587 event needs attention (e.g. a signal handler or
588 async I/O handler); see Py_AddPendingCall() and
589 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000590
Guido van Rossuma027efa1997-05-05 20:56:21 +0000591 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000592 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000593 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000594 if (Py_MakePendingCalls() < 0) {
595 why = WHY_EXCEPTION;
596 goto on_error;
597 }
598 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000599#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 /* If we have true signals, the signal handler
601 will call Py_AddPendingCall() so we don't
602 have to call sigcheck(). On the Mac and
603 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000604 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 goto on_error;
607 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000608#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000609
Guido van Rossume59214e1994-08-30 08:01:59 +0000610#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000611 if (interpreter_lock) {
612 /* Give another thread a chance */
613
Guido van Rossum25ce5661997-08-02 03:10:38 +0000614 if (PyThreadState_Swap(NULL) != tstate)
615 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000616 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000617
618 /* Other threads may run now */
619
Guido van Rossum65d5b571998-12-21 19:32:43 +0000620 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000621 if (PyThreadState_Swap(tstate) != NULL)
622 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000623 }
624#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000628
Guido van Rossum408027e1996-12-30 16:17:54 +0000629#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000630 f->f_lasti = INSTR_OFFSET();
631#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000632
633 opcode = NEXTOP();
634 if (HAS_ARG(opcode))
635 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000636 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000637#ifdef DYNAMIC_EXECUTION_PROFILE
638#ifdef DXPAIRS
639 dxpairs[lastopcode][opcode]++;
640 lastopcode = opcode;
641#endif
642 dxp[opcode]++;
643#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000644
Guido van Rossum96a42c81992-01-12 02:29:51 +0000645#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000646 /* Instruction tracing */
647
Guido van Rossum96a42c81992-01-12 02:29:51 +0000648 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 if (HAS_ARG(opcode)) {
650 printf("%d: %d, %d\n",
651 (int) (INSTR_OFFSET() - 3),
652 opcode, oparg);
653 }
654 else {
655 printf("%d: %d\n",
656 (int) (INSTR_OFFSET() - 1), opcode);
657 }
658 }
659#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 /* Main switch on opcode */
661
662 switch (opcode) {
663
664 /* BEWARE!
665 It is essential that any operation that fails sets either
666 x to NULL, err to nonzero, or why to anything but WHY_NOT,
667 and that no operation that succeeds does this! */
668
669 /* case STOP_CODE: this is an error! */
670
671 case POP_TOP:
672 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000673 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000674 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000675
676 case ROT_TWO:
677 v = POP();
678 w = POP();
679 PUSH(v);
680 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000681 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000682
683 case ROT_THREE:
684 v = POP();
685 w = POP();
686 x = POP();
687 PUSH(v);
688 PUSH(x);
689 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691
Thomas Wouters434d0822000-08-24 20:11:32 +0000692 case ROT_FOUR:
693 u = POP();
694 v = POP();
695 w = POP();
696 x = POP();
697 PUSH(u);
698 PUSH(x);
699 PUSH(w);
700 PUSH(v);
701 continue;
702
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 case DUP_TOP:
704 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000705 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000707 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000708
Thomas Wouters434d0822000-08-24 20:11:32 +0000709 case DUP_TOPX:
710 switch (oparg) {
711 case 5:
712 case 4:
713 case 3:
714 case 2:
715 case 1:
716 x = POP();
717 if (oparg == 1) break;
718 w = POP();
719 if (oparg == 2) break;
720 v = POP();
721 if (oparg == 3) break;
722 u = POP();
723 if (oparg == 4) break;
724 t = POP();
725 break;
726 default:
727 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
728 PyErr_SetString(PyExc_SystemError,
729 "invalid argument to DUP_TOPX");
730 x = NULL;
731 }
732 if (x == NULL)
733 break;
734 switch (oparg) {
735 case 5: PUSH(t);
736 Py_INCREF(t); /* Fallthrough */
737 case 4: PUSH(u);
738 Py_INCREF(u); /* Fallthrough */
739 case 3: PUSH(v);
740 Py_INCREF(v); /* Fallthrough */
741 case 2: PUSH(w);
742 Py_INCREF(w); /* Fallthrough */
743 case 1: PUSH(x);
744 Py_INCREF(x); /* Fallthrough */
745 }
746 switch (oparg) {
747 case 5: PUSH(t); /* Fallthrough */
748 case 4: PUSH(u); /* Fallthrough */
749 case 3: PUSH(v); /* Fallthrough */
750 case 2: PUSH(w); /* Fallthrough */
751 case 1: PUSH(x); /* Fallthrough */
752 }
753 continue;
754
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 case UNARY_POSITIVE:
756 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000757 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000758 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000760 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 break;
762
763 case UNARY_NEGATIVE:
764 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000765 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000766 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000768 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 break;
770
771 case UNARY_NOT:
772 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000773 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000774 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000775 if (err == 0) {
776 Py_INCREF(Py_True);
777 PUSH(Py_True);
778 continue;
779 }
780 else if (err > 0) {
781 Py_INCREF(Py_False);
782 PUSH(Py_False);
783 err = 0;
784 continue;
785 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000786 break;
787
788 case UNARY_CONVERT:
789 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000790 x = PyObject_Repr(v);
791 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000793 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000795
796 case UNARY_INVERT:
797 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000798 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000799 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000800 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000801 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000802 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000803
Guido van Rossum50564e81996-01-12 01:13:16 +0000804 case BINARY_POWER:
805 w = POP();
806 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000807 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000808 Py_DECREF(v);
809 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000810 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000811 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000812 break;
813
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 case BINARY_MULTIPLY:
815 w = POP();
816 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000817 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000818 Py_DECREF(v);
819 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000821 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 break;
823
824 case BINARY_DIVIDE:
825 w = POP();
826 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000827 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000828 Py_DECREF(v);
829 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000831 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 break;
833
834 case BINARY_MODULO:
835 w = POP();
836 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000837 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 Py_DECREF(v);
839 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 break;
843
844 case BINARY_ADD:
845 w = POP();
846 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000847 if (PyInt_Check(v) && PyInt_Check(w)) {
848 /* INLINE: int + int */
849 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000850 a = PyInt_AS_LONG(v);
851 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000852 i = a + b;
853 if ((i^a) < 0 && (i^b) < 0) {
854 PyErr_SetString(PyExc_OverflowError,
855 "integer addition");
856 x = NULL;
857 }
858 else
859 x = PyInt_FromLong(i);
860 }
861 else
862 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000863 Py_DECREF(v);
864 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000866 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 break;
868
869 case BINARY_SUBTRACT:
870 w = POP();
871 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000872 if (PyInt_Check(v) && PyInt_Check(w)) {
873 /* INLINE: int - int */
874 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000875 a = PyInt_AS_LONG(v);
876 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000877 i = a - b;
878 if ((i^a) < 0 && (i^~b) < 0) {
879 PyErr_SetString(PyExc_OverflowError,
880 "integer subtraction");
881 x = NULL;
882 }
883 else
884 x = PyInt_FromLong(i);
885 }
886 else
887 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 break;
893
894 case BINARY_SUBSCR:
895 w = POP();
896 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000897 if (PyList_Check(v) && PyInt_Check(w)) {
898 /* INLINE: list[int] */
899 long i = PyInt_AsLong(w);
900 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000901 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000902 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000903 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000904 PyErr_SetString(PyExc_IndexError,
905 "list index out of range");
906 x = NULL;
907 }
908 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000909 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000910 Py_INCREF(x);
911 }
912 }
913 else
914 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 Py_DECREF(v);
916 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000918 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 break;
920
Guido van Rossum7928cd71991-10-24 14:59:31 +0000921 case BINARY_LSHIFT:
922 w = POP();
923 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000924 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000925 Py_DECREF(v);
926 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000927 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000928 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000929 break;
930
931 case BINARY_RSHIFT:
932 w = POP();
933 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000934 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 Py_DECREF(v);
936 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000937 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000938 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000939 break;
940
941 case BINARY_AND:
942 w = POP();
943 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000944 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 Py_DECREF(v);
946 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000949 break;
950
951 case BINARY_XOR:
952 w = POP();
953 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000954 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000955 Py_DECREF(v);
956 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000957 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000958 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000959 break;
960
961 case BINARY_OR:
962 w = POP();
963 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000964 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000965 Py_DECREF(v);
966 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000967 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000969 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000970
971 case INPLACE_POWER:
972 w = POP();
973 v = POP();
974 x = PyNumber_InPlacePower(v, w, Py_None);
975 Py_DECREF(v);
976 Py_DECREF(w);
977 PUSH(x);
978 if (x != NULL) continue;
979 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000980
Thomas Wouters434d0822000-08-24 20:11:32 +0000981 case INPLACE_MULTIPLY:
982 w = POP();
983 v = POP();
984 x = PyNumber_InPlaceMultiply(v, w);
985 Py_DECREF(v);
986 Py_DECREF(w);
987 PUSH(x);
988 if (x != NULL) continue;
989 break;
990
991 case INPLACE_DIVIDE:
992 w = POP();
993 v = POP();
994 x = PyNumber_InPlaceDivide(v, w);
995 Py_DECREF(v);
996 Py_DECREF(w);
997 PUSH(x);
998 if (x != NULL) continue;
999 break;
1000
1001 case INPLACE_MODULO:
1002 w = POP();
1003 v = POP();
1004 x = PyNumber_InPlaceRemainder(v, w);
1005 Py_DECREF(v);
1006 Py_DECREF(w);
1007 PUSH(x);
1008 if (x != NULL) continue;
1009 break;
1010
1011 case INPLACE_ADD:
1012 w = POP();
1013 v = POP();
1014 if (PyInt_Check(v) && PyInt_Check(w)) {
1015 /* INLINE: int + int */
1016 register long a, b, i;
1017 a = PyInt_AS_LONG(v);
1018 b = PyInt_AS_LONG(w);
1019 i = a + b;
1020 if ((i^a) < 0 && (i^b) < 0) {
1021 PyErr_SetString(PyExc_OverflowError,
1022 "integer addition");
1023 x = NULL;
1024 }
1025 else
1026 x = PyInt_FromLong(i);
1027 }
1028 else
1029 x = PyNumber_InPlaceAdd(v, w);
1030 Py_DECREF(v);
1031 Py_DECREF(w);
1032 PUSH(x);
1033 if (x != NULL) continue;
1034 break;
1035
1036 case INPLACE_SUBTRACT:
1037 w = POP();
1038 v = POP();
1039 if (PyInt_Check(v) && PyInt_Check(w)) {
1040 /* INLINE: int - int */
1041 register long a, b, i;
1042 a = PyInt_AS_LONG(v);
1043 b = PyInt_AS_LONG(w);
1044 i = a - b;
1045 if ((i^a) < 0 && (i^~b) < 0) {
1046 PyErr_SetString(PyExc_OverflowError,
1047 "integer subtraction");
1048 x = NULL;
1049 }
1050 else
1051 x = PyInt_FromLong(i);
1052 }
1053 else
1054 x = PyNumber_InPlaceSubtract(v, w);
1055 Py_DECREF(v);
1056 Py_DECREF(w);
1057 PUSH(x);
1058 if (x != NULL) continue;
1059 break;
1060
1061 case INPLACE_LSHIFT:
1062 w = POP();
1063 v = POP();
1064 x = PyNumber_InPlaceLshift(v, w);
1065 Py_DECREF(v);
1066 Py_DECREF(w);
1067 PUSH(x);
1068 if (x != NULL) continue;
1069 break;
1070
1071 case INPLACE_RSHIFT:
1072 w = POP();
1073 v = POP();
1074 x = PyNumber_InPlaceRshift(v, w);
1075 Py_DECREF(v);
1076 Py_DECREF(w);
1077 PUSH(x);
1078 if (x != NULL) continue;
1079 break;
1080
1081 case INPLACE_AND:
1082 w = POP();
1083 v = POP();
1084 x = PyNumber_InPlaceAnd(v, w);
1085 Py_DECREF(v);
1086 Py_DECREF(w);
1087 PUSH(x);
1088 if (x != NULL) continue;
1089 break;
1090
1091 case INPLACE_XOR:
1092 w = POP();
1093 v = POP();
1094 x = PyNumber_InPlaceXor(v, w);
1095 Py_DECREF(v);
1096 Py_DECREF(w);
1097 PUSH(x);
1098 if (x != NULL) continue;
1099 break;
1100
1101 case INPLACE_OR:
1102 w = POP();
1103 v = POP();
1104 x = PyNumber_InPlaceOr(v, w);
1105 Py_DECREF(v);
1106 Py_DECREF(w);
1107 PUSH(x);
1108 if (x != NULL) continue;
1109 break;
1110
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 case SLICE+0:
1112 case SLICE+1:
1113 case SLICE+2:
1114 case SLICE+3:
1115 if ((opcode-SLICE) & 2)
1116 w = POP();
1117 else
1118 w = NULL;
1119 if ((opcode-SLICE) & 1)
1120 v = POP();
1121 else
1122 v = NULL;
1123 u = POP();
1124 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001125 Py_DECREF(u);
1126 Py_XDECREF(v);
1127 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001129 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 break;
1131
1132 case STORE_SLICE+0:
1133 case STORE_SLICE+1:
1134 case STORE_SLICE+2:
1135 case STORE_SLICE+3:
1136 if ((opcode-STORE_SLICE) & 2)
1137 w = POP();
1138 else
1139 w = NULL;
1140 if ((opcode-STORE_SLICE) & 1)
1141 v = POP();
1142 else
1143 v = NULL;
1144 u = POP();
1145 t = POP();
1146 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001147 Py_DECREF(t);
1148 Py_DECREF(u);
1149 Py_XDECREF(v);
1150 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001151 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 break;
1153
1154 case DELETE_SLICE+0:
1155 case DELETE_SLICE+1:
1156 case DELETE_SLICE+2:
1157 case DELETE_SLICE+3:
1158 if ((opcode-DELETE_SLICE) & 2)
1159 w = POP();
1160 else
1161 w = NULL;
1162 if ((opcode-DELETE_SLICE) & 1)
1163 v = POP();
1164 else
1165 v = NULL;
1166 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001167 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001169 Py_DECREF(u);
1170 Py_XDECREF(v);
1171 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001172 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 break;
1174
1175 case STORE_SUBSCR:
1176 w = POP();
1177 v = POP();
1178 u = POP();
1179 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001180 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001181 Py_DECREF(u);
1182 Py_DECREF(v);
1183 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001184 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 break;
1186
1187 case DELETE_SUBSCR:
1188 w = POP();
1189 v = POP();
1190 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001191 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001192 Py_DECREF(v);
1193 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001194 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001196
Guido van Rossum374a9221991-04-04 10:40:29 +00001197 case PRINT_EXPR:
1198 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001199 /* Print value except if None */
1200 /* After printing, also assign to '_' */
1201 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001202 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001203 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001204 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001205 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001206 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001207 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001208 if (x == NULL) {
1209 PyErr_SetString(
1210 PyExc_RuntimeError,
1211 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001212 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001213 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001214 }
1215 if (err == 0)
1216 err = PyFile_WriteObject(v, x, 0);
1217 if (err == 0) {
1218 PyFile_SoftSpace(x, 1);
1219 err = Py_FlushLine();
1220 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001221 if (err == 0) {
1222 err = PyDict_SetItemString(
1223 f->f_builtins, "_", v);
1224 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 break;
1228
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001229 case PRINT_ITEM_TO:
1230 w = stream = POP();
1231 /* fall through to PRINT_ITEM */
1232
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 case PRINT_ITEM:
1234 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001235 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001236 w = PySys_GetObject("stdout");
1237 if (w == NULL) {
1238 PyErr_SetString(PyExc_RuntimeError,
1239 "lost sys.stdout");
1240 err = -1;
1241 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001242 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001243 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001244 err = PyFile_WriteString(" ", w);
1245 if (err == 0)
1246 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001248 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 char *s = PyString_AsString(v);
1250 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001251 if (len > 0 &&
1252 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001253 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001254 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001256 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001257 Py_XDECREF(stream);
1258 stream = NULL;
1259 if (err == 0)
1260 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 break;
1262
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001263 case PRINT_NEWLINE_TO:
1264 w = stream = POP();
1265 /* fall through to PRINT_NEWLINE */
1266
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001268 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001269 w = PySys_GetObject("stdout");
1270 if (w == NULL)
1271 PyErr_SetString(PyExc_RuntimeError,
1272 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001273 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001274 if (w != NULL) {
1275 err = PyFile_WriteString("\n", w);
1276 if (err == 0)
1277 PyFile_SoftSpace(w, 0);
1278 }
1279 Py_XDECREF(stream);
1280 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 break;
1282
Thomas Wouters434d0822000-08-24 20:11:32 +00001283
1284#ifdef CASE_TOO_BIG
1285 default: switch (opcode) {
1286#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 case BREAK_LOOP:
1288 why = WHY_BREAK;
1289 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001290
Guido van Rossumf10570b1995-07-07 22:53:21 +00001291 case RAISE_VARARGS:
1292 u = v = w = NULL;
1293 switch (oparg) {
1294 case 3:
1295 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001296 /* Fallthrough */
1297 case 2:
1298 v = POP(); /* value */
1299 /* Fallthrough */
1300 case 1:
1301 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001302 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001303 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001304 break;
1305 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001307 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001308 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001309 break;
1310 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 break;
1312
1313 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001314 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001315 PyErr_SetString(PyExc_SystemError,
1316 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001317 break;
1318 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001320 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 break;
1322
1323 case RETURN_VALUE:
1324 retval = POP();
1325 why = WHY_RETURN;
1326 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001327
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001328 case EXEC_STMT:
1329 w = POP();
1330 v = POP();
1331 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001332 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001333 Py_DECREF(u);
1334 Py_DECREF(v);
1335 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001336 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001337
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 case POP_BLOCK:
1339 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001340 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 while (STACK_LEVEL() > b->b_level) {
1342 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 }
1345 }
1346 break;
1347
1348 case END_FINALLY:
1349 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 if (PyInt_Check(v)) {
1351 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 if (why == WHY_RETURN)
1353 retval = POP();
1354 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001357 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001360 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 else if (v != Py_None) {
1363 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 "'finally' pops bad exception");
1365 why = WHY_EXCEPTION;
1366 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001367 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 break;
1369
1370 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001371 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001373 w = POP();
1374 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001375 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001376 Py_DECREF(u);
1377 Py_DECREF(v);
1378 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 break;
1380
1381 case STORE_NAME:
1382 w = GETNAMEV(oparg);
1383 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001384 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001385 PyErr_SetString(PyExc_SystemError,
1386 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001387 break;
1388 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 err = PyDict_SetItem(x, w, v);
1390 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 break;
1392
1393 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001394 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001395 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001396 PyErr_SetString(PyExc_SystemError,
1397 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001398 break;
1399 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001400 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001401 format_exc_check_arg(PyExc_NameError,
1402 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001404
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001405 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001407 if (PyTuple_Check(v)) {
1408 if (PyTuple_Size(v) != oparg) {
1409 PyErr_SetString(PyExc_ValueError,
1410 "unpack tuple of wrong size");
1411 why = WHY_EXCEPTION;
1412 }
1413 else {
1414 for (; --oparg >= 0; ) {
1415 w = PyTuple_GET_ITEM(v, oparg);
1416 Py_INCREF(w);
1417 PUSH(w);
1418 }
1419 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001421 else if (PyList_Check(v)) {
1422 if (PyList_Size(v) != oparg) {
1423 PyErr_SetString(PyExc_ValueError,
1424 "unpack list of wrong size");
1425 why = WHY_EXCEPTION;
1426 }
1427 else {
1428 for (; --oparg >= 0; ) {
1429 w = PyList_GET_ITEM(v, oparg);
1430 Py_INCREF(w);
1431 PUSH(w);
1432 }
1433 }
1434 }
1435 else if (PySequence_Check(v)) {
1436 if (unpack_sequence(v, oparg,
1437 stack_pointer + oparg))
1438 stack_pointer += oparg;
1439 else
1440 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 }
1442 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001443 PyErr_SetString(PyExc_TypeError,
1444 "unpack non-sequence");
1445 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001447 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 break;
1449
1450 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001451 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 v = POP();
1453 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001454 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1455 Py_DECREF(v);
1456 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 break;
1458
1459 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001460 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001462 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1463 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001464 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 break;
1466
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001467 case STORE_GLOBAL:
1468 w = GETNAMEV(oparg);
1469 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001470 err = PyDict_SetItem(f->f_globals, w, v);
1471 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001472 break;
1473
1474 case DELETE_GLOBAL:
1475 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001477 format_exc_check_arg(
1478 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001479 break;
1480
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 case LOAD_CONST:
1482 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 PUSH(x);
1485 break;
1486
1487 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001488 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001489 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001490 PyErr_SetString(PyExc_SystemError,
1491 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001492 break;
1493 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001500 format_exc_check_arg(
1501 PyExc_NameError,
1502 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 break;
1504 }
1505 }
1506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 PUSH(x);
1509 break;
1510
1511 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001512 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001517 format_exc_check_arg(
1518 PyExc_NameError,
1519 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 break;
1521 }
1522 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 PUSH(x);
1525 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001526
Guido van Rossum9bfef441993-03-29 10:43:31 +00001527 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001528 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001529 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001530 format_exc_check_arg(
1531 PyExc_UnboundLocalError,
1532 UNBOUNDLOCAL_ERROR_MSG,
1533 PyTuple_GetItem(co->co_varnames, oparg)
1534 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001535 break;
1536 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001538 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001539 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001540 break;
1541
1542 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001543 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001544 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001545 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001546
1547 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001548 x = GETLOCAL(oparg);
1549 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001550 format_exc_check_arg(
1551 PyExc_UnboundLocalError,
1552 UNBOUNDLOCAL_ERROR_MSG,
1553 PyTuple_GetItem(co->co_varnames, oparg)
1554 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001555 break;
1556 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001558 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001559
1560 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001561 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 if (x != NULL) {
1563 for (; --oparg >= 0;) {
1564 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 }
1567 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001568 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 }
1570 break;
1571
1572 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 if (x != NULL) {
1575 for (; --oparg >= 0;) {
1576 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001577 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 }
1579 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001580 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 }
1582 break;
1583
1584 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001585 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001587 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 break;
1589
1590 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001591 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 x = PyObject_GetAttr(v, w);
1594 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001596 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 break;
1598
1599 case COMPARE_OP:
1600 w = POP();
1601 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001602 if (PyInt_Check(v) && PyInt_Check(w)) {
1603 /* INLINE: cmp(int, int) */
1604 register long a, b;
1605 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001606 a = PyInt_AS_LONG(v);
1607 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001608 switch (oparg) {
1609 case LT: res = a < b; break;
1610 case LE: res = a <= b; break;
1611 case EQ: res = a == b; break;
1612 case NE: res = a != b; break;
1613 case GT: res = a > b; break;
1614 case GE: res = a >= b; break;
1615 case IS: res = v == w; break;
1616 case IS_NOT: res = v != w; break;
1617 default: goto slow_compare;
1618 }
1619 x = res ? Py_True : Py_False;
1620 Py_INCREF(x);
1621 }
1622 else {
1623 slow_compare:
1624 x = cmp_outcome(oparg, v, w);
1625 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 Py_DECREF(v);
1627 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001629 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 break;
1631
1632 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001633 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001635 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001637 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001638 break;
1639 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001640 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001642 w,
1643 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001644 f->f_locals == NULL ?
1645 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001646 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001648 if (w == NULL) {
1649 x = NULL;
1650 break;
1651 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 x = PyEval_CallObject(x, w);
1653 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001654 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001655 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 break;
1657
Thomas Wouters52152252000-08-17 22:55:00 +00001658 case IMPORT_STAR:
1659 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001662 PyErr_SetString(PyExc_SystemError,
1663 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001664 break;
1665 }
Thomas Wouters52152252000-08-17 22:55:00 +00001666 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001668 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001669 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001671
Thomas Wouters52152252000-08-17 22:55:00 +00001672 case IMPORT_FROM:
1673 w = GETNAMEV(oparg);
1674 v = TOP();
1675 x = import_from(v, w);
1676 PUSH(x);
1677 if (x != NULL) continue;
1678 break;
1679
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 case JUMP_FORWARD:
1681 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001682 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001683
1684 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001686 if (err > 0)
1687 err = 0;
1688 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001690 else
1691 break;
1692 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693
1694 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001695 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001696 if (err > 0) {
1697 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001699 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001700 else if (err == 0)
1701 ;
1702 else
1703 break;
1704 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001705
1706 case JUMP_ABSOLUTE:
1707 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001708 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001709
1710 case FOR_LOOP:
1711 /* for v in s: ...
1712 On entry: stack contains s, i.
1713 On exit: stack contains s, i+1, s[i];
1714 but if loop exhausted:
1715 s, i are popped, and we jump */
1716 w = POP(); /* Loop index */
1717 v = POP(); /* Sequence object */
1718 u = loop_subscript(v, w);
1719 if (u != NULL) {
1720 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 }
1727 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001728 Py_DECREF(v);
1729 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 /* A NULL can mean "s exhausted"
1731 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001734 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001736 continue;
1737 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 }
1739 break;
1740
1741 case SETUP_LOOP:
1742 case SETUP_EXCEPT:
1743 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001744 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001746 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001747
1748 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001749#ifdef LLTRACE
1750 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001753 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001754 if (f->f_trace == NULL)
1755 continue;
1756 /* Trace each line of code reached */
1757 f->f_lasti = INSTR_OFFSET();
1758 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001761
1762 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001763 case CALL_FUNCTION_VAR:
1764 case CALL_FUNCTION_KW:
1765 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001766 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001767 int na = oparg & 0xff;
1768 int nk = (oparg>>8) & 0xff;
1769 int flags = (opcode - CALL_FUNCTION) & 3;
1770 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1771 PyObject **pfunc = stack_pointer - n - 1;
1772 PyObject *func = *pfunc;
1773 PyObject *self = NULL;
1774 PyObject *class = NULL;
1775 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1776 if (PyMethod_Check(func)) {
1777 self = PyMethod_Self(func);
1778 class = PyMethod_Class(func);
1779 func = PyMethod_Function(func);
1780 Py_INCREF(func);
1781 if (self != NULL) {
1782 Py_INCREF(self);
1783 Py_DECREF(*pfunc);
1784 *pfunc = self;
1785 na++;
1786 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001787 }
1788 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001789 /* Unbound methods must be called with an
1790 instance of the class (or a derived
1791 class) as first argument */
1792 if (na > 0 && (self = stack_pointer[-n]) != NULL
1793 && PyInstance_Check(self)
1794 && PyClass_IsSubclass((PyObject *)
1795 (((PyInstanceObject *)self)->in_class),
1796 class))
1797 /* Handy-dandy */ ;
1798 else {
1799 PyErr_SetString(PyExc_TypeError,
1800 "unbound method must be called with class instance 1st argument");
1801 x = NULL;
1802 break;
1803 }
1804 }
1805 }
1806 else
1807 Py_INCREF(func);
1808 if (PyFunction_Check(func) && flags == 0) {
1809 PyObject *co = PyFunction_GetCode(func);
1810 PyObject *globals = PyFunction_GetGlobals(func);
1811 PyObject *argdefs = PyFunction_GetDefaults(func);
1812 PyObject **d;
1813 int nd;
1814 if (argdefs != NULL) {
1815 d = &PyTuple_GET_ITEM(argdefs, 0);
1816 nd = ((PyTupleObject *)argdefs)->ob_size;
1817 }
1818 else {
1819 d = NULL;
1820 nd = 0;
1821 }
1822 x = eval_code2((PyCodeObject *)co, globals,
1823 (PyObject *)NULL, stack_pointer-n, na,
1824 stack_pointer-2*nk, nk, d, nd,
1825 class);
1826 }
1827 else {
1828 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001829 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001830 PyObject *stararg = 0;
1831 PyObject *kwdict = NULL;
1832 if (flags & 2) {
1833 kwdict = POP();
1834 if (!PyDict_Check(kwdict)) {
1835 PyErr_SetString(PyExc_TypeError,
1836 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001837 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001838 }
1839 }
1840 if (flags & 1) {
1841 stararg = POP();
1842 if (!PySequence_Check(stararg)) {
1843 PyErr_SetString(PyExc_TypeError,
1844 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001845 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001846 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001847 /* Convert abstract sequence to concrete tuple */
1848 if (!PyTuple_Check(stararg)) {
1849 PyObject *t = NULL;
1850 t = PySequence_Tuple(stararg);
1851 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001852 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001853 }
1854 Py_DECREF(stararg);
1855 stararg = t;
1856 }
1857 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001858 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001859 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001860 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001861 }
1862 if (nk > 0) {
1863 if (kwdict == NULL) {
1864 kwdict = PyDict_New();
1865 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001866 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001867 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001868 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001869 else {
1870 PyObject *d = PyDict_Copy(kwdict);
1871 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001872 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001873 }
1874 Py_DECREF(kwdict);
1875 kwdict = d;
1876 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001877 err = 0;
1878 while (--nk >= 0) {
1879 PyObject *value = POP();
1880 PyObject *key = POP();
1881 if (PyDict_GetItem(kwdict, key) != NULL) {
1882 err = 1;
1883 PyErr_Format(PyExc_TypeError,
1884 "keyword parameter redefined: %.400s",
1885 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001886 Py_DECREF(key);
1887 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001888 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001889 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001890 err = PyDict_SetItem(kwdict, key, value);
1891 Py_DECREF(key);
1892 Py_DECREF(value);
1893 if (err)
1894 break;
1895 }
1896 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001897 extcall_fail:
1898 Py_XDECREF(kwdict);
1899 Py_XDECREF(stararg);
1900 Py_DECREF(func);
1901 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001902 break;
1903 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001904 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001905 callargs = PyTuple_New(na + nstar);
1906 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001907 x = NULL;
1908 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001909 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001910 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001911 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001912 for (i = 0; i < nstar; i++) {
1913 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1914 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001915 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001916 }
1917 Py_DECREF(stararg);
1918 }
1919 while (--na >= 0) {
1920 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001921 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001922 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001923 x = PyEval_CallObjectWithKeywords(func,
1924 callargs,
1925 kwdict);
1926 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001927 Py_XDECREF(kwdict);
1928 }
1929 Py_DECREF(func);
1930 while (stack_pointer > pfunc) {
1931 w = POP();
1932 Py_DECREF(w);
1933 }
1934 PUSH(x);
1935 if (x != NULL) continue;
1936 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001937 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001938
Guido van Rossum681d79a1995-07-18 14:51:37 +00001939 case MAKE_FUNCTION:
1940 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001941 x = PyFunction_New(v, f->f_globals);
1942 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001943 /* XXX Maybe this should be a separate opcode? */
1944 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001945 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001946 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001947 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001948 x = NULL;
1949 break;
1950 }
1951 while (--oparg >= 0) {
1952 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001953 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001954 }
1955 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001956 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001957 }
1958 PUSH(x);
1959 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001960
1961 case BUILD_SLICE:
1962 if (oparg == 3)
1963 w = POP();
1964 else
1965 w = NULL;
1966 v = POP();
1967 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001968 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 Py_DECREF(u);
1970 Py_DECREF(v);
1971 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001972 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001973 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001974 break;
1975
Fred Drakeef8ace32000-08-24 00:32:09 +00001976 case EXTENDED_ARG:
1977 opcode = NEXTOP();
1978 oparg = oparg<<16 | NEXTARG();
1979 goto dispatch_opcode;
1980 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001981
Guido van Rossum374a9221991-04-04 10:40:29 +00001982 default:
1983 fprintf(stderr,
1984 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001985 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001987 why = WHY_EXCEPTION;
1988 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001989
1990#ifdef CASE_TOO_BIG
1991 }
1992#endif
1993
Guido van Rossum374a9221991-04-04 10:40:29 +00001994 } /* switch */
1995
1996 on_error:
1997
1998 /* Quickly continue if no error occurred */
1999
2000 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002001 if (err == 0 && x != NULL) {
2002#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002003 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002004 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002005 fprintf(stderr,
2006 "XXX undetected error\n");
2007 else
2008#endif
2009 continue; /* Normal, fast path */
2010 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002011 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002012 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002013 err = 0;
2014 }
2015
Guido van Rossum374a9221991-04-04 10:40:29 +00002016 /* Double-check exception status */
2017
2018 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002020 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002021 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002022 why = WHY_EXCEPTION;
2023 }
2024 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002025#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002026 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002027 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002028 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002029 fprintf(stderr,
2030 "XXX undetected error (why=%d)\n",
2031 why);
2032 why = WHY_EXCEPTION;
2033 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002034 }
2035#endif
2036
2037 /* Log traceback info if this is a real exception */
2038
2039 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002040 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002041 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002042 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002044
Guido van Rossume59214e1994-08-30 08:01:59 +00002045 if (f->f_trace)
2046 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002047 if (tstate->sys_profilefunc)
2048 call_exc_trace(&tstate->sys_profilefunc,
2049 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002050 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002051
2052 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2053
2054 if (why == WHY_RERAISE)
2055 why = WHY_EXCEPTION;
2056
2057 /* Unwind stacks if a (pseudo) exception occurred */
2058
2059 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002061 while (STACK_LEVEL() > b->b_level) {
2062 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002064 }
2065 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2066 why = WHY_NOT;
2067 JUMPTO(b->b_handler);
2068 break;
2069 }
2070 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002071 (b->b_type == SETUP_EXCEPT &&
2072 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002073 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 PyObject *exc, *val, *tb;
2075 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002076 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 val = Py_None;
2078 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002079 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002080 /* Make the raw exception data
2081 available to the handler,
2082 so a program can emulate the
2083 Python main loop. Don't do
2084 this for 'finally'. */
2085 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002086 PyErr_NormalizeException(
2087 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002088 set_exc_info(tstate,
2089 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002090 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 PUSH(val);
2093 PUSH(exc);
2094 }
2095 else {
2096 if (why == WHY_RETURN)
2097 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002099 PUSH(v);
2100 }
2101 why = WHY_NOT;
2102 JUMPTO(b->b_handler);
2103 break;
2104 }
2105 } /* unwind stack */
2106
2107 /* End the loop if we still have an error (or return) */
2108
2109 if (why != WHY_NOT)
2110 break;
2111
2112 } /* main loop */
2113
2114 /* Pop remaining stack entries */
2115
2116 while (!EMPTY()) {
2117 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 }
2120
Guido van Rossum96a42c81992-01-12 02:29:51 +00002121 if (why != WHY_RETURN)
2122 retval = NULL;
2123
Guido van Rossume59214e1994-08-30 08:01:59 +00002124 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002125 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002126 if (call_trace(&f->f_trace, &f->f_trace, f,
2127 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002129 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002130 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002131 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002132 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002133 }
2134
Guido van Rossuma027efa1997-05-05 20:56:21 +00002135 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2136 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002137 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002139 retval = NULL;
2140 why = WHY_EXCEPTION;
2141 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002142 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002143
Guido van Rossuma027efa1997-05-05 20:56:21 +00002144 reset_exc_info(tstate);
2145
2146 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002147
2148 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002149
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002151
Guido van Rossuma027efa1997-05-05 20:56:21 +00002152 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002154
Guido van Rossum96a42c81992-01-12 02:29:51 +00002155 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002156}
2157
Guido van Rossuma027efa1997-05-05 20:56:21 +00002158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002159set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002160{
2161 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002162 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002163
Guido van Rossuma027efa1997-05-05 20:56:21 +00002164 frame = tstate->frame;
2165 if (frame->f_exc_type == NULL) {
2166 /* This frame didn't catch an exception before */
2167 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002168 if (tstate->exc_type == NULL) {
2169 Py_INCREF(Py_None);
2170 tstate->exc_type = Py_None;
2171 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002172 tmp_type = frame->f_exc_type;
2173 tmp_value = frame->f_exc_value;
2174 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 Py_XINCREF(tstate->exc_type);
2176 Py_XINCREF(tstate->exc_value);
2177 Py_XINCREF(tstate->exc_traceback);
2178 frame->f_exc_type = tstate->exc_type;
2179 frame->f_exc_value = tstate->exc_value;
2180 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002181 Py_XDECREF(tmp_type);
2182 Py_XDECREF(tmp_value);
2183 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002184 }
2185 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002186 tmp_type = tstate->exc_type;
2187 tmp_value = tstate->exc_value;
2188 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002189 Py_XINCREF(type);
2190 Py_XINCREF(value);
2191 Py_XINCREF(tb);
2192 tstate->exc_type = type;
2193 tstate->exc_value = value;
2194 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002195 Py_XDECREF(tmp_type);
2196 Py_XDECREF(tmp_value);
2197 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002198 /* For b/w compatibility */
2199 PySys_SetObject("exc_type", type);
2200 PySys_SetObject("exc_value", value);
2201 PySys_SetObject("exc_traceback", tb);
2202}
2203
2204static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002205reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002206{
2207 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002208 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209 frame = tstate->frame;
2210 if (frame->f_exc_type != NULL) {
2211 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002212 tmp_type = tstate->exc_type;
2213 tmp_value = tstate->exc_value;
2214 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002215 Py_XINCREF(frame->f_exc_type);
2216 Py_XINCREF(frame->f_exc_value);
2217 Py_XINCREF(frame->f_exc_traceback);
2218 tstate->exc_type = frame->f_exc_type;
2219 tstate->exc_value = frame->f_exc_value;
2220 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002221 Py_XDECREF(tmp_type);
2222 Py_XDECREF(tmp_value);
2223 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002224 /* For b/w compatibility */
2225 PySys_SetObject("exc_type", frame->f_exc_type);
2226 PySys_SetObject("exc_value", frame->f_exc_value);
2227 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2228 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002229 tmp_type = frame->f_exc_type;
2230 tmp_value = frame->f_exc_value;
2231 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 frame->f_exc_type = NULL;
2233 frame->f_exc_value = NULL;
2234 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002235 Py_XDECREF(tmp_type);
2236 Py_XDECREF(tmp_value);
2237 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002238}
2239
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002240/* Logic for the raise statement (too complicated for inlining).
2241 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002242static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002243do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002244{
Guido van Rossumd295f121998-04-09 21:39:57 +00002245 if (type == NULL) {
2246 /* Reraise */
2247 PyThreadState *tstate = PyThreadState_Get();
2248 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2249 value = tstate->exc_value;
2250 tb = tstate->exc_traceback;
2251 Py_XINCREF(type);
2252 Py_XINCREF(value);
2253 Py_XINCREF(tb);
2254 }
2255
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002256 /* We support the following forms of raise:
2257 raise <class>, <classinstance>
2258 raise <class>, <argument tuple>
2259 raise <class>, None
2260 raise <class>, <argument>
2261 raise <classinstance>, None
2262 raise <string>, <object>
2263 raise <string>, None
2264
2265 An omitted second argument is the same as None.
2266
2267 In addition, raise <tuple>, <anything> is the same as
2268 raising the tuple's first item (and it better have one!);
2269 this rule is applied recursively.
2270
2271 Finally, an optional third argument can be supplied, which
2272 gives the traceback to be substituted (useful when
2273 re-raising an exception after examining it). */
2274
2275 /* First, check the traceback argument, replacing None with
2276 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002277 if (tb == Py_None) {
2278 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002279 tb = NULL;
2280 }
2281 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002282 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002283 "raise 3rd arg must be traceback or None");
2284 goto raise_error;
2285 }
2286
2287 /* Next, replace a missing value with None */
2288 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002289 value = Py_None;
2290 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002291 }
2292
2293 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2295 PyObject *tmp = type;
2296 type = PyTuple_GET_ITEM(type, 0);
2297 Py_INCREF(type);
2298 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002299 }
2300
Barry Warsaw4249f541997-08-22 21:26:19 +00002301 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002302 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002303
2304 else if (PyClass_Check(type))
2305 PyErr_NormalizeException(&type, &value, &tb);
2306
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002308 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 if (value != Py_None) {
2310 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002311 "instance exception may not have a separate value");
2312 goto raise_error;
2313 }
2314 else {
2315 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002317 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002318 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2319 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002320 }
2321 }
2322 else {
2323 /* Not something you can raise. You get an exception
2324 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002325 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002326 "exceptions must be strings, classes, or instances");
2327 goto raise_error;
2328 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002330 if (tb == NULL)
2331 return WHY_EXCEPTION;
2332 else
2333 return WHY_RERAISE;
2334 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 Py_XDECREF(value);
2336 Py_XDECREF(type);
2337 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002338 return WHY_EXCEPTION;
2339}
2340
Barry Warsawe42b18f1997-08-25 22:13:04 +00002341static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002342unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002343{
2344 int i;
2345 PyObject *w;
2346
2347 for (i = 0; i < argcnt; i++) {
2348 if (! (w = PySequence_GetItem(v, i))) {
2349 if (PyErr_ExceptionMatches(PyExc_IndexError))
2350 PyErr_SetString(PyExc_ValueError,
2351 "unpack sequence of wrong size");
2352 goto finally;
2353 }
2354 *--sp = w;
2355 }
2356 /* we better get an IndexError now */
2357 if (PySequence_GetItem(v, i) == NULL) {
2358 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2359 PyErr_Clear();
2360 return 1;
2361 }
2362 /* some other exception occurred. fall through to finally */
2363 }
2364 else
2365 PyErr_SetString(PyExc_ValueError,
2366 "unpack sequence of wrong size");
2367 /* fall through */
2368finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002369 for (; i > 0; i--, sp++)
2370 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002371
2372 return 0;
2373}
2374
2375
Guido van Rossum96a42c81992-01-12 02:29:51 +00002376#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002378prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 if (PyObject_Print(v, stdout, 0) != 0)
2382 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002384 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002386#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002388static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002389call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002390{
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002392 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002394 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 value = Py_None;
2396 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002397 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002399 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002401 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002402 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002403 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002405 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002407 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 Py_XDECREF(type);
2409 Py_XDECREF(value);
2410 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002411 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002412}
2413
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002414/* PyObject **p_trace: in/out; may not be NULL;
2415 may not point to NULL variable initially
2416 PyObject **p_newtrace: in/out; may be NULL;
2417 may point to NULL variable;
2418 may be same variable as p_newtrace */
2419
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002420static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002421call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2422 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002423{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002424 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 PyObject *args, *what;
2426 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002427
Guido van Rossuma027efa1997-05-05 20:56:21 +00002428 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002429 /* Don't do recursive traces */
2430 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002432 *p_newtrace = NULL;
2433 }
2434 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002435 }
2436
Guido van Rossumb209a111997-04-29 18:18:01 +00002437 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002438 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002439 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002441 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002442 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 Py_INCREF(f);
2444 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2445 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002446 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002447 arg = Py_None;
2448 Py_INCREF(arg);
2449 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002450 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 PyFrame_FastToLocals(f);
2452 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2453 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002454 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002455 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002457 if (res == NULL) {
2458 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 PyTraceBack_Here(f);
2460 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002461 *p_trace = NULL;
2462 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002464 *p_newtrace = NULL;
2465 }
Barry Warsawf6202631999-09-08 16:26:33 +00002466 /* to be extra double plus sure we don't get recursive
2467 * calls inf either tracefunc or profilefunc gets an
2468 * exception, zap the global variables.
2469 */
2470 Py_XDECREF(tstate->sys_tracefunc);
2471 tstate->sys_tracefunc = NULL;
2472 Py_XDECREF(tstate->sys_profilefunc);
2473 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002474 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002475 }
2476 else {
2477 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002478 Py_XDECREF(*p_newtrace);
2479 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002480 *p_newtrace = NULL;
2481 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002483 *p_newtrace = res;
2484 }
2485 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002486 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002487 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002488 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002489}
2490
Guido van Rossumb209a111997-04-29 18:18:01 +00002491PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002493{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002494 PyThreadState *tstate = PyThreadState_Get();
2495 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002496 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002497 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002498 else
2499 return current_frame->f_builtins;
2500}
2501
Guido van Rossumb209a111997-04-29 18:18:01 +00002502PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002503PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002504{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002505 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002506 if (current_frame == NULL)
2507 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002509 return current_frame->f_locals;
2510}
2511
Guido van Rossumb209a111997-04-29 18:18:01 +00002512PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002513PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002515 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516 if (current_frame == NULL)
2517 return NULL;
2518 else
2519 return current_frame->f_globals;
2520}
2521
Guido van Rossumb209a111997-04-29 18:18:01 +00002522PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002523PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002524{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002525 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002527}
2528
Guido van Rossum6135a871995-01-09 17:53:26 +00002529int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002531{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002532 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002533 return current_frame == NULL ? 0 : current_frame->f_restricted;
2534}
2535
Guido van Rossumbe270261997-05-22 22:26:18 +00002536int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002537Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538{
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002540 if (f == NULL)
2541 return 0;
2542 if (!PyFile_SoftSpace(f, 0))
2543 return 0;
2544 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545}
2546
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547
Guido van Rossum681d79a1995-07-18 14:51:37 +00002548/* External interface to call any callable object.
2549 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002550
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002551#undef PyEval_CallObject
2552/* for backward compatibility: export this interface */
2553
Guido van Rossumb209a111997-04-29 18:18:01 +00002554PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002555PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002556{
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002558}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002559#define PyEval_CallObject(func,arg) \
2560 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002561
Guido van Rossumb209a111997-04-29 18:18:01 +00002562PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002563PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002564{
2565 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002566 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002567
2568 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002569 arg = PyTuple_New(0);
2570 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002571 PyErr_SetString(PyExc_TypeError,
2572 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002573 return NULL;
2574 }
2575 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002576 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002577
Guido van Rossumb209a111997-04-29 18:18:01 +00002578 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002579 PyErr_SetString(PyExc_TypeError,
2580 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002581 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002582 return NULL;
2583 }
2584
Guido van Rossum150b2df1996-12-05 23:17:11 +00002585 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002586 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002587 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002588 result = call_function(func, arg, kw);
2589 else
2590 result = call_builtin(func, arg, kw);
2591
Guido van Rossumb209a111997-04-29 18:18:01 +00002592 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002593
Guido van Rossumb209a111997-04-29 18:18:01 +00002594 if (result == NULL && !PyErr_Occurred())
2595 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002596 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002597
2598 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002599}
2600
Guido van Rossumb209a111997-04-29 18:18:01 +00002601static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603{
Guido van Rossumb209a111997-04-29 18:18:01 +00002604 if (PyCFunction_Check(func)) {
2605 PyCFunction meth = PyCFunction_GetFunction(func);
2606 PyObject *self = PyCFunction_GetSelf(func);
2607 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002608 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002609 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002610 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002611 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002612 else if (size == 0)
2613 arg = NULL;
2614 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002615 if (flags & METH_KEYWORDS)
2616 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002617 if (kw != NULL && PyDict_Size(kw) != 0) {
2618 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002619 "this function takes no keyword arguments");
2620 return NULL;
2621 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002622 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002624 if (PyClass_Check(func)) {
2625 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 if (PyInstance_Check(func)) {
2628 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002629 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 PyErr_Clear();
2631 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002632 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002633 return NULL;
2634 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002635 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002637 return res;
2638 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002639 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002640 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 return NULL;
2642}
2643
Guido van Rossumb209a111997-04-29 18:18:01 +00002644static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646{
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 PyObject *class = NULL; /* == owner */
2648 PyObject *argdefs;
2649 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002650 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002651 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002652
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 if (kw != NULL && !PyDict_Check(kw)) {
2654 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002655 return NULL;
2656 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 if (PyMethod_Check(func)) {
2659 PyObject *self = PyMethod_Self(func);
2660 class = PyMethod_Class(func);
2661 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002662 if (self == NULL) {
2663 /* Unbound methods must be called with an instance of
2664 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002665 if (PyTuple_Size(arg) >= 1) {
2666 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002667 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 PyInstance_Check(self) &&
2669 PyClass_IsSubclass((PyObject *)
2670 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002671 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002672 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002673 else
2674 self = NULL;
2675 }
2676 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002678 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002679 return NULL;
2680 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002682 }
2683 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 int argcount = PyTuple_Size(arg);
2685 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002686 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002687 if (newarg == NULL)
2688 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002689 Py_INCREF(self);
2690 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002691 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 PyObject *v = PyTuple_GET_ITEM(arg, i);
2693 Py_XINCREF(v);
2694 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002695 }
2696 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002698 if (!PyFunction_Check(func)) {
2699 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2700 Py_DECREF(arg);
2701 return result;
2702 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 }
2704 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002706 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002707 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002708 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 return NULL;
2710 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002713
2714 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2716 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2717 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002718 }
2719 else {
2720 d = NULL;
2721 nd = 0;
2722 }
2723
2724 if (kw != NULL) {
2725 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 nk = PyDict_Size(kw);
2727 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002728 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 PyErr_NoMemory();
2730 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002731 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002732 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002733 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002735 i += 2;
2736 nk = i/2;
2737 /* XXX This is broken if the caller deletes dict items! */
2738 }
2739 else {
2740 k = NULL;
2741 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002742 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 (PyCodeObject *)PyFunction_GetCode(func),
2746 PyFunction_GetGlobals(func), (PyObject *)NULL,
2747 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002748 k, nk,
2749 d, nd,
2750 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002753 if (k != NULL)
2754 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755
Guido van Rossum681d79a1995-07-18 14:51:37 +00002756 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757}
2758
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002759#define SLICE_ERROR_MSG \
2760 "standard sequence type does not support step size other than one"
2761
Guido van Rossumb209a111997-04-29 18:18:01 +00002762static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002763loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764{
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002766 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002767 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 return NULL;
2770 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002772 v = (*sq->sq_item)(v, i);
2773 if (v)
2774 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002775 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002777 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778}
2779
Guido van Rossum20c6add2000-05-08 14:06:50 +00002780/* Extract a slice index from a PyInt or PyLong, the index is bound to
2781 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2782 and error. Returns 1 on success.*/
2783
2784int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002785_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786{
2787 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002788 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002789 if (PyInt_Check(v)) {
2790 x = PyInt_AsLong(v);
2791 } else if (PyLong_Check(v)) {
2792 x = PyLong_AsLong(v);
2793 if (x==-1 && PyErr_Occurred()) {
2794 PyObject *long_zero;
2795
2796 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2797 /* It's not an overflow error, so just
2798 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002799 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002800 }
2801
2802 /* It's an overflow error, so we need to
2803 check the sign of the long integer,
2804 set the value to INT_MAX or 0, and clear
2805 the error. */
2806
2807 /* Create a long integer with a value of 0 */
2808 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002809 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002810
2811 /* Check sign */
2812 if (PyObject_Compare(long_zero, v) < 0)
2813 x = INT_MAX;
2814 else
2815 x = 0;
2816
2817 /* Free the long integer we created, and clear the
2818 OverflowError */
2819 Py_DECREF(long_zero);
2820 PyErr_Clear();
2821 }
2822 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002823 PyErr_SetString(PyExc_TypeError,
2824 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002825 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002827 /* Truncate -- very long indices are truncated anyway */
2828 if (x > INT_MAX)
2829 x = INT_MAX;
2830 else if (x < -INT_MAX)
2831 x = 0;
2832 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002834 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835}
2836
Guido van Rossumb209a111997-04-29 18:18:01 +00002837static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002840 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002841 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002843 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002844 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002845 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847
2848static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002849assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002851 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002852 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002853 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002854 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002856 if (x == NULL)
2857 return PySequence_DelSlice(u, ilow, ihigh);
2858 else
2859 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860}
2861
Guido van Rossumb209a111997-04-29 18:18:01 +00002862static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002863cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864{
2865 register int cmp;
2866 register int res = 0;
2867 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002868 case IS:
2869 case IS_NOT:
2870 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002871 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002872 res = !res;
2873 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 case IN:
2875 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002876 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002877 if (res < 0)
2878 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002879 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002880 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 break;
2882 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002883 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 break;
2885 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002886 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002887 if (cmp && PyErr_Occurred())
2888 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 switch (op) {
2890 case LT: res = cmp < 0; break;
2891 case LE: res = cmp <= 0; break;
2892 case EQ: res = cmp == 0; break;
2893 case NE: res = cmp != 0; break;
2894 case GT: res = cmp > 0; break;
2895 case GE: res = cmp >= 0; break;
2896 /* XXX no default? (res is initialized to 0 though) */
2897 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002899 v = res ? Py_True : Py_False;
2900 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 return v;
2902}
2903
Thomas Wouters52152252000-08-17 22:55:00 +00002904static PyObject *
2905import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002906{
Guido van Rossumb209a111997-04-29 18:18:01 +00002907 PyObject *w, *x;
2908 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002909 PyErr_SetString(PyExc_TypeError,
2910 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002911 return NULL;
2912 }
2913 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2914 x = PyDict_GetItem(w, name);
2915 if (x == NULL) {
2916 PyErr_Format(PyExc_ImportError,
2917 "cannot import name %.230s",
2918 PyString_AsString(name));
2919 } else
2920 Py_INCREF(x);
2921 return x;
2922}
2923
2924static int
2925import_all_from(PyObject *locals, PyObject *v)
2926{
2927 int pos = 0, err;
2928 PyObject *name, *value;
2929 PyObject *w;
2930
2931 if (!PyModule_Check(v)) {
2932 PyErr_SetString(PyExc_TypeError,
2933 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002934 return -1;
2935 }
Thomas Wouters52152252000-08-17 22:55:00 +00002936 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2937
2938 while (PyDict_Next(w, &pos, &name, &value)) {
2939 if (!PyString_Check(name) ||
2940 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002941 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002942 Py_INCREF(value);
2943 err = PyDict_SetItem(locals, name, value);
2944 Py_DECREF(value);
2945 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002946 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002947 }
Thomas Wouters52152252000-08-17 22:55:00 +00002948 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002949}
2950
Guido van Rossumb209a111997-04-29 18:18:01 +00002951static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002952build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002953{
Guido van Rossumcd649651997-08-22 16:56:16 +00002954 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002955 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002956 PyErr_SetString(PyExc_SystemError,
2957 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002958 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002959 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002960 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002961 PyErr_SetString(PyExc_SystemError,
2962 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002963 return NULL;
2964 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002965 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002966 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002967 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002968 return NULL;
2969 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002970 n = PyTuple_Size(bases);
2971 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002972 PyObject *base = PyTuple_GET_ITEM(bases, i);
2973 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002974 /* Call the base's *type*, if it is callable.
2975 This code is a hook for Donald Beaudry's
2976 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002977 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002978 since its types are not callable.
2979 Ditto: call the bases's *class*, if it has
2980 one. This makes the same thing possible
2981 without writing C code. A true meta-object
2982 protocol! */
2983 PyObject *basetype = (PyObject *)base->ob_type;
2984 PyObject *callable = NULL;
2985 if (PyCallable_Check(basetype))
2986 callable = basetype;
2987 else
2988 callable = PyObject_GetAttrString(
2989 base, "__class__");
2990 if (callable) {
2991 PyObject *args;
2992 PyObject *newclass = NULL;
2993 args = Py_BuildValue(
2994 "(OOO)", name, bases, methods);
2995 if (args != NULL) {
2996 newclass = PyEval_CallObject(
2997 callable, args);
2998 Py_DECREF(args);
2999 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003000 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003001 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003002 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003003 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003004 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003005 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003006 "base is not a class object");
3007 return NULL;
3008 }
3009 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003010 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003011}
3012
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003013static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003014exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3015 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003016{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003017 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003018 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003019 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003020
Guido van Rossumb209a111997-04-29 18:18:01 +00003021 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3022 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003023 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003024 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003025 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003026 locals = PyTuple_GetItem(prog, 2);
3027 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003028 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003029 if (globals == Py_None) {
3030 globals = PyEval_GetGlobals();
3031 if (locals == Py_None) {
3032 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003033 plain = 1;
3034 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003035 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003036 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003037 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003038 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003039 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003040 !PyCode_Check(prog) &&
3041 !PyFile_Check(prog)) {
3042 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043 "exec 1st arg must be string, code or file object");
3044 return -1;
3045 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003046 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3047 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003048 "exec 2nd/3rd args must be dict or None");
3049 return -1;
3050 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003051 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003052 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003053 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003054 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003055 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003056 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003057 FILE *fp = PyFile_AsFile(prog);
3058 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003059 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3060 }
3061 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003062 char *str;
3063 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003064 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003065 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003066 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003067 if (plain)
3068 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003069 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003070 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003071 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003072 return 0;
3073}
Guido van Rossum24c13741995-02-14 09:42:43 +00003074
Paul Prescode68140d2000-08-30 20:25:01 +00003075static void
3076format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3077{
3078 char *obj_str;
3079
3080 if (!obj)
3081 return;
3082
3083 obj_str = PyString_AsString(obj);
3084 if (!obj_str)
3085 return;
3086
3087 PyErr_Format(exc, format_str, obj_str);
3088}
Guido van Rossum950361c1997-01-24 13:49:28 +00003089
3090#ifdef DYNAMIC_EXECUTION_PROFILE
3091
3092PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003093getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003094{
3095 int i;
3096 PyObject *l = PyList_New(256);
3097 if (l == NULL) return NULL;
3098 for (i = 0; i < 256; i++) {
3099 PyObject *x = PyInt_FromLong(a[i]);
3100 if (x == NULL) {
3101 Py_DECREF(l);
3102 return NULL;
3103 }
3104 PyList_SetItem(l, i, x);
3105 }
3106 for (i = 0; i < 256; i++)
3107 a[i] = 0;
3108 return l;
3109}
3110
3111PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003112_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003113{
3114#ifndef DXPAIRS
3115 return getarray(dxp);
3116#else
3117 int i;
3118 PyObject *l = PyList_New(257);
3119 if (l == NULL) return NULL;
3120 for (i = 0; i < 257; i++) {
3121 PyObject *x = getarray(dxpairs[i]);
3122 if (x == NULL) {
3123 Py_DECREF(l);
3124 return NULL;
3125 }
3126 PyList_SetItem(l, i, x);
3127 }
3128 return l;
3129#endif
3130}
3131
3132#endif