blob: 45f655608694ed19e581870e8a4f819ffd2f9263 [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
Tim Petersd320c342000-09-01 03:34:26 +0000305int Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000306{
307 return recursion_limit;
308}
309
310void Py_SetRecursionLimit(int new_limit)
311{
312 recursion_limit = new_limit;
313}
314
Guido van Rossum374a9221991-04-04 10:40:29 +0000315/* Status code for main loop (reason for stack unwind) */
316
317enum why_code {
318 WHY_NOT, /* No error */
319 WHY_EXCEPTION, /* Exception occurred */
320 WHY_RERAISE, /* Exception re-raised by 'finally' */
321 WHY_RETURN, /* 'return' statement */
322 WHY_BREAK /* 'break' statement */
323};
324
Tim Petersdbd9ba62000-07-09 03:09:57 +0000325static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
326static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000327
Guido van Rossum374a9221991-04-04 10:40:29 +0000328
Guido van Rossumb209a111997-04-29 18:18:01 +0000329PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000331{
332 return eval_code2(co,
333 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000334 (PyObject **)NULL, 0,
335 (PyObject **)NULL, 0,
336 (PyObject **)NULL, 0,
337 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000338}
339
340
341/* Interpreter main loop */
342
Guido van Rossumb209a111997-04-29 18:18:01 +0000343static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000344eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
345 PyObject **args, int argcount, PyObject **kws, int kwcount,
346 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000347{
Guido van Rossum950361c1997-01-24 13:49:28 +0000348#ifdef DXPAIRS
349 int lastopcode = 0;
350#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000351 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000352 register int opcode=0; /* Current opcode */
353 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000354 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000355 register enum why_code why; /* Reason for block stack unwind */
356 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000357 register PyObject *x; /* Result object -- NULL if error */
358 register PyObject *v; /* Temporary objects popped off stack */
359 register PyObject *w;
360 register PyObject *u;
361 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000362 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000363 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000364 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000365 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000366 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000367 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000368#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000369 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000370#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000371#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000372 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000373 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000374#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000375
376/* Code access macros */
377
378#define GETCONST(i) Getconst(f, i)
379#define GETNAME(i) Getname(f, i)
380#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000381#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000382#define NEXTOP() (*next_instr++)
383#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000384#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000385#define JUMPBY(x) (next_instr += (x))
386
387/* Stack manipulation macros */
388
389#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
390#define EMPTY() (STACK_LEVEL() == 0)
391#define TOP() (stack_pointer[-1])
392#define BASIC_PUSH(v) (*stack_pointer++ = (v))
393#define BASIC_POP() (*--stack_pointer)
394
Guido van Rossum96a42c81992-01-12 02:29:51 +0000395#ifdef LLTRACE
396#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
397#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000398#else
399#define PUSH(v) BASIC_PUSH(v)
400#define POP() BASIC_POP()
401#endif
402
Guido van Rossum681d79a1995-07-18 14:51:37 +0000403/* Local variable macros */
404
405#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000406#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407 GETLOCAL(i) = value; } while (0)
408
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409/* Start of code */
410
Guido van Rossum8861b741996-07-30 16:49:37 +0000411#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000412 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000413 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000414 return NULL;
415 }
416#endif
417
Guido van Rossum681d79a1995-07-18 14:51:37 +0000418 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000419 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000420 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000421 }
422
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000423#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000424 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000425#endif
426
Guido van Rossumb209a111997-04-29 18:18:01 +0000427 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000428 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000429 co, /*code*/
430 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000431 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 if (f == NULL)
433 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434
Guido van Rossuma027efa1997-05-05 20:56:21 +0000435 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000436 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437
438 if (co->co_argcount > 0 ||
439 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
440 int i;
441 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000442 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 if (kwdict == NULL)
446 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000447 i = co->co_argcount;
448 if (co->co_flags & CO_VARARGS)
449 i++;
450 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 }
452 if (argcount > co->co_argcount) {
453 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000454 PyErr_Format(PyExc_TypeError,
455 "too many arguments; expected %d, got %d",
456 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 goto fail;
458 }
459 n = co->co_argcount;
460 }
461 for (i = 0; i < n; i++) {
462 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000463 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 SETLOCAL(i, x);
465 }
466 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000467 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000468 if (u == NULL)
469 goto fail;
470 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 for (i = n; i < argcount; i++) {
472 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000473 Py_INCREF(x);
474 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 }
477 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 PyObject *keyword = kws[2*i];
479 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000481 if (keyword == NULL || !PyString_Check(keyword)) {
482 PyErr_SetString(PyExc_TypeError,
483 "keywords must be strings");
484 goto fail;
485 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 /* XXX slow -- speed up using dictionary? */
487 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000488 PyObject *nm = PyTuple_GET_ITEM(
489 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000490 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 break;
492 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000493 /* Check errors from Compare */
494 if (PyErr_Occurred())
495 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 if (j >= co->co_argcount) {
497 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000499 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000500 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 goto fail;
502 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000503 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000504 }
505 else {
506 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000507 PyErr_Format(PyExc_TypeError,
508 "keyword parameter redefined: %.400s",
509 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 goto fail;
511 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000512 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000513 SETLOCAL(j, value);
514 }
515 }
516 if (argcount < co->co_argcount) {
517 int m = co->co_argcount - defcount;
518 for (i = argcount; i < m; i++) {
519 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000520 PyErr_Format(PyExc_TypeError,
521 "not enough arguments; expected %d, got %d",
522 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 goto fail;
524 }
525 }
526 if (n > m)
527 i = n - m;
528 else
529 i = 0;
530 for (; i < defcount; i++) {
531 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000532 PyObject *def = defs[i];
533 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 SETLOCAL(m+i, def);
535 }
536 }
537 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000538 }
539 else {
540 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000541 PyErr_SetString(PyExc_TypeError,
542 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000543 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 }
545 }
546
Guido van Rossuma027efa1997-05-05 20:56:21 +0000547 if (tstate->sys_tracefunc != NULL) {
548 /* tstate->sys_tracefunc, if defined, is a function that
549 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000550 Its return value, if not None, is a function that
551 will be called at the start of each executed line
552 of code. (Actually, the function must return
553 itself in order to continue tracing.)
554 The trace functions are called with three arguments:
555 a pointer to the current frame, a string indicating
556 why the function is called, and an argument which
557 depends on the situation. The global trace function
558 (sys.trace) is also called whenever an exception
559 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560 if (call_trace(&tstate->sys_tracefunc,
561 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000562 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000563 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000564 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000565 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000566 }
567
Guido van Rossuma027efa1997-05-05 20:56:21 +0000568 if (tstate->sys_profilefunc != NULL) {
569 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000570 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571 if (call_trace(&tstate->sys_profilefunc,
572 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000573 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000574 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000575 }
576 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000577
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000578 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000579 --tstate->recursion_depth;
580 PyErr_SetString(PyExc_RuntimeError,
581 "Maximum recursion depth exceeded");
582 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000583 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000584 return NULL;
585 }
586
Guido van Rossumd076c731998-10-07 19:42:25 +0000587 _PyCode_GETCODEPTR(co, &first_instr);
588 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000589 stack_pointer = f->f_valuestack;
590
Guido van Rossum374a9221991-04-04 10:40:29 +0000591 why = WHY_NOT;
592 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000593 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000594
595 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000596 /* Do periodic things. Doing this every time through
597 the loop would add too much overhead, so we do it
598 only every Nth instruction. We also do it if
599 ``things_to_do'' is set, i.e. when an asynchronous
600 event needs attention (e.g. a signal handler or
601 async I/O handler); see Py_AddPendingCall() and
602 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000603
Guido van Rossuma027efa1997-05-05 20:56:21 +0000604 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000605 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000606 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000607 if (Py_MakePendingCalls() < 0) {
608 why = WHY_EXCEPTION;
609 goto on_error;
610 }
611 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000612#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000613 /* If we have true signals, the signal handler
614 will call Py_AddPendingCall() so we don't
615 have to call sigcheck(). On the Mac and
616 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000617 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 goto on_error;
620 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000621#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000622
Guido van Rossume59214e1994-08-30 08:01:59 +0000623#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000624 if (interpreter_lock) {
625 /* Give another thread a chance */
626
Guido van Rossum25ce5661997-08-02 03:10:38 +0000627 if (PyThreadState_Swap(NULL) != tstate)
628 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000629 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000630
631 /* Other threads may run now */
632
Guido van Rossum65d5b571998-12-21 19:32:43 +0000633 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000634 if (PyThreadState_Swap(tstate) != NULL)
635 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636 }
637#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000639
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000641
Guido van Rossum408027e1996-12-30 16:17:54 +0000642#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000643 f->f_lasti = INSTR_OFFSET();
644#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000645
646 opcode = NEXTOP();
647 if (HAS_ARG(opcode))
648 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000649 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000650#ifdef DYNAMIC_EXECUTION_PROFILE
651#ifdef DXPAIRS
652 dxpairs[lastopcode][opcode]++;
653 lastopcode = opcode;
654#endif
655 dxp[opcode]++;
656#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000657
Guido van Rossum96a42c81992-01-12 02:29:51 +0000658#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 /* Instruction tracing */
660
Guido van Rossum96a42c81992-01-12 02:29:51 +0000661 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 if (HAS_ARG(opcode)) {
663 printf("%d: %d, %d\n",
664 (int) (INSTR_OFFSET() - 3),
665 opcode, oparg);
666 }
667 else {
668 printf("%d: %d\n",
669 (int) (INSTR_OFFSET() - 1), opcode);
670 }
671 }
672#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 /* Main switch on opcode */
674
675 switch (opcode) {
676
677 /* BEWARE!
678 It is essential that any operation that fails sets either
679 x to NULL, err to nonzero, or why to anything but WHY_NOT,
680 and that no operation that succeeds does this! */
681
682 /* case STOP_CODE: this is an error! */
683
684 case POP_TOP:
685 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000686 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000687 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000688
689 case ROT_TWO:
690 v = POP();
691 w = POP();
692 PUSH(v);
693 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000694 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000695
696 case ROT_THREE:
697 v = POP();
698 w = POP();
699 x = POP();
700 PUSH(v);
701 PUSH(x);
702 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000703 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000704
Thomas Wouters434d0822000-08-24 20:11:32 +0000705 case ROT_FOUR:
706 u = POP();
707 v = POP();
708 w = POP();
709 x = POP();
710 PUSH(u);
711 PUSH(x);
712 PUSH(w);
713 PUSH(v);
714 continue;
715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 case DUP_TOP:
717 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000718 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000720 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000721
Thomas Wouters434d0822000-08-24 20:11:32 +0000722 case DUP_TOPX:
723 switch (oparg) {
724 case 5:
725 case 4:
726 case 3:
727 case 2:
728 case 1:
729 x = POP();
730 if (oparg == 1) break;
731 w = POP();
732 if (oparg == 2) break;
733 v = POP();
734 if (oparg == 3) break;
735 u = POP();
736 if (oparg == 4) break;
737 t = POP();
738 break;
739 default:
740 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
741 PyErr_SetString(PyExc_SystemError,
742 "invalid argument to DUP_TOPX");
743 x = NULL;
744 }
745 if (x == NULL)
746 break;
747 switch (oparg) {
748 case 5: PUSH(t);
749 Py_INCREF(t); /* Fallthrough */
750 case 4: PUSH(u);
751 Py_INCREF(u); /* Fallthrough */
752 case 3: PUSH(v);
753 Py_INCREF(v); /* Fallthrough */
754 case 2: PUSH(w);
755 Py_INCREF(w); /* Fallthrough */
756 case 1: PUSH(x);
757 Py_INCREF(x); /* Fallthrough */
758 }
759 switch (oparg) {
760 case 5: PUSH(t); /* Fallthrough */
761 case 4: PUSH(u); /* Fallthrough */
762 case 3: PUSH(v); /* Fallthrough */
763 case 2: PUSH(w); /* Fallthrough */
764 case 1: PUSH(x); /* Fallthrough */
765 }
766 continue;
767
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 case UNARY_POSITIVE:
769 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000770 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000771 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 break;
775
776 case UNARY_NEGATIVE:
777 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000778 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000779 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000780 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000781 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 break;
783
784 case UNARY_NOT:
785 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000786 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000787 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000788 if (err == 0) {
789 Py_INCREF(Py_True);
790 PUSH(Py_True);
791 continue;
792 }
793 else if (err > 0) {
794 Py_INCREF(Py_False);
795 PUSH(Py_False);
796 err = 0;
797 continue;
798 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 break;
800
801 case UNARY_CONVERT:
802 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000803 x = PyObject_Repr(v);
804 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000805 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000806 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000808
809 case UNARY_INVERT:
810 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000811 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000812 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000813 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000815 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000816
Guido van Rossum50564e81996-01-12 01:13:16 +0000817 case BINARY_POWER:
818 w = POP();
819 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000820 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000821 Py_DECREF(v);
822 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000823 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000824 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000825 break;
826
Guido van Rossum374a9221991-04-04 10:40:29 +0000827 case BINARY_MULTIPLY:
828 w = POP();
829 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000830 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000831 Py_DECREF(v);
832 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000834 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 break;
836
837 case BINARY_DIVIDE:
838 w = POP();
839 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000840 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_DECREF(v);
842 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000844 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 break;
846
847 case BINARY_MODULO:
848 w = POP();
849 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000850 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000851 Py_DECREF(v);
852 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000853 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000854 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000855 break;
856
857 case BINARY_ADD:
858 w = POP();
859 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000860 if (PyInt_Check(v) && PyInt_Check(w)) {
861 /* INLINE: int + int */
862 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000863 a = PyInt_AS_LONG(v);
864 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000865 i = a + b;
866 if ((i^a) < 0 && (i^b) < 0) {
867 PyErr_SetString(PyExc_OverflowError,
868 "integer addition");
869 x = NULL;
870 }
871 else
872 x = PyInt_FromLong(i);
873 }
874 else
875 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000876 Py_DECREF(v);
877 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000879 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 break;
881
882 case BINARY_SUBTRACT:
883 w = POP();
884 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000885 if (PyInt_Check(v) && PyInt_Check(w)) {
886 /* INLINE: int - int */
887 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000888 a = PyInt_AS_LONG(v);
889 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000890 i = a - b;
891 if ((i^a) < 0 && (i^~b) < 0) {
892 PyErr_SetString(PyExc_OverflowError,
893 "integer subtraction");
894 x = NULL;
895 }
896 else
897 x = PyInt_FromLong(i);
898 }
899 else
900 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
902 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 break;
906
907 case BINARY_SUBSCR:
908 w = POP();
909 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000910 if (PyList_Check(v) && PyInt_Check(w)) {
911 /* INLINE: list[int] */
912 long i = PyInt_AsLong(w);
913 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000914 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000915 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 PyErr_SetString(PyExc_IndexError,
918 "list index out of range");
919 x = NULL;
920 }
921 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000922 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000923 Py_INCREF(x);
924 }
925 }
926 else
927 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 Py_DECREF(v);
929 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000931 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 break;
933
Guido van Rossum7928cd71991-10-24 14:59:31 +0000934 case BINARY_LSHIFT:
935 w = POP();
936 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000937 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(v);
939 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000940 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000942 break;
943
944 case BINARY_RSHIFT:
945 w = POP();
946 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000947 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000948 Py_DECREF(v);
949 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000950 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000951 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000952 break;
953
954 case BINARY_AND:
955 w = POP();
956 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000957 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000958 Py_DECREF(v);
959 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000960 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000961 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000962 break;
963
964 case BINARY_XOR:
965 w = POP();
966 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000967 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 Py_DECREF(v);
969 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000970 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000971 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000972 break;
973
974 case BINARY_OR:
975 w = POP();
976 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000977 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000978 Py_DECREF(v);
979 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000980 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000981 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000982 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000983
984 case INPLACE_POWER:
985 w = POP();
986 v = POP();
987 x = PyNumber_InPlacePower(v, w, Py_None);
988 Py_DECREF(v);
989 Py_DECREF(w);
990 PUSH(x);
991 if (x != NULL) continue;
992 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000993
Thomas Wouters434d0822000-08-24 20:11:32 +0000994 case INPLACE_MULTIPLY:
995 w = POP();
996 v = POP();
997 x = PyNumber_InPlaceMultiply(v, w);
998 Py_DECREF(v);
999 Py_DECREF(w);
1000 PUSH(x);
1001 if (x != NULL) continue;
1002 break;
1003
1004 case INPLACE_DIVIDE:
1005 w = POP();
1006 v = POP();
1007 x = PyNumber_InPlaceDivide(v, w);
1008 Py_DECREF(v);
1009 Py_DECREF(w);
1010 PUSH(x);
1011 if (x != NULL) continue;
1012 break;
1013
1014 case INPLACE_MODULO:
1015 w = POP();
1016 v = POP();
1017 x = PyNumber_InPlaceRemainder(v, w);
1018 Py_DECREF(v);
1019 Py_DECREF(w);
1020 PUSH(x);
1021 if (x != NULL) continue;
1022 break;
1023
1024 case INPLACE_ADD:
1025 w = POP();
1026 v = POP();
1027 if (PyInt_Check(v) && PyInt_Check(w)) {
1028 /* INLINE: int + int */
1029 register long a, b, i;
1030 a = PyInt_AS_LONG(v);
1031 b = PyInt_AS_LONG(w);
1032 i = a + b;
1033 if ((i^a) < 0 && (i^b) < 0) {
1034 PyErr_SetString(PyExc_OverflowError,
1035 "integer addition");
1036 x = NULL;
1037 }
1038 else
1039 x = PyInt_FromLong(i);
1040 }
1041 else
1042 x = PyNumber_InPlaceAdd(v, w);
1043 Py_DECREF(v);
1044 Py_DECREF(w);
1045 PUSH(x);
1046 if (x != NULL) continue;
1047 break;
1048
1049 case INPLACE_SUBTRACT:
1050 w = POP();
1051 v = POP();
1052 if (PyInt_Check(v) && PyInt_Check(w)) {
1053 /* INLINE: int - int */
1054 register long a, b, i;
1055 a = PyInt_AS_LONG(v);
1056 b = PyInt_AS_LONG(w);
1057 i = a - b;
1058 if ((i^a) < 0 && (i^~b) < 0) {
1059 PyErr_SetString(PyExc_OverflowError,
1060 "integer subtraction");
1061 x = NULL;
1062 }
1063 else
1064 x = PyInt_FromLong(i);
1065 }
1066 else
1067 x = PyNumber_InPlaceSubtract(v, w);
1068 Py_DECREF(v);
1069 Py_DECREF(w);
1070 PUSH(x);
1071 if (x != NULL) continue;
1072 break;
1073
1074 case INPLACE_LSHIFT:
1075 w = POP();
1076 v = POP();
1077 x = PyNumber_InPlaceLshift(v, w);
1078 Py_DECREF(v);
1079 Py_DECREF(w);
1080 PUSH(x);
1081 if (x != NULL) continue;
1082 break;
1083
1084 case INPLACE_RSHIFT:
1085 w = POP();
1086 v = POP();
1087 x = PyNumber_InPlaceRshift(v, w);
1088 Py_DECREF(v);
1089 Py_DECREF(w);
1090 PUSH(x);
1091 if (x != NULL) continue;
1092 break;
1093
1094 case INPLACE_AND:
1095 w = POP();
1096 v = POP();
1097 x = PyNumber_InPlaceAnd(v, w);
1098 Py_DECREF(v);
1099 Py_DECREF(w);
1100 PUSH(x);
1101 if (x != NULL) continue;
1102 break;
1103
1104 case INPLACE_XOR:
1105 w = POP();
1106 v = POP();
1107 x = PyNumber_InPlaceXor(v, w);
1108 Py_DECREF(v);
1109 Py_DECREF(w);
1110 PUSH(x);
1111 if (x != NULL) continue;
1112 break;
1113
1114 case INPLACE_OR:
1115 w = POP();
1116 v = POP();
1117 x = PyNumber_InPlaceOr(v, w);
1118 Py_DECREF(v);
1119 Py_DECREF(w);
1120 PUSH(x);
1121 if (x != NULL) continue;
1122 break;
1123
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 case SLICE+0:
1125 case SLICE+1:
1126 case SLICE+2:
1127 case SLICE+3:
1128 if ((opcode-SLICE) & 2)
1129 w = POP();
1130 else
1131 w = NULL;
1132 if ((opcode-SLICE) & 1)
1133 v = POP();
1134 else
1135 v = NULL;
1136 u = POP();
1137 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001138 Py_DECREF(u);
1139 Py_XDECREF(v);
1140 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001141 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001142 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 break;
1144
1145 case STORE_SLICE+0:
1146 case STORE_SLICE+1:
1147 case STORE_SLICE+2:
1148 case STORE_SLICE+3:
1149 if ((opcode-STORE_SLICE) & 2)
1150 w = POP();
1151 else
1152 w = NULL;
1153 if ((opcode-STORE_SLICE) & 1)
1154 v = POP();
1155 else
1156 v = NULL;
1157 u = POP();
1158 t = POP();
1159 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001160 Py_DECREF(t);
1161 Py_DECREF(u);
1162 Py_XDECREF(v);
1163 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001164 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 break;
1166
1167 case DELETE_SLICE+0:
1168 case DELETE_SLICE+1:
1169 case DELETE_SLICE+2:
1170 case DELETE_SLICE+3:
1171 if ((opcode-DELETE_SLICE) & 2)
1172 w = POP();
1173 else
1174 w = NULL;
1175 if ((opcode-DELETE_SLICE) & 1)
1176 v = POP();
1177 else
1178 v = NULL;
1179 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001180 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001182 Py_DECREF(u);
1183 Py_XDECREF(v);
1184 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001185 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 break;
1187
1188 case STORE_SUBSCR:
1189 w = POP();
1190 v = POP();
1191 u = POP();
1192 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001193 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001194 Py_DECREF(u);
1195 Py_DECREF(v);
1196 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001197 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 break;
1199
1200 case DELETE_SUBSCR:
1201 w = POP();
1202 v = POP();
1203 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001204 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001205 Py_DECREF(v);
1206 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001207 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001208 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001209
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 case PRINT_EXPR:
1211 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001212 /* Print value except if None */
1213 /* After printing, also assign to '_' */
1214 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001215 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001216 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001217 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001218 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001219 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001220 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001221 if (x == NULL) {
1222 PyErr_SetString(
1223 PyExc_RuntimeError,
1224 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001225 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001226 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001227 }
1228 if (err == 0)
1229 err = PyFile_WriteObject(v, x, 0);
1230 if (err == 0) {
1231 PyFile_SoftSpace(x, 1);
1232 err = Py_FlushLine();
1233 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001234 if (err == 0) {
1235 err = PyDict_SetItemString(
1236 f->f_builtins, "_", v);
1237 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 break;
1241
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001242 case PRINT_ITEM_TO:
1243 w = stream = POP();
1244 /* fall through to PRINT_ITEM */
1245
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 case PRINT_ITEM:
1247 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001248 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001249 w = PySys_GetObject("stdout");
1250 if (w == NULL) {
1251 PyErr_SetString(PyExc_RuntimeError,
1252 "lost sys.stdout");
1253 err = -1;
1254 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001255 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001256 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001257 err = PyFile_WriteString(" ", w);
1258 if (err == 0)
1259 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001261 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 char *s = PyString_AsString(v);
1263 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001264 if (len > 0 &&
1265 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001266 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001267 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001269 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001270 Py_XDECREF(stream);
1271 stream = NULL;
1272 if (err == 0)
1273 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 break;
1275
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001276 case PRINT_NEWLINE_TO:
1277 w = stream = POP();
1278 /* fall through to PRINT_NEWLINE */
1279
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001281 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001282 w = PySys_GetObject("stdout");
1283 if (w == NULL)
1284 PyErr_SetString(PyExc_RuntimeError,
1285 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001286 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001287 if (w != NULL) {
1288 err = PyFile_WriteString("\n", w);
1289 if (err == 0)
1290 PyFile_SoftSpace(w, 0);
1291 }
1292 Py_XDECREF(stream);
1293 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 break;
1295
Thomas Wouters434d0822000-08-24 20:11:32 +00001296
1297#ifdef CASE_TOO_BIG
1298 default: switch (opcode) {
1299#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 case BREAK_LOOP:
1301 why = WHY_BREAK;
1302 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001303
Guido van Rossumf10570b1995-07-07 22:53:21 +00001304 case RAISE_VARARGS:
1305 u = v = w = NULL;
1306 switch (oparg) {
1307 case 3:
1308 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001309 /* Fallthrough */
1310 case 2:
1311 v = POP(); /* value */
1312 /* Fallthrough */
1313 case 1:
1314 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001315 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001316 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001317 break;
1318 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001320 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001321 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001322 break;
1323 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 break;
1325
1326 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001327 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001328 PyErr_SetString(PyExc_SystemError,
1329 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001330 break;
1331 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001333 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 break;
1335
1336 case RETURN_VALUE:
1337 retval = POP();
1338 why = WHY_RETURN;
1339 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001340
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001341 case EXEC_STMT:
1342 w = POP();
1343 v = POP();
1344 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001345 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 Py_DECREF(u);
1347 Py_DECREF(v);
1348 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001349 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 case POP_BLOCK:
1352 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 while (STACK_LEVEL() > b->b_level) {
1355 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 }
1358 }
1359 break;
1360
1361 case END_FINALLY:
1362 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 if (PyInt_Check(v)) {
1364 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 if (why == WHY_RETURN)
1366 retval = POP();
1367 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001368 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001370 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001373 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001375 else if (v != Py_None) {
1376 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 "'finally' pops bad exception");
1378 why = WHY_EXCEPTION;
1379 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
1382
1383 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001384 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001386 w = POP();
1387 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 Py_DECREF(u);
1390 Py_DECREF(v);
1391 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 break;
1393
1394 case STORE_NAME:
1395 w = GETNAMEV(oparg);
1396 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001397 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001398 PyErr_SetString(PyExc_SystemError,
1399 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001400 break;
1401 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 err = PyDict_SetItem(x, w, v);
1403 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 break;
1405
1406 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001407 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001408 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001409 PyErr_SetString(PyExc_SystemError,
1410 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001411 break;
1412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 if ((err = PyDict_DelItem(x, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001414 format_exc_check_arg(PyExc_NameError,
1415 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001417
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001418 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001419 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001420 if (PyTuple_Check(v)) {
1421 if (PyTuple_Size(v) != oparg) {
1422 PyErr_SetString(PyExc_ValueError,
1423 "unpack tuple of wrong size");
1424 why = WHY_EXCEPTION;
1425 }
1426 else {
1427 for (; --oparg >= 0; ) {
1428 w = PyTuple_GET_ITEM(v, oparg);
1429 Py_INCREF(w);
1430 PUSH(w);
1431 }
1432 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001434 else if (PyList_Check(v)) {
1435 if (PyList_Size(v) != oparg) {
1436 PyErr_SetString(PyExc_ValueError,
1437 "unpack list of wrong size");
1438 why = WHY_EXCEPTION;
1439 }
1440 else {
1441 for (; --oparg >= 0; ) {
1442 w = PyList_GET_ITEM(v, oparg);
1443 Py_INCREF(w);
1444 PUSH(w);
1445 }
1446 }
1447 }
1448 else if (PySequence_Check(v)) {
1449 if (unpack_sequence(v, oparg,
1450 stack_pointer + oparg))
1451 stack_pointer += oparg;
1452 else
1453 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 }
1455 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001456 PyErr_SetString(PyExc_TypeError,
1457 "unpack non-sequence");
1458 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 break;
1462
1463 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001464 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 v = POP();
1466 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1468 Py_DECREF(v);
1469 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 break;
1471
1472 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001473 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001475 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1476 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001477 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 break;
1479
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001480 case STORE_GLOBAL:
1481 w = GETNAMEV(oparg);
1482 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 err = PyDict_SetItem(f->f_globals, w, v);
1484 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001485 break;
1486
1487 case DELETE_GLOBAL:
1488 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001489 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001490 format_exc_check_arg(
1491 PyExc_NameError, NAME_ERROR_MSG ,w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001492 break;
1493
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 case LOAD_CONST:
1495 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 PUSH(x);
1498 break;
1499
1500 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001501 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001502 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001503 PyErr_SetString(PyExc_SystemError,
1504 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001505 break;
1506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 x = PyDict_GetItem(f->f_globals, 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_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001513 format_exc_check_arg(
1514 PyExc_NameError,
1515 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 break;
1517 }
1518 }
1519 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 PUSH(x);
1522 break;
1523
1524 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001525 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001530 format_exc_check_arg(
1531 PyExc_NameError,
1532 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 break;
1534 }
1535 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 PUSH(x);
1538 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001539
Guido van Rossum9bfef441993-03-29 10:43:31 +00001540 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001541 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001542 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001543 format_exc_check_arg(
1544 PyExc_UnboundLocalError,
1545 UNBOUNDLOCAL_ERROR_MSG,
1546 PyTuple_GetItem(co->co_varnames, oparg)
1547 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001548 break;
1549 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001550 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001551 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001552 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001553 break;
1554
1555 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001556 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001558 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001559
1560 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001561 x = GETLOCAL(oparg);
1562 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001563 format_exc_check_arg(
1564 PyExc_UnboundLocalError,
1565 UNBOUNDLOCAL_ERROR_MSG,
1566 PyTuple_GetItem(co->co_varnames, oparg)
1567 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001568 break;
1569 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001570 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001571 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001572
1573 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 if (x != NULL) {
1576 for (; --oparg >= 0;) {
1577 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 }
1580 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001581 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 }
1583 break;
1584
1585 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 if (x != NULL) {
1588 for (; --oparg >= 0;) {
1589 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001590 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 }
1592 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001593 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 }
1595 break;
1596
1597 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001600 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 break;
1602
1603 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001604 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 x = PyObject_GetAttr(v, w);
1607 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001609 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 break;
1611
1612 case COMPARE_OP:
1613 w = POP();
1614 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001615 if (PyInt_Check(v) && PyInt_Check(w)) {
1616 /* INLINE: cmp(int, int) */
1617 register long a, b;
1618 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001619 a = PyInt_AS_LONG(v);
1620 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001621 switch (oparg) {
1622 case LT: res = a < b; break;
1623 case LE: res = a <= b; break;
1624 case EQ: res = a == b; break;
1625 case NE: res = a != b; break;
1626 case GT: res = a > b; break;
1627 case GE: res = a >= b; break;
1628 case IS: res = v == w; break;
1629 case IS_NOT: res = v != w; break;
1630 default: goto slow_compare;
1631 }
1632 x = res ? Py_True : Py_False;
1633 Py_INCREF(x);
1634 }
1635 else {
1636 slow_compare:
1637 x = cmp_outcome(oparg, v, w);
1638 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 Py_DECREF(v);
1640 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001642 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 break;
1644
1645 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001646 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001648 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001650 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651 break;
1652 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001653 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 w,
1656 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001657 f->f_locals == NULL ?
1658 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001661 if (w == NULL) {
1662 x = NULL;
1663 break;
1664 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001665 x = PyEval_CallObject(x, w);
1666 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001667 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001668 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 break;
1670
Thomas Wouters52152252000-08-17 22:55:00 +00001671 case IMPORT_STAR:
1672 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001673 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001674 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001675 PyErr_SetString(PyExc_SystemError,
1676 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001677 break;
1678 }
Thomas Wouters52152252000-08-17 22:55:00 +00001679 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001681 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001682 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001684
Thomas Wouters52152252000-08-17 22:55:00 +00001685 case IMPORT_FROM:
1686 w = GETNAMEV(oparg);
1687 v = TOP();
1688 x = import_from(v, w);
1689 PUSH(x);
1690 if (x != NULL) continue;
1691 break;
1692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 case JUMP_FORWARD:
1694 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001695 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001696
1697 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001699 if (err > 0)
1700 err = 0;
1701 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001703 else
1704 break;
1705 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001706
1707 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001709 if (err > 0) {
1710 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001712 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001713 else if (err == 0)
1714 ;
1715 else
1716 break;
1717 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001718
1719 case JUMP_ABSOLUTE:
1720 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001721 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001722
1723 case FOR_LOOP:
1724 /* for v in s: ...
1725 On entry: stack contains s, i.
1726 On exit: stack contains s, i+1, s[i];
1727 but if loop exhausted:
1728 s, i are popped, and we jump */
1729 w = POP(); /* Loop index */
1730 v = POP(); /* Sequence object */
1731 u = loop_subscript(v, w);
1732 if (u != NULL) {
1733 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001738 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 }
1740 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 Py_DECREF(v);
1742 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 /* A NULL can mean "s exhausted"
1744 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001745 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001747 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001749 continue;
1750 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 }
1752 break;
1753
1754 case SETUP_LOOP:
1755 case SETUP_EXCEPT:
1756 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001757 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001759 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001760
1761 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001762#ifdef LLTRACE
1763 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001765#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001766 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001767 if (f->f_trace == NULL)
1768 continue;
1769 /* Trace each line of code reached */
1770 f->f_lasti = INSTR_OFFSET();
1771 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001774
1775 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001776 case CALL_FUNCTION_VAR:
1777 case CALL_FUNCTION_KW:
1778 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001779 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001780 int na = oparg & 0xff;
1781 int nk = (oparg>>8) & 0xff;
1782 int flags = (opcode - CALL_FUNCTION) & 3;
1783 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1784 PyObject **pfunc = stack_pointer - n - 1;
1785 PyObject *func = *pfunc;
1786 PyObject *self = NULL;
1787 PyObject *class = NULL;
1788 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1789 if (PyMethod_Check(func)) {
1790 self = PyMethod_Self(func);
1791 class = PyMethod_Class(func);
1792 func = PyMethod_Function(func);
1793 Py_INCREF(func);
1794 if (self != NULL) {
1795 Py_INCREF(self);
1796 Py_DECREF(*pfunc);
1797 *pfunc = self;
1798 na++;
1799 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001800 }
1801 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001802 /* Unbound methods must be called with an
1803 instance of the class (or a derived
1804 class) as first argument */
1805 if (na > 0 && (self = stack_pointer[-n]) != NULL
1806 && PyInstance_Check(self)
1807 && PyClass_IsSubclass((PyObject *)
1808 (((PyInstanceObject *)self)->in_class),
1809 class))
1810 /* Handy-dandy */ ;
1811 else {
1812 PyErr_SetString(PyExc_TypeError,
1813 "unbound method must be called with class instance 1st argument");
1814 x = NULL;
1815 break;
1816 }
1817 }
1818 }
1819 else
1820 Py_INCREF(func);
1821 if (PyFunction_Check(func) && flags == 0) {
1822 PyObject *co = PyFunction_GetCode(func);
1823 PyObject *globals = PyFunction_GetGlobals(func);
1824 PyObject *argdefs = PyFunction_GetDefaults(func);
1825 PyObject **d;
1826 int nd;
1827 if (argdefs != NULL) {
1828 d = &PyTuple_GET_ITEM(argdefs, 0);
1829 nd = ((PyTupleObject *)argdefs)->ob_size;
1830 }
1831 else {
1832 d = NULL;
1833 nd = 0;
1834 }
1835 x = eval_code2((PyCodeObject *)co, globals,
1836 (PyObject *)NULL, stack_pointer-n, na,
1837 stack_pointer-2*nk, nk, d, nd,
1838 class);
1839 }
1840 else {
1841 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001842 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001843 PyObject *stararg = 0;
1844 PyObject *kwdict = NULL;
1845 if (flags & 2) {
1846 kwdict = POP();
1847 if (!PyDict_Check(kwdict)) {
1848 PyErr_SetString(PyExc_TypeError,
1849 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001850 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001851 }
1852 }
1853 if (flags & 1) {
1854 stararg = POP();
1855 if (!PySequence_Check(stararg)) {
1856 PyErr_SetString(PyExc_TypeError,
1857 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001858 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001859 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001860 /* Convert abstract sequence to concrete tuple */
1861 if (!PyTuple_Check(stararg)) {
1862 PyObject *t = NULL;
1863 t = PySequence_Tuple(stararg);
1864 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001865 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001866 }
1867 Py_DECREF(stararg);
1868 stararg = t;
1869 }
1870 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001871 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001872 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001873 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001874 }
1875 if (nk > 0) {
1876 if (kwdict == NULL) {
1877 kwdict = PyDict_New();
1878 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001879 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001880 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001881 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001882 else {
1883 PyObject *d = PyDict_Copy(kwdict);
1884 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001885 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001886 }
1887 Py_DECREF(kwdict);
1888 kwdict = d;
1889 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001890 err = 0;
1891 while (--nk >= 0) {
1892 PyObject *value = POP();
1893 PyObject *key = POP();
1894 if (PyDict_GetItem(kwdict, key) != NULL) {
1895 err = 1;
1896 PyErr_Format(PyExc_TypeError,
1897 "keyword parameter redefined: %.400s",
1898 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001899 Py_DECREF(key);
1900 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001901 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001902 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001903 err = PyDict_SetItem(kwdict, key, value);
1904 Py_DECREF(key);
1905 Py_DECREF(value);
1906 if (err)
1907 break;
1908 }
1909 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001910 extcall_fail:
1911 Py_XDECREF(kwdict);
1912 Py_XDECREF(stararg);
1913 Py_DECREF(func);
1914 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001915 break;
1916 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001917 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001918 callargs = PyTuple_New(na + nstar);
1919 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001920 x = NULL;
1921 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001922 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001923 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001924 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001925 for (i = 0; i < nstar; i++) {
1926 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1927 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001928 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001929 }
1930 Py_DECREF(stararg);
1931 }
1932 while (--na >= 0) {
1933 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001934 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001935 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001936 x = PyEval_CallObjectWithKeywords(func,
1937 callargs,
1938 kwdict);
1939 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001940 Py_XDECREF(kwdict);
1941 }
1942 Py_DECREF(func);
1943 while (stack_pointer > pfunc) {
1944 w = POP();
1945 Py_DECREF(w);
1946 }
1947 PUSH(x);
1948 if (x != NULL) continue;
1949 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001950 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001951
Guido van Rossum681d79a1995-07-18 14:51:37 +00001952 case MAKE_FUNCTION:
1953 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001954 x = PyFunction_New(v, f->f_globals);
1955 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001956 /* XXX Maybe this should be a separate opcode? */
1957 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001958 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001959 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001960 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001961 x = NULL;
1962 break;
1963 }
1964 while (--oparg >= 0) {
1965 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001966 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001967 }
1968 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001970 }
1971 PUSH(x);
1972 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001973
1974 case BUILD_SLICE:
1975 if (oparg == 3)
1976 w = POP();
1977 else
1978 w = NULL;
1979 v = POP();
1980 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001981 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001982 Py_DECREF(u);
1983 Py_DECREF(v);
1984 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001985 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001986 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001987 break;
1988
Fred Drakeef8ace32000-08-24 00:32:09 +00001989 case EXTENDED_ARG:
1990 opcode = NEXTOP();
1991 oparg = oparg<<16 | NEXTARG();
1992 goto dispatch_opcode;
1993 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001994
Guido van Rossum374a9221991-04-04 10:40:29 +00001995 default:
1996 fprintf(stderr,
1997 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001998 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002000 why = WHY_EXCEPTION;
2001 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002002
2003#ifdef CASE_TOO_BIG
2004 }
2005#endif
2006
Guido van Rossum374a9221991-04-04 10:40:29 +00002007 } /* switch */
2008
2009 on_error:
2010
2011 /* Quickly continue if no error occurred */
2012
2013 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002014 if (err == 0 && x != NULL) {
2015#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002016 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002018 fprintf(stderr,
2019 "XXX undetected error\n");
2020 else
2021#endif
2022 continue; /* Normal, fast path */
2023 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002024 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002026 err = 0;
2027 }
2028
Guido van Rossum374a9221991-04-04 10:40:29 +00002029 /* Double-check exception status */
2030
2031 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002033 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002034 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002035 why = WHY_EXCEPTION;
2036 }
2037 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002038#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002039 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002040 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002041 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002042 fprintf(stderr,
2043 "XXX undetected error (why=%d)\n",
2044 why);
2045 why = WHY_EXCEPTION;
2046 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002047 }
2048#endif
2049
2050 /* Log traceback info if this is a real exception */
2051
2052 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002053 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002054 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002055 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002057
Guido van Rossume59214e1994-08-30 08:01:59 +00002058 if (f->f_trace)
2059 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002060 if (tstate->sys_profilefunc)
2061 call_exc_trace(&tstate->sys_profilefunc,
2062 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002063 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002064
2065 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2066
2067 if (why == WHY_RERAISE)
2068 why = WHY_EXCEPTION;
2069
2070 /* Unwind stacks if a (pseudo) exception occurred */
2071
2072 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002074 while (STACK_LEVEL() > b->b_level) {
2075 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002076 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002077 }
2078 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2079 why = WHY_NOT;
2080 JUMPTO(b->b_handler);
2081 break;
2082 }
2083 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002084 (b->b_type == SETUP_EXCEPT &&
2085 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 PyObject *exc, *val, *tb;
2088 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002089 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 val = Py_None;
2091 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002092 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 /* Make the raw exception data
2094 available to the handler,
2095 so a program can emulate the
2096 Python main loop. Don't do
2097 this for 'finally'. */
2098 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002099 PyErr_NormalizeException(
2100 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002101 set_exc_info(tstate,
2102 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002103 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002104 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002105 PUSH(val);
2106 PUSH(exc);
2107 }
2108 else {
2109 if (why == WHY_RETURN)
2110 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002112 PUSH(v);
2113 }
2114 why = WHY_NOT;
2115 JUMPTO(b->b_handler);
2116 break;
2117 }
2118 } /* unwind stack */
2119
2120 /* End the loop if we still have an error (or return) */
2121
2122 if (why != WHY_NOT)
2123 break;
2124
2125 } /* main loop */
2126
2127 /* Pop remaining stack entries */
2128
2129 while (!EMPTY()) {
2130 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 }
2133
Guido van Rossum96a42c81992-01-12 02:29:51 +00002134 if (why != WHY_RETURN)
2135 retval = NULL;
2136
Guido van Rossume59214e1994-08-30 08:01:59 +00002137 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002138 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002139 if (call_trace(&f->f_trace, &f->f_trace, f,
2140 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002142 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002143 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002144 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002145 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002146 }
2147
Guido van Rossuma027efa1997-05-05 20:56:21 +00002148 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2149 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002150 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152 retval = NULL;
2153 why = WHY_EXCEPTION;
2154 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002155 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002156
Guido van Rossuma027efa1997-05-05 20:56:21 +00002157 reset_exc_info(tstate);
2158
2159 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002160
2161 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002162
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002164
Guido van Rossuma027efa1997-05-05 20:56:21 +00002165 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002167
Guido van Rossum96a42c81992-01-12 02:29:51 +00002168 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002169}
2170
Guido van Rossuma027efa1997-05-05 20:56:21 +00002171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002172set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002173{
2174 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002175 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002176
Guido van Rossuma027efa1997-05-05 20:56:21 +00002177 frame = tstate->frame;
2178 if (frame->f_exc_type == NULL) {
2179 /* This frame didn't catch an exception before */
2180 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002181 if (tstate->exc_type == NULL) {
2182 Py_INCREF(Py_None);
2183 tstate->exc_type = Py_None;
2184 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002185 tmp_type = frame->f_exc_type;
2186 tmp_value = frame->f_exc_value;
2187 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188 Py_XINCREF(tstate->exc_type);
2189 Py_XINCREF(tstate->exc_value);
2190 Py_XINCREF(tstate->exc_traceback);
2191 frame->f_exc_type = tstate->exc_type;
2192 frame->f_exc_value = tstate->exc_value;
2193 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002194 Py_XDECREF(tmp_type);
2195 Py_XDECREF(tmp_value);
2196 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002197 }
2198 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002199 tmp_type = tstate->exc_type;
2200 tmp_value = tstate->exc_value;
2201 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002202 Py_XINCREF(type);
2203 Py_XINCREF(value);
2204 Py_XINCREF(tb);
2205 tstate->exc_type = type;
2206 tstate->exc_value = value;
2207 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002208 Py_XDECREF(tmp_type);
2209 Py_XDECREF(tmp_value);
2210 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002211 /* For b/w compatibility */
2212 PySys_SetObject("exc_type", type);
2213 PySys_SetObject("exc_value", value);
2214 PySys_SetObject("exc_traceback", tb);
2215}
2216
2217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002219{
2220 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002221 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002222 frame = tstate->frame;
2223 if (frame->f_exc_type != NULL) {
2224 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002225 tmp_type = tstate->exc_type;
2226 tmp_value = tstate->exc_value;
2227 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002228 Py_XINCREF(frame->f_exc_type);
2229 Py_XINCREF(frame->f_exc_value);
2230 Py_XINCREF(frame->f_exc_traceback);
2231 tstate->exc_type = frame->f_exc_type;
2232 tstate->exc_value = frame->f_exc_value;
2233 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002234 Py_XDECREF(tmp_type);
2235 Py_XDECREF(tmp_value);
2236 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002237 /* For b/w compatibility */
2238 PySys_SetObject("exc_type", frame->f_exc_type);
2239 PySys_SetObject("exc_value", frame->f_exc_value);
2240 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2241 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002242 tmp_type = frame->f_exc_type;
2243 tmp_value = frame->f_exc_value;
2244 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002245 frame->f_exc_type = NULL;
2246 frame->f_exc_value = NULL;
2247 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002248 Py_XDECREF(tmp_type);
2249 Py_XDECREF(tmp_value);
2250 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002251}
2252
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002253/* Logic for the raise statement (too complicated for inlining).
2254 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002255static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002256do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002257{
Guido van Rossumd295f121998-04-09 21:39:57 +00002258 if (type == NULL) {
2259 /* Reraise */
2260 PyThreadState *tstate = PyThreadState_Get();
2261 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2262 value = tstate->exc_value;
2263 tb = tstate->exc_traceback;
2264 Py_XINCREF(type);
2265 Py_XINCREF(value);
2266 Py_XINCREF(tb);
2267 }
2268
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002269 /* We support the following forms of raise:
2270 raise <class>, <classinstance>
2271 raise <class>, <argument tuple>
2272 raise <class>, None
2273 raise <class>, <argument>
2274 raise <classinstance>, None
2275 raise <string>, <object>
2276 raise <string>, None
2277
2278 An omitted second argument is the same as None.
2279
2280 In addition, raise <tuple>, <anything> is the same as
2281 raising the tuple's first item (and it better have one!);
2282 this rule is applied recursively.
2283
2284 Finally, an optional third argument can be supplied, which
2285 gives the traceback to be substituted (useful when
2286 re-raising an exception after examining it). */
2287
2288 /* First, check the traceback argument, replacing None with
2289 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002290 if (tb == Py_None) {
2291 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002292 tb = NULL;
2293 }
2294 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002296 "raise 3rd arg must be traceback or None");
2297 goto raise_error;
2298 }
2299
2300 /* Next, replace a missing value with None */
2301 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 value = Py_None;
2303 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002304 }
2305
2306 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2308 PyObject *tmp = type;
2309 type = PyTuple_GET_ITEM(type, 0);
2310 Py_INCREF(type);
2311 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002312 }
2313
Barry Warsaw4249f541997-08-22 21:26:19 +00002314 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002315 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002316
2317 else if (PyClass_Check(type))
2318 PyErr_NormalizeException(&type, &value, &tb);
2319
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002321 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 if (value != Py_None) {
2323 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002324 "instance exception may not have a separate value");
2325 goto raise_error;
2326 }
2327 else {
2328 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002330 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2332 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002333 }
2334 }
2335 else {
2336 /* Not something you can raise. You get an exception
2337 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002339 "exceptions must be strings, classes, or instances");
2340 goto raise_error;
2341 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002342 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002343 if (tb == NULL)
2344 return WHY_EXCEPTION;
2345 else
2346 return WHY_RERAISE;
2347 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 Py_XDECREF(value);
2349 Py_XDECREF(type);
2350 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002351 return WHY_EXCEPTION;
2352}
2353
Barry Warsawe42b18f1997-08-25 22:13:04 +00002354static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002355unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002356{
2357 int i;
2358 PyObject *w;
2359
2360 for (i = 0; i < argcnt; i++) {
2361 if (! (w = PySequence_GetItem(v, i))) {
2362 if (PyErr_ExceptionMatches(PyExc_IndexError))
2363 PyErr_SetString(PyExc_ValueError,
2364 "unpack sequence of wrong size");
2365 goto finally;
2366 }
2367 *--sp = w;
2368 }
2369 /* we better get an IndexError now */
2370 if (PySequence_GetItem(v, i) == NULL) {
2371 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2372 PyErr_Clear();
2373 return 1;
2374 }
2375 /* some other exception occurred. fall through to finally */
2376 }
2377 else
2378 PyErr_SetString(PyExc_ValueError,
2379 "unpack sequence of wrong size");
2380 /* fall through */
2381finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002382 for (; i > 0; i--, sp++)
2383 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002384
2385 return 0;
2386}
2387
2388
Guido van Rossum96a42c81992-01-12 02:29:51 +00002389#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002391prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002393 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002394 if (PyObject_Print(v, stdout, 0) != 0)
2395 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002396 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002397 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002399#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002402call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002403{
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002405 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002407 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 value = Py_None;
2409 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002410 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002412 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002414 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002415 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002416 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002418 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002420 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 Py_XDECREF(type);
2422 Py_XDECREF(value);
2423 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002424 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002425}
2426
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002427/* PyObject **p_trace: in/out; may not be NULL;
2428 may not point to NULL variable initially
2429 PyObject **p_newtrace: in/out; may be NULL;
2430 may point to NULL variable;
2431 may be same variable as p_newtrace */
2432
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002433static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002434call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2435 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002436{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002437 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 PyObject *args, *what;
2439 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002440
Guido van Rossuma027efa1997-05-05 20:56:21 +00002441 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002442 /* Don't do recursive traces */
2443 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002444 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002445 *p_newtrace = NULL;
2446 }
2447 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002448 }
2449
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002451 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002452 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002454 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002455 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 Py_INCREF(f);
2457 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2458 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002459 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002460 arg = Py_None;
2461 Py_INCREF(arg);
2462 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002463 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyFrame_FastToLocals(f);
2465 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2466 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002467 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002468 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002469 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002470 if (res == NULL) {
2471 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002472 PyTraceBack_Here(f);
2473 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002474 *p_trace = NULL;
2475 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002476 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002477 *p_newtrace = NULL;
2478 }
Barry Warsawf6202631999-09-08 16:26:33 +00002479 /* to be extra double plus sure we don't get recursive
2480 * calls inf either tracefunc or profilefunc gets an
2481 * exception, zap the global variables.
2482 */
2483 Py_XDECREF(tstate->sys_tracefunc);
2484 tstate->sys_tracefunc = NULL;
2485 Py_XDECREF(tstate->sys_profilefunc);
2486 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002487 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002488 }
2489 else {
2490 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002491 Py_XDECREF(*p_newtrace);
2492 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002493 *p_newtrace = NULL;
2494 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002495 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002496 *p_newtrace = res;
2497 }
2498 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002499 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002500 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002501 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002502}
2503
Guido van Rossumb209a111997-04-29 18:18:01 +00002504PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002505PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002506{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002507 PyThreadState *tstate = PyThreadState_Get();
2508 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002509 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002510 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002511 else
2512 return current_frame->f_builtins;
2513}
2514
Guido van Rossumb209a111997-04-29 18:18:01 +00002515PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002516PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002517{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002518 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002519 if (current_frame == NULL)
2520 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002521 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002522 return current_frame->f_locals;
2523}
2524
Guido van Rossumb209a111997-04-29 18:18:01 +00002525PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002526PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002528 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529 if (current_frame == NULL)
2530 return NULL;
2531 else
2532 return current_frame->f_globals;
2533}
2534
Guido van Rossumb209a111997-04-29 18:18:01 +00002535PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002536PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002537{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002538 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002540}
2541
Guido van Rossum6135a871995-01-09 17:53:26 +00002542int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002543PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002544{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002545 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002546 return current_frame == NULL ? 0 : current_frame->f_restricted;
2547}
2548
Guido van Rossumbe270261997-05-22 22:26:18 +00002549int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002550Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551{
Guido van Rossumb209a111997-04-29 18:18:01 +00002552 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002553 if (f == NULL)
2554 return 0;
2555 if (!PyFile_SoftSpace(f, 0))
2556 return 0;
2557 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558}
2559
Guido van Rossum3f5da241990-12-20 15:06:42 +00002560
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561/* External interface to call any callable object.
2562 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002563
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002564#undef PyEval_CallObject
2565/* for backward compatibility: export this interface */
2566
Guido van Rossumb209a111997-04-29 18:18:01 +00002567PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002569{
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002571}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002572#define PyEval_CallObject(func,arg) \
2573 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002574
Guido van Rossumb209a111997-04-29 18:18:01 +00002575PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002576PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002577{
2578 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002579 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002580
2581 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002582 arg = PyTuple_New(0);
2583 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002584 PyErr_SetString(PyExc_TypeError,
2585 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002586 return NULL;
2587 }
2588 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002589 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002590
Guido van Rossumb209a111997-04-29 18:18:01 +00002591 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002592 PyErr_SetString(PyExc_TypeError,
2593 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002594 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002595 return NULL;
2596 }
2597
Guido van Rossum150b2df1996-12-05 23:17:11 +00002598 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002599 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002601 result = call_function(func, arg, kw);
2602 else
2603 result = call_builtin(func, arg, kw);
2604
Guido van Rossumb209a111997-04-29 18:18:01 +00002605 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002606
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 if (result == NULL && !PyErr_Occurred())
2608 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002609 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002610
2611 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002612}
2613
Guido van Rossumb209a111997-04-29 18:18:01 +00002614static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002615call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616{
Guido van Rossumb209a111997-04-29 18:18:01 +00002617 if (PyCFunction_Check(func)) {
2618 PyCFunction meth = PyCFunction_GetFunction(func);
2619 PyObject *self = PyCFunction_GetSelf(func);
2620 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002621 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002623 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002624 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002625 else if (size == 0)
2626 arg = NULL;
2627 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002628 if (flags & METH_KEYWORDS)
2629 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 if (kw != NULL && PyDict_Size(kw) != 0) {
2631 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002632 "this function takes no keyword arguments");
2633 return NULL;
2634 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002635 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002637 if (PyClass_Check(func)) {
2638 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 if (PyInstance_Check(func)) {
2641 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002642 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyErr_Clear();
2644 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002645 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002646 return NULL;
2647 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002648 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002650 return res;
2651 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002652 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002653 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 return NULL;
2655}
2656
Guido van Rossumb209a111997-04-29 18:18:01 +00002657static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002658call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659{
Guido van Rossumb209a111997-04-29 18:18:01 +00002660 PyObject *class = NULL; /* == owner */
2661 PyObject *argdefs;
2662 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002663 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002665
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 if (kw != NULL && !PyDict_Check(kw)) {
2667 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002668 return NULL;
2669 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 if (PyMethod_Check(func)) {
2672 PyObject *self = PyMethod_Self(func);
2673 class = PyMethod_Class(func);
2674 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002675 if (self == NULL) {
2676 /* Unbound methods must be called with an instance of
2677 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 if (PyTuple_Size(arg) >= 1) {
2679 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002680 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 PyInstance_Check(self) &&
2682 PyClass_IsSubclass((PyObject *)
2683 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002684 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002685 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002686 else
2687 self = NULL;
2688 }
2689 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002691 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002692 return NULL;
2693 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002695 }
2696 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002697 int argcount = PyTuple_Size(arg);
2698 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002699 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002700 if (newarg == NULL)
2701 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002702 Py_INCREF(self);
2703 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002704 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 PyObject *v = PyTuple_GET_ITEM(arg, i);
2706 Py_XINCREF(v);
2707 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002708 }
2709 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002711 if (!PyFunction_Check(func)) {
2712 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2713 Py_DECREF(arg);
2714 return result;
2715 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 }
2717 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002719 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002720 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002721 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 return NULL;
2723 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002726
2727 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2729 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2730 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002731 }
2732 else {
2733 d = NULL;
2734 nd = 0;
2735 }
2736
2737 if (kw != NULL) {
2738 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 nk = PyDict_Size(kw);
2740 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002741 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 PyErr_NoMemory();
2743 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002745 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002746 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002748 i += 2;
2749 nk = i/2;
2750 /* XXX This is broken if the caller deletes dict items! */
2751 }
2752 else {
2753 k = NULL;
2754 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756
Guido van Rossum681d79a1995-07-18 14:51:37 +00002757 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 (PyCodeObject *)PyFunction_GetCode(func),
2759 PyFunction_GetGlobals(func), (PyObject *)NULL,
2760 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002761 k, nk,
2762 d, nd,
2763 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002766 if (k != NULL)
2767 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770}
2771
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002772#define SLICE_ERROR_MSG \
2773 "standard sequence type does not support step size other than one"
2774
Guido van Rossumb209a111997-04-29 18:18:01 +00002775static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002776loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777{
Guido van Rossumb209a111997-04-29 18:18:01 +00002778 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002779 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002780 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 return NULL;
2783 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002785 v = (*sq->sq_item)(v, i);
2786 if (v)
2787 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002788 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002790 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791}
2792
Guido van Rossum20c6add2000-05-08 14:06:50 +00002793/* Extract a slice index from a PyInt or PyLong, the index is bound to
2794 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2795 and error. Returns 1 on success.*/
2796
2797int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002798_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799{
2800 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002801 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002802 if (PyInt_Check(v)) {
2803 x = PyInt_AsLong(v);
2804 } else if (PyLong_Check(v)) {
2805 x = PyLong_AsLong(v);
2806 if (x==-1 && PyErr_Occurred()) {
2807 PyObject *long_zero;
2808
2809 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2810 /* It's not an overflow error, so just
2811 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002812 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002813 }
2814
2815 /* It's an overflow error, so we need to
2816 check the sign of the long integer,
2817 set the value to INT_MAX or 0, and clear
2818 the error. */
2819
2820 /* Create a long integer with a value of 0 */
2821 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002822 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002823
2824 /* Check sign */
2825 if (PyObject_Compare(long_zero, v) < 0)
2826 x = INT_MAX;
2827 else
2828 x = 0;
2829
2830 /* Free the long integer we created, and clear the
2831 OverflowError */
2832 Py_DECREF(long_zero);
2833 PyErr_Clear();
2834 }
2835 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002836 PyErr_SetString(PyExc_TypeError,
2837 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002838 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002840 /* Truncate -- very long indices are truncated anyway */
2841 if (x > INT_MAX)
2842 x = INT_MAX;
2843 else if (x < -INT_MAX)
2844 x = 0;
2845 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002847 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848}
2849
Guido van Rossumb209a111997-04-29 18:18:01 +00002850static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002851apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002853 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002854 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002856 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002857 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002858 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002860
2861static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002862assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002864 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002865 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002866 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002867 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002868 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002869 if (x == NULL)
2870 return PySequence_DelSlice(u, ilow, ihigh);
2871 else
2872 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873}
2874
Guido van Rossumb209a111997-04-29 18:18:01 +00002875static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002876cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877{
2878 register int cmp;
2879 register int res = 0;
2880 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 case IS:
2882 case IS_NOT:
2883 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002884 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002885 res = !res;
2886 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 case IN:
2888 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002889 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002890 if (res < 0)
2891 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002892 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002893 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 break;
2895 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002896 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 break;
2898 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002899 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002900 if (cmp && PyErr_Occurred())
2901 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002902 switch (op) {
2903 case LT: res = cmp < 0; break;
2904 case LE: res = cmp <= 0; break;
2905 case EQ: res = cmp == 0; break;
2906 case NE: res = cmp != 0; break;
2907 case GT: res = cmp > 0; break;
2908 case GE: res = cmp >= 0; break;
2909 /* XXX no default? (res is initialized to 0 though) */
2910 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002912 v = res ? Py_True : Py_False;
2913 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 return v;
2915}
2916
Thomas Wouters52152252000-08-17 22:55:00 +00002917static PyObject *
2918import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002919{
Guido van Rossumb209a111997-04-29 18:18:01 +00002920 PyObject *w, *x;
2921 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002922 PyErr_SetString(PyExc_TypeError,
2923 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002924 return NULL;
2925 }
2926 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2927 x = PyDict_GetItem(w, name);
2928 if (x == NULL) {
2929 PyErr_Format(PyExc_ImportError,
2930 "cannot import name %.230s",
2931 PyString_AsString(name));
2932 } else
2933 Py_INCREF(x);
2934 return x;
2935}
2936
2937static int
2938import_all_from(PyObject *locals, PyObject *v)
2939{
2940 int pos = 0, err;
2941 PyObject *name, *value;
2942 PyObject *w;
2943
2944 if (!PyModule_Check(v)) {
2945 PyErr_SetString(PyExc_TypeError,
2946 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002947 return -1;
2948 }
Thomas Wouters52152252000-08-17 22:55:00 +00002949 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2950
2951 while (PyDict_Next(w, &pos, &name, &value)) {
2952 if (!PyString_Check(name) ||
2953 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002954 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002955 Py_INCREF(value);
2956 err = PyDict_SetItem(locals, name, value);
2957 Py_DECREF(value);
2958 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002959 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002960 }
Thomas Wouters52152252000-08-17 22:55:00 +00002961 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002962}
2963
Guido van Rossumb209a111997-04-29 18:18:01 +00002964static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002965build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002966{
Guido van Rossumcd649651997-08-22 16:56:16 +00002967 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002968 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002969 PyErr_SetString(PyExc_SystemError,
2970 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002971 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002972 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002973 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002974 PyErr_SetString(PyExc_SystemError,
2975 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002976 return NULL;
2977 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002978 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002979 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002980 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002981 return NULL;
2982 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002983 n = PyTuple_Size(bases);
2984 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002985 PyObject *base = PyTuple_GET_ITEM(bases, i);
2986 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002987 /* Call the base's *type*, if it is callable.
2988 This code is a hook for Donald Beaudry's
2989 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002990 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002991 since its types are not callable.
2992 Ditto: call the bases's *class*, if it has
2993 one. This makes the same thing possible
2994 without writing C code. A true meta-object
2995 protocol! */
2996 PyObject *basetype = (PyObject *)base->ob_type;
2997 PyObject *callable = NULL;
2998 if (PyCallable_Check(basetype))
2999 callable = basetype;
3000 else
3001 callable = PyObject_GetAttrString(
3002 base, "__class__");
3003 if (callable) {
3004 PyObject *args;
3005 PyObject *newclass = NULL;
3006 args = Py_BuildValue(
3007 "(OOO)", name, bases, methods);
3008 if (args != NULL) {
3009 newclass = PyEval_CallObject(
3010 callable, args);
3011 Py_DECREF(args);
3012 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003013 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003014 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003015 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003016 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003017 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003018 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003019 "base is not a class object");
3020 return NULL;
3021 }
3022 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003023 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003024}
3025
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003026static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003027exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3028 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003029{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003030 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003031 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003032 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003033
Guido van Rossumb209a111997-04-29 18:18:01 +00003034 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3035 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003036 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003037 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003038 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003039 locals = PyTuple_GetItem(prog, 2);
3040 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003041 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003042 if (globals == Py_None) {
3043 globals = PyEval_GetGlobals();
3044 if (locals == Py_None) {
3045 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 plain = 1;
3047 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003048 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003049 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003050 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003051 if (!PyString_Check(prog) &&
3052 !PyCode_Check(prog) &&
3053 !PyFile_Check(prog)) {
3054 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003055 "exec 1st arg must be string, code or file object");
3056 return -1;
3057 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003058 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3059 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003060 "exec 2nd/3rd args must be dict or None");
3061 return -1;
3062 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003063 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003064 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003065 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003066 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003067 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003068 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003069 FILE *fp = PyFile_AsFile(prog);
3070 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003071 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3072 }
3073 else {
3074 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00003075 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003076 PyErr_SetString(PyExc_ValueError,
3077 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003078 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003079 }
3080 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003081 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003082 if (plain)
3083 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003084 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003085 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003086 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003087 return 0;
3088}
Guido van Rossum24c13741995-02-14 09:42:43 +00003089
Paul Prescode68140d2000-08-30 20:25:01 +00003090static void
3091format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3092{
3093 char *obj_str;
3094
3095 if (!obj)
3096 return;
3097
3098 obj_str = PyString_AsString(obj);
3099 if (!obj_str)
3100 return;
3101
3102 PyErr_Format(exc, format_str, obj_str);
3103}
Guido van Rossum950361c1997-01-24 13:49:28 +00003104
3105#ifdef DYNAMIC_EXECUTION_PROFILE
3106
3107PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003108getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003109{
3110 int i;
3111 PyObject *l = PyList_New(256);
3112 if (l == NULL) return NULL;
3113 for (i = 0; i < 256; i++) {
3114 PyObject *x = PyInt_FromLong(a[i]);
3115 if (x == NULL) {
3116 Py_DECREF(l);
3117 return NULL;
3118 }
3119 PyList_SetItem(l, i, x);
3120 }
3121 for (i = 0; i < 256; i++)
3122 a[i] = 0;
3123 return l;
3124}
3125
3126PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003127_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003128{
3129#ifndef DXPAIRS
3130 return getarray(dxp);
3131#else
3132 int i;
3133 PyObject *l = PyList_New(257);
3134 if (l == NULL) return NULL;
3135 for (i = 0; i < 257; i++) {
3136 PyObject *x = getarray(dxpairs[i]);
3137 if (x == NULL) {
3138 Py_DECREF(l);
3139 return NULL;
3140 }
3141 PyList_SetItem(l, i, x);
3142 }
3143 return l;
3144#endif
3145}
3146
3147#endif