blob: 40b5738774923d495f0ac4c1ecce914eb00ad78f [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 *);
69static int import_from(PyObject *, PyObject *, PyObject *);
70static PyObject *build_class(PyObject *, PyObject *, PyObject *);
71static int exec_statement(PyFrameObject *,
72 PyObject *, PyObject *, PyObject *);
73static PyObject *find_from_args(PyFrameObject *, int);
74static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
75static void reset_exc_info(PyThreadState *);
Guido van Rossum374a9221991-04-04 10:40:29 +000076
77
Guido van Rossum950361c1997-01-24 13:49:28 +000078/* Dynamic execution profile */
79#ifdef DYNAMIC_EXECUTION_PROFILE
80#ifdef DXPAIRS
81static long dxpairs[257][256];
82#define dxp dxpairs[256]
83#else
84static long dxp[256];
85#endif
86#endif
87
88
Guido van Rossume59214e1994-08-30 08:01:59 +000089#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000090
Guido van Rossum2571cc81999-04-07 16:07:23 +000091#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000093#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000094#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000095
Guido van Rossuma027efa1997-05-05 20:56:21 +000096extern int _PyThread_Started; /* Flag for Py_Exit */
97
Guido van Rossum65d5b571998-12-21 19:32:43 +000098static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +000099static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100
101void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000102PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000105 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000106 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000107 interpreter_lock = PyThread_allocate_lock();
108 PyThread_acquire_lock(interpreter_lock, 1);
109 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000112void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000113PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000115 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000116}
117
118void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000121 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122}
123
124void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000126{
127 if (tstate == NULL)
128 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000129 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000130 if (PyThreadState_Swap(tstate) != NULL)
131 Py_FatalError(
132 "PyEval_AcquireThread: non-NULL old thread state");
133}
134
135void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000137{
138 if (tstate == NULL)
139 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
140 if (PyThreadState_Swap(NULL) != tstate)
141 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000142 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000143}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144#endif
145
Guido van Rossumff4949e1992-08-05 19:58:53 +0000146/* Functions save_thread and restore_thread are always defined so
147 dynamically loaded modules needn't be compiled separately for use
148 with and without threads: */
149
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000150PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000151PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000153 PyThreadState *tstate = PyThreadState_Swap(NULL);
154 if (tstate == NULL)
155 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000156#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000157 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000158 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000159#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000160 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000161}
162
163void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000164PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000166 if (tstate == NULL)
167 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000168#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000169 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000170 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000171 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173 }
174#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000175 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176}
177
178
Guido van Rossuma9672091994-09-14 13:31:22 +0000179/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
180 signal handlers or Mac I/O completion routines) can schedule calls
181 to a function to be called synchronously.
182 The synchronous function is called with one void* argument.
183 It should return 0 for success or -1 for failure -- failure should
184 be accompanied by an exception.
185
186 If registry succeeds, the registry function returns 0; if it fails
187 (e.g. due to too many pending calls) it returns -1 (without setting
188 an exception condition).
189
190 Note that because registry may occur from within signal handlers,
191 or other asynchronous events, calling malloc() is unsafe!
192
193#ifdef WITH_THREAD
194 Any thread can schedule pending calls, but only the main thread
195 will execute them.
196#endif
197
198 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
199 There are two possible race conditions:
200 (1) nested asynchronous registry calls;
201 (2) registry calls made while pending calls are being processed.
202 While (1) is very unlikely, (2) is a real possibility.
203 The current code is safe against (2), but not against (1).
204 The safety against (2) is derived from the fact that only one
205 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000206
Guido van Rossuma027efa1997-05-05 20:56:21 +0000207 XXX Darn! With the advent of thread state, we should have an array
208 of pending calls per thread in the thread state! Later...
209*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000210
Guido van Rossuma9672091994-09-14 13:31:22 +0000211#define NPENDINGCALLS 32
212static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000213 int (*func)(void *);
214 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000215} pendingcalls[NPENDINGCALLS];
216static volatile int pendingfirst = 0;
217static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000218static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000219
220int
Thomas Wouters334fb892000-07-25 12:56:38 +0000221Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000222{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000223 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000224 int i, j;
225 /* XXX Begin critical section */
226 /* XXX If you want this to be safe against nested
227 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000228 if (busy)
229 return -1;
230 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000231 i = pendinglast;
232 j = (i + 1) % NPENDINGCALLS;
233 if (j == pendingfirst)
234 return -1; /* Queue full */
235 pendingcalls[i].func = func;
236 pendingcalls[i].arg = arg;
237 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000238 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000239 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240 /* XXX End critical section */
241 return 0;
242}
243
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245Py_MakePendingCalls(void)
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#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000249 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000250 return 0;
251#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000252 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 return 0;
254 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000255 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 for (;;) {
257 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000258 int (*func)(void *);
259 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000260 i = pendingfirst;
261 if (i == pendinglast)
262 break; /* Queue empty */
263 func = pendingcalls[i].func;
264 arg = pendingcalls[i].arg;
265 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 if (func(arg) < 0) {
267 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000268 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000270 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000271 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000273 return 0;
274}
275
276
Guido van Rossum374a9221991-04-04 10:40:29 +0000277/* Status code for main loop (reason for stack unwind) */
278
279enum why_code {
280 WHY_NOT, /* No error */
281 WHY_EXCEPTION, /* Exception occurred */
282 WHY_RERAISE, /* Exception re-raised by 'finally' */
283 WHY_RETURN, /* 'return' statement */
284 WHY_BREAK /* 'break' statement */
285};
286
Tim Petersdbd9ba62000-07-09 03:09:57 +0000287static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
288static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000289
Guido van Rossum374a9221991-04-04 10:40:29 +0000290
Guido van Rossumb209a111997-04-29 18:18:01 +0000291PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000292PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293{
294 return eval_code2(co,
295 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000296 (PyObject **)NULL, 0,
297 (PyObject **)NULL, 0,
298 (PyObject **)NULL, 0,
299 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000300}
301
302
303/* Interpreter main loop */
304
Guido van Rossum8861b741996-07-30 16:49:37 +0000305#ifndef MAX_RECURSION_DEPTH
306#define MAX_RECURSION_DEPTH 10000
307#endif
308
Guido van Rossumb209a111997-04-29 18:18:01 +0000309static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000310eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
311 PyObject **args, int argcount, PyObject **kws, int kwcount,
312 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000313{
Guido van Rossum950361c1997-01-24 13:49:28 +0000314#ifdef DXPAIRS
315 int lastopcode = 0;
316#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000317 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000318 register int opcode=0; /* Current opcode */
319 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000320 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000321 register enum why_code why; /* Reason for block stack unwind */
322 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000323 register PyObject *x; /* Result object -- NULL if error */
324 register PyObject *v; /* Temporary objects popped off stack */
325 register PyObject *w;
326 register PyObject *u;
327 register PyObject *t;
328 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000329 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000330 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000331 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000332 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000333#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000334 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000335#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000336#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000337 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000338 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000339#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000340
341/* Code access macros */
342
343#define GETCONST(i) Getconst(f, i)
344#define GETNAME(i) Getname(f, i)
345#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000346#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000347#define NEXTOP() (*next_instr++)
348#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000349#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000350#define JUMPBY(x) (next_instr += (x))
351
352/* Stack manipulation macros */
353
354#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
355#define EMPTY() (STACK_LEVEL() == 0)
356#define TOP() (stack_pointer[-1])
357#define BASIC_PUSH(v) (*stack_pointer++ = (v))
358#define BASIC_POP() (*--stack_pointer)
359
Guido van Rossum96a42c81992-01-12 02:29:51 +0000360#ifdef LLTRACE
361#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
362#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000363#else
364#define PUSH(v) BASIC_PUSH(v)
365#define POP() BASIC_POP()
366#endif
367
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368/* Local variable macros */
369
370#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000371#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000372 GETLOCAL(i) = value; } while (0)
373
Guido van Rossuma027efa1997-05-05 20:56:21 +0000374/* Start of code */
375
Guido van Rossum8861b741996-07-30 16:49:37 +0000376#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000377 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000378 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000379 return NULL;
380 }
381#endif
382
Guido van Rossum681d79a1995-07-18 14:51:37 +0000383 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000384 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000385 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000386 }
387
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000388#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000389 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000390#endif
391
Guido van Rossumb209a111997-04-29 18:18:01 +0000392 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000393 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000394 co, /*code*/
395 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000396 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000397 if (f == NULL)
398 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000399
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000401 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000402
403 if (co->co_argcount > 0 ||
404 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
405 int i;
406 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000407 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000408 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000409 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000410 if (kwdict == NULL)
411 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000412 i = co->co_argcount;
413 if (co->co_flags & CO_VARARGS)
414 i++;
415 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000416 }
417 if (argcount > co->co_argcount) {
418 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000419 PyErr_Format(PyExc_TypeError,
420 "too many arguments; expected %d, got %d",
421 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422 goto fail;
423 }
424 n = co->co_argcount;
425 }
426 for (i = 0; i < n; i++) {
427 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 SETLOCAL(i, x);
430 }
431 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000432 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000433 if (u == NULL)
434 goto fail;
435 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 for (i = n; i < argcount; i++) {
437 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000438 Py_INCREF(x);
439 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000441 }
442 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000443 PyObject *keyword = kws[2*i];
444 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000446 if (keyword == NULL || !PyString_Check(keyword)) {
447 PyErr_SetString(PyExc_TypeError,
448 "keywords must be strings");
449 goto fail;
450 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 /* XXX slow -- speed up using dictionary? */
452 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000453 PyObject *nm = PyTuple_GET_ITEM(
454 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000455 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000456 break;
457 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000458 /* Check errors from Compare */
459 if (PyErr_Occurred())
460 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 if (j >= co->co_argcount) {
462 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000463 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000464 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000465 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 goto fail;
467 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000468 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 }
470 else {
471 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000472 PyErr_Format(PyExc_TypeError,
473 "keyword parameter redefined: %.400s",
474 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 goto fail;
476 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 SETLOCAL(j, value);
479 }
480 }
481 if (argcount < co->co_argcount) {
482 int m = co->co_argcount - defcount;
483 for (i = argcount; i < m; i++) {
484 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000485 PyErr_Format(PyExc_TypeError,
486 "not enough arguments; expected %d, got %d",
487 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 goto fail;
489 }
490 }
491 if (n > m)
492 i = n - m;
493 else
494 i = 0;
495 for (; i < defcount; i++) {
496 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000497 PyObject *def = defs[i];
498 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 SETLOCAL(m+i, def);
500 }
501 }
502 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 }
504 else {
505 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000506 PyErr_SetString(PyExc_TypeError,
507 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000508 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 }
510 }
511
Guido van Rossuma027efa1997-05-05 20:56:21 +0000512 if (tstate->sys_tracefunc != NULL) {
513 /* tstate->sys_tracefunc, if defined, is a function that
514 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000515 Its return value, if not None, is a function that
516 will be called at the start of each executed line
517 of code. (Actually, the function must return
518 itself in order to continue tracing.)
519 The trace functions are called with three arguments:
520 a pointer to the current frame, a string indicating
521 why the function is called, and an argument which
522 depends on the situation. The global trace function
523 (sys.trace) is also called whenever an exception
524 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000525 if (call_trace(&tstate->sys_tracefunc,
526 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000527 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000528 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000529 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000530 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000531 }
532
Guido van Rossuma027efa1997-05-05 20:56:21 +0000533 if (tstate->sys_profilefunc != NULL) {
534 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000535 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000536 if (call_trace(&tstate->sys_profilefunc,
537 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000538 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000539 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000540 }
541 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000542
Guido van Rossuma027efa1997-05-05 20:56:21 +0000543 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
544 --tstate->recursion_depth;
545 PyErr_SetString(PyExc_RuntimeError,
546 "Maximum recursion depth exceeded");
547 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000548 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000549 return NULL;
550 }
551
Guido van Rossumd076c731998-10-07 19:42:25 +0000552 _PyCode_GETCODEPTR(co, &first_instr);
553 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000554 stack_pointer = f->f_valuestack;
555
Guido van Rossum374a9221991-04-04 10:40:29 +0000556 why = WHY_NOT;
557 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000558 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000559
560 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000561 /* Do periodic things. Doing this every time through
562 the loop would add too much overhead, so we do it
563 only every Nth instruction. We also do it if
564 ``things_to_do'' is set, i.e. when an asynchronous
565 event needs attention (e.g. a signal handler or
566 async I/O handler); see Py_AddPendingCall() and
567 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000568
Guido van Rossuma027efa1997-05-05 20:56:21 +0000569 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000570 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000572 if (Py_MakePendingCalls() < 0) {
573 why = WHY_EXCEPTION;
574 goto on_error;
575 }
576 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000577#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000578 /* If we have true signals, the signal handler
579 will call Py_AddPendingCall() so we don't
580 have to call sigcheck(). On the Mac and
581 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000582 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000583 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 goto on_error;
585 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000586#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587
Guido van Rossume59214e1994-08-30 08:01:59 +0000588#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589 if (interpreter_lock) {
590 /* Give another thread a chance */
591
Guido van Rossum25ce5661997-08-02 03:10:38 +0000592 if (PyThreadState_Swap(NULL) != tstate)
593 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000594 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000595
596 /* Other threads may run now */
597
Guido van Rossum65d5b571998-12-21 19:32:43 +0000598 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000599 if (PyThreadState_Swap(tstate) != NULL)
600 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000601 }
602#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000604
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000606
Guido van Rossum408027e1996-12-30 16:17:54 +0000607#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000608 f->f_lasti = INSTR_OFFSET();
609#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000610
611 opcode = NEXTOP();
612 if (HAS_ARG(opcode))
613 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000614#ifdef DYNAMIC_EXECUTION_PROFILE
615#ifdef DXPAIRS
616 dxpairs[lastopcode][opcode]++;
617 lastopcode = opcode;
618#endif
619 dxp[opcode]++;
620#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000621
Guido van Rossum96a42c81992-01-12 02:29:51 +0000622#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000623 /* Instruction tracing */
624
Guido van Rossum96a42c81992-01-12 02:29:51 +0000625 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 if (HAS_ARG(opcode)) {
627 printf("%d: %d, %d\n",
628 (int) (INSTR_OFFSET() - 3),
629 opcode, oparg);
630 }
631 else {
632 printf("%d: %d\n",
633 (int) (INSTR_OFFSET() - 1), opcode);
634 }
635 }
636#endif
637
638 /* Main switch on opcode */
639
640 switch (opcode) {
641
642 /* BEWARE!
643 It is essential that any operation that fails sets either
644 x to NULL, err to nonzero, or why to anything but WHY_NOT,
645 and that no operation that succeeds does this! */
646
647 /* case STOP_CODE: this is an error! */
648
649 case POP_TOP:
650 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000651 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000652 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000653
654 case ROT_TWO:
655 v = POP();
656 w = POP();
657 PUSH(v);
658 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000659 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000660
661 case ROT_THREE:
662 v = POP();
663 w = POP();
664 x = POP();
665 PUSH(v);
666 PUSH(x);
667 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000668 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000669
670 case DUP_TOP:
671 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000672 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000674 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000675
676 case UNARY_POSITIVE:
677 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000678 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000679 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000681 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 break;
683
684 case UNARY_NEGATIVE:
685 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000686 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000687 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000689 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 break;
691
692 case UNARY_NOT:
693 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000694 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000695 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000696 if (err == 0) {
697 Py_INCREF(Py_True);
698 PUSH(Py_True);
699 continue;
700 }
701 else if (err > 0) {
702 Py_INCREF(Py_False);
703 PUSH(Py_False);
704 err = 0;
705 continue;
706 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 break;
708
709 case UNARY_CONVERT:
710 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000711 x = PyObject_Repr(v);
712 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000714 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000716
717 case UNARY_INVERT:
718 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000719 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000720 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000721 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000722 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000723 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000724
Guido van Rossum50564e81996-01-12 01:13:16 +0000725 case BINARY_POWER:
726 w = POP();
727 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000728 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000729 Py_DECREF(v);
730 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000731 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000732 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000733 break;
734
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 case BINARY_MULTIPLY:
736 w = POP();
737 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000738 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000739 Py_DECREF(v);
740 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000741 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000742 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 break;
744
745 case BINARY_DIVIDE:
746 w = POP();
747 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000748 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000749 Py_DECREF(v);
750 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000752 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 break;
754
755 case BINARY_MODULO:
756 w = POP();
757 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000758 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000759 Py_DECREF(v);
760 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000762 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000763 break;
764
765 case BINARY_ADD:
766 w = POP();
767 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000768 if (PyInt_Check(v) && PyInt_Check(w)) {
769 /* INLINE: int + int */
770 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000771 a = PyInt_AS_LONG(v);
772 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000773 i = a + b;
774 if ((i^a) < 0 && (i^b) < 0) {
775 PyErr_SetString(PyExc_OverflowError,
776 "integer addition");
777 x = NULL;
778 }
779 else
780 x = PyInt_FromLong(i);
781 }
782 else
783 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000784 Py_DECREF(v);
785 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000786 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000787 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 break;
789
790 case BINARY_SUBTRACT:
791 w = POP();
792 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000793 if (PyInt_Check(v) && PyInt_Check(w)) {
794 /* INLINE: int - int */
795 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000796 a = PyInt_AS_LONG(v);
797 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000798 i = a - b;
799 if ((i^a) < 0 && (i^~b) < 0) {
800 PyErr_SetString(PyExc_OverflowError,
801 "integer subtraction");
802 x = NULL;
803 }
804 else
805 x = PyInt_FromLong(i);
806 }
807 else
808 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000809 Py_DECREF(v);
810 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000811 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000812 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 break;
814
815 case BINARY_SUBSCR:
816 w = POP();
817 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000818 if (PyList_Check(v) && PyInt_Check(w)) {
819 /* INLINE: list[int] */
820 long i = PyInt_AsLong(w);
821 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000822 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000823 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000824 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000825 PyErr_SetString(PyExc_IndexError,
826 "list index out of range");
827 x = NULL;
828 }
829 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000830 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000831 Py_INCREF(x);
832 }
833 }
834 else
835 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000836 Py_DECREF(v);
837 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 break;
841
Guido van Rossum7928cd71991-10-24 14:59:31 +0000842 case BINARY_LSHIFT:
843 w = POP();
844 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000845 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000846 Py_DECREF(v);
847 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000850 break;
851
852 case BINARY_RSHIFT:
853 w = POP();
854 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(v);
857 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000858 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000859 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000860 break;
861
862 case BINARY_AND:
863 w = POP();
864 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000865 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000866 Py_DECREF(v);
867 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000868 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000870 break;
871
872 case BINARY_XOR:
873 w = POP();
874 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000875 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000876 Py_DECREF(v);
877 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000879 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 break;
881
882 case BINARY_OR:
883 w = POP();
884 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000885 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000886 Py_DECREF(v);
887 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000888 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000889 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 break;
891
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 case SLICE+0:
893 case SLICE+1:
894 case SLICE+2:
895 case SLICE+3:
896 if ((opcode-SLICE) & 2)
897 w = POP();
898 else
899 w = NULL;
900 if ((opcode-SLICE) & 1)
901 v = POP();
902 else
903 v = NULL;
904 u = POP();
905 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000906 Py_DECREF(u);
907 Py_XDECREF(v);
908 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000910 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 break;
912
913 case STORE_SLICE+0:
914 case STORE_SLICE+1:
915 case STORE_SLICE+2:
916 case STORE_SLICE+3:
917 if ((opcode-STORE_SLICE) & 2)
918 w = POP();
919 else
920 w = NULL;
921 if ((opcode-STORE_SLICE) & 1)
922 v = POP();
923 else
924 v = NULL;
925 u = POP();
926 t = POP();
927 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 Py_DECREF(t);
929 Py_DECREF(u);
930 Py_XDECREF(v);
931 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000932 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 break;
934
935 case DELETE_SLICE+0:
936 case DELETE_SLICE+1:
937 case DELETE_SLICE+2:
938 case DELETE_SLICE+3:
939 if ((opcode-DELETE_SLICE) & 2)
940 w = POP();
941 else
942 w = NULL;
943 if ((opcode-DELETE_SLICE) & 1)
944 v = POP();
945 else
946 v = NULL;
947 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000948 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 Py_DECREF(u);
951 Py_XDECREF(v);
952 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000953 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 break;
955
956 case STORE_SUBSCR:
957 w = POP();
958 v = POP();
959 u = POP();
960 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000961 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(u);
963 Py_DECREF(v);
964 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000965 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 break;
967
968 case DELETE_SUBSCR:
969 w = POP();
970 v = POP();
971 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000972 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000973 Py_DECREF(v);
974 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000975 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 break;
977
978 case PRINT_EXPR:
979 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000980 /* Print value except if None */
981 /* After printing, also assign to '_' */
982 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +0000983 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000984 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000985 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000986 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +0000987 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000988 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +0000989 if (x == NULL) {
990 PyErr_SetString(
991 PyExc_RuntimeError,
992 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +0000993 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +0000994 }
Guido van Rossumbe270261997-05-22 22:26:18 +0000995 }
996 if (err == 0)
997 err = PyFile_WriteObject(v, x, 0);
998 if (err == 0) {
999 PyFile_SoftSpace(x, 1);
1000 err = Py_FlushLine();
1001 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001002 if (err == 0) {
1003 err = PyDict_SetItemString(
1004 f->f_builtins, "_", v);
1005 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001007 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 break;
1009
1010 case PRINT_ITEM:
1011 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001012 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001013 if (w == NULL) {
1014 PyErr_SetString(PyExc_RuntimeError,
1015 "lost sys.stdout");
1016 err = -1;
1017 }
1018 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001019 err = PyFile_WriteString(" ", w);
1020 if (err == 0)
1021 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001022 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001023 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 char *s = PyString_AsString(v);
1025 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001026 if (len > 0 &&
1027 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001028 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001032 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 break;
1034
1035 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001036 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001037 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001038 PyErr_SetString(PyExc_RuntimeError,
1039 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001040 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001041 err = PyFile_WriteString("\n", x);
1042 if (err == 0)
1043 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001044 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 break;
1046
1047 case BREAK_LOOP:
1048 why = WHY_BREAK;
1049 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001050
Guido van Rossumf10570b1995-07-07 22:53:21 +00001051 case RAISE_VARARGS:
1052 u = v = w = NULL;
1053 switch (oparg) {
1054 case 3:
1055 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001056 /* Fallthrough */
1057 case 2:
1058 v = POP(); /* value */
1059 /* Fallthrough */
1060 case 1:
1061 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001062 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001063 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001064 break;
1065 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001066 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001067 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001069 break;
1070 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 break;
1072
1073 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001074 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001075 PyErr_SetString(PyExc_SystemError,
1076 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001077 break;
1078 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001079 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001080 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001081 break;
1082
1083 case RETURN_VALUE:
1084 retval = POP();
1085 why = WHY_RETURN;
1086 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001087
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001088 case EXEC_STMT:
1089 w = POP();
1090 v = POP();
1091 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001092 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001093 Py_DECREF(u);
1094 Py_DECREF(v);
1095 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001096 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001097
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 case POP_BLOCK:
1099 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001100 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 while (STACK_LEVEL() > b->b_level) {
1102 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001103 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001104 }
1105 }
1106 break;
1107
1108 case END_FINALLY:
1109 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001110 if (PyInt_Check(v)) {
1111 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001112 if (why == WHY_RETURN)
1113 retval = POP();
1114 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001117 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001118 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001120 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001122 else if (v != Py_None) {
1123 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 "'finally' pops bad exception");
1125 why = WHY_EXCEPTION;
1126 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001127 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 break;
1129
1130 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001131 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001133 w = POP();
1134 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001136 Py_DECREF(u);
1137 Py_DECREF(v);
1138 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 break;
1140
1141 case STORE_NAME:
1142 w = GETNAMEV(oparg);
1143 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001144 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001145 PyErr_SetString(PyExc_SystemError,
1146 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001147 break;
1148 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001149 err = PyDict_SetItem(x, w, v);
1150 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 break;
1152
1153 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001154 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001155 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001156 PyErr_SetString(PyExc_SystemError,
1157 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001158 break;
1159 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001160 if ((err = PyDict_DelItem(x, w)) != 0)
1161 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001163
1164#ifdef CASE_TOO_BIG
1165 default: switch (opcode) {
1166#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001167
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001168 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001170 if (PyTuple_Check(v)) {
1171 if (PyTuple_Size(v) != oparg) {
1172 PyErr_SetString(PyExc_ValueError,
1173 "unpack tuple of wrong size");
1174 why = WHY_EXCEPTION;
1175 }
1176 else {
1177 for (; --oparg >= 0; ) {
1178 w = PyTuple_GET_ITEM(v, oparg);
1179 Py_INCREF(w);
1180 PUSH(w);
1181 }
1182 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001184 else if (PyList_Check(v)) {
1185 if (PyList_Size(v) != oparg) {
1186 PyErr_SetString(PyExc_ValueError,
1187 "unpack list of wrong size");
1188 why = WHY_EXCEPTION;
1189 }
1190 else {
1191 for (; --oparg >= 0; ) {
1192 w = PyList_GET_ITEM(v, oparg);
1193 Py_INCREF(w);
1194 PUSH(w);
1195 }
1196 }
1197 }
1198 else if (PySequence_Check(v)) {
1199 if (unpack_sequence(v, oparg,
1200 stack_pointer + oparg))
1201 stack_pointer += oparg;
1202 else
1203 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 }
1205 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001206 PyErr_SetString(PyExc_TypeError,
1207 "unpack non-sequence");
1208 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001210 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 break;
1212
1213 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001214 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 v = POP();
1216 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001217 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1218 Py_DECREF(v);
1219 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 break;
1221
1222 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001223 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001225 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1226 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 break;
1229
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001230 case STORE_GLOBAL:
1231 w = GETNAMEV(oparg);
1232 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 err = PyDict_SetItem(f->f_globals, w, v);
1234 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001235 break;
1236
1237 case DELETE_GLOBAL:
1238 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1240 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001241 break;
1242
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 case LOAD_CONST:
1244 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001245 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 PUSH(x);
1247 break;
1248
1249 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001250 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001251 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001252 PyErr_SetString(PyExc_SystemError,
1253 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001254 break;
1255 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001256 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001257 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001258 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001262 PyErr_SetObject(
1263 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
1265 }
1266 }
1267 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001268 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 PUSH(x);
1270 break;
1271
1272 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001273 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 break;
1280 }
1281 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 PUSH(x);
1284 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001285
Guido van Rossum9bfef441993-03-29 10:43:31 +00001286 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001287 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001288 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001289 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001291 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001292 break;
1293 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001295 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001296 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001297 break;
1298
1299 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001300 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001301 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001302 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001303
1304 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001305 x = GETLOCAL(oparg);
1306 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001307 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001308 PyTuple_GetItem(co->co_varnames,
1309 oparg));
1310 break;
1311 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001312 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001313 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001314
1315 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 if (x != NULL) {
1318 for (; --oparg >= 0;) {
1319 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 }
1322 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 }
1325 break;
1326
1327 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 if (x != NULL) {
1330 for (; --oparg >= 0;) {
1331 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001332 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 }
1334 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001335 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 }
1337 break;
1338
1339 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001340 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001342 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 break;
1344
1345 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001346 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001348 x = PyObject_GetAttr(v, w);
1349 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001351 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 break;
1353
1354 case COMPARE_OP:
1355 w = POP();
1356 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001357 if (PyInt_Check(v) && PyInt_Check(w)) {
1358 /* INLINE: cmp(int, int) */
1359 register long a, b;
1360 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001361 a = PyInt_AS_LONG(v);
1362 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001363 switch (oparg) {
1364 case LT: res = a < b; break;
1365 case LE: res = a <= b; break;
1366 case EQ: res = a == b; break;
1367 case NE: res = a != b; break;
1368 case GT: res = a > b; break;
1369 case GE: res = a >= b; break;
1370 case IS: res = v == w; break;
1371 case IS_NOT: res = v != w; break;
1372 default: goto slow_compare;
1373 }
1374 x = res ? Py_True : Py_False;
1375 Py_INCREF(x);
1376 }
1377 else {
1378 slow_compare:
1379 x = cmp_outcome(oparg, v, w);
1380 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001381 Py_DECREF(v);
1382 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001384 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 break;
1386
1387 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001388 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001389 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001390 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001391 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001392 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001393 break;
1394 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001395 u = find_from_args(f, INSTR_OFFSET());
1396 if (u == NULL) {
1397 x = u;
1398 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001399 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001400 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001401 w,
1402 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001403 f->f_locals == NULL ?
1404 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001405 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001406 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407 if (w == NULL) {
1408 x = NULL;
1409 break;
1410 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001411 x = PyEval_CallObject(x, w);
1412 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001413 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001414 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 break;
1416
1417 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001418 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001419 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001422 PyErr_SetString(PyExc_SystemError,
1423 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001424 break;
1425 }
1426 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001428 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001430
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 case JUMP_FORWARD:
1432 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001433 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001434
1435 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001437 if (err > 0)
1438 err = 0;
1439 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001441 else
1442 break;
1443 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001444
1445 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001446 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001447 if (err > 0) {
1448 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001450 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001451 else if (err == 0)
1452 ;
1453 else
1454 break;
1455 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001456
1457 case JUMP_ABSOLUTE:
1458 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001459 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460
1461 case FOR_LOOP:
1462 /* for v in s: ...
1463 On entry: stack contains s, i.
1464 On exit: stack contains s, i+1, s[i];
1465 but if loop exhausted:
1466 s, i are popped, and we jump */
1467 w = POP(); /* Loop index */
1468 v = POP(); /* Sequence object */
1469 u = loop_subscript(v, w);
1470 if (u != NULL) {
1471 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001472 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001476 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 }
1478 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 Py_DECREF(v);
1480 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 /* A NULL can mean "s exhausted"
1482 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001485 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001487 continue;
1488 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 }
1490 break;
1491
1492 case SETUP_LOOP:
1493 case SETUP_EXCEPT:
1494 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001497 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001498
1499 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001500#ifdef LLTRACE
1501 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001502 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001504 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001505 if (f->f_trace == NULL)
1506 continue;
1507 /* Trace each line of code reached */
1508 f->f_lasti = INSTR_OFFSET();
1509 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512
1513 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001514 case CALL_FUNCTION_VAR:
1515 case CALL_FUNCTION_KW:
1516 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001517 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001518 int na = oparg & 0xff;
1519 int nk = (oparg>>8) & 0xff;
1520 int flags = (opcode - CALL_FUNCTION) & 3;
1521 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1522 PyObject **pfunc = stack_pointer - n - 1;
1523 PyObject *func = *pfunc;
1524 PyObject *self = NULL;
1525 PyObject *class = NULL;
1526 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1527 if (PyMethod_Check(func)) {
1528 self = PyMethod_Self(func);
1529 class = PyMethod_Class(func);
1530 func = PyMethod_Function(func);
1531 Py_INCREF(func);
1532 if (self != NULL) {
1533 Py_INCREF(self);
1534 Py_DECREF(*pfunc);
1535 *pfunc = self;
1536 na++;
1537 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001538 }
1539 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001540 /* Unbound methods must be called with an
1541 instance of the class (or a derived
1542 class) as first argument */
1543 if (na > 0 && (self = stack_pointer[-n]) != NULL
1544 && PyInstance_Check(self)
1545 && PyClass_IsSubclass((PyObject *)
1546 (((PyInstanceObject *)self)->in_class),
1547 class))
1548 /* Handy-dandy */ ;
1549 else {
1550 PyErr_SetString(PyExc_TypeError,
1551 "unbound method must be called with class instance 1st argument");
1552 x = NULL;
1553 break;
1554 }
1555 }
1556 }
1557 else
1558 Py_INCREF(func);
1559 if (PyFunction_Check(func) && flags == 0) {
1560 PyObject *co = PyFunction_GetCode(func);
1561 PyObject *globals = PyFunction_GetGlobals(func);
1562 PyObject *argdefs = PyFunction_GetDefaults(func);
1563 PyObject **d;
1564 int nd;
1565 if (argdefs != NULL) {
1566 d = &PyTuple_GET_ITEM(argdefs, 0);
1567 nd = ((PyTupleObject *)argdefs)->ob_size;
1568 }
1569 else {
1570 d = NULL;
1571 nd = 0;
1572 }
1573 x = eval_code2((PyCodeObject *)co, globals,
1574 (PyObject *)NULL, stack_pointer-n, na,
1575 stack_pointer-2*nk, nk, d, nd,
1576 class);
1577 }
1578 else {
1579 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001580 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001581 PyObject *stararg = 0;
1582 PyObject *kwdict = NULL;
1583 if (flags & 2) {
1584 kwdict = POP();
1585 if (!PyDict_Check(kwdict)) {
1586 PyErr_SetString(PyExc_TypeError,
1587 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001588 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001589 }
1590 }
1591 if (flags & 1) {
1592 stararg = POP();
1593 if (!PySequence_Check(stararg)) {
1594 PyErr_SetString(PyExc_TypeError,
1595 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001596 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001597 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001598 /* Convert abstract sequence to concrete tuple */
1599 if (!PyTuple_Check(stararg)) {
1600 PyObject *t = NULL;
1601 t = PySequence_Tuple(stararg);
1602 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001603 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001604 }
1605 Py_DECREF(stararg);
1606 stararg = t;
1607 }
1608 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001609 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001610 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001611 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 }
1613 if (nk > 0) {
1614 if (kwdict == NULL) {
1615 kwdict = PyDict_New();
1616 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001617 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001619 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001620 else {
1621 PyObject *d = PyDict_Copy(kwdict);
1622 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001623 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001624 }
1625 Py_DECREF(kwdict);
1626 kwdict = d;
1627 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001628 err = 0;
1629 while (--nk >= 0) {
1630 PyObject *value = POP();
1631 PyObject *key = POP();
1632 if (PyDict_GetItem(kwdict, key) != NULL) {
1633 err = 1;
1634 PyErr_Format(PyExc_TypeError,
1635 "keyword parameter redefined: %.400s",
1636 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001637 Py_DECREF(key);
1638 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001639 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001640 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001641 err = PyDict_SetItem(kwdict, key, value);
1642 Py_DECREF(key);
1643 Py_DECREF(value);
1644 if (err)
1645 break;
1646 }
1647 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001648 extcall_fail:
1649 Py_XDECREF(kwdict);
1650 Py_XDECREF(stararg);
1651 Py_DECREF(func);
1652 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001653 break;
1654 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001655 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001656 callargs = PyTuple_New(na + nstar);
1657 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001658 x = NULL;
1659 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001660 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001661 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001662 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001663 for (i = 0; i < nstar; i++) {
1664 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1665 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001666 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001667 }
1668 Py_DECREF(stararg);
1669 }
1670 while (--na >= 0) {
1671 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001672 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001673 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001674 x = PyEval_CallObjectWithKeywords(func,
1675 callargs,
1676 kwdict);
1677 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001678 Py_XDECREF(kwdict);
1679 }
1680 Py_DECREF(func);
1681 while (stack_pointer > pfunc) {
1682 w = POP();
1683 Py_DECREF(w);
1684 }
1685 PUSH(x);
1686 if (x != NULL) continue;
1687 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001688 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001689
Guido van Rossum681d79a1995-07-18 14:51:37 +00001690 case MAKE_FUNCTION:
1691 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 x = PyFunction_New(v, f->f_globals);
1693 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001694 /* XXX Maybe this should be a separate opcode? */
1695 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001697 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001699 x = NULL;
1700 break;
1701 }
1702 while (--oparg >= 0) {
1703 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001704 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001705 }
1706 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001708 }
1709 PUSH(x);
1710 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001711
1712 case BUILD_SLICE:
1713 if (oparg == 3)
1714 w = POP();
1715 else
1716 w = NULL;
1717 v = POP();
1718 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001719 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 Py_DECREF(u);
1721 Py_DECREF(v);
1722 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001723 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001724 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001725 break;
1726
1727
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 default:
1729 fprintf(stderr,
1730 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001731 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 why = WHY_EXCEPTION;
1734 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001735
1736#ifdef CASE_TOO_BIG
1737 }
1738#endif
1739
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 } /* switch */
1741
1742 on_error:
1743
1744 /* Quickly continue if no error occurred */
1745
1746 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001747 if (err == 0 && x != NULL) {
1748#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001749 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001751 fprintf(stderr,
1752 "XXX undetected error\n");
1753 else
1754#endif
1755 continue; /* Normal, fast path */
1756 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 err = 0;
1760 }
1761
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 /* Double-check exception status */
1763
1764 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001766 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001767 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 why = WHY_EXCEPTION;
1769 }
1770 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001771#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001773 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001775 fprintf(stderr,
1776 "XXX undetected error (why=%d)\n",
1777 why);
1778 why = WHY_EXCEPTION;
1779 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 }
1781#endif
1782
1783 /* Log traceback info if this is a real exception */
1784
1785 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001786 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001788 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001789 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001790
Guido van Rossume59214e1994-08-30 08:01:59 +00001791 if (f->f_trace)
1792 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001793 if (tstate->sys_profilefunc)
1794 call_exc_trace(&tstate->sys_profilefunc,
1795 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001796 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001797
1798 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1799
1800 if (why == WHY_RERAISE)
1801 why = WHY_EXCEPTION;
1802
1803 /* Unwind stacks if a (pseudo) exception occurred */
1804
1805 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 while (STACK_LEVEL() > b->b_level) {
1808 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001809 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 }
1811 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1812 why = WHY_NOT;
1813 JUMPTO(b->b_handler);
1814 break;
1815 }
1816 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001817 (b->b_type == SETUP_EXCEPT &&
1818 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 PyObject *exc, *val, *tb;
1821 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001823 val = Py_None;
1824 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001826 /* Make the raw exception data
1827 available to the handler,
1828 so a program can emulate the
1829 Python main loop. Don't do
1830 this for 'finally'. */
1831 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001832 PyErr_NormalizeException(
1833 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001834 set_exc_info(tstate,
1835 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001836 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001837 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 PUSH(val);
1839 PUSH(exc);
1840 }
1841 else {
1842 if (why == WHY_RETURN)
1843 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001845 PUSH(v);
1846 }
1847 why = WHY_NOT;
1848 JUMPTO(b->b_handler);
1849 break;
1850 }
1851 } /* unwind stack */
1852
1853 /* End the loop if we still have an error (or return) */
1854
1855 if (why != WHY_NOT)
1856 break;
1857
1858 } /* main loop */
1859
1860 /* Pop remaining stack entries */
1861
1862 while (!EMPTY()) {
1863 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 }
1866
Guido van Rossum96a42c81992-01-12 02:29:51 +00001867 if (why != WHY_RETURN)
1868 retval = NULL;
1869
Guido van Rossume59214e1994-08-30 08:01:59 +00001870 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001871 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001872 if (call_trace(&f->f_trace, &f->f_trace, f,
1873 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001875 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001876 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001877 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001878 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001879 }
1880
Guido van Rossuma027efa1997-05-05 20:56:21 +00001881 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1882 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001883 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001884 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001885 retval = NULL;
1886 why = WHY_EXCEPTION;
1887 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001888 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001889
Guido van Rossuma027efa1997-05-05 20:56:21 +00001890 reset_exc_info(tstate);
1891
1892 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001893
1894 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001895
Guido van Rossum374a9221991-04-04 10:40:29 +00001896 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001897
Guido van Rossuma027efa1997-05-05 20:56:21 +00001898 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001899 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001900
Guido van Rossum96a42c81992-01-12 02:29:51 +00001901 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001902}
1903
Guido van Rossuma027efa1997-05-05 20:56:21 +00001904static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001905set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001906{
1907 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001908 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001909
Guido van Rossuma027efa1997-05-05 20:56:21 +00001910 frame = tstate->frame;
1911 if (frame->f_exc_type == NULL) {
1912 /* This frame didn't catch an exception before */
1913 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001914 if (tstate->exc_type == NULL) {
1915 Py_INCREF(Py_None);
1916 tstate->exc_type = Py_None;
1917 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001918 tmp_type = frame->f_exc_type;
1919 tmp_value = frame->f_exc_value;
1920 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001921 Py_XINCREF(tstate->exc_type);
1922 Py_XINCREF(tstate->exc_value);
1923 Py_XINCREF(tstate->exc_traceback);
1924 frame->f_exc_type = tstate->exc_type;
1925 frame->f_exc_value = tstate->exc_value;
1926 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001927 Py_XDECREF(tmp_type);
1928 Py_XDECREF(tmp_value);
1929 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001930 }
1931 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001932 tmp_type = tstate->exc_type;
1933 tmp_value = tstate->exc_value;
1934 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001935 Py_XINCREF(type);
1936 Py_XINCREF(value);
1937 Py_XINCREF(tb);
1938 tstate->exc_type = type;
1939 tstate->exc_value = value;
1940 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001941 Py_XDECREF(tmp_type);
1942 Py_XDECREF(tmp_value);
1943 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001944 /* For b/w compatibility */
1945 PySys_SetObject("exc_type", type);
1946 PySys_SetObject("exc_value", value);
1947 PySys_SetObject("exc_traceback", tb);
1948}
1949
1950static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001951reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001952{
1953 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001954 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001955 frame = tstate->frame;
1956 if (frame->f_exc_type != NULL) {
1957 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001958 tmp_type = tstate->exc_type;
1959 tmp_value = tstate->exc_value;
1960 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001961 Py_XINCREF(frame->f_exc_type);
1962 Py_XINCREF(frame->f_exc_value);
1963 Py_XINCREF(frame->f_exc_traceback);
1964 tstate->exc_type = frame->f_exc_type;
1965 tstate->exc_value = frame->f_exc_value;
1966 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001967 Py_XDECREF(tmp_type);
1968 Py_XDECREF(tmp_value);
1969 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001970 /* For b/w compatibility */
1971 PySys_SetObject("exc_type", frame->f_exc_type);
1972 PySys_SetObject("exc_value", frame->f_exc_value);
1973 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1974 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001975 tmp_type = frame->f_exc_type;
1976 tmp_value = frame->f_exc_value;
1977 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001978 frame->f_exc_type = NULL;
1979 frame->f_exc_value = NULL;
1980 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001981 Py_XDECREF(tmp_type);
1982 Py_XDECREF(tmp_value);
1983 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001984}
1985
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001986/* Logic for the raise statement (too complicated for inlining).
1987 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001988static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001990{
Guido van Rossumd295f121998-04-09 21:39:57 +00001991 if (type == NULL) {
1992 /* Reraise */
1993 PyThreadState *tstate = PyThreadState_Get();
1994 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
1995 value = tstate->exc_value;
1996 tb = tstate->exc_traceback;
1997 Py_XINCREF(type);
1998 Py_XINCREF(value);
1999 Py_XINCREF(tb);
2000 }
2001
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002002 /* We support the following forms of raise:
2003 raise <class>, <classinstance>
2004 raise <class>, <argument tuple>
2005 raise <class>, None
2006 raise <class>, <argument>
2007 raise <classinstance>, None
2008 raise <string>, <object>
2009 raise <string>, None
2010
2011 An omitted second argument is the same as None.
2012
2013 In addition, raise <tuple>, <anything> is the same as
2014 raising the tuple's first item (and it better have one!);
2015 this rule is applied recursively.
2016
2017 Finally, an optional third argument can be supplied, which
2018 gives the traceback to be substituted (useful when
2019 re-raising an exception after examining it). */
2020
2021 /* First, check the traceback argument, replacing None with
2022 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 if (tb == Py_None) {
2024 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002025 tb = NULL;
2026 }
2027 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002028 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002029 "raise 3rd arg must be traceback or None");
2030 goto raise_error;
2031 }
2032
2033 /* Next, replace a missing value with None */
2034 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 value = Py_None;
2036 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002037 }
2038
2039 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2041 PyObject *tmp = type;
2042 type = PyTuple_GET_ITEM(type, 0);
2043 Py_INCREF(type);
2044 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002045 }
2046
Barry Warsaw4249f541997-08-22 21:26:19 +00002047 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002048 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002049
2050 else if (PyClass_Check(type))
2051 PyErr_NormalizeException(&type, &value, &tb);
2052
Guido van Rossumb209a111997-04-29 18:18:01 +00002053 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002054 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002055 if (value != Py_None) {
2056 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002057 "instance exception may not have a separate value");
2058 goto raise_error;
2059 }
2060 else {
2061 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002063 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2065 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002066 }
2067 }
2068 else {
2069 /* Not something you can raise. You get an exception
2070 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002072 "exceptions must be strings, classes, or instances");
2073 goto raise_error;
2074 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002076 if (tb == NULL)
2077 return WHY_EXCEPTION;
2078 else
2079 return WHY_RERAISE;
2080 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 Py_XDECREF(value);
2082 Py_XDECREF(type);
2083 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002084 return WHY_EXCEPTION;
2085}
2086
Barry Warsawe42b18f1997-08-25 22:13:04 +00002087static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002088unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002089{
2090 int i;
2091 PyObject *w;
2092
2093 for (i = 0; i < argcnt; i++) {
2094 if (! (w = PySequence_GetItem(v, i))) {
2095 if (PyErr_ExceptionMatches(PyExc_IndexError))
2096 PyErr_SetString(PyExc_ValueError,
2097 "unpack sequence of wrong size");
2098 goto finally;
2099 }
2100 *--sp = w;
2101 }
2102 /* we better get an IndexError now */
2103 if (PySequence_GetItem(v, i) == NULL) {
2104 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2105 PyErr_Clear();
2106 return 1;
2107 }
2108 /* some other exception occurred. fall through to finally */
2109 }
2110 else
2111 PyErr_SetString(PyExc_ValueError,
2112 "unpack sequence of wrong size");
2113 /* fall through */
2114finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002115 for (; i > 0; i--, sp++)
2116 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002117
2118 return 0;
2119}
2120
2121
Guido van Rossum96a42c81992-01-12 02:29:51 +00002122#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002123static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002124prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002126 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 if (PyObject_Print(v, stdout, 0) != 0)
2128 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002130 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002132#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002134static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002135call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002136{
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002138 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002140 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 value = Py_None;
2142 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002143 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002145 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002147 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002148 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002149 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002151 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002153 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 Py_XDECREF(type);
2155 Py_XDECREF(value);
2156 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002157 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002158}
2159
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002160/* PyObject **p_trace: in/out; may not be NULL;
2161 may not point to NULL variable initially
2162 PyObject **p_newtrace: in/out; may be NULL;
2163 may point to NULL variable;
2164 may be same variable as p_newtrace */
2165
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002166static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002167call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2168 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002169{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002170 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 PyObject *args, *what;
2172 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002173
Guido van Rossuma027efa1997-05-05 20:56:21 +00002174 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002175 /* Don't do recursive traces */
2176 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002178 *p_newtrace = NULL;
2179 }
2180 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002181 }
2182
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002184 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002185 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002187 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002188 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 Py_INCREF(f);
2190 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2191 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002192 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002193 arg = Py_None;
2194 Py_INCREF(arg);
2195 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002196 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 PyFrame_FastToLocals(f);
2198 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2199 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002200 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002201 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002202 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002203 if (res == NULL) {
2204 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 PyTraceBack_Here(f);
2206 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002207 *p_trace = NULL;
2208 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002210 *p_newtrace = NULL;
2211 }
Barry Warsawf6202631999-09-08 16:26:33 +00002212 /* to be extra double plus sure we don't get recursive
2213 * calls inf either tracefunc or profilefunc gets an
2214 * exception, zap the global variables.
2215 */
2216 Py_XDECREF(tstate->sys_tracefunc);
2217 tstate->sys_tracefunc = NULL;
2218 Py_XDECREF(tstate->sys_profilefunc);
2219 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002220 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002221 }
2222 else {
2223 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002224 Py_XDECREF(*p_newtrace);
2225 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002226 *p_newtrace = NULL;
2227 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002229 *p_newtrace = res;
2230 }
2231 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002232 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002233 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002234 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002235}
2236
Guido van Rossumb209a111997-04-29 18:18:01 +00002237PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002238PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002239{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002240 PyThreadState *tstate = PyThreadState_Get();
2241 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002242 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002243 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002244 else
2245 return current_frame->f_builtins;
2246}
2247
Guido van Rossumb209a111997-04-29 18:18:01 +00002248PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002249PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002250{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002251 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002252 if (current_frame == NULL)
2253 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002255 return current_frame->f_locals;
2256}
2257
Guido van Rossumb209a111997-04-29 18:18:01 +00002258PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002259PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002261 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262 if (current_frame == NULL)
2263 return NULL;
2264 else
2265 return current_frame->f_globals;
2266}
2267
Guido van Rossumb209a111997-04-29 18:18:01 +00002268PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002269PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002270{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002271 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002272 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002273}
2274
Guido van Rossum6135a871995-01-09 17:53:26 +00002275int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002276PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002277{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002278 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002279 return current_frame == NULL ? 0 : current_frame->f_restricted;
2280}
2281
Guido van Rossumbe270261997-05-22 22:26:18 +00002282int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002283Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284{
Guido van Rossumb209a111997-04-29 18:18:01 +00002285 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002286 if (f == NULL)
2287 return 0;
2288 if (!PyFile_SoftSpace(f, 0))
2289 return 0;
2290 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291}
2292
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293
Guido van Rossum681d79a1995-07-18 14:51:37 +00002294/* External interface to call any callable object.
2295 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002296
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002297#undef PyEval_CallObject
2298/* for backward compatibility: export this interface */
2299
Guido van Rossumb209a111997-04-29 18:18:01 +00002300PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002301PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002302{
Guido van Rossumb209a111997-04-29 18:18:01 +00002303 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002304}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002305#define PyEval_CallObject(func,arg) \
2306 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002307
Guido van Rossumb209a111997-04-29 18:18:01 +00002308PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002309PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002310{
2311 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002312 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002313
2314 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002315 arg = PyTuple_New(0);
2316 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002317 PyErr_SetString(PyExc_TypeError,
2318 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319 return NULL;
2320 }
2321 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002323
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002325 PyErr_SetString(PyExc_TypeError,
2326 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002327 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002328 return NULL;
2329 }
2330
Guido van Rossum150b2df1996-12-05 23:17:11 +00002331 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002332 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334 result = call_function(func, arg, kw);
2335 else
2336 result = call_builtin(func, arg, kw);
2337
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002339
Guido van Rossumb209a111997-04-29 18:18:01 +00002340 if (result == NULL && !PyErr_Occurred())
2341 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002342 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002343
2344 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002345}
2346
Guido van Rossumb209a111997-04-29 18:18:01 +00002347static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002348call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349{
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 if (PyCFunction_Check(func)) {
2351 PyCFunction meth = PyCFunction_GetFunction(func);
2352 PyObject *self = PyCFunction_GetSelf(func);
2353 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002354 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002355 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002356 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002357 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002358 else if (size == 0)
2359 arg = NULL;
2360 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002361 if (flags & METH_KEYWORDS)
2362 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 if (kw != NULL && PyDict_Size(kw) != 0) {
2364 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002365 "this function takes no keyword arguments");
2366 return NULL;
2367 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 if (PyClass_Check(func)) {
2371 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 if (PyInstance_Check(func)) {
2374 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002375 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002376 PyErr_Clear();
2377 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002378 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002379 return NULL;
2380 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002381 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002382 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002383 return res;
2384 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002385 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002386 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 return NULL;
2388}
2389
Guido van Rossumb209a111997-04-29 18:18:01 +00002390static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002391call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392{
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 PyObject *class = NULL; /* == owner */
2394 PyObject *argdefs;
2395 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002396 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002398
Guido van Rossumb209a111997-04-29 18:18:01 +00002399 if (kw != NULL && !PyDict_Check(kw)) {
2400 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002401 return NULL;
2402 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 if (PyMethod_Check(func)) {
2405 PyObject *self = PyMethod_Self(func);
2406 class = PyMethod_Class(func);
2407 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002408 if (self == NULL) {
2409 /* Unbound methods must be called with an instance of
2410 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 if (PyTuple_Size(arg) >= 1) {
2412 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002413 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 PyInstance_Check(self) &&
2415 PyClass_IsSubclass((PyObject *)
2416 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002417 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002419 else
2420 self = NULL;
2421 }
2422 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002423 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002425 return NULL;
2426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002428 }
2429 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002430 int argcount = PyTuple_Size(arg);
2431 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002433 if (newarg == NULL)
2434 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002435 Py_INCREF(self);
2436 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 PyObject *v = PyTuple_GET_ITEM(arg, i);
2439 Py_XINCREF(v);
2440 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002441 }
2442 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002444 if (!PyFunction_Check(func)) {
2445 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2446 Py_DECREF(arg);
2447 return result;
2448 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 }
2450 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002452 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002453 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002454 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455 return NULL;
2456 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002459
2460 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2462 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2463 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 }
2465 else {
2466 d = NULL;
2467 nd = 0;
2468 }
2469
2470 if (kw != NULL) {
2471 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002472 nk = PyDict_Size(kw);
2473 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002474 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002475 PyErr_NoMemory();
2476 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002477 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002478 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002479 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002481 i += 2;
2482 nk = i/2;
2483 /* XXX This is broken if the caller deletes dict items! */
2484 }
2485 else {
2486 k = NULL;
2487 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002488 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489
Guido van Rossum681d79a1995-07-18 14:51:37 +00002490 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002491 (PyCodeObject *)PyFunction_GetCode(func),
2492 PyFunction_GetGlobals(func), (PyObject *)NULL,
2493 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002494 k, nk,
2495 d, nd,
2496 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002499 if (k != NULL)
2500 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501
Guido van Rossum681d79a1995-07-18 14:51:37 +00002502 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503}
2504
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002505#define SLICE_ERROR_MSG \
2506 "standard sequence type does not support step size other than one"
2507
Guido van Rossumb209a111997-04-29 18:18:01 +00002508static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002509loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510{
Guido van Rossumb209a111997-04-29 18:18:01 +00002511 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002512 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002513 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 return NULL;
2516 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002517 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002518 v = (*sq->sq_item)(v, i);
2519 if (v)
2520 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002521 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002522 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002523 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524}
2525
Guido van Rossum20c6add2000-05-08 14:06:50 +00002526/* Extract a slice index from a PyInt or PyLong, the index is bound to
2527 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2528 and error. Returns 1 on success.*/
2529
2530int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002531_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532{
2533 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002534 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002535 if (PyInt_Check(v)) {
2536 x = PyInt_AsLong(v);
2537 } else if (PyLong_Check(v)) {
2538 x = PyLong_AsLong(v);
2539 if (x==-1 && PyErr_Occurred()) {
2540 PyObject *long_zero;
2541
2542 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2543 /* It's not an overflow error, so just
2544 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002545 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002546 }
2547
2548 /* It's an overflow error, so we need to
2549 check the sign of the long integer,
2550 set the value to INT_MAX or 0, and clear
2551 the error. */
2552
2553 /* Create a long integer with a value of 0 */
2554 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002555 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002556
2557 /* Check sign */
2558 if (PyObject_Compare(long_zero, v) < 0)
2559 x = INT_MAX;
2560 else
2561 x = 0;
2562
2563 /* Free the long integer we created, and clear the
2564 OverflowError */
2565 Py_DECREF(long_zero);
2566 PyErr_Clear();
2567 }
2568 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002569 PyErr_SetString(PyExc_TypeError,
2570 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002571 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573 /* Truncate -- very long indices are truncated anyway */
2574 if (x > INT_MAX)
2575 x = INT_MAX;
2576 else if (x < -INT_MAX)
2577 x = 0;
2578 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002580 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581}
2582
Guido van Rossumb209a111997-04-29 18:18:01 +00002583static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002584apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002586 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002587 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002589 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002590 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002591 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593
2594static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002595assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002598 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002600 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002602 if (x == NULL)
2603 return PySequence_DelSlice(u, ilow, ihigh);
2604 else
2605 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606}
2607
Guido van Rossumb209a111997-04-29 18:18:01 +00002608static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002609cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610{
2611 register int cmp;
2612 register int res = 0;
2613 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002614 case IS:
2615 case IS_NOT:
2616 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002617 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002618 res = !res;
2619 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 case IN:
2621 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002622 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002623 if (res < 0)
2624 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002625 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 break;
2628 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002629 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 break;
2631 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002633 if (cmp && PyErr_Occurred())
2634 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002635 switch (op) {
2636 case LT: res = cmp < 0; break;
2637 case LE: res = cmp <= 0; break;
2638 case EQ: res = cmp == 0; break;
2639 case NE: res = cmp != 0; break;
2640 case GT: res = cmp > 0; break;
2641 case GE: res = cmp >= 0; break;
2642 /* XXX no default? (res is initialized to 0 though) */
2643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 v = res ? Py_True : Py_False;
2646 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 return v;
2648}
2649
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002651import_from(PyObject *locals, PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002652{
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 PyObject *w, *x;
2654 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002655 PyErr_SetString(PyExc_TypeError,
2656 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002657 return -1;
2658 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002659 w = PyModule_GetDict(v);
2660 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002661 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002663 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 while (PyDict_Next(w, &pos, &name, &value)) {
2665 if (!PyString_Check(name) ||
2666 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002667 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002668 Py_INCREF(value);
2669 err = PyDict_SetItem(locals, name, value);
2670 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002671 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002672 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002673 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002674 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002675 }
2676 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002678 if (x == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00002679 PyErr_Format(PyExc_ImportError,
2680 "cannot import name %.230s",
2681 PyString_AsString(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002682 return -1;
2683 }
2684 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002686 }
2687}
2688
Guido van Rossumb209a111997-04-29 18:18:01 +00002689static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002690build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002691{
Guido van Rossumcd649651997-08-22 16:56:16 +00002692 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002693 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002694 PyErr_SetString(PyExc_SystemError,
2695 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002696 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002697 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002699 PyErr_SetString(PyExc_SystemError,
2700 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002701 return NULL;
2702 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002704 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002705 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002706 return NULL;
2707 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002708 n = PyTuple_Size(bases);
2709 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 PyObject *base = PyTuple_GET_ITEM(bases, i);
2711 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002712 /* Call the base's *type*, if it is callable.
2713 This code is a hook for Donald Beaudry's
2714 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002715 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002716 since its types are not callable.
2717 Ditto: call the bases's *class*, if it has
2718 one. This makes the same thing possible
2719 without writing C code. A true meta-object
2720 protocol! */
2721 PyObject *basetype = (PyObject *)base->ob_type;
2722 PyObject *callable = NULL;
2723 if (PyCallable_Check(basetype))
2724 callable = basetype;
2725 else
2726 callable = PyObject_GetAttrString(
2727 base, "__class__");
2728 if (callable) {
2729 PyObject *args;
2730 PyObject *newclass = NULL;
2731 args = Py_BuildValue(
2732 "(OOO)", name, bases, methods);
2733 if (args != NULL) {
2734 newclass = PyEval_CallObject(
2735 callable, args);
2736 Py_DECREF(args);
2737 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002738 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002739 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002740 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002741 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002742 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002744 "base is not a class object");
2745 return NULL;
2746 }
2747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002749}
2750
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002751static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002752exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
2753 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002754{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002755 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002756 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002757 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002758
Guido van Rossumb209a111997-04-29 18:18:01 +00002759 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2760 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002761 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002763 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 locals = PyTuple_GetItem(prog, 2);
2765 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002766 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 if (globals == Py_None) {
2768 globals = PyEval_GetGlobals();
2769 if (locals == Py_None) {
2770 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002771 plain = 1;
2772 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002773 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002775 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 if (!PyString_Check(prog) &&
2777 !PyCode_Check(prog) &&
2778 !PyFile_Check(prog)) {
2779 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002780 "exec 1st arg must be string, code or file object");
2781 return -1;
2782 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2784 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002785 "exec 2nd/3rd args must be dict or None");
2786 return -1;
2787 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002788 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002789 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002791 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002793 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 FILE *fp = PyFile_AsFile(prog);
2795 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002796 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2797 }
2798 else {
2799 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00002800 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002801 PyErr_SetString(PyExc_ValueError,
2802 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002803 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002804 }
2805 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002806 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002807 if (plain)
2808 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002809 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002810 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002812 return 0;
2813}
Guido van Rossum24c13741995-02-14 09:42:43 +00002814
Guido van Rossum1aa14831997-01-21 05:34:20 +00002815/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002816static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002817find_from_args(PyFrameObject *f, int nexti)
Guido van Rossum24c13741995-02-14 09:42:43 +00002818{
2819 int opcode;
2820 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002822 unsigned char *next_instr;
2823
Guido van Rossumd076c731998-10-07 19:42:25 +00002824 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2825 next_instr += nexti;
2826
Guido van Rossum24c13741995-02-14 09:42:43 +00002827 opcode = (*next_instr++);
2828 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 Py_INCREF(Py_None);
2830 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002831 }
2832
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002834 if (list == NULL)
2835 return NULL;
2836
2837 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002838 oparg = (next_instr[1]<<8) + next_instr[0];
2839 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002840 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 if (PyList_Append(list, name) < 0) {
2842 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002843 break;
2844 }
2845 opcode = (*next_instr++);
2846 } while (opcode == IMPORT_FROM);
2847
2848 return list;
2849}
Guido van Rossum950361c1997-01-24 13:49:28 +00002850
2851
2852#ifdef DYNAMIC_EXECUTION_PROFILE
2853
2854PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002855getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00002856{
2857 int i;
2858 PyObject *l = PyList_New(256);
2859 if (l == NULL) return NULL;
2860 for (i = 0; i < 256; i++) {
2861 PyObject *x = PyInt_FromLong(a[i]);
2862 if (x == NULL) {
2863 Py_DECREF(l);
2864 return NULL;
2865 }
2866 PyList_SetItem(l, i, x);
2867 }
2868 for (i = 0; i < 256; i++)
2869 a[i] = 0;
2870 return l;
2871}
2872
2873PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002874_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00002875{
2876#ifndef DXPAIRS
2877 return getarray(dxp);
2878#else
2879 int i;
2880 PyObject *l = PyList_New(257);
2881 if (l == NULL) return NULL;
2882 for (i = 0; i < 257; i++) {
2883 PyObject *x = getarray(dxpairs[i]);
2884 if (x == NULL) {
2885 Py_DECREF(l);
2886 return NULL;
2887 }
2888 PyList_SetItem(l, i, x);
2889 }
2890 return l;
2891#endif
2892}
2893
2894#endif