blob: fb7b5bcb2801ec13ab91b77b8f6b7cc758622b4b [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum681d79a1995-07-18 14:51:37 +000013/* XXX TO DO:
14 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000015 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000016 XXX document it!
17 */
18
Guido van Rossumb209a111997-04-29 18:18:01 +000019#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000022#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000023#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000024#include "opcode.h"
25
Jack Jansencbf630f2000-07-11 21:59:16 +000026#ifdef macintosh
27#include "macglue.h"
28#endif
29
Guido van Rossumc6004111993-11-05 10:22:19 +000030#include <ctype.h>
31
Guido van Rossuma027efa1997-05-05 20:56:21 +000032#ifdef HAVE_LIMITS_H
33#include <limits.h>
34#else
35#define INT_MAX 2147483647
36#endif
37
Guido van Rossum04691fc1992-08-12 15:35:34 +000038/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000040
Guido van Rossum408027e1996-12-30 16:17:54 +000041#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000042/* For debugging the interpreter: */
43#define LLTRACE 1 /* Low-level trace feature */
44#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#endif
46
Guido van Rossum5b722181993-03-30 17:46:03 +000047
Guido van Rossum374a9221991-04-04 10:40:29 +000048/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000049
Tim Petersdbd9ba62000-07-09 03:09:57 +000050static PyObject *eval_code2(PyCodeObject *,
51 PyObject *, PyObject *,
52 PyObject **, int,
53 PyObject **, int,
54 PyObject **, int,
55 PyObject *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000056#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
60static int call_trace(PyObject **, PyObject **,
61 PyFrameObject *, char *, PyObject *);
62static PyObject *call_builtin(PyObject *, PyObject *, PyObject *);
63static PyObject *call_function(PyObject *, PyObject *, PyObject *);
64static PyObject *loop_subscript(PyObject *, PyObject *);
65static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
66static int assign_slice(PyObject *, PyObject *,
67 PyObject *, PyObject *);
68static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000069static PyObject *import_from(PyObject *, PyObject *);
70static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000071static PyObject *build_class(PyObject *, PyObject *, PyObject *);
72static int exec_statement(PyFrameObject *,
73 PyObject *, PyObject *, PyObject *);
74static PyObject *find_from_args(PyFrameObject *, int);
75static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
76static void reset_exc_info(PyThreadState *);
Guido van Rossum374a9221991-04-04 10:40:29 +000077
78
Guido van Rossum950361c1997-01-24 13:49:28 +000079/* Dynamic execution profile */
80#ifdef DYNAMIC_EXECUTION_PROFILE
81#ifdef DXPAIRS
82static long dxpairs[257][256];
83#define dxp dxpairs[256]
84#else
85static long dxp[256];
86#endif
87#endif
88
89
Guido van Rossume59214e1994-08-30 08:01:59 +000090#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000091
Guido van Rossum2571cc81999-04-07 16:07:23 +000092#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000094#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000095#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000096
Guido van Rossuma027efa1997-05-05 20:56:21 +000097extern int _PyThread_Started; /* Flag for Py_Exit */
98
Guido van Rossum65d5b571998-12-21 19:32:43 +000099static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000100static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101
102void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000106 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000108 interpreter_lock = PyThread_allocate_lock();
109 PyThread_acquire_lock(interpreter_lock, 1);
110 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000113void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000116 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117}
118
119void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000122 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123}
124
125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000127{
128 if (tstate == NULL)
129 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000130 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131 if (PyThreadState_Swap(tstate) != NULL)
132 Py_FatalError(
133 "PyEval_AcquireThread: non-NULL old thread state");
134}
135
136void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000138{
139 if (tstate == NULL)
140 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
141 if (PyThreadState_Swap(NULL) != tstate)
142 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000143 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000144}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145#endif
146
Guido van Rossumff4949e1992-08-05 19:58:53 +0000147/* Functions save_thread and restore_thread are always defined so
148 dynamically loaded modules needn't be compiled separately for use
149 with and without threads: */
150
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000151PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000152PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000154 PyThreadState *tstate = PyThreadState_Swap(NULL);
155 if (tstate == NULL)
156 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000157#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000158 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000159 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000160#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000161 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162}
163
164void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000165PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000167 if (tstate == NULL)
168 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000169#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000171 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000172 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174 }
175#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000176 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177}
178
179
Guido van Rossuma9672091994-09-14 13:31:22 +0000180/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
181 signal handlers or Mac I/O completion routines) can schedule calls
182 to a function to be called synchronously.
183 The synchronous function is called with one void* argument.
184 It should return 0 for success or -1 for failure -- failure should
185 be accompanied by an exception.
186
187 If registry succeeds, the registry function returns 0; if it fails
188 (e.g. due to too many pending calls) it returns -1 (without setting
189 an exception condition).
190
191 Note that because registry may occur from within signal handlers,
192 or other asynchronous events, calling malloc() is unsafe!
193
194#ifdef WITH_THREAD
195 Any thread can schedule pending calls, but only the main thread
196 will execute them.
197#endif
198
199 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
200 There are two possible race conditions:
201 (1) nested asynchronous registry calls;
202 (2) registry calls made while pending calls are being processed.
203 While (1) is very unlikely, (2) is a real possibility.
204 The current code is safe against (2), but not against (1).
205 The safety against (2) is derived from the fact that only one
206 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000207
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208 XXX Darn! With the advent of thread state, we should have an array
209 of pending calls per thread in the thread state! Later...
210*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000211
Guido van Rossuma9672091994-09-14 13:31:22 +0000212#define NPENDINGCALLS 32
213static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000214 int (*func)(void *);
215 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000216} pendingcalls[NPENDINGCALLS];
217static volatile int pendingfirst = 0;
218static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000219static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000220
221int
Thomas Wouters334fb892000-07-25 12:56:38 +0000222Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000223{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000224 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000225 int i, j;
226 /* XXX Begin critical section */
227 /* XXX If you want this to be safe against nested
228 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000229 if (busy)
230 return -1;
231 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000232 i = pendinglast;
233 j = (i + 1) % NPENDINGCALLS;
234 if (j == pendingfirst)
235 return -1; /* Queue full */
236 pendingcalls[i].func = func;
237 pendingcalls[i].arg = arg;
238 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000240 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000241 /* XXX End critical section */
242 return 0;
243}
244
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000246Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000247{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000251 return 0;
252#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000253 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000254 return 0;
255 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000256 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000257 for (;;) {
258 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000259 int (*func)(void *);
260 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000261 i = pendingfirst;
262 if (i == pendinglast)
263 break; /* Queue empty */
264 func = pendingcalls[i].func;
265 arg = pendingcalls[i].arg;
266 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267 if (func(arg) < 0) {
268 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000269 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000270 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000272 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000273 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 return 0;
275}
276
277
Guido van Rossum374a9221991-04-04 10:40:29 +0000278/* Status code for main loop (reason for stack unwind) */
279
280enum why_code {
281 WHY_NOT, /* No error */
282 WHY_EXCEPTION, /* Exception occurred */
283 WHY_RERAISE, /* Exception re-raised by 'finally' */
284 WHY_RETURN, /* 'return' statement */
285 WHY_BREAK /* 'break' statement */
286};
287
Tim Petersdbd9ba62000-07-09 03:09:57 +0000288static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
289static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000290
Guido van Rossum374a9221991-04-04 10:40:29 +0000291
Guido van Rossumb209a111997-04-29 18:18:01 +0000292PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000293PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000294{
295 return eval_code2(co,
296 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000297 (PyObject **)NULL, 0,
298 (PyObject **)NULL, 0,
299 (PyObject **)NULL, 0,
300 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000301}
302
303
304/* Interpreter main loop */
305
Guido van Rossum8861b741996-07-30 16:49:37 +0000306#ifndef MAX_RECURSION_DEPTH
307#define MAX_RECURSION_DEPTH 10000
308#endif
309
Guido van Rossumb209a111997-04-29 18:18:01 +0000310static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000311eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
312 PyObject **args, int argcount, PyObject **kws, int kwcount,
313 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000314{
Guido van Rossum950361c1997-01-24 13:49:28 +0000315#ifdef DXPAIRS
316 int lastopcode = 0;
317#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000318 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000319 register int opcode=0; /* Current opcode */
320 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000321 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000322 register enum why_code why; /* Reason for block stack unwind */
323 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 register PyObject *x; /* Result object -- NULL if error */
325 register PyObject *v; /* Temporary objects popped off stack */
326 register PyObject *w;
327 register PyObject *u;
328 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000329 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000330 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000331 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000332 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000333 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000334 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000335#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000336 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000337#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000338#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000339 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000340 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000341#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000342
343/* Code access macros */
344
345#define GETCONST(i) Getconst(f, i)
346#define GETNAME(i) Getname(f, i)
347#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000348#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000349#define NEXTOP() (*next_instr++)
350#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000351#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000352#define JUMPBY(x) (next_instr += (x))
353
354/* Stack manipulation macros */
355
356#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
357#define EMPTY() (STACK_LEVEL() == 0)
358#define TOP() (stack_pointer[-1])
359#define BASIC_PUSH(v) (*stack_pointer++ = (v))
360#define BASIC_POP() (*--stack_pointer)
361
Guido van Rossum96a42c81992-01-12 02:29:51 +0000362#ifdef LLTRACE
363#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
364#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000365#else
366#define PUSH(v) BASIC_PUSH(v)
367#define POP() BASIC_POP()
368#endif
369
Guido van Rossum681d79a1995-07-18 14:51:37 +0000370/* Local variable macros */
371
372#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000373#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000374 GETLOCAL(i) = value; } while (0)
375
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376/* Start of code */
377
Guido van Rossum8861b741996-07-30 16:49:37 +0000378#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000379 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000380 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000381 return NULL;
382 }
383#endif
384
Guido van Rossum681d79a1995-07-18 14:51:37 +0000385 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000386 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000387 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000388 }
389
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000390#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000391 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000392#endif
393
Guido van Rossumb209a111997-04-29 18:18:01 +0000394 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000395 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000396 co, /*code*/
397 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000398 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000399 if (f == NULL)
400 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000401
Guido van Rossuma027efa1997-05-05 20:56:21 +0000402 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000403 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404
405 if (co->co_argcount > 0 ||
406 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
407 int i;
408 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000409 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000410 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000411 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412 if (kwdict == NULL)
413 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000414 i = co->co_argcount;
415 if (co->co_flags & CO_VARARGS)
416 i++;
417 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000418 }
419 if (argcount > co->co_argcount) {
420 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000421 PyErr_Format(PyExc_TypeError,
422 "too many arguments; expected %d, got %d",
423 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424 goto fail;
425 }
426 n = co->co_argcount;
427 }
428 for (i = 0; i < n; i++) {
429 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431 SETLOCAL(i, x);
432 }
433 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000434 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000435 if (u == NULL)
436 goto fail;
437 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 for (i = n; i < argcount; i++) {
439 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000440 Py_INCREF(x);
441 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 }
444 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 PyObject *keyword = kws[2*i];
446 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000448 if (keyword == NULL || !PyString_Check(keyword)) {
449 PyErr_SetString(PyExc_TypeError,
450 "keywords must be strings");
451 goto fail;
452 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 /* XXX slow -- speed up using dictionary? */
454 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000455 PyObject *nm = PyTuple_GET_ITEM(
456 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000457 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000458 break;
459 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000460 /* Check errors from Compare */
461 if (PyErr_Occurred())
462 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 if (j >= co->co_argcount) {
464 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000466 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000467 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 goto fail;
469 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000470 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 }
472 else {
473 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000474 PyErr_Format(PyExc_TypeError,
475 "keyword parameter redefined: %.400s",
476 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 goto fail;
478 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000479 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 SETLOCAL(j, value);
481 }
482 }
483 if (argcount < co->co_argcount) {
484 int m = co->co_argcount - defcount;
485 for (i = argcount; i < m; i++) {
486 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000487 PyErr_Format(PyExc_TypeError,
488 "not enough arguments; expected %d, got %d",
489 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 goto fail;
491 }
492 }
493 if (n > m)
494 i = n - m;
495 else
496 i = 0;
497 for (; i < defcount; i++) {
498 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000499 PyObject *def = defs[i];
500 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 SETLOCAL(m+i, def);
502 }
503 }
504 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 }
506 else {
507 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000508 PyErr_SetString(PyExc_TypeError,
509 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000510 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 }
512 }
513
Guido van Rossuma027efa1997-05-05 20:56:21 +0000514 if (tstate->sys_tracefunc != NULL) {
515 /* tstate->sys_tracefunc, if defined, is a function that
516 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517 Its return value, if not None, is a function that
518 will be called at the start of each executed line
519 of code. (Actually, the function must return
520 itself in order to continue tracing.)
521 The trace functions are called with three arguments:
522 a pointer to the current frame, a string indicating
523 why the function is called, and an argument which
524 depends on the situation. The global trace function
525 (sys.trace) is also called whenever an exception
526 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000527 if (call_trace(&tstate->sys_tracefunc,
528 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000529 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000530 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000531 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000532 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000533 }
534
Guido van Rossuma027efa1997-05-05 20:56:21 +0000535 if (tstate->sys_profilefunc != NULL) {
536 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000537 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000538 if (call_trace(&tstate->sys_profilefunc,
539 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000540 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000541 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000542 }
543 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000544
Guido van Rossuma027efa1997-05-05 20:56:21 +0000545 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
546 --tstate->recursion_depth;
547 PyErr_SetString(PyExc_RuntimeError,
548 "Maximum recursion depth exceeded");
549 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000550 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000551 return NULL;
552 }
553
Guido van Rossumd076c731998-10-07 19:42:25 +0000554 _PyCode_GETCODEPTR(co, &first_instr);
555 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000556 stack_pointer = f->f_valuestack;
557
Guido van Rossum374a9221991-04-04 10:40:29 +0000558 why = WHY_NOT;
559 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000561
562 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000563 /* Do periodic things. Doing this every time through
564 the loop would add too much overhead, so we do it
565 only every Nth instruction. We also do it if
566 ``things_to_do'' is set, i.e. when an asynchronous
567 event needs attention (e.g. a signal handler or
568 async I/O handler); see Py_AddPendingCall() and
569 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000570
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000572 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000574 if (Py_MakePendingCalls() < 0) {
575 why = WHY_EXCEPTION;
576 goto on_error;
577 }
578 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000579#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580 /* If we have true signals, the signal handler
581 will call Py_AddPendingCall() so we don't
582 have to call sigcheck(). On the Mac and
583 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000584 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 goto on_error;
587 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000588#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589
Guido van Rossume59214e1994-08-30 08:01:59 +0000590#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591 if (interpreter_lock) {
592 /* Give another thread a chance */
593
Guido van Rossum25ce5661997-08-02 03:10:38 +0000594 if (PyThreadState_Swap(NULL) != tstate)
595 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000596 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000597
598 /* Other threads may run now */
599
Guido van Rossum65d5b571998-12-21 19:32:43 +0000600 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000601 if (PyThreadState_Swap(tstate) != NULL)
602 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603 }
604#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000606
Guido van Rossum374a9221991-04-04 10:40:29 +0000607 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000608
Guido van Rossum408027e1996-12-30 16:17:54 +0000609#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000610 f->f_lasti = INSTR_OFFSET();
611#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000612
613 opcode = NEXTOP();
614 if (HAS_ARG(opcode))
615 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000616 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000617#ifdef DYNAMIC_EXECUTION_PROFILE
618#ifdef DXPAIRS
619 dxpairs[lastopcode][opcode]++;
620 lastopcode = opcode;
621#endif
622 dxp[opcode]++;
623#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000624
Guido van Rossum96a42c81992-01-12 02:29:51 +0000625#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 /* Instruction tracing */
627
Guido van Rossum96a42c81992-01-12 02:29:51 +0000628 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000629 if (HAS_ARG(opcode)) {
630 printf("%d: %d, %d\n",
631 (int) (INSTR_OFFSET() - 3),
632 opcode, oparg);
633 }
634 else {
635 printf("%d: %d\n",
636 (int) (INSTR_OFFSET() - 1), opcode);
637 }
638 }
639#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 /* Main switch on opcode */
641
642 switch (opcode) {
643
644 /* BEWARE!
645 It is essential that any operation that fails sets either
646 x to NULL, err to nonzero, or why to anything but WHY_NOT,
647 and that no operation that succeeds does this! */
648
649 /* case STOP_CODE: this is an error! */
650
651 case POP_TOP:
652 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000653 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000654 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000655
656 case ROT_TWO:
657 v = POP();
658 w = POP();
659 PUSH(v);
660 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000661 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662
663 case ROT_THREE:
664 v = POP();
665 w = POP();
666 x = POP();
667 PUSH(v);
668 PUSH(x);
669 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000670 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000671
672 case DUP_TOP:
673 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000674 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000676 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000677
678 case UNARY_POSITIVE:
679 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000680 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000681 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000683 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 break;
685
686 case UNARY_NEGATIVE:
687 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000688 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000689 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000691 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 break;
693
694 case UNARY_NOT:
695 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000696 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000697 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000698 if (err == 0) {
699 Py_INCREF(Py_True);
700 PUSH(Py_True);
701 continue;
702 }
703 else if (err > 0) {
704 Py_INCREF(Py_False);
705 PUSH(Py_False);
706 err = 0;
707 continue;
708 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 break;
710
711 case UNARY_CONVERT:
712 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000713 x = PyObject_Repr(v);
714 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000716 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000718
719 case UNARY_INVERT:
720 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000721 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000722 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000723 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000724 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000725 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000726
Guido van Rossum50564e81996-01-12 01:13:16 +0000727 case BINARY_POWER:
728 w = POP();
729 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000730 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000731 Py_DECREF(v);
732 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000733 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000734 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000735 break;
736
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 case BINARY_MULTIPLY:
738 w = POP();
739 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000740 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000741 Py_DECREF(v);
742 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000744 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 break;
746
747 case BINARY_DIVIDE:
748 w = POP();
749 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000750 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000751 Py_DECREF(v);
752 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000754 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 break;
756
757 case BINARY_MODULO:
758 w = POP();
759 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000760 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_DECREF(v);
762 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000763 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000764 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 break;
766
767 case BINARY_ADD:
768 w = POP();
769 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000770 if (PyInt_Check(v) && PyInt_Check(w)) {
771 /* INLINE: int + int */
772 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000773 a = PyInt_AS_LONG(v);
774 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000775 i = a + b;
776 if ((i^a) < 0 && (i^b) < 0) {
777 PyErr_SetString(PyExc_OverflowError,
778 "integer addition");
779 x = NULL;
780 }
781 else
782 x = PyInt_FromLong(i);
783 }
784 else
785 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000786 Py_DECREF(v);
787 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000789 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 break;
791
792 case BINARY_SUBTRACT:
793 w = POP();
794 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000795 if (PyInt_Check(v) && PyInt_Check(w)) {
796 /* INLINE: int - int */
797 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000798 a = PyInt_AS_LONG(v);
799 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000800 i = a - b;
801 if ((i^a) < 0 && (i^~b) < 0) {
802 PyErr_SetString(PyExc_OverflowError,
803 "integer subtraction");
804 x = NULL;
805 }
806 else
807 x = PyInt_FromLong(i);
808 }
809 else
810 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000811 Py_DECREF(v);
812 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000814 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 break;
816
817 case BINARY_SUBSCR:
818 w = POP();
819 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000820 if (PyList_Check(v) && PyInt_Check(w)) {
821 /* INLINE: list[int] */
822 long i = PyInt_AsLong(w);
823 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 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000826 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000827 PyErr_SetString(PyExc_IndexError,
828 "list index out of range");
829 x = NULL;
830 }
831 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000832 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000833 Py_INCREF(x);
834 }
835 }
836 else
837 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 Py_DECREF(v);
839 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 break;
843
Guido van Rossum7928cd71991-10-24 14:59:31 +0000844 case BINARY_LSHIFT:
845 w = POP();
846 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000847 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000848 Py_DECREF(v);
849 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000850 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000851 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000852 break;
853
854 case BINARY_RSHIFT:
855 w = POP();
856 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000857 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000858 Py_DECREF(v);
859 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000860 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000861 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000862 break;
863
864 case BINARY_AND:
865 w = POP();
866 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000867 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000868 Py_DECREF(v);
869 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000872 break;
873
874 case BINARY_XOR:
875 w = POP();
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
879 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 break;
883
884 case BINARY_OR:
885 w = POP();
886 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000887 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000892 break;
893
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 case SLICE+0:
895 case SLICE+1:
896 case SLICE+2:
897 case SLICE+3:
898 if ((opcode-SLICE) & 2)
899 w = POP();
900 else
901 w = NULL;
902 if ((opcode-SLICE) & 1)
903 v = POP();
904 else
905 v = NULL;
906 u = POP();
907 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(u);
909 Py_XDECREF(v);
910 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000912 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
914
915 case STORE_SLICE+0:
916 case STORE_SLICE+1:
917 case STORE_SLICE+2:
918 case STORE_SLICE+3:
919 if ((opcode-STORE_SLICE) & 2)
920 w = POP();
921 else
922 w = NULL;
923 if ((opcode-STORE_SLICE) & 1)
924 v = POP();
925 else
926 v = NULL;
927 u = POP();
928 t = POP();
929 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000930 Py_DECREF(t);
931 Py_DECREF(u);
932 Py_XDECREF(v);
933 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000934 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 break;
936
937 case DELETE_SLICE+0:
938 case DELETE_SLICE+1:
939 case DELETE_SLICE+2:
940 case DELETE_SLICE+3:
941 if ((opcode-DELETE_SLICE) & 2)
942 w = POP();
943 else
944 w = NULL;
945 if ((opcode-DELETE_SLICE) & 1)
946 v = POP();
947 else
948 v = NULL;
949 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000952 Py_DECREF(u);
953 Py_XDECREF(v);
954 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000955 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
957
958 case STORE_SUBSCR:
959 w = POP();
960 v = POP();
961 u = POP();
962 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000963 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000964 Py_DECREF(u);
965 Py_DECREF(v);
966 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000967 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 break;
969
970 case DELETE_SUBSCR:
971 w = POP();
972 v = POP();
973 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000974 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000975 Py_DECREF(v);
976 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000977 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000979
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 case PRINT_EXPR:
981 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000982 /* Print value except if None */
983 /* After printing, also assign to '_' */
984 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +0000985 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000986 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000987 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000988 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +0000989 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000990 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +0000991 if (x == NULL) {
992 PyErr_SetString(
993 PyExc_RuntimeError,
994 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +0000995 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +0000996 }
Guido van Rossumbe270261997-05-22 22:26:18 +0000997 }
998 if (err == 0)
999 err = PyFile_WriteObject(v, x, 0);
1000 if (err == 0) {
1001 PyFile_SoftSpace(x, 1);
1002 err = Py_FlushLine();
1003 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001004 if (err == 0) {
1005 err = PyDict_SetItemString(
1006 f->f_builtins, "_", v);
1007 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001009 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 break;
1011
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001012 case PRINT_ITEM_TO:
1013 w = stream = POP();
1014 /* fall through to PRINT_ITEM */
1015
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 case PRINT_ITEM:
1017 v = POP();
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001018 if (stream == NULL) {
1019 w = PySys_GetObject("stdout");
1020 if (w == NULL) {
1021 PyErr_SetString(PyExc_RuntimeError,
1022 "lost sys.stdout");
1023 err = -1;
1024 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001025 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001026 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001027 err = PyFile_WriteString(" ", w);
1028 if (err == 0)
1029 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001030 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001031 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 char *s = PyString_AsString(v);
1033 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001034 if (len > 0 &&
1035 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001036 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001040 Py_XDECREF(stream);
1041 stream = NULL;
1042 if (err == 0)
1043 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 break;
1045
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001046 case PRINT_NEWLINE_TO:
1047 w = stream = POP();
1048 /* fall through to PRINT_NEWLINE */
1049
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 case PRINT_NEWLINE:
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001051 if (stream == NULL) {
1052 w = PySys_GetObject("stdout");
1053 if (w == NULL)
1054 PyErr_SetString(PyExc_RuntimeError,
1055 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001056 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001057 if (w != NULL) {
1058 err = PyFile_WriteString("\n", w);
1059 if (err == 0)
1060 PyFile_SoftSpace(w, 0);
1061 }
1062 Py_XDECREF(stream);
1063 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 break;
1065
1066 case BREAK_LOOP:
1067 why = WHY_BREAK;
1068 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001069
Guido van Rossumf10570b1995-07-07 22:53:21 +00001070 case RAISE_VARARGS:
1071 u = v = w = NULL;
1072 switch (oparg) {
1073 case 3:
1074 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001075 /* Fallthrough */
1076 case 2:
1077 v = POP(); /* value */
1078 /* Fallthrough */
1079 case 1:
1080 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001081 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001082 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001083 break;
1084 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001085 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001086 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001087 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001088 break;
1089 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001090 break;
1091
1092 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001093 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001094 PyErr_SetString(PyExc_SystemError,
1095 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001096 break;
1097 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001098 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001099 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001100 break;
1101
1102 case RETURN_VALUE:
1103 retval = POP();
1104 why = WHY_RETURN;
1105 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001106
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001107 case EXEC_STMT:
1108 w = POP();
1109 v = POP();
1110 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001111 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001112 Py_DECREF(u);
1113 Py_DECREF(v);
1114 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001115 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001116
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 case POP_BLOCK:
1118 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001119 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 while (STACK_LEVEL() > b->b_level) {
1121 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001122 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 }
1124 }
1125 break;
1126
1127 case END_FINALLY:
1128 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001129 if (PyInt_Check(v)) {
1130 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 if (why == WHY_RETURN)
1132 retval = POP();
1133 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001134 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001136 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001137 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001139 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001141 else if (v != Py_None) {
1142 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 "'finally' pops bad exception");
1144 why = WHY_EXCEPTION;
1145 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001146 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 break;
1148
1149 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001150 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001152 w = POP();
1153 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001155 Py_DECREF(u);
1156 Py_DECREF(v);
1157 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 break;
1159
1160 case STORE_NAME:
1161 w = GETNAMEV(oparg);
1162 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001163 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001164 PyErr_SetString(PyExc_SystemError,
1165 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001166 break;
1167 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001168 err = PyDict_SetItem(x, w, v);
1169 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 break;
1171
1172 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001173 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001175 PyErr_SetString(PyExc_SystemError,
1176 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001177 break;
1178 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001179 if ((err = PyDict_DelItem(x, w)) != 0)
1180 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001182
1183#ifdef CASE_TOO_BIG
1184 default: switch (opcode) {
1185#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001186
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001187 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001189 if (PyTuple_Check(v)) {
1190 if (PyTuple_Size(v) != oparg) {
1191 PyErr_SetString(PyExc_ValueError,
1192 "unpack tuple of wrong size");
1193 why = WHY_EXCEPTION;
1194 }
1195 else {
1196 for (; --oparg >= 0; ) {
1197 w = PyTuple_GET_ITEM(v, oparg);
1198 Py_INCREF(w);
1199 PUSH(w);
1200 }
1201 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001202 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001203 else if (PyList_Check(v)) {
1204 if (PyList_Size(v) != oparg) {
1205 PyErr_SetString(PyExc_ValueError,
1206 "unpack list of wrong size");
1207 why = WHY_EXCEPTION;
1208 }
1209 else {
1210 for (; --oparg >= 0; ) {
1211 w = PyList_GET_ITEM(v, oparg);
1212 Py_INCREF(w);
1213 PUSH(w);
1214 }
1215 }
1216 }
1217 else if (PySequence_Check(v)) {
1218 if (unpack_sequence(v, oparg,
1219 stack_pointer + oparg))
1220 stack_pointer += oparg;
1221 else
1222 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 }
1224 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001225 PyErr_SetString(PyExc_TypeError,
1226 "unpack non-sequence");
1227 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 break;
1231
1232 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001233 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 v = POP();
1235 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001236 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1237 Py_DECREF(v);
1238 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 break;
1240
1241 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001242 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001244 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1245 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 break;
1248
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001249 case STORE_GLOBAL:
1250 w = GETNAMEV(oparg);
1251 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 err = PyDict_SetItem(f->f_globals, w, v);
1253 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001254 break;
1255
1256 case DELETE_GLOBAL:
1257 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001258 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1259 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001260 break;
1261
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 case LOAD_CONST:
1263 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 PUSH(x);
1266 break;
1267
1268 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001269 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001270 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001271 PyErr_SetString(PyExc_SystemError,
1272 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001273 break;
1274 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001277 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001279 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001281 PyErr_SetObject(
1282 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 break;
1284 }
1285 }
1286 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 PUSH(x);
1289 break;
1290
1291 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001292 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
1299 }
1300 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 PUSH(x);
1303 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001304
Guido van Rossum9bfef441993-03-29 10:43:31 +00001305 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001307 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001308 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001310 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001311 break;
1312 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001313 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001314 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001315 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001316 break;
1317
1318 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001319 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001320 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001321 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001322
1323 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001324 x = GETLOCAL(oparg);
1325 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001326 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001327 PyTuple_GetItem(co->co_varnames,
1328 oparg));
1329 break;
1330 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001331 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001332 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001333
1334 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001335 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 if (x != NULL) {
1337 for (; --oparg >= 0;) {
1338 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 }
1341 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001342 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 }
1344 break;
1345
1346 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001347 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 if (x != NULL) {
1349 for (; --oparg >= 0;) {
1350 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001351 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 }
1353 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001354 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 }
1356 break;
1357
1358 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001359 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001361 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 break;
1363
1364 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001365 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001367 x = PyObject_GetAttr(v, w);
1368 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001370 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 break;
1372
1373 case COMPARE_OP:
1374 w = POP();
1375 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001376 if (PyInt_Check(v) && PyInt_Check(w)) {
1377 /* INLINE: cmp(int, int) */
1378 register long a, b;
1379 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001380 a = PyInt_AS_LONG(v);
1381 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001382 switch (oparg) {
1383 case LT: res = a < b; break;
1384 case LE: res = a <= b; break;
1385 case EQ: res = a == b; break;
1386 case NE: res = a != b; break;
1387 case GT: res = a > b; break;
1388 case GE: res = a >= b; break;
1389 case IS: res = v == w; break;
1390 case IS_NOT: res = v != w; break;
1391 default: goto slow_compare;
1392 }
1393 x = res ? Py_True : Py_False;
1394 Py_INCREF(x);
1395 }
1396 else {
1397 slow_compare:
1398 x = cmp_outcome(oparg, v, w);
1399 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001400 Py_DECREF(v);
1401 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001403 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 break;
1405
1406 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001409 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001410 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001411 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001412 break;
1413 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001414 u = find_from_args(f, INSTR_OFFSET());
1415 if (u == NULL) {
1416 x = u;
1417 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001418 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001420 w,
1421 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001422 f->f_locals == NULL ?
1423 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001424 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001426 if (w == NULL) {
1427 x = NULL;
1428 break;
1429 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 x = PyEval_CallObject(x, w);
1431 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001432 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001433 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 break;
1435
Thomas Wouters52152252000-08-17 22:55:00 +00001436 case IMPORT_STAR:
1437 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001438 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001440 PyErr_SetString(PyExc_SystemError,
1441 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 break;
1443 }
Thomas Wouters52152252000-08-17 22:55:00 +00001444 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001446 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001447 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001449
Thomas Wouters52152252000-08-17 22:55:00 +00001450 case IMPORT_FROM:
1451 w = GETNAMEV(oparg);
1452 v = TOP();
1453 x = import_from(v, w);
1454 PUSH(x);
1455 if (x != NULL) continue;
1456 break;
1457
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 case JUMP_FORWARD:
1459 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001460 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001461
1462 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001463 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001464 if (err > 0)
1465 err = 0;
1466 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001468 else
1469 break;
1470 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001471
1472 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001473 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001474 if (err > 0) {
1475 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001477 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001478 else if (err == 0)
1479 ;
1480 else
1481 break;
1482 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001483
1484 case JUMP_ABSOLUTE:
1485 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001486 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001487
1488 case FOR_LOOP:
1489 /* for v in s: ...
1490 On entry: stack contains s, i.
1491 On exit: stack contains s, i+1, s[i];
1492 but if loop exhausted:
1493 s, i are popped, and we jump */
1494 w = POP(); /* Loop index */
1495 v = POP(); /* Sequence object */
1496 u = loop_subscript(v, w);
1497 if (u != NULL) {
1498 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001501 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001503 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 }
1505 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001506 Py_DECREF(v);
1507 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 /* A NULL can mean "s exhausted"
1509 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001512 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001514 continue;
1515 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 }
1517 break;
1518
1519 case SETUP_LOOP:
1520 case SETUP_EXCEPT:
1521 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001524 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001525
1526 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001527#ifdef LLTRACE
1528 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001529 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001531 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001532 if (f->f_trace == NULL)
1533 continue;
1534 /* Trace each line of code reached */
1535 f->f_lasti = INSTR_OFFSET();
1536 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539
1540 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001541 case CALL_FUNCTION_VAR:
1542 case CALL_FUNCTION_KW:
1543 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001545 int na = oparg & 0xff;
1546 int nk = (oparg>>8) & 0xff;
1547 int flags = (opcode - CALL_FUNCTION) & 3;
1548 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1549 PyObject **pfunc = stack_pointer - n - 1;
1550 PyObject *func = *pfunc;
1551 PyObject *self = NULL;
1552 PyObject *class = NULL;
1553 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1554 if (PyMethod_Check(func)) {
1555 self = PyMethod_Self(func);
1556 class = PyMethod_Class(func);
1557 func = PyMethod_Function(func);
1558 Py_INCREF(func);
1559 if (self != NULL) {
1560 Py_INCREF(self);
1561 Py_DECREF(*pfunc);
1562 *pfunc = self;
1563 na++;
1564 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001565 }
1566 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001567 /* Unbound methods must be called with an
1568 instance of the class (or a derived
1569 class) as first argument */
1570 if (na > 0 && (self = stack_pointer[-n]) != NULL
1571 && PyInstance_Check(self)
1572 && PyClass_IsSubclass((PyObject *)
1573 (((PyInstanceObject *)self)->in_class),
1574 class))
1575 /* Handy-dandy */ ;
1576 else {
1577 PyErr_SetString(PyExc_TypeError,
1578 "unbound method must be called with class instance 1st argument");
1579 x = NULL;
1580 break;
1581 }
1582 }
1583 }
1584 else
1585 Py_INCREF(func);
1586 if (PyFunction_Check(func) && flags == 0) {
1587 PyObject *co = PyFunction_GetCode(func);
1588 PyObject *globals = PyFunction_GetGlobals(func);
1589 PyObject *argdefs = PyFunction_GetDefaults(func);
1590 PyObject **d;
1591 int nd;
1592 if (argdefs != NULL) {
1593 d = &PyTuple_GET_ITEM(argdefs, 0);
1594 nd = ((PyTupleObject *)argdefs)->ob_size;
1595 }
1596 else {
1597 d = NULL;
1598 nd = 0;
1599 }
1600 x = eval_code2((PyCodeObject *)co, globals,
1601 (PyObject *)NULL, stack_pointer-n, na,
1602 stack_pointer-2*nk, nk, d, nd,
1603 class);
1604 }
1605 else {
1606 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001607 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001608 PyObject *stararg = 0;
1609 PyObject *kwdict = NULL;
1610 if (flags & 2) {
1611 kwdict = POP();
1612 if (!PyDict_Check(kwdict)) {
1613 PyErr_SetString(PyExc_TypeError,
1614 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001615 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001616 }
1617 }
1618 if (flags & 1) {
1619 stararg = POP();
1620 if (!PySequence_Check(stararg)) {
1621 PyErr_SetString(PyExc_TypeError,
1622 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001623 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001624 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001625 /* Convert abstract sequence to concrete tuple */
1626 if (!PyTuple_Check(stararg)) {
1627 PyObject *t = NULL;
1628 t = PySequence_Tuple(stararg);
1629 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001630 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001631 }
1632 Py_DECREF(stararg);
1633 stararg = t;
1634 }
1635 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001636 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001637 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001638 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001639 }
1640 if (nk > 0) {
1641 if (kwdict == NULL) {
1642 kwdict = PyDict_New();
1643 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001644 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001645 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001646 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001647 else {
1648 PyObject *d = PyDict_Copy(kwdict);
1649 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001650 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001651 }
1652 Py_DECREF(kwdict);
1653 kwdict = d;
1654 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001655 err = 0;
1656 while (--nk >= 0) {
1657 PyObject *value = POP();
1658 PyObject *key = POP();
1659 if (PyDict_GetItem(kwdict, key) != NULL) {
1660 err = 1;
1661 PyErr_Format(PyExc_TypeError,
1662 "keyword parameter redefined: %.400s",
1663 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001664 Py_DECREF(key);
1665 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001666 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001667 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001668 err = PyDict_SetItem(kwdict, key, value);
1669 Py_DECREF(key);
1670 Py_DECREF(value);
1671 if (err)
1672 break;
1673 }
1674 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001675 extcall_fail:
1676 Py_XDECREF(kwdict);
1677 Py_XDECREF(stararg);
1678 Py_DECREF(func);
1679 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001680 break;
1681 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001682 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001683 callargs = PyTuple_New(na + nstar);
1684 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001685 x = NULL;
1686 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001687 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001688 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001689 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001690 for (i = 0; i < nstar; i++) {
1691 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1692 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001693 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001694 }
1695 Py_DECREF(stararg);
1696 }
1697 while (--na >= 0) {
1698 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001699 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001700 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001701 x = PyEval_CallObjectWithKeywords(func,
1702 callargs,
1703 kwdict);
1704 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001705 Py_XDECREF(kwdict);
1706 }
1707 Py_DECREF(func);
1708 while (stack_pointer > pfunc) {
1709 w = POP();
1710 Py_DECREF(w);
1711 }
1712 PUSH(x);
1713 if (x != NULL) continue;
1714 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001715 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001716
Guido van Rossum681d79a1995-07-18 14:51:37 +00001717 case MAKE_FUNCTION:
1718 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001719 x = PyFunction_New(v, f->f_globals);
1720 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001721 /* XXX Maybe this should be a separate opcode? */
1722 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001726 x = NULL;
1727 break;
1728 }
1729 while (--oparg >= 0) {
1730 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001732 }
1733 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001735 }
1736 PUSH(x);
1737 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001738
1739 case BUILD_SLICE:
1740 if (oparg == 3)
1741 w = POP();
1742 else
1743 w = NULL;
1744 v = POP();
1745 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001746 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 Py_DECREF(u);
1748 Py_DECREF(v);
1749 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001750 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001752 break;
1753
Fred Drakeef8ace32000-08-24 00:32:09 +00001754 case EXTENDED_ARG:
1755 opcode = NEXTOP();
1756 oparg = oparg<<16 | NEXTARG();
1757 goto dispatch_opcode;
1758 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001759
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 default:
1761 fprintf(stderr,
1762 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001763 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001764 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 why = WHY_EXCEPTION;
1766 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001767
1768#ifdef CASE_TOO_BIG
1769 }
1770#endif
1771
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 } /* switch */
1773
1774 on_error:
1775
1776 /* Quickly continue if no error occurred */
1777
1778 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001779 if (err == 0 && x != NULL) {
1780#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001781 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001783 fprintf(stderr,
1784 "XXX undetected error\n");
1785 else
1786#endif
1787 continue; /* Normal, fast path */
1788 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 err = 0;
1792 }
1793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 /* Double-check exception status */
1795
1796 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001797 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001798 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001799 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 why = WHY_EXCEPTION;
1801 }
1802 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001803#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001805 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001807 fprintf(stderr,
1808 "XXX undetected error (why=%d)\n",
1809 why);
1810 why = WHY_EXCEPTION;
1811 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001812 }
1813#endif
1814
1815 /* Log traceback info if this is a real exception */
1816
1817 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001818 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001820 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001822
Guido van Rossume59214e1994-08-30 08:01:59 +00001823 if (f->f_trace)
1824 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001825 if (tstate->sys_profilefunc)
1826 call_exc_trace(&tstate->sys_profilefunc,
1827 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001828 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001829
1830 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1831
1832 if (why == WHY_RERAISE)
1833 why = WHY_EXCEPTION;
1834
1835 /* Unwind stacks if a (pseudo) exception occurred */
1836
1837 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001838 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 while (STACK_LEVEL() > b->b_level) {
1840 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 }
1843 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1844 why = WHY_NOT;
1845 JUMPTO(b->b_handler);
1846 break;
1847 }
1848 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001849 (b->b_type == SETUP_EXCEPT &&
1850 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 PyObject *exc, *val, *tb;
1853 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001855 val = Py_None;
1856 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 /* Make the raw exception data
1859 available to the handler,
1860 so a program can emulate the
1861 Python main loop. Don't do
1862 this for 'finally'. */
1863 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001864 PyErr_NormalizeException(
1865 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001866 set_exc_info(tstate,
1867 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001868 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001870 PUSH(val);
1871 PUSH(exc);
1872 }
1873 else {
1874 if (why == WHY_RETURN)
1875 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877 PUSH(v);
1878 }
1879 why = WHY_NOT;
1880 JUMPTO(b->b_handler);
1881 break;
1882 }
1883 } /* unwind stack */
1884
1885 /* End the loop if we still have an error (or return) */
1886
1887 if (why != WHY_NOT)
1888 break;
1889
1890 } /* main loop */
1891
1892 /* Pop remaining stack entries */
1893
1894 while (!EMPTY()) {
1895 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001896 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001897 }
1898
Guido van Rossum96a42c81992-01-12 02:29:51 +00001899 if (why != WHY_RETURN)
1900 retval = NULL;
1901
Guido van Rossume59214e1994-08-30 08:01:59 +00001902 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001903 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001904 if (call_trace(&f->f_trace, &f->f_trace, f,
1905 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001907 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001908 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001909 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001911 }
1912
Guido van Rossuma027efa1997-05-05 20:56:21 +00001913 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1914 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001915 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001916 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001917 retval = NULL;
1918 why = WHY_EXCEPTION;
1919 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001920 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001921
Guido van Rossuma027efa1997-05-05 20:56:21 +00001922 reset_exc_info(tstate);
1923
1924 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001925
1926 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001927
Guido van Rossum374a9221991-04-04 10:40:29 +00001928 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001929
Guido van Rossuma027efa1997-05-05 20:56:21 +00001930 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001931 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001932
Guido van Rossum96a42c81992-01-12 02:29:51 +00001933 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001934}
1935
Guido van Rossuma027efa1997-05-05 20:56:21 +00001936static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001937set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001938{
1939 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001940 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001941
Guido van Rossuma027efa1997-05-05 20:56:21 +00001942 frame = tstate->frame;
1943 if (frame->f_exc_type == NULL) {
1944 /* This frame didn't catch an exception before */
1945 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001946 if (tstate->exc_type == NULL) {
1947 Py_INCREF(Py_None);
1948 tstate->exc_type = Py_None;
1949 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001950 tmp_type = frame->f_exc_type;
1951 tmp_value = frame->f_exc_value;
1952 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001953 Py_XINCREF(tstate->exc_type);
1954 Py_XINCREF(tstate->exc_value);
1955 Py_XINCREF(tstate->exc_traceback);
1956 frame->f_exc_type = tstate->exc_type;
1957 frame->f_exc_value = tstate->exc_value;
1958 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001959 Py_XDECREF(tmp_type);
1960 Py_XDECREF(tmp_value);
1961 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001962 }
1963 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001964 tmp_type = tstate->exc_type;
1965 tmp_value = tstate->exc_value;
1966 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001967 Py_XINCREF(type);
1968 Py_XINCREF(value);
1969 Py_XINCREF(tb);
1970 tstate->exc_type = type;
1971 tstate->exc_value = value;
1972 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001973 Py_XDECREF(tmp_type);
1974 Py_XDECREF(tmp_value);
1975 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001976 /* For b/w compatibility */
1977 PySys_SetObject("exc_type", type);
1978 PySys_SetObject("exc_value", value);
1979 PySys_SetObject("exc_traceback", tb);
1980}
1981
1982static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001983reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001984{
1985 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001986 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001987 frame = tstate->frame;
1988 if (frame->f_exc_type != NULL) {
1989 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001990 tmp_type = tstate->exc_type;
1991 tmp_value = tstate->exc_value;
1992 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001993 Py_XINCREF(frame->f_exc_type);
1994 Py_XINCREF(frame->f_exc_value);
1995 Py_XINCREF(frame->f_exc_traceback);
1996 tstate->exc_type = frame->f_exc_type;
1997 tstate->exc_value = frame->f_exc_value;
1998 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001999 Py_XDECREF(tmp_type);
2000 Py_XDECREF(tmp_value);
2001 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002002 /* For b/w compatibility */
2003 PySys_SetObject("exc_type", frame->f_exc_type);
2004 PySys_SetObject("exc_value", frame->f_exc_value);
2005 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2006 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002007 tmp_type = frame->f_exc_type;
2008 tmp_value = frame->f_exc_value;
2009 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002010 frame->f_exc_type = NULL;
2011 frame->f_exc_value = NULL;
2012 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002013 Py_XDECREF(tmp_type);
2014 Py_XDECREF(tmp_value);
2015 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002016}
2017
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002018/* Logic for the raise statement (too complicated for inlining).
2019 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002020static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002021do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002022{
Guido van Rossumd295f121998-04-09 21:39:57 +00002023 if (type == NULL) {
2024 /* Reraise */
2025 PyThreadState *tstate = PyThreadState_Get();
2026 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2027 value = tstate->exc_value;
2028 tb = tstate->exc_traceback;
2029 Py_XINCREF(type);
2030 Py_XINCREF(value);
2031 Py_XINCREF(tb);
2032 }
2033
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002034 /* We support the following forms of raise:
2035 raise <class>, <classinstance>
2036 raise <class>, <argument tuple>
2037 raise <class>, None
2038 raise <class>, <argument>
2039 raise <classinstance>, None
2040 raise <string>, <object>
2041 raise <string>, None
2042
2043 An omitted second argument is the same as None.
2044
2045 In addition, raise <tuple>, <anything> is the same as
2046 raising the tuple's first item (and it better have one!);
2047 this rule is applied recursively.
2048
2049 Finally, an optional third argument can be supplied, which
2050 gives the traceback to be substituted (useful when
2051 re-raising an exception after examining it). */
2052
2053 /* First, check the traceback argument, replacing None with
2054 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002055 if (tb == Py_None) {
2056 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002057 tb = NULL;
2058 }
2059 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002061 "raise 3rd arg must be traceback or None");
2062 goto raise_error;
2063 }
2064
2065 /* Next, replace a missing value with None */
2066 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002067 value = Py_None;
2068 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002069 }
2070
2071 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2073 PyObject *tmp = type;
2074 type = PyTuple_GET_ITEM(type, 0);
2075 Py_INCREF(type);
2076 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002077 }
2078
Barry Warsaw4249f541997-08-22 21:26:19 +00002079 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002080 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002081
2082 else if (PyClass_Check(type))
2083 PyErr_NormalizeException(&type, &value, &tb);
2084
Guido van Rossumb209a111997-04-29 18:18:01 +00002085 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002086 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 if (value != Py_None) {
2088 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002089 "instance exception may not have a separate value");
2090 goto raise_error;
2091 }
2092 else {
2093 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002095 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002096 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2097 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002098 }
2099 }
2100 else {
2101 /* Not something you can raise. You get an exception
2102 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002104 "exceptions must be strings, classes, or instances");
2105 goto raise_error;
2106 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002108 if (tb == NULL)
2109 return WHY_EXCEPTION;
2110 else
2111 return WHY_RERAISE;
2112 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 Py_XDECREF(value);
2114 Py_XDECREF(type);
2115 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002116 return WHY_EXCEPTION;
2117}
2118
Barry Warsawe42b18f1997-08-25 22:13:04 +00002119static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002120unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002121{
2122 int i;
2123 PyObject *w;
2124
2125 for (i = 0; i < argcnt; i++) {
2126 if (! (w = PySequence_GetItem(v, i))) {
2127 if (PyErr_ExceptionMatches(PyExc_IndexError))
2128 PyErr_SetString(PyExc_ValueError,
2129 "unpack sequence of wrong size");
2130 goto finally;
2131 }
2132 *--sp = w;
2133 }
2134 /* we better get an IndexError now */
2135 if (PySequence_GetItem(v, i) == NULL) {
2136 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2137 PyErr_Clear();
2138 return 1;
2139 }
2140 /* some other exception occurred. fall through to finally */
2141 }
2142 else
2143 PyErr_SetString(PyExc_ValueError,
2144 "unpack sequence of wrong size");
2145 /* fall through */
2146finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002147 for (; i > 0; i--, sp++)
2148 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002149
2150 return 0;
2151}
2152
2153
Guido van Rossum96a42c81992-01-12 02:29:51 +00002154#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002155static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002156prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002158 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 if (PyObject_Print(v, stdout, 0) != 0)
2160 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002162 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002164#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002166static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002167call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002168{
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002170 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002172 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 value = Py_None;
2174 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002175 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002177 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002179 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002180 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002181 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002183 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002185 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 Py_XDECREF(type);
2187 Py_XDECREF(value);
2188 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002189 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002190}
2191
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002192/* PyObject **p_trace: in/out; may not be NULL;
2193 may not point to NULL variable initially
2194 PyObject **p_newtrace: in/out; may be NULL;
2195 may point to NULL variable;
2196 may be same variable as p_newtrace */
2197
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002198static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002199call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2200 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002201{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002202 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 PyObject *args, *what;
2204 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002205
Guido van Rossuma027efa1997-05-05 20:56:21 +00002206 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002207 /* Don't do recursive traces */
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 }
2212 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002213 }
2214
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002216 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002217 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002218 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002219 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002220 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 Py_INCREF(f);
2222 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2223 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002224 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 arg = Py_None;
2226 Py_INCREF(arg);
2227 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002228 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 PyFrame_FastToLocals(f);
2230 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2231 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002233 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002234 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002235 if (res == NULL) {
2236 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002237 PyTraceBack_Here(f);
2238 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002239 *p_trace = NULL;
2240 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002242 *p_newtrace = NULL;
2243 }
Barry Warsawf6202631999-09-08 16:26:33 +00002244 /* to be extra double plus sure we don't get recursive
2245 * calls inf either tracefunc or profilefunc gets an
2246 * exception, zap the global variables.
2247 */
2248 Py_XDECREF(tstate->sys_tracefunc);
2249 tstate->sys_tracefunc = NULL;
2250 Py_XDECREF(tstate->sys_profilefunc);
2251 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002252 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002253 }
2254 else {
2255 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 Py_XDECREF(*p_newtrace);
2257 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002258 *p_newtrace = NULL;
2259 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002260 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002261 *p_newtrace = res;
2262 }
2263 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002264 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002265 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002266 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002267}
2268
Guido van Rossumb209a111997-04-29 18:18:01 +00002269PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002270PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002271{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002272 PyThreadState *tstate = PyThreadState_Get();
2273 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002274 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002275 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002276 else
2277 return current_frame->f_builtins;
2278}
2279
Guido van Rossumb209a111997-04-29 18:18:01 +00002280PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002281PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002282{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002283 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002284 if (current_frame == NULL)
2285 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002286 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002287 return current_frame->f_locals;
2288}
2289
Guido van Rossumb209a111997-04-29 18:18:01 +00002290PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002291PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002293 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294 if (current_frame == NULL)
2295 return NULL;
2296 else
2297 return current_frame->f_globals;
2298}
2299
Guido van Rossumb209a111997-04-29 18:18:01 +00002300PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002301PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002302{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002303 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002304 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002305}
2306
Guido van Rossum6135a871995-01-09 17:53:26 +00002307int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002308PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002309{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002310 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002311 return current_frame == NULL ? 0 : current_frame->f_restricted;
2312}
2313
Guido van Rossumbe270261997-05-22 22:26:18 +00002314int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002315Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316{
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002318 if (f == NULL)
2319 return 0;
2320 if (!PyFile_SoftSpace(f, 0))
2321 return 0;
2322 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323}
2324
Guido van Rossum3f5da241990-12-20 15:06:42 +00002325
Guido van Rossum681d79a1995-07-18 14:51:37 +00002326/* External interface to call any callable object.
2327 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002328
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002329#undef PyEval_CallObject
2330/* for backward compatibility: export this interface */
2331
Guido van Rossumb209a111997-04-29 18:18:01 +00002332PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002333PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002334{
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002337#define PyEval_CallObject(func,arg) \
2338 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002339
Guido van Rossumb209a111997-04-29 18:18:01 +00002340PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002341PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002342{
2343 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002345
2346 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002347 arg = PyTuple_New(0);
2348 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002349 PyErr_SetString(PyExc_TypeError,
2350 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351 return NULL;
2352 }
2353 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002354 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002355
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002357 PyErr_SetString(PyExc_TypeError,
2358 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002359 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002360 return NULL;
2361 }
2362
Guido van Rossum150b2df1996-12-05 23:17:11 +00002363 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002364 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002366 result = call_function(func, arg, kw);
2367 else
2368 result = call_builtin(func, arg, kw);
2369
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002371
Guido van Rossumb209a111997-04-29 18:18:01 +00002372 if (result == NULL && !PyErr_Occurred())
2373 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002374 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002375
2376 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002377}
2378
Guido van Rossumb209a111997-04-29 18:18:01 +00002379static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002380call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381{
Guido van Rossumb209a111997-04-29 18:18:01 +00002382 if (PyCFunction_Check(func)) {
2383 PyCFunction meth = PyCFunction_GetFunction(func);
2384 PyObject *self = PyCFunction_GetSelf(func);
2385 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002386 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002388 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002390 else if (size == 0)
2391 arg = NULL;
2392 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002393 if (flags & METH_KEYWORDS)
2394 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 if (kw != NULL && PyDict_Size(kw) != 0) {
2396 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002397 "this function takes no keyword arguments");
2398 return NULL;
2399 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002400 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 if (PyClass_Check(func)) {
2403 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 if (PyInstance_Check(func)) {
2406 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002407 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 PyErr_Clear();
2409 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002411 return NULL;
2412 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002413 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002415 return res;
2416 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002417 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002418 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 return NULL;
2420}
2421
Guido van Rossumb209a111997-04-29 18:18:01 +00002422static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002423call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424{
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 PyObject *class = NULL; /* == owner */
2426 PyObject *argdefs;
2427 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 if (kw != NULL && !PyDict_Check(kw)) {
2432 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 return NULL;
2434 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 if (PyMethod_Check(func)) {
2437 PyObject *self = PyMethod_Self(func);
2438 class = PyMethod_Class(func);
2439 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002440 if (self == NULL) {
2441 /* Unbound methods must be called with an instance of
2442 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 if (PyTuple_Size(arg) >= 1) {
2444 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002445 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 PyInstance_Check(self) &&
2447 PyClass_IsSubclass((PyObject *)
2448 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002449 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002451 else
2452 self = NULL;
2453 }
2454 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002456 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002457 return NULL;
2458 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002460 }
2461 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 int argcount = PyTuple_Size(arg);
2463 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002465 if (newarg == NULL)
2466 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002467 Py_INCREF(self);
2468 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002469 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 PyObject *v = PyTuple_GET_ITEM(arg, i);
2471 Py_XINCREF(v);
2472 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002473 }
2474 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002476 if (!PyFunction_Check(func)) {
2477 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2478 Py_DECREF(arg);
2479 return result;
2480 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 }
2482 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002484 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002485 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002486 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487 return NULL;
2488 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002491
2492 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002493 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2494 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2495 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002496 }
2497 else {
2498 d = NULL;
2499 nd = 0;
2500 }
2501
2502 if (kw != NULL) {
2503 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 nk = PyDict_Size(kw);
2505 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002506 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002507 PyErr_NoMemory();
2508 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002509 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002510 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002511 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002512 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002513 i += 2;
2514 nk = i/2;
2515 /* XXX This is broken if the caller deletes dict items! */
2516 }
2517 else {
2518 k = NULL;
2519 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002520 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521
Guido van Rossum681d79a1995-07-18 14:51:37 +00002522 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002523 (PyCodeObject *)PyFunction_GetCode(func),
2524 PyFunction_GetGlobals(func), (PyObject *)NULL,
2525 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002526 k, nk,
2527 d, nd,
2528 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529
Guido van Rossumb209a111997-04-29 18:18:01 +00002530 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002531 if (k != NULL)
2532 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533
Guido van Rossum681d79a1995-07-18 14:51:37 +00002534 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535}
2536
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002537#define SLICE_ERROR_MSG \
2538 "standard sequence type does not support step size other than one"
2539
Guido van Rossumb209a111997-04-29 18:18:01 +00002540static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002541loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542{
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002544 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002545 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002546 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 return NULL;
2548 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002549 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002550 v = (*sq->sq_item)(v, i);
2551 if (v)
2552 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002553 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002554 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002555 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556}
2557
Guido van Rossum20c6add2000-05-08 14:06:50 +00002558/* Extract a slice index from a PyInt or PyLong, the index is bound to
2559 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2560 and error. Returns 1 on success.*/
2561
2562int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002563_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564{
2565 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002567 if (PyInt_Check(v)) {
2568 x = PyInt_AsLong(v);
2569 } else if (PyLong_Check(v)) {
2570 x = PyLong_AsLong(v);
2571 if (x==-1 && PyErr_Occurred()) {
2572 PyObject *long_zero;
2573
2574 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2575 /* It's not an overflow error, so just
2576 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002577 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002578 }
2579
2580 /* It's an overflow error, so we need to
2581 check the sign of the long integer,
2582 set the value to INT_MAX or 0, and clear
2583 the error. */
2584
2585 /* Create a long integer with a value of 0 */
2586 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002587 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002588
2589 /* Check sign */
2590 if (PyObject_Compare(long_zero, v) < 0)
2591 x = INT_MAX;
2592 else
2593 x = 0;
2594
2595 /* Free the long integer we created, and clear the
2596 OverflowError */
2597 Py_DECREF(long_zero);
2598 PyErr_Clear();
2599 }
2600 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002601 PyErr_SetString(PyExc_TypeError,
2602 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002603 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 /* Truncate -- very long indices are truncated anyway */
2606 if (x > INT_MAX)
2607 x = INT_MAX;
2608 else if (x < -INT_MAX)
2609 x = 0;
2610 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002612 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613}
2614
Guido van Rossumb209a111997-04-29 18:18:01 +00002615static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002616apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002618 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002619 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002621 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002622 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002623 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002625
2626static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002627assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002630 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002631 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002632 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 if (x == NULL)
2635 return PySequence_DelSlice(u, ilow, ihigh);
2636 else
2637 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638}
2639
Guido van Rossumb209a111997-04-29 18:18:01 +00002640static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002641cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642{
2643 register int cmp;
2644 register int res = 0;
2645 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002646 case IS:
2647 case IS_NOT:
2648 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002649 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650 res = !res;
2651 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 case IN:
2653 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002654 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002655 if (res < 0)
2656 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002657 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002658 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 break;
2660 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002661 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 break;
2663 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002665 if (cmp && PyErr_Occurred())
2666 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 switch (op) {
2668 case LT: res = cmp < 0; break;
2669 case LE: res = cmp <= 0; break;
2670 case EQ: res = cmp == 0; break;
2671 case NE: res = cmp != 0; break;
2672 case GT: res = cmp > 0; break;
2673 case GE: res = cmp >= 0; break;
2674 /* XXX no default? (res is initialized to 0 though) */
2675 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 v = res ? Py_True : Py_False;
2678 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679 return v;
2680}
2681
Thomas Wouters52152252000-08-17 22:55:00 +00002682static PyObject *
2683import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002684{
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 PyObject *w, *x;
2686 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002687 PyErr_SetString(PyExc_TypeError,
2688 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002689 return NULL;
2690 }
2691 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2692 x = PyDict_GetItem(w, name);
2693 if (x == NULL) {
2694 PyErr_Format(PyExc_ImportError,
2695 "cannot import name %.230s",
2696 PyString_AsString(name));
2697 } else
2698 Py_INCREF(x);
2699 return x;
2700}
2701
2702static int
2703import_all_from(PyObject *locals, PyObject *v)
2704{
2705 int pos = 0, err;
2706 PyObject *name, *value;
2707 PyObject *w;
2708
2709 if (!PyModule_Check(v)) {
2710 PyErr_SetString(PyExc_TypeError,
2711 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002712 return -1;
2713 }
Thomas Wouters52152252000-08-17 22:55:00 +00002714 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2715
2716 while (PyDict_Next(w, &pos, &name, &value)) {
2717 if (!PyString_Check(name) ||
2718 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002719 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002720 Py_INCREF(value);
2721 err = PyDict_SetItem(locals, name, value);
2722 Py_DECREF(value);
2723 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002724 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002725 }
Thomas Wouters52152252000-08-17 22:55:00 +00002726 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002727}
2728
Guido van Rossumb209a111997-04-29 18:18:01 +00002729static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002730build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002731{
Guido van Rossumcd649651997-08-22 16:56:16 +00002732 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002733 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002734 PyErr_SetString(PyExc_SystemError,
2735 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002736 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002737 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002739 PyErr_SetString(PyExc_SystemError,
2740 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002741 return NULL;
2742 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002744 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002745 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002746 return NULL;
2747 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002748 n = PyTuple_Size(bases);
2749 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 PyObject *base = PyTuple_GET_ITEM(bases, i);
2751 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002752 /* Call the base's *type*, if it is callable.
2753 This code is a hook for Donald Beaudry's
2754 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002755 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002756 since its types are not callable.
2757 Ditto: call the bases's *class*, if it has
2758 one. This makes the same thing possible
2759 without writing C code. A true meta-object
2760 protocol! */
2761 PyObject *basetype = (PyObject *)base->ob_type;
2762 PyObject *callable = NULL;
2763 if (PyCallable_Check(basetype))
2764 callable = basetype;
2765 else
2766 callable = PyObject_GetAttrString(
2767 base, "__class__");
2768 if (callable) {
2769 PyObject *args;
2770 PyObject *newclass = NULL;
2771 args = Py_BuildValue(
2772 "(OOO)", name, bases, methods);
2773 if (args != NULL) {
2774 newclass = PyEval_CallObject(
2775 callable, args);
2776 Py_DECREF(args);
2777 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002778 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002779 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002780 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002781 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002782 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002784 "base is not a class object");
2785 return NULL;
2786 }
2787 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002788 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002789}
2790
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002791static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002792exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
2793 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002794{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002795 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002797 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002798
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2800 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002801 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002803 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002804 locals = PyTuple_GetItem(prog, 2);
2805 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002806 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 if (globals == Py_None) {
2808 globals = PyEval_GetGlobals();
2809 if (locals == Py_None) {
2810 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002811 plain = 1;
2812 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002813 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002815 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 if (!PyString_Check(prog) &&
2817 !PyCode_Check(prog) &&
2818 !PyFile_Check(prog)) {
2819 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002820 "exec 1st arg must be string, code or file object");
2821 return -1;
2822 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002823 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2824 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002825 "exec 2nd/3rd args must be dict or None");
2826 return -1;
2827 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002829 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002830 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002831 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002832 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002833 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 FILE *fp = PyFile_AsFile(prog);
2835 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002836 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2837 }
2838 else {
2839 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00002840 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002841 PyErr_SetString(PyExc_ValueError,
2842 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002843 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002844 }
2845 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002846 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002847 if (plain)
2848 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002849 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002850 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002851 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002852 return 0;
2853}
Guido van Rossum24c13741995-02-14 09:42:43 +00002854
Guido van Rossum1aa14831997-01-21 05:34:20 +00002855/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002856static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002857find_from_args(PyFrameObject *f, int nexti)
Guido van Rossum24c13741995-02-14 09:42:43 +00002858{
2859 int opcode;
2860 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002861 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002862 unsigned char *next_instr;
2863
Guido van Rossumd076c731998-10-07 19:42:25 +00002864 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2865 next_instr += nexti;
2866
Guido van Rossum24c13741995-02-14 09:42:43 +00002867 opcode = (*next_instr++);
Thomas Wouters52152252000-08-17 22:55:00 +00002868 if (opcode != IMPORT_FROM && opcode != IMPORT_STAR) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002869 Py_INCREF(Py_None);
2870 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002871 }
2872
Guido van Rossumb209a111997-04-29 18:18:01 +00002873 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002874 if (list == NULL)
2875 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00002876
2877 if (opcode == IMPORT_STAR) {
2878 name = PyString_FromString("*");
2879 if (!name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002880 Py_DECREF(list);
Thomas Wouters52152252000-08-17 22:55:00 +00002881 else {
Fred Drake04e654a2000-08-18 19:53:25 +00002882 if (PyList_Append(list, name) < 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002883 Py_DECREF(list);
Fred Drake04e654a2000-08-18 19:53:25 +00002884 }
Thomas Wouters52152252000-08-17 22:55:00 +00002885 Py_DECREF(name);
Guido van Rossum24c13741995-02-14 09:42:43 +00002886 }
Thomas Wouters52152252000-08-17 22:55:00 +00002887 } else {
2888 do {
2889 oparg = (next_instr[1]<<8) + next_instr[0];
Thomas Wouters04005152000-08-20 14:01:53 +00002890 /* Jump over our own argument, the next instruction
2891 (which is a STORE), and its argument.*/
2892 next_instr += 5;
Thomas Wouters52152252000-08-17 22:55:00 +00002893 name = Getnamev(f, oparg);
2894 if (PyList_Append(list, name) < 0) {
2895 Py_DECREF(list);
2896 break;
2897 }
2898 opcode = (*next_instr++);
2899 } while (opcode == IMPORT_FROM);
2900 }
Guido van Rossum24c13741995-02-14 09:42:43 +00002901 return list;
2902}
Guido van Rossum950361c1997-01-24 13:49:28 +00002903
2904
2905#ifdef DYNAMIC_EXECUTION_PROFILE
2906
2907PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00002909{
2910 int i;
2911 PyObject *l = PyList_New(256);
2912 if (l == NULL) return NULL;
2913 for (i = 0; i < 256; i++) {
2914 PyObject *x = PyInt_FromLong(a[i]);
2915 if (x == NULL) {
2916 Py_DECREF(l);
2917 return NULL;
2918 }
2919 PyList_SetItem(l, i, x);
2920 }
2921 for (i = 0; i < 256; i++)
2922 a[i] = 0;
2923 return l;
2924}
2925
2926PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00002928{
2929#ifndef DXPAIRS
2930 return getarray(dxp);
2931#else
2932 int i;
2933 PyObject *l = PyList_New(257);
2934 if (l == NULL) return NULL;
2935 for (i = 0; i < 257; i++) {
2936 PyObject *x = getarray(dxpairs[i]);
2937 if (x == NULL) {
2938 Py_DECREF(l);
2939 return NULL;
2940 }
2941 PyList_SetItem(l, i, x);
2942 }
2943 return l;
2944#endif
2945}
2946
2947#endif