blob: e8f8e8a61f422a1690ec1a35d0464ad24d4097a9 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum681d79a1995-07-18 14:51:37 +000013/* XXX TO DO:
14 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000015 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000016 XXX document it!
17 */
18
Guido van Rossumb209a111997-04-29 18:18:01 +000019#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000022#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000023#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000024#include "opcode.h"
25
Jack Jansencbf630f2000-07-11 21:59:16 +000026#ifdef macintosh
27#include "macglue.h"
28#endif
29
Guido van Rossumc6004111993-11-05 10:22:19 +000030#include <ctype.h>
31
Guido van Rossuma027efa1997-05-05 20:56:21 +000032#ifdef HAVE_LIMITS_H
33#include <limits.h>
34#else
35#define INT_MAX 2147483647
36#endif
37
Guido van Rossum04691fc1992-08-12 15:35:34 +000038/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000040
Guido van Rossum408027e1996-12-30 16:17:54 +000041#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000042/* For debugging the interpreter: */
43#define LLTRACE 1 /* Low-level trace feature */
44#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#endif
46
Guido van Rossum5b722181993-03-30 17:46:03 +000047
Guido van Rossum374a9221991-04-04 10:40:29 +000048/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000049
Tim Petersdbd9ba62000-07-09 03:09:57 +000050static PyObject *eval_code2(PyCodeObject *,
51 PyObject *, PyObject *,
52 PyObject **, int,
53 PyObject **, int,
54 PyObject **, int,
55 PyObject *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000056#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
60static int call_trace(PyObject **, PyObject **,
61 PyFrameObject *, char *, PyObject *);
62static PyObject *call_builtin(PyObject *, PyObject *, PyObject *);
63static PyObject *call_function(PyObject *, PyObject *, PyObject *);
64static PyObject *loop_subscript(PyObject *, PyObject *);
65static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
66static int assign_slice(PyObject *, PyObject *,
67 PyObject *, PyObject *);
68static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000069static PyObject *import_from(PyObject *, PyObject *);
70static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000071static PyObject *build_class(PyObject *, PyObject *, PyObject *);
72static int exec_statement(PyFrameObject *,
73 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
75static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000076static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Paul Prescode68140d2000-08-30 20:25:01 +000078#define NAME_ERROR_MSG \
79 "There is no variable named '%s'"
80#define UNBOUNDLOCAL_ERROR_MSG \
81 "Local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000082
Guido van Rossum950361c1997-01-24 13:49:28 +000083/* Dynamic execution profile */
84#ifdef DYNAMIC_EXECUTION_PROFILE
85#ifdef DXPAIRS
86static long dxpairs[257][256];
87#define dxp dxpairs[256]
88#else
89static long dxp[256];
90#endif
91#endif
92
93
Guido van Rossume59214e1994-08-30 08:01:59 +000094#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000095
Guido van Rossum2571cc81999-04-07 16:07:23 +000096#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000098#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000099#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000100
Guido van Rossuma027efa1997-05-05 20:56:21 +0000101extern int _PyThread_Started; /* Flag for Py_Exit */
102
Guido van Rossum65d5b571998-12-21 19:32:43 +0000103static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000104static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105
106void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000107PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000110 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000111 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000112 interpreter_lock = PyThread_allocate_lock();
113 PyThread_acquire_lock(interpreter_lock, 1);
114 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000116
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000117void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000118PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000120 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121}
122
123void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000124PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000125{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000126 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000127}
128
129void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000130PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131{
132 if (tstate == NULL)
133 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000134 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000135 if (PyThreadState_Swap(tstate) != NULL)
136 Py_FatalError(
137 "PyEval_AcquireThread: non-NULL old thread state");
138}
139
140void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000141PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000142{
143 if (tstate == NULL)
144 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
145 if (PyThreadState_Swap(NULL) != tstate)
146 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000147 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000148}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000149
150/* This function is called from PyOS_AfterFork to ensure that newly
151 created child processes don't hold locks referring to threads which
152 are not running in the child process. (This could also be done using
153 pthread_atfork mechanism, at least for the pthreads implementation.) */
154
155void
156PyEval_ReInitThreads(void)
157{
158 if (!interpreter_lock)
159 return;
160 /*XXX Can't use PyThread_free_lock here because it does too
161 much error-checking. Doing this cleanly would require
162 adding a new function to each thread_*.h. Instead, just
163 create a new lock and waste a little bit of memory */
164 interpreter_lock = PyThread_allocate_lock();
165 PyThread_acquire_lock(interpreter_lock, 1);
166 main_thread = PyThread_get_thread_ident();
167}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168#endif
169
Guido van Rossumff4949e1992-08-05 19:58:53 +0000170/* Functions save_thread and restore_thread are always defined so
171 dynamically loaded modules needn't be compiled separately for use
172 with and without threads: */
173
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000174PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000175PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000177 PyThreadState *tstate = PyThreadState_Swap(NULL);
178 if (tstate == NULL)
179 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000180#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000181 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000182 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000184 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185}
186
187void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000188PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000190 if (tstate == NULL)
191 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000192#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000194 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000195 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197 }
198#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000199 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200}
201
202
Guido van Rossuma9672091994-09-14 13:31:22 +0000203/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
204 signal handlers or Mac I/O completion routines) can schedule calls
205 to a function to be called synchronously.
206 The synchronous function is called with one void* argument.
207 It should return 0 for success or -1 for failure -- failure should
208 be accompanied by an exception.
209
210 If registry succeeds, the registry function returns 0; if it fails
211 (e.g. due to too many pending calls) it returns -1 (without setting
212 an exception condition).
213
214 Note that because registry may occur from within signal handlers,
215 or other asynchronous events, calling malloc() is unsafe!
216
217#ifdef WITH_THREAD
218 Any thread can schedule pending calls, but only the main thread
219 will execute them.
220#endif
221
222 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
223 There are two possible race conditions:
224 (1) nested asynchronous registry calls;
225 (2) registry calls made while pending calls are being processed.
226 While (1) is very unlikely, (2) is a real possibility.
227 The current code is safe against (2), but not against (1).
228 The safety against (2) is derived from the fact that only one
229 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000230
Guido van Rossuma027efa1997-05-05 20:56:21 +0000231 XXX Darn! With the advent of thread state, we should have an array
232 of pending calls per thread in the thread state! Later...
233*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000234
Guido van Rossuma9672091994-09-14 13:31:22 +0000235#define NPENDINGCALLS 32
236static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000237 int (*func)(void *);
238 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000239} pendingcalls[NPENDINGCALLS];
240static volatile int pendingfirst = 0;
241static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000242static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000243
244int
Thomas Wouters334fb892000-07-25 12:56:38 +0000245Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000246{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000247 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 int i, j;
249 /* XXX Begin critical section */
250 /* XXX If you want this to be safe against nested
251 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000252 if (busy)
253 return -1;
254 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000255 i = pendinglast;
256 j = (i + 1) % NPENDINGCALLS;
257 if (j == pendingfirst)
258 return -1; /* Queue full */
259 pendingcalls[i].func = func;
260 pendingcalls[i].arg = arg;
261 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 /* XXX End critical section */
265 return 0;
266}
267
Guido van Rossum180d7b41994-09-29 09:45:57 +0000268int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000270{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000272#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 return 0;
275#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000276 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000277 return 0;
278 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000279 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 for (;;) {
281 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000282 int (*func)(void *);
283 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000284 i = pendingfirst;
285 if (i == pendinglast)
286 break; /* Queue empty */
287 func = pendingcalls[i].func;
288 arg = pendingcalls[i].arg;
289 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000290 if (func(arg) < 0) {
291 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000292 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000293 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000294 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000295 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000296 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000297 return 0;
298}
299
300
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000301/* The interpreter's recursion limit */
302
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000303static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000304
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000305int
306Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000307{
308 return recursion_limit;
309}
310
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000311void
312Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000313{
314 recursion_limit = new_limit;
315}
316
Guido van Rossum374a9221991-04-04 10:40:29 +0000317/* Status code for main loop (reason for stack unwind) */
318
319enum why_code {
320 WHY_NOT, /* No error */
321 WHY_EXCEPTION, /* Exception occurred */
322 WHY_RERAISE, /* Exception re-raised by 'finally' */
323 WHY_RETURN, /* 'return' statement */
324 WHY_BREAK /* 'break' statement */
325};
326
Tim Petersdbd9ba62000-07-09 03:09:57 +0000327static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
328static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000329
Guido van Rossum374a9221991-04-04 10:40:29 +0000330
Guido van Rossumb209a111997-04-29 18:18:01 +0000331PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000333{
334 return eval_code2(co,
335 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000336 (PyObject **)NULL, 0,
337 (PyObject **)NULL, 0,
338 (PyObject **)NULL, 0,
339 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000340}
341
342
343/* Interpreter main loop */
344
Guido van Rossumb209a111997-04-29 18:18:01 +0000345static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000346eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
347 PyObject **args, int argcount, PyObject **kws, int kwcount,
348 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000349{
Guido van Rossum950361c1997-01-24 13:49:28 +0000350#ifdef DXPAIRS
351 int lastopcode = 0;
352#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000353 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000354 register int opcode=0; /* Current opcode */
355 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000356 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000357 register enum why_code why; /* Reason for block stack unwind */
358 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000359 register PyObject *x; /* Result object -- NULL if error */
360 register PyObject *v; /* Temporary objects popped off stack */
361 register PyObject *w;
362 register PyObject *u;
363 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000364 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000365 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000366 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000367 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000368 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000369 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000370#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000371 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000373#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000374 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000375 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000376#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000377
378/* Code access macros */
379
380#define GETCONST(i) Getconst(f, i)
381#define GETNAME(i) Getname(f, i)
382#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000383#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000384#define NEXTOP() (*next_instr++)
385#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000386#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000387#define JUMPBY(x) (next_instr += (x))
388
389/* Stack manipulation macros */
390
391#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
392#define EMPTY() (STACK_LEVEL() == 0)
393#define TOP() (stack_pointer[-1])
394#define BASIC_PUSH(v) (*stack_pointer++ = (v))
395#define BASIC_POP() (*--stack_pointer)
396
Guido van Rossum96a42c81992-01-12 02:29:51 +0000397#ifdef LLTRACE
398#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
399#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000400#else
401#define PUSH(v) BASIC_PUSH(v)
402#define POP() BASIC_POP()
403#endif
404
Guido van Rossum681d79a1995-07-18 14:51:37 +0000405/* Local variable macros */
406
407#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000408#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409 GETLOCAL(i) = value; } while (0)
410
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411/* Start of code */
412
Guido van Rossum8861b741996-07-30 16:49:37 +0000413#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000415 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000416 return NULL;
417 }
418#endif
419
Guido van Rossum681d79a1995-07-18 14:51:37 +0000420 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000421 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000422 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000423 }
424
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000425#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000426 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000427#endif
428
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000431 co, /*code*/
432 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000433 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 if (f == NULL)
435 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000438 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439
440 if (co->co_argcount > 0 ||
441 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
442 int i;
443 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000446 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 if (kwdict == NULL)
448 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000449 i = co->co_argcount;
450 if (co->co_flags & CO_VARARGS)
451 i++;
452 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 }
454 if (argcount > co->co_argcount) {
455 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000456 PyErr_Format(PyExc_TypeError,
457 "too many arguments; expected %d, got %d",
458 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 goto fail;
460 }
461 n = co->co_argcount;
462 }
463 for (i = 0; i < n; i++) {
464 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 SETLOCAL(i, x);
467 }
468 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000470 if (u == NULL)
471 goto fail;
472 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 for (i = n; i < argcount; i++) {
474 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 Py_INCREF(x);
476 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 }
479 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 PyObject *keyword = kws[2*i];
481 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000483 if (keyword == NULL || !PyString_Check(keyword)) {
484 PyErr_SetString(PyExc_TypeError,
485 "keywords must be strings");
486 goto fail;
487 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 /* XXX slow -- speed up using dictionary? */
489 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000490 PyObject *nm = PyTuple_GET_ITEM(
491 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000492 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000493 break;
494 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000495 /* Check errors from Compare */
496 if (PyErr_Occurred())
497 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 if (j >= co->co_argcount) {
499 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000500 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000501 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000502 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 goto fail;
504 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 }
507 else {
508 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000509 PyErr_Format(PyExc_TypeError,
510 "keyword parameter redefined: %.400s",
511 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000512 goto fail;
513 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000514 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000515 SETLOCAL(j, value);
516 }
517 }
518 if (argcount < co->co_argcount) {
519 int m = co->co_argcount - defcount;
520 for (i = argcount; i < m; i++) {
521 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000522 PyErr_Format(PyExc_TypeError,
523 "not enough arguments; expected %d, got %d",
524 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000525 goto fail;
526 }
527 }
528 if (n > m)
529 i = n - m;
530 else
531 i = 0;
532 for (; i < defcount; i++) {
533 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000534 PyObject *def = defs[i];
535 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000536 SETLOCAL(m+i, def);
537 }
538 }
539 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000540 }
541 else {
542 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000543 PyErr_SetString(PyExc_TypeError,
544 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000545 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000546 }
547 }
548
Guido van Rossuma027efa1997-05-05 20:56:21 +0000549 if (tstate->sys_tracefunc != NULL) {
550 /* tstate->sys_tracefunc, if defined, is a function that
551 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000552 Its return value, if not None, is a function that
553 will be called at the start of each executed line
554 of code. (Actually, the function must return
555 itself in order to continue tracing.)
556 The trace functions are called with three arguments:
557 a pointer to the current frame, a string indicating
558 why the function is called, and an argument which
559 depends on the situation. The global trace function
560 (sys.trace) is also called whenever an exception
561 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000562 if (call_trace(&tstate->sys_tracefunc,
563 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000564 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000565 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000566 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000567 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000568 }
569
Guido van Rossuma027efa1997-05-05 20:56:21 +0000570 if (tstate->sys_profilefunc != NULL) {
571 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000572 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 if (call_trace(&tstate->sys_profilefunc,
574 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000575 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000576 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000577 }
578 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000579
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000580 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 --tstate->recursion_depth;
582 PyErr_SetString(PyExc_RuntimeError,
583 "Maximum recursion depth exceeded");
584 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000585 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000586 return NULL;
587 }
588
Guido van Rossumd076c731998-10-07 19:42:25 +0000589 _PyCode_GETCODEPTR(co, &first_instr);
590 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000591 stack_pointer = f->f_valuestack;
592
Guido van Rossum374a9221991-04-04 10:40:29 +0000593 why = WHY_NOT;
594 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000595 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000596
597 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 /* Do periodic things. Doing this every time through
599 the loop would add too much overhead, so we do it
600 only every Nth instruction. We also do it if
601 ``things_to_do'' is set, i.e. when an asynchronous
602 event needs attention (e.g. a signal handler or
603 async I/O handler); see Py_AddPendingCall() and
604 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000605
Guido van Rossuma027efa1997-05-05 20:56:21 +0000606 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000607 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000608 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000609 if (Py_MakePendingCalls() < 0) {
610 why = WHY_EXCEPTION;
611 goto on_error;
612 }
613 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000614#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000615 /* If we have true signals, the signal handler
616 will call Py_AddPendingCall() so we don't
617 have to call sigcheck(). On the Mac and
618 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000619 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000620 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 goto on_error;
622 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000623#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000624
Guido van Rossume59214e1994-08-30 08:01:59 +0000625#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626 if (interpreter_lock) {
627 /* Give another thread a chance */
628
Guido van Rossum25ce5661997-08-02 03:10:38 +0000629 if (PyThreadState_Swap(NULL) != tstate)
630 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000631 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000632
633 /* Other threads may run now */
634
Guido van Rossum65d5b571998-12-21 19:32:43 +0000635 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000636 if (PyThreadState_Swap(tstate) != NULL)
637 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638 }
639#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000641
Guido van Rossum374a9221991-04-04 10:40:29 +0000642 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000643
Guido van Rossum408027e1996-12-30 16:17:54 +0000644#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000645 f->f_lasti = INSTR_OFFSET();
646#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000647
648 opcode = NEXTOP();
649 if (HAS_ARG(opcode))
650 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000651 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000652#ifdef DYNAMIC_EXECUTION_PROFILE
653#ifdef DXPAIRS
654 dxpairs[lastopcode][opcode]++;
655 lastopcode = opcode;
656#endif
657 dxp[opcode]++;
658#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000659
Guido van Rossum96a42c81992-01-12 02:29:51 +0000660#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 /* Instruction tracing */
662
Guido van Rossum96a42c81992-01-12 02:29:51 +0000663 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 if (HAS_ARG(opcode)) {
665 printf("%d: %d, %d\n",
666 (int) (INSTR_OFFSET() - 3),
667 opcode, oparg);
668 }
669 else {
670 printf("%d: %d\n",
671 (int) (INSTR_OFFSET() - 1), opcode);
672 }
673 }
674#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 /* Main switch on opcode */
676
677 switch (opcode) {
678
679 /* BEWARE!
680 It is essential that any operation that fails sets either
681 x to NULL, err to nonzero, or why to anything but WHY_NOT,
682 and that no operation that succeeds does this! */
683
684 /* case STOP_CODE: this is an error! */
685
686 case POP_TOP:
687 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000688 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000689 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000690
691 case ROT_TWO:
692 v = POP();
693 w = POP();
694 PUSH(v);
695 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000696 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000697
698 case ROT_THREE:
699 v = POP();
700 w = POP();
701 x = POP();
702 PUSH(v);
703 PUSH(x);
704 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000705 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000706
Thomas Wouters434d0822000-08-24 20:11:32 +0000707 case ROT_FOUR:
708 u = POP();
709 v = POP();
710 w = POP();
711 x = POP();
712 PUSH(u);
713 PUSH(x);
714 PUSH(w);
715 PUSH(v);
716 continue;
717
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 case DUP_TOP:
719 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000720 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000722 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000723
Thomas Wouters434d0822000-08-24 20:11:32 +0000724 case DUP_TOPX:
725 switch (oparg) {
726 case 5:
727 case 4:
728 case 3:
729 case 2:
730 case 1:
731 x = POP();
732 if (oparg == 1) break;
733 w = POP();
734 if (oparg == 2) break;
735 v = POP();
736 if (oparg == 3) break;
737 u = POP();
738 if (oparg == 4) break;
739 t = POP();
740 break;
741 default:
742 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
743 PyErr_SetString(PyExc_SystemError,
744 "invalid argument to DUP_TOPX");
745 x = NULL;
746 }
747 if (x == NULL)
748 break;
749 switch (oparg) {
750 case 5: PUSH(t);
751 Py_INCREF(t); /* Fallthrough */
752 case 4: PUSH(u);
753 Py_INCREF(u); /* Fallthrough */
754 case 3: PUSH(v);
755 Py_INCREF(v); /* Fallthrough */
756 case 2: PUSH(w);
757 Py_INCREF(w); /* Fallthrough */
758 case 1: PUSH(x);
759 Py_INCREF(x); /* Fallthrough */
760 }
761 switch (oparg) {
762 case 5: PUSH(t); /* Fallthrough */
763 case 4: PUSH(u); /* Fallthrough */
764 case 3: PUSH(v); /* Fallthrough */
765 case 2: PUSH(w); /* Fallthrough */
766 case 1: PUSH(x); /* Fallthrough */
767 }
768 continue;
769
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 case UNARY_POSITIVE:
771 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000772 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000773 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000775 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000776 break;
777
778 case UNARY_NEGATIVE:
779 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000780 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000781 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000783 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
786 case UNARY_NOT:
787 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000788 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000789 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000790 if (err == 0) {
791 Py_INCREF(Py_True);
792 PUSH(Py_True);
793 continue;
794 }
795 else if (err > 0) {
796 Py_INCREF(Py_False);
797 PUSH(Py_False);
798 err = 0;
799 continue;
800 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000801 break;
802
803 case UNARY_CONVERT:
804 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 x = PyObject_Repr(v);
806 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000808 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000809 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000810
811 case UNARY_INVERT:
812 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000813 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000814 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000817 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000818
Guido van Rossum50564e81996-01-12 01:13:16 +0000819 case BINARY_POWER:
820 w = POP();
821 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000822 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000823 Py_DECREF(v);
824 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000826 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000827 break;
828
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 case BINARY_MULTIPLY:
830 w = POP();
831 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000832 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000833 Py_DECREF(v);
834 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000836 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 break;
838
839 case BINARY_DIVIDE:
840 w = POP();
841 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000842 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000843 Py_DECREF(v);
844 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000846 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 break;
848
849 case BINARY_MODULO:
850 w = POP();
851 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000852 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_DECREF(v);
854 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000855 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000856 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 break;
858
859 case BINARY_ADD:
860 w = POP();
861 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000862 if (PyInt_Check(v) && PyInt_Check(w)) {
863 /* INLINE: int + int */
864 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000865 a = PyInt_AS_LONG(v);
866 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000867 i = a + b;
868 if ((i^a) < 0 && (i^b) < 0) {
869 PyErr_SetString(PyExc_OverflowError,
870 "integer addition");
871 x = NULL;
872 }
873 else
874 x = PyInt_FromLong(i);
875 }
876 else
877 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
879 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000882 break;
883
884 case BINARY_SUBTRACT:
885 w = POP();
886 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000887 if (PyInt_Check(v) && PyInt_Check(w)) {
888 /* INLINE: int - int */
889 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000890 a = PyInt_AS_LONG(v);
891 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000892 i = a - b;
893 if ((i^a) < 0 && (i^~b) < 0) {
894 PyErr_SetString(PyExc_OverflowError,
895 "integer subtraction");
896 x = NULL;
897 }
898 else
899 x = PyInt_FromLong(i);
900 }
901 else
902 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000903 Py_DECREF(v);
904 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000906 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 break;
908
909 case BINARY_SUBSCR:
910 w = POP();
911 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000912 if (PyList_Check(v) && PyInt_Check(w)) {
913 /* INLINE: list[int] */
914 long i = PyInt_AsLong(w);
915 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000916 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000917 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000918 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000919 PyErr_SetString(PyExc_IndexError,
920 "list index out of range");
921 x = NULL;
922 }
923 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000924 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000925 Py_INCREF(x);
926 }
927 }
928 else
929 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000930 Py_DECREF(v);
931 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000933 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 break;
935
Guido van Rossum7928cd71991-10-24 14:59:31 +0000936 case BINARY_LSHIFT:
937 w = POP();
938 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000939 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000940 Py_DECREF(v);
941 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000942 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000943 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000944 break;
945
946 case BINARY_RSHIFT:
947 w = POP();
948 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000949 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 Py_DECREF(v);
951 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000952 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000953 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000954 break;
955
956 case BINARY_AND:
957 w = POP();
958 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000959 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000960 Py_DECREF(v);
961 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000962 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000963 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000964 break;
965
966 case BINARY_XOR:
967 w = POP();
968 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000969 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000970 Py_DECREF(v);
971 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000972 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000973 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000974 break;
975
976 case BINARY_OR:
977 w = POP();
978 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000979 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000980 Py_DECREF(v);
981 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000982 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000983 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000984 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000985
986 case INPLACE_POWER:
987 w = POP();
988 v = POP();
989 x = PyNumber_InPlacePower(v, w, Py_None);
990 Py_DECREF(v);
991 Py_DECREF(w);
992 PUSH(x);
993 if (x != NULL) continue;
994 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000995
Thomas Wouters434d0822000-08-24 20:11:32 +0000996 case INPLACE_MULTIPLY:
997 w = POP();
998 v = POP();
999 x = PyNumber_InPlaceMultiply(v, w);
1000 Py_DECREF(v);
1001 Py_DECREF(w);
1002 PUSH(x);
1003 if (x != NULL) continue;
1004 break;
1005
1006 case INPLACE_DIVIDE:
1007 w = POP();
1008 v = POP();
1009 x = PyNumber_InPlaceDivide(v, w);
1010 Py_DECREF(v);
1011 Py_DECREF(w);
1012 PUSH(x);
1013 if (x != NULL) continue;
1014 break;
1015
1016 case INPLACE_MODULO:
1017 w = POP();
1018 v = POP();
1019 x = PyNumber_InPlaceRemainder(v, w);
1020 Py_DECREF(v);
1021 Py_DECREF(w);
1022 PUSH(x);
1023 if (x != NULL) continue;
1024 break;
1025
1026 case INPLACE_ADD:
1027 w = POP();
1028 v = POP();
1029 if (PyInt_Check(v) && PyInt_Check(w)) {
1030 /* INLINE: int + int */
1031 register long a, b, i;
1032 a = PyInt_AS_LONG(v);
1033 b = PyInt_AS_LONG(w);
1034 i = a + b;
1035 if ((i^a) < 0 && (i^b) < 0) {
1036 PyErr_SetString(PyExc_OverflowError,
1037 "integer addition");
1038 x = NULL;
1039 }
1040 else
1041 x = PyInt_FromLong(i);
1042 }
1043 else
1044 x = PyNumber_InPlaceAdd(v, w);
1045 Py_DECREF(v);
1046 Py_DECREF(w);
1047 PUSH(x);
1048 if (x != NULL) continue;
1049 break;
1050
1051 case INPLACE_SUBTRACT:
1052 w = POP();
1053 v = POP();
1054 if (PyInt_Check(v) && PyInt_Check(w)) {
1055 /* INLINE: int - int */
1056 register long a, b, i;
1057 a = PyInt_AS_LONG(v);
1058 b = PyInt_AS_LONG(w);
1059 i = a - b;
1060 if ((i^a) < 0 && (i^~b) < 0) {
1061 PyErr_SetString(PyExc_OverflowError,
1062 "integer subtraction");
1063 x = NULL;
1064 }
1065 else
1066 x = PyInt_FromLong(i);
1067 }
1068 else
1069 x = PyNumber_InPlaceSubtract(v, w);
1070 Py_DECREF(v);
1071 Py_DECREF(w);
1072 PUSH(x);
1073 if (x != NULL) continue;
1074 break;
1075
1076 case INPLACE_LSHIFT:
1077 w = POP();
1078 v = POP();
1079 x = PyNumber_InPlaceLshift(v, w);
1080 Py_DECREF(v);
1081 Py_DECREF(w);
1082 PUSH(x);
1083 if (x != NULL) continue;
1084 break;
1085
1086 case INPLACE_RSHIFT:
1087 w = POP();
1088 v = POP();
1089 x = PyNumber_InPlaceRshift(v, w);
1090 Py_DECREF(v);
1091 Py_DECREF(w);
1092 PUSH(x);
1093 if (x != NULL) continue;
1094 break;
1095
1096 case INPLACE_AND:
1097 w = POP();
1098 v = POP();
1099 x = PyNumber_InPlaceAnd(v, w);
1100 Py_DECREF(v);
1101 Py_DECREF(w);
1102 PUSH(x);
1103 if (x != NULL) continue;
1104 break;
1105
1106 case INPLACE_XOR:
1107 w = POP();
1108 v = POP();
1109 x = PyNumber_InPlaceXor(v, w);
1110 Py_DECREF(v);
1111 Py_DECREF(w);
1112 PUSH(x);
1113 if (x != NULL) continue;
1114 break;
1115
1116 case INPLACE_OR:
1117 w = POP();
1118 v = POP();
1119 x = PyNumber_InPlaceOr(v, w);
1120 Py_DECREF(v);
1121 Py_DECREF(w);
1122 PUSH(x);
1123 if (x != NULL) continue;
1124 break;
1125
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 case SLICE+0:
1127 case SLICE+1:
1128 case SLICE+2:
1129 case SLICE+3:
1130 if ((opcode-SLICE) & 2)
1131 w = POP();
1132 else
1133 w = NULL;
1134 if ((opcode-SLICE) & 1)
1135 v = POP();
1136 else
1137 v = NULL;
1138 u = POP();
1139 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001140 Py_DECREF(u);
1141 Py_XDECREF(v);
1142 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001144 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 break;
1146
1147 case STORE_SLICE+0:
1148 case STORE_SLICE+1:
1149 case STORE_SLICE+2:
1150 case STORE_SLICE+3:
1151 if ((opcode-STORE_SLICE) & 2)
1152 w = POP();
1153 else
1154 w = NULL;
1155 if ((opcode-STORE_SLICE) & 1)
1156 v = POP();
1157 else
1158 v = NULL;
1159 u = POP();
1160 t = POP();
1161 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001162 Py_DECREF(t);
1163 Py_DECREF(u);
1164 Py_XDECREF(v);
1165 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001166 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 break;
1168
1169 case DELETE_SLICE+0:
1170 case DELETE_SLICE+1:
1171 case DELETE_SLICE+2:
1172 case DELETE_SLICE+3:
1173 if ((opcode-DELETE_SLICE) & 2)
1174 w = POP();
1175 else
1176 w = NULL;
1177 if ((opcode-DELETE_SLICE) & 1)
1178 v = POP();
1179 else
1180 v = NULL;
1181 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001182 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001184 Py_DECREF(u);
1185 Py_XDECREF(v);
1186 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001187 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 break;
1189
1190 case STORE_SUBSCR:
1191 w = POP();
1192 v = POP();
1193 u = POP();
1194 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001195 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 Py_DECREF(u);
1197 Py_DECREF(v);
1198 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001199 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 break;
1201
1202 case DELETE_SUBSCR:
1203 w = POP();
1204 v = POP();
1205 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001206 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001207 Py_DECREF(v);
1208 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001209 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001211
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 case PRINT_EXPR:
1213 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001214 /* Print value except if None */
1215 /* After printing, also assign to '_' */
1216 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001217 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001218 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001219 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001220 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001221 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001222 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001223 if (x == NULL) {
1224 PyErr_SetString(
1225 PyExc_RuntimeError,
1226 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001227 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001228 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001229 }
1230 if (err == 0)
1231 err = PyFile_WriteObject(v, x, 0);
1232 if (err == 0) {
1233 PyFile_SoftSpace(x, 1);
1234 err = Py_FlushLine();
1235 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001236 if (err == 0) {
1237 err = PyDict_SetItemString(
1238 f->f_builtins, "_", v);
1239 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001241 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
1243
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001244 case PRINT_ITEM_TO:
1245 w = stream = POP();
1246 /* fall through to PRINT_ITEM */
1247
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 case PRINT_ITEM:
1249 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001250 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001251 w = PySys_GetObject("stdout");
1252 if (w == NULL) {
1253 PyErr_SetString(PyExc_RuntimeError,
1254 "lost sys.stdout");
1255 err = -1;
1256 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001257 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001258 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001259 err = PyFile_WriteString(" ", w);
1260 if (err == 0)
1261 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001263 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 char *s = PyString_AsString(v);
1265 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001266 if (len > 0 &&
1267 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001268 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001269 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001272 Py_XDECREF(stream);
1273 stream = NULL;
1274 if (err == 0)
1275 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 break;
1277
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001278 case PRINT_NEWLINE_TO:
1279 w = stream = POP();
1280 /* fall through to PRINT_NEWLINE */
1281
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001283 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001284 w = PySys_GetObject("stdout");
1285 if (w == NULL)
1286 PyErr_SetString(PyExc_RuntimeError,
1287 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001288 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001289 if (w != NULL) {
1290 err = PyFile_WriteString("\n", w);
1291 if (err == 0)
1292 PyFile_SoftSpace(w, 0);
1293 }
1294 Py_XDECREF(stream);
1295 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 break;
1297
Thomas Wouters434d0822000-08-24 20:11:32 +00001298
1299#ifdef CASE_TOO_BIG
1300 default: switch (opcode) {
1301#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 case BREAK_LOOP:
1303 why = WHY_BREAK;
1304 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001305
Guido van Rossumf10570b1995-07-07 22:53:21 +00001306 case RAISE_VARARGS:
1307 u = v = w = NULL;
1308 switch (oparg) {
1309 case 3:
1310 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001311 /* Fallthrough */
1312 case 2:
1313 v = POP(); /* value */
1314 /* Fallthrough */
1315 case 1:
1316 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001317 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001318 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001319 break;
1320 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001322 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001323 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001324 break;
1325 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 break;
1327
1328 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001329 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001330 PyErr_SetString(PyExc_SystemError,
1331 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001332 break;
1333 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001335 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 break;
1337
1338 case RETURN_VALUE:
1339 retval = POP();
1340 why = WHY_RETURN;
1341 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001342
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001343 case EXEC_STMT:
1344 w = POP();
1345 v = POP();
1346 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001347 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001348 Py_DECREF(u);
1349 Py_DECREF(v);
1350 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001351 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 case POP_BLOCK:
1354 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 while (STACK_LEVEL() > b->b_level) {
1357 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 }
1360 }
1361 break;
1362
1363 case END_FINALLY:
1364 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001365 if (PyInt_Check(v)) {
1366 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 if (why == WHY_RETURN)
1368 retval = POP();
1369 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001370 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001372 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001373 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001375 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 else if (v != Py_None) {
1378 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 "'finally' pops bad exception");
1380 why = WHY_EXCEPTION;
1381 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 break;
1384
1385 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001386 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001388 w = POP();
1389 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001391 Py_DECREF(u);
1392 Py_DECREF(v);
1393 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 break;
1395
1396 case STORE_NAME:
1397 w = GETNAMEV(oparg);
1398 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001399 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001400 PyErr_SetString(PyExc_SystemError,
1401 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001402 break;
1403 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 err = PyDict_SetItem(x, w, v);
1405 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001406 break;
1407
1408 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001409 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001410 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001411 PyErr_SetString(PyExc_SystemError,
1412 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001413 break;
1414 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001415 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001416 format_exc_check_arg(PyExc_NameError,
1417 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001419
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001420 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001422 if (PyTuple_Check(v)) {
1423 if (PyTuple_Size(v) != oparg) {
1424 PyErr_SetString(PyExc_ValueError,
1425 "unpack tuple of wrong size");
1426 why = WHY_EXCEPTION;
1427 }
1428 else {
1429 for (; --oparg >= 0; ) {
1430 w = PyTuple_GET_ITEM(v, oparg);
1431 Py_INCREF(w);
1432 PUSH(w);
1433 }
1434 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001436 else if (PyList_Check(v)) {
1437 if (PyList_Size(v) != oparg) {
1438 PyErr_SetString(PyExc_ValueError,
1439 "unpack list of wrong size");
1440 why = WHY_EXCEPTION;
1441 }
1442 else {
1443 for (; --oparg >= 0; ) {
1444 w = PyList_GET_ITEM(v, oparg);
1445 Py_INCREF(w);
1446 PUSH(w);
1447 }
1448 }
1449 }
1450 else if (PySequence_Check(v)) {
1451 if (unpack_sequence(v, oparg,
1452 stack_pointer + oparg))
1453 stack_pointer += oparg;
1454 else
1455 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 }
1457 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001458 PyErr_SetString(PyExc_TypeError,
1459 "unpack non-sequence");
1460 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 break;
1464
1465 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001466 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 v = POP();
1468 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001469 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1470 Py_DECREF(v);
1471 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 break;
1473
1474 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001475 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001477 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1478 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 break;
1481
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001482 case STORE_GLOBAL:
1483 w = GETNAMEV(oparg);
1484 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 err = PyDict_SetItem(f->f_globals, w, v);
1486 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001487 break;
1488
1489 case DELETE_GLOBAL:
1490 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001492 format_exc_check_arg(
1493 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001494 break;
1495
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 case LOAD_CONST:
1497 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 PUSH(x);
1500 break;
1501
1502 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001503 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001505 PyErr_SetString(PyExc_SystemError,
1506 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 break;
1508 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001513 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001515 format_exc_check_arg(
1516 PyExc_NameError,
1517 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 break;
1519 }
1520 }
1521 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 PUSH(x);
1524 break;
1525
1526 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001527 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001532 format_exc_check_arg(
1533 PyExc_NameError,
1534 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 break;
1536 }
1537 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 PUSH(x);
1540 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001541
Guido van Rossum9bfef441993-03-29 10:43:31 +00001542 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001543 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001544 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001545 format_exc_check_arg(
1546 PyExc_UnboundLocalError,
1547 UNBOUNDLOCAL_ERROR_MSG,
1548 PyTuple_GetItem(co->co_varnames, oparg)
1549 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001550 break;
1551 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001553 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001554 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001555 break;
1556
1557 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001558 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001559 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001560 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001561
1562 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001563 x = GETLOCAL(oparg);
1564 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001565 format_exc_check_arg(
1566 PyExc_UnboundLocalError,
1567 UNBOUNDLOCAL_ERROR_MSG,
1568 PyTuple_GetItem(co->co_varnames, oparg)
1569 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001570 break;
1571 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001573 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001574
1575 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 if (x != NULL) {
1578 for (; --oparg >= 0;) {
1579 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 }
1582 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001583 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 }
1585 break;
1586
1587 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001588 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 if (x != NULL) {
1590 for (; --oparg >= 0;) {
1591 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001592 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001593 }
1594 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001595 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 }
1597 break;
1598
1599 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001602 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 break;
1604
1605 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001606 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001608 x = PyObject_GetAttr(v, w);
1609 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001611 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 break;
1613
1614 case COMPARE_OP:
1615 w = POP();
1616 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001617 if (PyInt_Check(v) && PyInt_Check(w)) {
1618 /* INLINE: cmp(int, int) */
1619 register long a, b;
1620 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001621 a = PyInt_AS_LONG(v);
1622 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001623 switch (oparg) {
1624 case LT: res = a < b; break;
1625 case LE: res = a <= b; break;
1626 case EQ: res = a == b; break;
1627 case NE: res = a != b; break;
1628 case GT: res = a > b; break;
1629 case GE: res = a >= b; break;
1630 case IS: res = v == w; break;
1631 case IS_NOT: res = v != w; break;
1632 default: goto slow_compare;
1633 }
1634 x = res ? Py_True : Py_False;
1635 Py_INCREF(x);
1636 }
1637 else {
1638 slow_compare:
1639 x = cmp_outcome(oparg, v, w);
1640 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 Py_DECREF(v);
1642 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001644 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 break;
1646
1647 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001648 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001650 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001652 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001653 break;
1654 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001655 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001657 w,
1658 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001659 f->f_locals == NULL ?
1660 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001663 if (w == NULL) {
1664 x = NULL;
1665 break;
1666 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 x = PyEval_CallObject(x, w);
1668 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001669 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001670 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001671 break;
1672
Thomas Wouters52152252000-08-17 22:55:00 +00001673 case IMPORT_STAR:
1674 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001676 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001677 PyErr_SetString(PyExc_SystemError,
1678 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 break;
1680 }
Thomas Wouters52152252000-08-17 22:55:00 +00001681 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001683 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001684 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001686
Thomas Wouters52152252000-08-17 22:55:00 +00001687 case IMPORT_FROM:
1688 w = GETNAMEV(oparg);
1689 v = TOP();
1690 x = import_from(v, w);
1691 PUSH(x);
1692 if (x != NULL) continue;
1693 break;
1694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case JUMP_FORWARD:
1696 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001697 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001698
1699 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001701 if (err > 0)
1702 err = 0;
1703 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001705 else
1706 break;
1707 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001708
1709 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001711 if (err > 0) {
1712 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001714 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001715 else if (err == 0)
1716 ;
1717 else
1718 break;
1719 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001720
1721 case JUMP_ABSOLUTE:
1722 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001723 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001724
1725 case FOR_LOOP:
1726 /* for v in s: ...
1727 On entry: stack contains s, i.
1728 On exit: stack contains s, i+1, s[i];
1729 but if loop exhausted:
1730 s, i are popped, and we jump */
1731 w = POP(); /* Loop index */
1732 v = POP(); /* Sequence object */
1733 u = loop_subscript(v, w);
1734 if (u != NULL) {
1735 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001738 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001740 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 }
1742 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 Py_DECREF(v);
1744 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 /* A NULL can mean "s exhausted"
1746 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001749 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 continue;
1752 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 }
1754 break;
1755
1756 case SETUP_LOOP:
1757 case SETUP_EXCEPT:
1758 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001761 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001762
1763 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001764#ifdef LLTRACE
1765 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001767#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001768 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001769 if (f->f_trace == NULL)
1770 continue;
1771 /* Trace each line of code reached */
1772 f->f_lasti = INSTR_OFFSET();
1773 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001776
1777 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001778 case CALL_FUNCTION_VAR:
1779 case CALL_FUNCTION_KW:
1780 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001781 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001782 int na = oparg & 0xff;
1783 int nk = (oparg>>8) & 0xff;
1784 int flags = (opcode - CALL_FUNCTION) & 3;
1785 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1786 PyObject **pfunc = stack_pointer - n - 1;
1787 PyObject *func = *pfunc;
1788 PyObject *self = NULL;
1789 PyObject *class = NULL;
1790 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1791 if (PyMethod_Check(func)) {
1792 self = PyMethod_Self(func);
1793 class = PyMethod_Class(func);
1794 func = PyMethod_Function(func);
1795 Py_INCREF(func);
1796 if (self != NULL) {
1797 Py_INCREF(self);
1798 Py_DECREF(*pfunc);
1799 *pfunc = self;
1800 na++;
1801 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001802 }
1803 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001804 /* Unbound methods must be called with an
1805 instance of the class (or a derived
1806 class) as first argument */
1807 if (na > 0 && (self = stack_pointer[-n]) != NULL
1808 && PyInstance_Check(self)
1809 && PyClass_IsSubclass((PyObject *)
1810 (((PyInstanceObject *)self)->in_class),
1811 class))
1812 /* Handy-dandy */ ;
1813 else {
1814 PyErr_SetString(PyExc_TypeError,
1815 "unbound method must be called with class instance 1st argument");
1816 x = NULL;
1817 break;
1818 }
1819 }
1820 }
1821 else
1822 Py_INCREF(func);
1823 if (PyFunction_Check(func) && flags == 0) {
1824 PyObject *co = PyFunction_GetCode(func);
1825 PyObject *globals = PyFunction_GetGlobals(func);
1826 PyObject *argdefs = PyFunction_GetDefaults(func);
1827 PyObject **d;
1828 int nd;
1829 if (argdefs != NULL) {
1830 d = &PyTuple_GET_ITEM(argdefs, 0);
1831 nd = ((PyTupleObject *)argdefs)->ob_size;
1832 }
1833 else {
1834 d = NULL;
1835 nd = 0;
1836 }
1837 x = eval_code2((PyCodeObject *)co, globals,
1838 (PyObject *)NULL, stack_pointer-n, na,
1839 stack_pointer-2*nk, nk, d, nd,
1840 class);
1841 }
1842 else {
1843 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001844 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001845 PyObject *stararg = 0;
1846 PyObject *kwdict = NULL;
1847 if (flags & 2) {
1848 kwdict = POP();
1849 if (!PyDict_Check(kwdict)) {
1850 PyErr_SetString(PyExc_TypeError,
1851 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001852 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001853 }
1854 }
1855 if (flags & 1) {
1856 stararg = POP();
1857 if (!PySequence_Check(stararg)) {
1858 PyErr_SetString(PyExc_TypeError,
1859 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001860 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001861 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001862 /* Convert abstract sequence to concrete tuple */
1863 if (!PyTuple_Check(stararg)) {
1864 PyObject *t = NULL;
1865 t = PySequence_Tuple(stararg);
1866 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001867 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001868 }
1869 Py_DECREF(stararg);
1870 stararg = t;
1871 }
1872 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001873 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001874 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001875 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001876 }
1877 if (nk > 0) {
1878 if (kwdict == NULL) {
1879 kwdict = PyDict_New();
1880 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001881 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001882 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001883 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001884 else {
1885 PyObject *d = PyDict_Copy(kwdict);
1886 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001887 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001888 }
1889 Py_DECREF(kwdict);
1890 kwdict = d;
1891 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001892 err = 0;
1893 while (--nk >= 0) {
1894 PyObject *value = POP();
1895 PyObject *key = POP();
1896 if (PyDict_GetItem(kwdict, key) != NULL) {
1897 err = 1;
1898 PyErr_Format(PyExc_TypeError,
1899 "keyword parameter redefined: %.400s",
1900 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001901 Py_DECREF(key);
1902 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001903 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001904 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001905 err = PyDict_SetItem(kwdict, key, value);
1906 Py_DECREF(key);
1907 Py_DECREF(value);
1908 if (err)
1909 break;
1910 }
1911 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001912 extcall_fail:
1913 Py_XDECREF(kwdict);
1914 Py_XDECREF(stararg);
1915 Py_DECREF(func);
1916 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001917 break;
1918 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001919 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001920 callargs = PyTuple_New(na + nstar);
1921 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001922 x = NULL;
1923 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001924 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001925 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001926 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001927 for (i = 0; i < nstar; i++) {
1928 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1929 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001930 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001931 }
1932 Py_DECREF(stararg);
1933 }
1934 while (--na >= 0) {
1935 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001936 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001937 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001938 x = PyEval_CallObjectWithKeywords(func,
1939 callargs,
1940 kwdict);
1941 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001942 Py_XDECREF(kwdict);
1943 }
1944 Py_DECREF(func);
1945 while (stack_pointer > pfunc) {
1946 w = POP();
1947 Py_DECREF(w);
1948 }
1949 PUSH(x);
1950 if (x != NULL) continue;
1951 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001952 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001953
Guido van Rossum681d79a1995-07-18 14:51:37 +00001954 case MAKE_FUNCTION:
1955 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001956 x = PyFunction_New(v, f->f_globals);
1957 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001958 /* XXX Maybe this should be a separate opcode? */
1959 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001960 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001961 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001962 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001963 x = NULL;
1964 break;
1965 }
1966 while (--oparg >= 0) {
1967 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001968 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001969 }
1970 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001971 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001972 }
1973 PUSH(x);
1974 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001975
1976 case BUILD_SLICE:
1977 if (oparg == 3)
1978 w = POP();
1979 else
1980 w = NULL;
1981 v = POP();
1982 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001983 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001984 Py_DECREF(u);
1985 Py_DECREF(v);
1986 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001987 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001988 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001989 break;
1990
Fred Drakeef8ace32000-08-24 00:32:09 +00001991 case EXTENDED_ARG:
1992 opcode = NEXTOP();
1993 oparg = oparg<<16 | NEXTARG();
1994 goto dispatch_opcode;
1995 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001996
Guido van Rossum374a9221991-04-04 10:40:29 +00001997 default:
1998 fprintf(stderr,
1999 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002000 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002001 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002002 why = WHY_EXCEPTION;
2003 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002004
2005#ifdef CASE_TOO_BIG
2006 }
2007#endif
2008
Guido van Rossum374a9221991-04-04 10:40:29 +00002009 } /* switch */
2010
2011 on_error:
2012
2013 /* Quickly continue if no error occurred */
2014
2015 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002016 if (err == 0 && x != NULL) {
2017#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002018 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002020 fprintf(stderr,
2021 "XXX undetected error\n");
2022 else
2023#endif
2024 continue; /* Normal, fast path */
2025 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002026 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002027 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002028 err = 0;
2029 }
2030
Guido van Rossum374a9221991-04-04 10:40:29 +00002031 /* Double-check exception status */
2032
2033 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002035 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002036 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002037 why = WHY_EXCEPTION;
2038 }
2039 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002040#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002041 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002042 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002044 fprintf(stderr,
2045 "XXX undetected error (why=%d)\n",
2046 why);
2047 why = WHY_EXCEPTION;
2048 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002049 }
2050#endif
2051
2052 /* Log traceback info if this is a real exception */
2053
2054 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002055 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002056 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002057 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002059
Guido van Rossume59214e1994-08-30 08:01:59 +00002060 if (f->f_trace)
2061 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002062 if (tstate->sys_profilefunc)
2063 call_exc_trace(&tstate->sys_profilefunc,
2064 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002065 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002066
2067 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2068
2069 if (why == WHY_RERAISE)
2070 why = WHY_EXCEPTION;
2071
2072 /* Unwind stacks if a (pseudo) exception occurred */
2073
2074 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002076 while (STACK_LEVEL() > b->b_level) {
2077 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002079 }
2080 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2081 why = WHY_NOT;
2082 JUMPTO(b->b_handler);
2083 break;
2084 }
2085 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002086 (b->b_type == SETUP_EXCEPT &&
2087 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002089 PyObject *exc, *val, *tb;
2090 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 val = Py_None;
2093 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002094 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002095 /* Make the raw exception data
2096 available to the handler,
2097 so a program can emulate the
2098 Python main loop. Don't do
2099 this for 'finally'. */
2100 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002101 PyErr_NormalizeException(
2102 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002103 set_exc_info(tstate,
2104 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002105 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002107 PUSH(val);
2108 PUSH(exc);
2109 }
2110 else {
2111 if (why == WHY_RETURN)
2112 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 PUSH(v);
2115 }
2116 why = WHY_NOT;
2117 JUMPTO(b->b_handler);
2118 break;
2119 }
2120 } /* unwind stack */
2121
2122 /* End the loop if we still have an error (or return) */
2123
2124 if (why != WHY_NOT)
2125 break;
2126
2127 } /* main loop */
2128
2129 /* Pop remaining stack entries */
2130
2131 while (!EMPTY()) {
2132 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 }
2135
Guido van Rossum96a42c81992-01-12 02:29:51 +00002136 if (why != WHY_RETURN)
2137 retval = NULL;
2138
Guido van Rossume59214e1994-08-30 08:01:59 +00002139 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002140 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002141 if (call_trace(&f->f_trace, &f->f_trace, f,
2142 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002144 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002145 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002146 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002147 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002148 }
2149
Guido van Rossuma027efa1997-05-05 20:56:21 +00002150 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2151 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002154 retval = NULL;
2155 why = WHY_EXCEPTION;
2156 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002158
Guido van Rossuma027efa1997-05-05 20:56:21 +00002159 reset_exc_info(tstate);
2160
2161 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002162
2163 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002164
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002166
Guido van Rossuma027efa1997-05-05 20:56:21 +00002167 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002169
Guido van Rossum96a42c81992-01-12 02:29:51 +00002170 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002171}
2172
Guido van Rossuma027efa1997-05-05 20:56:21 +00002173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002174set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175{
2176 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002177 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002178
Guido van Rossuma027efa1997-05-05 20:56:21 +00002179 frame = tstate->frame;
2180 if (frame->f_exc_type == NULL) {
2181 /* This frame didn't catch an exception before */
2182 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002183 if (tstate->exc_type == NULL) {
2184 Py_INCREF(Py_None);
2185 tstate->exc_type = Py_None;
2186 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002187 tmp_type = frame->f_exc_type;
2188 tmp_value = frame->f_exc_value;
2189 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002190 Py_XINCREF(tstate->exc_type);
2191 Py_XINCREF(tstate->exc_value);
2192 Py_XINCREF(tstate->exc_traceback);
2193 frame->f_exc_type = tstate->exc_type;
2194 frame->f_exc_value = tstate->exc_value;
2195 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002196 Py_XDECREF(tmp_type);
2197 Py_XDECREF(tmp_value);
2198 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002199 }
2200 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002201 tmp_type = tstate->exc_type;
2202 tmp_value = tstate->exc_value;
2203 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002204 Py_XINCREF(type);
2205 Py_XINCREF(value);
2206 Py_XINCREF(tb);
2207 tstate->exc_type = type;
2208 tstate->exc_value = value;
2209 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002210 Py_XDECREF(tmp_type);
2211 Py_XDECREF(tmp_value);
2212 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002213 /* For b/w compatibility */
2214 PySys_SetObject("exc_type", type);
2215 PySys_SetObject("exc_value", value);
2216 PySys_SetObject("exc_traceback", tb);
2217}
2218
2219static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002220reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002221{
2222 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002223 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002224 frame = tstate->frame;
2225 if (frame->f_exc_type != NULL) {
2226 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002227 tmp_type = tstate->exc_type;
2228 tmp_value = tstate->exc_value;
2229 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002230 Py_XINCREF(frame->f_exc_type);
2231 Py_XINCREF(frame->f_exc_value);
2232 Py_XINCREF(frame->f_exc_traceback);
2233 tstate->exc_type = frame->f_exc_type;
2234 tstate->exc_value = frame->f_exc_value;
2235 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002236 Py_XDECREF(tmp_type);
2237 Py_XDECREF(tmp_value);
2238 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002239 /* For b/w compatibility */
2240 PySys_SetObject("exc_type", frame->f_exc_type);
2241 PySys_SetObject("exc_value", frame->f_exc_value);
2242 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2243 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002244 tmp_type = frame->f_exc_type;
2245 tmp_value = frame->f_exc_value;
2246 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002247 frame->f_exc_type = NULL;
2248 frame->f_exc_value = NULL;
2249 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002250 Py_XDECREF(tmp_type);
2251 Py_XDECREF(tmp_value);
2252 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253}
2254
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002255/* Logic for the raise statement (too complicated for inlining).
2256 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002257static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002258do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002259{
Guido van Rossumd295f121998-04-09 21:39:57 +00002260 if (type == NULL) {
2261 /* Reraise */
2262 PyThreadState *tstate = PyThreadState_Get();
2263 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2264 value = tstate->exc_value;
2265 tb = tstate->exc_traceback;
2266 Py_XINCREF(type);
2267 Py_XINCREF(value);
2268 Py_XINCREF(tb);
2269 }
2270
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002271 /* We support the following forms of raise:
2272 raise <class>, <classinstance>
2273 raise <class>, <argument tuple>
2274 raise <class>, None
2275 raise <class>, <argument>
2276 raise <classinstance>, None
2277 raise <string>, <object>
2278 raise <string>, None
2279
2280 An omitted second argument is the same as None.
2281
2282 In addition, raise <tuple>, <anything> is the same as
2283 raising the tuple's first item (and it better have one!);
2284 this rule is applied recursively.
2285
2286 Finally, an optional third argument can be supplied, which
2287 gives the traceback to be substituted (useful when
2288 re-raising an exception after examining it). */
2289
2290 /* First, check the traceback argument, replacing None with
2291 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002292 if (tb == Py_None) {
2293 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002294 tb = NULL;
2295 }
2296 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002297 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002298 "raise 3rd arg must be traceback or None");
2299 goto raise_error;
2300 }
2301
2302 /* Next, replace a missing value with None */
2303 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002304 value = Py_None;
2305 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002306 }
2307
2308 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2310 PyObject *tmp = type;
2311 type = PyTuple_GET_ITEM(type, 0);
2312 Py_INCREF(type);
2313 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002314 }
2315
Barry Warsaw4249f541997-08-22 21:26:19 +00002316 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002317 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002318
2319 else if (PyClass_Check(type))
2320 PyErr_NormalizeException(&type, &value, &tb);
2321
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002323 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (value != Py_None) {
2325 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002326 "instance exception may not have a separate value");
2327 goto raise_error;
2328 }
2329 else {
2330 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002332 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2334 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002335 }
2336 }
2337 else {
2338 /* Not something you can raise. You get an exception
2339 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002340 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002341 "exceptions must be strings, classes, or instances");
2342 goto raise_error;
2343 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002345 if (tb == NULL)
2346 return WHY_EXCEPTION;
2347 else
2348 return WHY_RERAISE;
2349 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 Py_XDECREF(value);
2351 Py_XDECREF(type);
2352 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002353 return WHY_EXCEPTION;
2354}
2355
Barry Warsawe42b18f1997-08-25 22:13:04 +00002356static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002357unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002358{
2359 int i;
2360 PyObject *w;
2361
2362 for (i = 0; i < argcnt; i++) {
2363 if (! (w = PySequence_GetItem(v, i))) {
2364 if (PyErr_ExceptionMatches(PyExc_IndexError))
2365 PyErr_SetString(PyExc_ValueError,
2366 "unpack sequence of wrong size");
2367 goto finally;
2368 }
2369 *--sp = w;
2370 }
2371 /* we better get an IndexError now */
2372 if (PySequence_GetItem(v, i) == NULL) {
2373 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2374 PyErr_Clear();
2375 return 1;
2376 }
2377 /* some other exception occurred. fall through to finally */
2378 }
2379 else
2380 PyErr_SetString(PyExc_ValueError,
2381 "unpack sequence of wrong size");
2382 /* fall through */
2383finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002384 for (; i > 0; i--, sp++)
2385 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002386
2387 return 0;
2388}
2389
2390
Guido van Rossum96a42c81992-01-12 02:29:51 +00002391#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002395 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 if (PyObject_Print(v, stdout, 0) != 0)
2397 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002398 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002399 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002401#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002403static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002404call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002405{
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002407 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002409 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002410 value = Py_None;
2411 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002414 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002415 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002416 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002417 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002418 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002420 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002422 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002423 Py_XDECREF(type);
2424 Py_XDECREF(value);
2425 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002426 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002427}
2428
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002429/* PyObject **p_trace: in/out; may not be NULL;
2430 may not point to NULL variable initially
2431 PyObject **p_newtrace: in/out; may be NULL;
2432 may point to NULL variable;
2433 may be same variable as p_newtrace */
2434
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002435static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002436call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2437 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002438{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002439 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 PyObject *args, *what;
2441 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002442
Guido van Rossuma027efa1997-05-05 20:56:21 +00002443 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002444 /* Don't do recursive traces */
2445 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002447 *p_newtrace = NULL;
2448 }
2449 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002450 }
2451
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002453 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002454 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002456 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002457 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 Py_INCREF(f);
2459 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2460 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002461 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 arg = Py_None;
2463 Py_INCREF(arg);
2464 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002465 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 PyFrame_FastToLocals(f);
2467 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2468 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002469 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002470 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002472 if (res == NULL) {
2473 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002474 PyTraceBack_Here(f);
2475 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002476 *p_trace = NULL;
2477 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002478 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002479 *p_newtrace = NULL;
2480 }
Barry Warsawf6202631999-09-08 16:26:33 +00002481 /* to be extra double plus sure we don't get recursive
2482 * calls inf either tracefunc or profilefunc gets an
2483 * exception, zap the global variables.
2484 */
2485 Py_XDECREF(tstate->sys_tracefunc);
2486 tstate->sys_tracefunc = NULL;
2487 Py_XDECREF(tstate->sys_profilefunc);
2488 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002489 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002490 }
2491 else {
2492 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002493 Py_XDECREF(*p_newtrace);
2494 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002495 *p_newtrace = NULL;
2496 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002498 *p_newtrace = res;
2499 }
2500 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002502 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002503 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002504}
2505
Guido van Rossumb209a111997-04-29 18:18:01 +00002506PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002507PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002508{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002509 PyThreadState *tstate = PyThreadState_Get();
2510 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002511 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002512 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002513 else
2514 return current_frame->f_builtins;
2515}
2516
Guido van Rossumb209a111997-04-29 18:18:01 +00002517PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002518PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002519{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002520 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002521 if (current_frame == NULL)
2522 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002523 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002524 return current_frame->f_locals;
2525}
2526
Guido van Rossumb209a111997-04-29 18:18:01 +00002527PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002528PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002530 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002531 if (current_frame == NULL)
2532 return NULL;
2533 else
2534 return current_frame->f_globals;
2535}
2536
Guido van Rossumb209a111997-04-29 18:18:01 +00002537PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002538PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002539{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002540 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002542}
2543
Guido van Rossum6135a871995-01-09 17:53:26 +00002544int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002545PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002546{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002547 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002548 return current_frame == NULL ? 0 : current_frame->f_restricted;
2549}
2550
Guido van Rossumbe270261997-05-22 22:26:18 +00002551int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002552Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553{
Guido van Rossumb209a111997-04-29 18:18:01 +00002554 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002555 if (f == NULL)
2556 return 0;
2557 if (!PyFile_SoftSpace(f, 0))
2558 return 0;
2559 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560}
2561
Guido van Rossum3f5da241990-12-20 15:06:42 +00002562
Guido van Rossum681d79a1995-07-18 14:51:37 +00002563/* External interface to call any callable object.
2564 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002565
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002566#undef PyEval_CallObject
2567/* for backward compatibility: export this interface */
2568
Guido van Rossumb209a111997-04-29 18:18:01 +00002569PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002570PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002571{
Guido van Rossumb209a111997-04-29 18:18:01 +00002572 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002573}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002574#define PyEval_CallObject(func,arg) \
2575 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002576
Guido van Rossumb209a111997-04-29 18:18:01 +00002577PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002578PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002579{
2580 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002581 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002582
2583 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 arg = PyTuple_New(0);
2585 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 PyErr_SetString(PyExc_TypeError,
2587 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002588 return NULL;
2589 }
2590 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002591 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002592
Guido van Rossumb209a111997-04-29 18:18:01 +00002593 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594 PyErr_SetString(PyExc_TypeError,
2595 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002596 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002597 return NULL;
2598 }
2599
Guido van Rossum150b2df1996-12-05 23:17:11 +00002600 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002601 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002602 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002603 result = call_function(func, arg, kw);
2604 else
2605 result = call_builtin(func, arg, kw);
2606
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002608
Guido van Rossumb209a111997-04-29 18:18:01 +00002609 if (result == NULL && !PyErr_Occurred())
2610 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002611 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002612
2613 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002614}
2615
Guido van Rossumb209a111997-04-29 18:18:01 +00002616static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002617call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618{
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 if (PyCFunction_Check(func)) {
2620 PyCFunction meth = PyCFunction_GetFunction(func);
2621 PyObject *self = PyCFunction_GetSelf(func);
2622 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002623 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002624 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002625 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002626 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002627 else if (size == 0)
2628 arg = NULL;
2629 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002630 if (flags & METH_KEYWORDS)
2631 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 if (kw != NULL && PyDict_Size(kw) != 0) {
2633 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002634 "this function takes no keyword arguments");
2635 return NULL;
2636 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002637 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002639 if (PyClass_Check(func)) {
2640 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 if (PyInstance_Check(func)) {
2643 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002644 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 PyErr_Clear();
2646 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002647 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002648 return NULL;
2649 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002650 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002651 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002652 return res;
2653 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002654 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002655 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 return NULL;
2657}
2658
Guido van Rossumb209a111997-04-29 18:18:01 +00002659static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002660call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661{
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyObject *class = NULL; /* == owner */
2663 PyObject *argdefs;
2664 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002665 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002667
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 if (kw != NULL && !PyDict_Check(kw)) {
2669 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002670 return NULL;
2671 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 if (PyMethod_Check(func)) {
2674 PyObject *self = PyMethod_Self(func);
2675 class = PyMethod_Class(func);
2676 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002677 if (self == NULL) {
2678 /* Unbound methods must be called with an instance of
2679 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 if (PyTuple_Size(arg) >= 1) {
2681 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002682 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 PyInstance_Check(self) &&
2684 PyClass_IsSubclass((PyObject *)
2685 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002686 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002687 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002688 else
2689 self = NULL;
2690 }
2691 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002693 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002694 return NULL;
2695 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002697 }
2698 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 int argcount = PyTuple_Size(arg);
2700 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002701 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002702 if (newarg == NULL)
2703 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 Py_INCREF(self);
2705 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002706 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002707 PyObject *v = PyTuple_GET_ITEM(arg, i);
2708 Py_XINCREF(v);
2709 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002710 }
2711 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002713 if (!PyFunction_Check(func)) {
2714 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2715 Py_DECREF(arg);
2716 return result;
2717 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 }
2719 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002721 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002722 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002723 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 return NULL;
2725 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002728
2729 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002730 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2731 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2732 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002733 }
2734 else {
2735 d = NULL;
2736 nd = 0;
2737 }
2738
2739 if (kw != NULL) {
2740 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 nk = PyDict_Size(kw);
2742 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002743 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 PyErr_NoMemory();
2745 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002746 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002747 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002748 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002750 i += 2;
2751 nk = i/2;
2752 /* XXX This is broken if the caller deletes dict items! */
2753 }
2754 else {
2755 k = NULL;
2756 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002757 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 (PyCodeObject *)PyFunction_GetCode(func),
2761 PyFunction_GetGlobals(func), (PyObject *)NULL,
2762 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002763 k, nk,
2764 d, nd,
2765 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002768 if (k != NULL)
2769 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770
Guido van Rossum681d79a1995-07-18 14:51:37 +00002771 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772}
2773
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002774#define SLICE_ERROR_MSG \
2775 "standard sequence type does not support step size other than one"
2776
Guido van Rossumb209a111997-04-29 18:18:01 +00002777static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002778loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779{
Guido van Rossumb209a111997-04-29 18:18:01 +00002780 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002781 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002782 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 return NULL;
2785 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002786 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002787 v = (*sq->sq_item)(v, i);
2788 if (v)
2789 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002790 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002792 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793}
2794
Guido van Rossum20c6add2000-05-08 14:06:50 +00002795/* Extract a slice index from a PyInt or PyLong, the index is bound to
2796 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2797 and error. Returns 1 on success.*/
2798
2799int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002800_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801{
2802 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002803 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002804 if (PyInt_Check(v)) {
2805 x = PyInt_AsLong(v);
2806 } else if (PyLong_Check(v)) {
2807 x = PyLong_AsLong(v);
2808 if (x==-1 && PyErr_Occurred()) {
2809 PyObject *long_zero;
2810
2811 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2812 /* It's not an overflow error, so just
2813 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002814 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002815 }
2816
2817 /* It's an overflow error, so we need to
2818 check the sign of the long integer,
2819 set the value to INT_MAX or 0, and clear
2820 the error. */
2821
2822 /* Create a long integer with a value of 0 */
2823 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002824 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002825
2826 /* Check sign */
2827 if (PyObject_Compare(long_zero, v) < 0)
2828 x = INT_MAX;
2829 else
2830 x = 0;
2831
2832 /* Free the long integer we created, and clear the
2833 OverflowError */
2834 Py_DECREF(long_zero);
2835 PyErr_Clear();
2836 }
2837 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002838 PyErr_SetString(PyExc_TypeError,
2839 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002840 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002842 /* Truncate -- very long indices are truncated anyway */
2843 if (x > INT_MAX)
2844 x = INT_MAX;
2845 else if (x < -INT_MAX)
2846 x = 0;
2847 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002849 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850}
2851
Guido van Rossumb209a111997-04-29 18:18:01 +00002852static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002853apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002855 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002856 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002858 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002859 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002860 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002862
2863static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002864assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002866 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002867 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002868 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002869 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002870 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002871 if (x == NULL)
2872 return PySequence_DelSlice(u, ilow, ihigh);
2873 else
2874 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875}
2876
Guido van Rossumb209a111997-04-29 18:18:01 +00002877static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002878cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879{
2880 register int cmp;
2881 register int res = 0;
2882 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 case IS:
2884 case IS_NOT:
2885 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002886 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 res = !res;
2888 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 case IN:
2890 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002891 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002892 if (res < 0)
2893 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002894 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002895 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002896 break;
2897 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002898 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 break;
2900 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002901 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002902 if (cmp && PyErr_Occurred())
2903 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002904 switch (op) {
2905 case LT: res = cmp < 0; break;
2906 case LE: res = cmp <= 0; break;
2907 case EQ: res = cmp == 0; break;
2908 case NE: res = cmp != 0; break;
2909 case GT: res = cmp > 0; break;
2910 case GE: res = cmp >= 0; break;
2911 /* XXX no default? (res is initialized to 0 though) */
2912 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002914 v = res ? Py_True : Py_False;
2915 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 return v;
2917}
2918
Thomas Wouters52152252000-08-17 22:55:00 +00002919static PyObject *
2920import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002921{
Guido van Rossumb209a111997-04-29 18:18:01 +00002922 PyObject *w, *x;
2923 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002924 PyErr_SetString(PyExc_TypeError,
2925 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002926 return NULL;
2927 }
2928 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2929 x = PyDict_GetItem(w, name);
2930 if (x == NULL) {
2931 PyErr_Format(PyExc_ImportError,
2932 "cannot import name %.230s",
2933 PyString_AsString(name));
2934 } else
2935 Py_INCREF(x);
2936 return x;
2937}
2938
2939static int
2940import_all_from(PyObject *locals, PyObject *v)
2941{
2942 int pos = 0, err;
2943 PyObject *name, *value;
2944 PyObject *w;
2945
2946 if (!PyModule_Check(v)) {
2947 PyErr_SetString(PyExc_TypeError,
2948 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002949 return -1;
2950 }
Thomas Wouters52152252000-08-17 22:55:00 +00002951 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2952
2953 while (PyDict_Next(w, &pos, &name, &value)) {
2954 if (!PyString_Check(name) ||
2955 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002956 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002957 Py_INCREF(value);
2958 err = PyDict_SetItem(locals, name, value);
2959 Py_DECREF(value);
2960 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002961 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002962 }
Thomas Wouters52152252000-08-17 22:55:00 +00002963 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002964}
2965
Guido van Rossumb209a111997-04-29 18:18:01 +00002966static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002968{
Guido van Rossumcd649651997-08-22 16:56:16 +00002969 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002970 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002971 PyErr_SetString(PyExc_SystemError,
2972 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002973 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002974 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002975 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002976 PyErr_SetString(PyExc_SystemError,
2977 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002978 return NULL;
2979 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002980 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002981 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002982 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002983 return NULL;
2984 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002985 n = PyTuple_Size(bases);
2986 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002987 PyObject *base = PyTuple_GET_ITEM(bases, i);
2988 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002989 /* Call the base's *type*, if it is callable.
2990 This code is a hook for Donald Beaudry's
2991 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002992 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002993 since its types are not callable.
2994 Ditto: call the bases's *class*, if it has
2995 one. This makes the same thing possible
2996 without writing C code. A true meta-object
2997 protocol! */
2998 PyObject *basetype = (PyObject *)base->ob_type;
2999 PyObject *callable = NULL;
3000 if (PyCallable_Check(basetype))
3001 callable = basetype;
3002 else
3003 callable = PyObject_GetAttrString(
3004 base, "__class__");
3005 if (callable) {
3006 PyObject *args;
3007 PyObject *newclass = NULL;
3008 args = Py_BuildValue(
3009 "(OOO)", name, bases, methods);
3010 if (args != NULL) {
3011 newclass = PyEval_CallObject(
3012 callable, args);
3013 Py_DECREF(args);
3014 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003015 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003016 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003017 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003018 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003019 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003021 "base is not a class object");
3022 return NULL;
3023 }
3024 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003025 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003026}
3027
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003028static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003029exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3030 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003031{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003032 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003033 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003034 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003035
Guido van Rossumb209a111997-04-29 18:18:01 +00003036 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3037 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003038 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003039 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003040 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003041 locals = PyTuple_GetItem(prog, 2);
3042 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003044 if (globals == Py_None) {
3045 globals = PyEval_GetGlobals();
3046 if (locals == Py_None) {
3047 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003048 plain = 1;
3049 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003050 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003051 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003052 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003053 if (!PyString_Check(prog) &&
3054 !PyCode_Check(prog) &&
3055 !PyFile_Check(prog)) {
3056 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003057 "exec 1st arg must be string, code or file object");
3058 return -1;
3059 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003060 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3061 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003062 "exec 2nd/3rd args must be dict or None");
3063 return -1;
3064 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003065 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003066 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003067 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003068 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003069 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003070 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003071 FILE *fp = PyFile_AsFile(prog);
3072 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003073 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3074 }
3075 else {
3076 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00003077 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003078 PyErr_SetString(PyExc_ValueError,
3079 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003080 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003081 }
3082 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003083 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003084 if (plain)
3085 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003087 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003088 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003089 return 0;
3090}
Guido van Rossum24c13741995-02-14 09:42:43 +00003091
Paul Prescode68140d2000-08-30 20:25:01 +00003092static void
3093format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3094{
3095 char *obj_str;
3096
3097 if (!obj)
3098 return;
3099
3100 obj_str = PyString_AsString(obj);
3101 if (!obj_str)
3102 return;
3103
3104 PyErr_Format(exc, format_str, obj_str);
3105}
Guido van Rossum950361c1997-01-24 13:49:28 +00003106
3107#ifdef DYNAMIC_EXECUTION_PROFILE
3108
3109PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003110getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003111{
3112 int i;
3113 PyObject *l = PyList_New(256);
3114 if (l == NULL) return NULL;
3115 for (i = 0; i < 256; i++) {
3116 PyObject *x = PyInt_FromLong(a[i]);
3117 if (x == NULL) {
3118 Py_DECREF(l);
3119 return NULL;
3120 }
3121 PyList_SetItem(l, i, x);
3122 }
3123 for (i = 0; i < 256; i++)
3124 a[i] = 0;
3125 return l;
3126}
3127
3128PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003129_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003130{
3131#ifndef DXPAIRS
3132 return getarray(dxp);
3133#else
3134 int i;
3135 PyObject *l = PyList_New(257);
3136 if (l == NULL) return NULL;
3137 for (i = 0; i < 257; i++) {
3138 PyObject *x = getarray(dxpairs[i]);
3139 if (x == NULL) {
3140 Py_DECREF(l);
3141 return NULL;
3142 }
3143 PyList_SetItem(l, i, x);
3144 }
3145 return l;
3146#endif
3147}
3148
3149#endif