blob: af28cdca874c853b8103fb3bebecb6c7ec987ae3 [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;
329 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000330 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000331 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000332 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000333 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000334#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000335 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000336#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000337#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000338 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000339 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000340#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000341
342/* Code access macros */
343
344#define GETCONST(i) Getconst(f, i)
345#define GETNAME(i) Getname(f, i)
346#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000347#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000348#define NEXTOP() (*next_instr++)
349#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000350#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000351#define JUMPBY(x) (next_instr += (x))
352
353/* Stack manipulation macros */
354
355#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
356#define EMPTY() (STACK_LEVEL() == 0)
357#define TOP() (stack_pointer[-1])
358#define BASIC_PUSH(v) (*stack_pointer++ = (v))
359#define BASIC_POP() (*--stack_pointer)
360
Guido van Rossum96a42c81992-01-12 02:29:51 +0000361#ifdef LLTRACE
362#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
363#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000364#else
365#define PUSH(v) BASIC_PUSH(v)
366#define POP() BASIC_POP()
367#endif
368
Guido van Rossum681d79a1995-07-18 14:51:37 +0000369/* Local variable macros */
370
371#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000372#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000373 GETLOCAL(i) = value; } while (0)
374
Guido van Rossuma027efa1997-05-05 20:56:21 +0000375/* Start of code */
376
Guido van Rossum8861b741996-07-30 16:49:37 +0000377#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000379 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000380 return NULL;
381 }
382#endif
383
Guido van Rossum681d79a1995-07-18 14:51:37 +0000384 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000385 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000386 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000387 }
388
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000389#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000390 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000391#endif
392
Guido van Rossumb209a111997-04-29 18:18:01 +0000393 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000394 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000395 co, /*code*/
396 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000397 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000398 if (f == NULL)
399 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000400
Guido van Rossuma027efa1997-05-05 20:56:21 +0000401 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000402 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000403
404 if (co->co_argcount > 0 ||
405 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
406 int i;
407 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000408 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000410 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411 if (kwdict == NULL)
412 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000413 i = co->co_argcount;
414 if (co->co_flags & CO_VARARGS)
415 i++;
416 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000417 }
418 if (argcount > co->co_argcount) {
419 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000420 PyErr_Format(PyExc_TypeError,
421 "too many arguments; expected %d, got %d",
422 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 goto fail;
424 }
425 n = co->co_argcount;
426 }
427 for (i = 0; i < n; i++) {
428 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 SETLOCAL(i, x);
431 }
432 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000433 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000434 if (u == NULL)
435 goto fail;
436 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437 for (i = n; i < argcount; i++) {
438 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000439 Py_INCREF(x);
440 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000441 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 }
443 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 PyObject *keyword = kws[2*i];
445 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000447 if (keyword == NULL || !PyString_Check(keyword)) {
448 PyErr_SetString(PyExc_TypeError,
449 "keywords must be strings");
450 goto fail;
451 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452 /* XXX slow -- speed up using dictionary? */
453 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000454 PyObject *nm = PyTuple_GET_ITEM(
455 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000456 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 break;
458 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000459 /* Check errors from Compare */
460 if (PyErr_Occurred())
461 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 if (j >= co->co_argcount) {
463 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000464 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000465 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000466 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 goto fail;
468 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000470 }
471 else {
472 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000473 PyErr_Format(PyExc_TypeError,
474 "keyword parameter redefined: %.400s",
475 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 goto fail;
477 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 SETLOCAL(j, value);
480 }
481 }
482 if (argcount < co->co_argcount) {
483 int m = co->co_argcount - defcount;
484 for (i = argcount; i < m; i++) {
485 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000486 PyErr_Format(PyExc_TypeError,
487 "not enough arguments; expected %d, got %d",
488 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 goto fail;
490 }
491 }
492 if (n > m)
493 i = n - m;
494 else
495 i = 0;
496 for (; i < defcount; i++) {
497 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 PyObject *def = defs[i];
499 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 SETLOCAL(m+i, def);
501 }
502 }
503 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000504 }
505 else {
506 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000507 PyErr_SetString(PyExc_TypeError,
508 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000509 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 }
511 }
512
Guido van Rossuma027efa1997-05-05 20:56:21 +0000513 if (tstate->sys_tracefunc != NULL) {
514 /* tstate->sys_tracefunc, if defined, is a function that
515 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000516 Its return value, if not None, is a function that
517 will be called at the start of each executed line
518 of code. (Actually, the function must return
519 itself in order to continue tracing.)
520 The trace functions are called with three arguments:
521 a pointer to the current frame, a string indicating
522 why the function is called, and an argument which
523 depends on the situation. The global trace function
524 (sys.trace) is also called whenever an exception
525 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000526 if (call_trace(&tstate->sys_tracefunc,
527 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000528 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000529 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000530 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000531 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000532 }
533
Guido van Rossuma027efa1997-05-05 20:56:21 +0000534 if (tstate->sys_profilefunc != NULL) {
535 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000536 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000537 if (call_trace(&tstate->sys_profilefunc,
538 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000539 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000540 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000541 }
542 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000543
Guido van Rossuma027efa1997-05-05 20:56:21 +0000544 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
545 --tstate->recursion_depth;
546 PyErr_SetString(PyExc_RuntimeError,
547 "Maximum recursion depth exceeded");
548 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000549 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000550 return NULL;
551 }
552
Guido van Rossumd076c731998-10-07 19:42:25 +0000553 _PyCode_GETCODEPTR(co, &first_instr);
554 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000555 stack_pointer = f->f_valuestack;
556
Guido van Rossum374a9221991-04-04 10:40:29 +0000557 why = WHY_NOT;
558 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000560
561 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000562 /* Do periodic things. Doing this every time through
563 the loop would add too much overhead, so we do it
564 only every Nth instruction. We also do it if
565 ``things_to_do'' is set, i.e. when an asynchronous
566 event needs attention (e.g. a signal handler or
567 async I/O handler); see Py_AddPendingCall() and
568 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000569
Guido van Rossuma027efa1997-05-05 20:56:21 +0000570 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000571 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000572 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000573 if (Py_MakePendingCalls() < 0) {
574 why = WHY_EXCEPTION;
575 goto on_error;
576 }
577 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000578#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000579 /* If we have true signals, the signal handler
580 will call Py_AddPendingCall() so we don't
581 have to call sigcheck(). On the Mac and
582 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000583 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 goto on_error;
586 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000587#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000588
Guido van Rossume59214e1994-08-30 08:01:59 +0000589#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000590 if (interpreter_lock) {
591 /* Give another thread a chance */
592
Guido van Rossum25ce5661997-08-02 03:10:38 +0000593 if (PyThreadState_Swap(NULL) != tstate)
594 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000595 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000596
597 /* Other threads may run now */
598
Guido van Rossum65d5b571998-12-21 19:32:43 +0000599 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000600 if (PyThreadState_Swap(tstate) != NULL)
601 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602 }
603#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000604 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000605
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000607
Guido van Rossum408027e1996-12-30 16:17:54 +0000608#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000609 f->f_lasti = INSTR_OFFSET();
610#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000611
612 opcode = NEXTOP();
613 if (HAS_ARG(opcode))
614 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000615#ifdef DYNAMIC_EXECUTION_PROFILE
616#ifdef DXPAIRS
617 dxpairs[lastopcode][opcode]++;
618 lastopcode = opcode;
619#endif
620 dxp[opcode]++;
621#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000622
Guido van Rossum96a42c81992-01-12 02:29:51 +0000623#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 /* Instruction tracing */
625
Guido van Rossum96a42c81992-01-12 02:29:51 +0000626 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 if (HAS_ARG(opcode)) {
628 printf("%d: %d, %d\n",
629 (int) (INSTR_OFFSET() - 3),
630 opcode, oparg);
631 }
632 else {
633 printf("%d: %d\n",
634 (int) (INSTR_OFFSET() - 1), opcode);
635 }
636 }
637#endif
638
639 /* Main switch on opcode */
640
641 switch (opcode) {
642
643 /* BEWARE!
644 It is essential that any operation that fails sets either
645 x to NULL, err to nonzero, or why to anything but WHY_NOT,
646 and that no operation that succeeds does this! */
647
648 /* case STOP_CODE: this is an error! */
649
650 case POP_TOP:
651 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000652 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000653 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000654
655 case ROT_TWO:
656 v = POP();
657 w = POP();
658 PUSH(v);
659 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000660 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000661
662 case ROT_THREE:
663 v = POP();
664 w = POP();
665 x = POP();
666 PUSH(v);
667 PUSH(x);
668 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000669 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000670
671 case DUP_TOP:
672 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000673 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000674 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000675 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000676
677 case UNARY_POSITIVE:
678 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000679 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000680 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000682 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 break;
684
685 case UNARY_NEGATIVE:
686 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000687 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000688 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 break;
692
693 case UNARY_NOT:
694 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000695 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000696 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000697 if (err == 0) {
698 Py_INCREF(Py_True);
699 PUSH(Py_True);
700 continue;
701 }
702 else if (err > 0) {
703 Py_INCREF(Py_False);
704 PUSH(Py_False);
705 err = 0;
706 continue;
707 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 break;
709
710 case UNARY_CONVERT:
711 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000712 x = PyObject_Repr(v);
713 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000715 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000717
718 case UNARY_INVERT:
719 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000720 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000721 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000722 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000723 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000724 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000725
Guido van Rossum50564e81996-01-12 01:13:16 +0000726 case BINARY_POWER:
727 w = POP();
728 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000729 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000730 Py_DECREF(v);
731 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000732 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000734 break;
735
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 case BINARY_MULTIPLY:
737 w = POP();
738 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000739 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000740 Py_DECREF(v);
741 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000743 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 break;
745
746 case BINARY_DIVIDE:
747 w = POP();
748 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000749 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000750 Py_DECREF(v);
751 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000753 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 break;
755
756 case BINARY_MODULO:
757 w = POP();
758 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000759 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_DECREF(v);
761 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 break;
765
766 case BINARY_ADD:
767 w = POP();
768 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000769 if (PyInt_Check(v) && PyInt_Check(w)) {
770 /* INLINE: int + int */
771 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000772 a = PyInt_AS_LONG(v);
773 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000774 i = a + b;
775 if ((i^a) < 0 && (i^b) < 0) {
776 PyErr_SetString(PyExc_OverflowError,
777 "integer addition");
778 x = NULL;
779 }
780 else
781 x = PyInt_FromLong(i);
782 }
783 else
784 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000785 Py_DECREF(v);
786 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 break;
790
791 case BINARY_SUBTRACT:
792 w = POP();
793 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000794 if (PyInt_Check(v) && PyInt_Check(w)) {
795 /* INLINE: int - int */
796 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000797 a = PyInt_AS_LONG(v);
798 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000799 i = a - b;
800 if ((i^a) < 0 && (i^~b) < 0) {
801 PyErr_SetString(PyExc_OverflowError,
802 "integer subtraction");
803 x = NULL;
804 }
805 else
806 x = PyInt_FromLong(i);
807 }
808 else
809 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000810 Py_DECREF(v);
811 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000813 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 break;
815
816 case BINARY_SUBSCR:
817 w = POP();
818 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000819 if (PyList_Check(v) && PyInt_Check(w)) {
820 /* INLINE: list[int] */
821 long i = PyInt_AsLong(w);
822 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000823 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000824 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000825 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000826 PyErr_SetString(PyExc_IndexError,
827 "list index out of range");
828 x = NULL;
829 }
830 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000831 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000832 Py_INCREF(x);
833 }
834 }
835 else
836 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
838 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
842
Guido van Rossum7928cd71991-10-24 14:59:31 +0000843 case BINARY_LSHIFT:
844 w = POP();
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
848 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000851 break;
852
853 case BINARY_RSHIFT:
854 w = POP();
855 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
858 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000859 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000860 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000861 break;
862
863 case BINARY_AND:
864 w = POP();
865 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000866 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(v);
868 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000870 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000871 break;
872
873 case BINARY_XOR:
874 w = POP();
875 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000876 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000877 Py_DECREF(v);
878 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 break;
882
883 case BINARY_OR:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000891 break;
892
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 case SLICE+0:
894 case SLICE+1:
895 case SLICE+2:
896 case SLICE+3:
897 if ((opcode-SLICE) & 2)
898 w = POP();
899 else
900 w = NULL;
901 if ((opcode-SLICE) & 1)
902 v = POP();
903 else
904 v = NULL;
905 u = POP();
906 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(u);
908 Py_XDECREF(v);
909 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 break;
913
914 case STORE_SLICE+0:
915 case STORE_SLICE+1:
916 case STORE_SLICE+2:
917 case STORE_SLICE+3:
918 if ((opcode-STORE_SLICE) & 2)
919 w = POP();
920 else
921 w = NULL;
922 if ((opcode-STORE_SLICE) & 1)
923 v = POP();
924 else
925 v = NULL;
926 u = POP();
927 t = POP();
928 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 Py_DECREF(t);
930 Py_DECREF(u);
931 Py_XDECREF(v);
932 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000933 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 break;
935
936 case DELETE_SLICE+0:
937 case DELETE_SLICE+1:
938 case DELETE_SLICE+2:
939 case DELETE_SLICE+3:
940 if ((opcode-DELETE_SLICE) & 2)
941 w = POP();
942 else
943 w = NULL;
944 if ((opcode-DELETE_SLICE) & 1)
945 v = POP();
946 else
947 v = NULL;
948 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000951 Py_DECREF(u);
952 Py_XDECREF(v);
953 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000954 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 break;
956
957 case STORE_SUBSCR:
958 w = POP();
959 v = POP();
960 u = POP();
961 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000962 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 Py_DECREF(u);
964 Py_DECREF(v);
965 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000966 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 break;
968
969 case DELETE_SUBSCR:
970 w = POP();
971 v = POP();
972 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000973 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000974 Py_DECREF(v);
975 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000976 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 break;
978
979 case PRINT_EXPR:
980 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000981 /* Print value except if None */
982 /* After printing, also assign to '_' */
983 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +0000984 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000985 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000986 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000987 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +0000988 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000989 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +0000990 if (x == NULL) {
991 PyErr_SetString(
992 PyExc_RuntimeError,
993 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +0000994 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +0000995 }
Guido van Rossumbe270261997-05-22 22:26:18 +0000996 }
997 if (err == 0)
998 err = PyFile_WriteObject(v, x, 0);
999 if (err == 0) {
1000 PyFile_SoftSpace(x, 1);
1001 err = Py_FlushLine();
1002 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001003 if (err == 0) {
1004 err = PyDict_SetItemString(
1005 f->f_builtins, "_", v);
1006 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001008 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001009 break;
1010
1011 case PRINT_ITEM:
1012 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001014 if (w == NULL) {
1015 PyErr_SetString(PyExc_RuntimeError,
1016 "lost sys.stdout");
1017 err = -1;
1018 }
1019 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001020 err = PyFile_WriteString(" ", w);
1021 if (err == 0)
1022 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001024 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 char *s = PyString_AsString(v);
1026 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001027 if (len > 0 &&
1028 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001029 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001030 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001033 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 break;
1035
1036 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001038 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001039 PyErr_SetString(PyExc_RuntimeError,
1040 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001041 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001042 err = PyFile_WriteString("\n", x);
1043 if (err == 0)
1044 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001045 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 break;
1047
1048 case BREAK_LOOP:
1049 why = WHY_BREAK;
1050 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001051
Guido van Rossumf10570b1995-07-07 22:53:21 +00001052 case RAISE_VARARGS:
1053 u = v = w = NULL;
1054 switch (oparg) {
1055 case 3:
1056 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001057 /* Fallthrough */
1058 case 2:
1059 v = POP(); /* value */
1060 /* Fallthrough */
1061 case 1:
1062 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001063 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001064 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001065 break;
1066 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001067 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001069 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001070 break;
1071 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 break;
1073
1074 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001075 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001076 PyErr_SetString(PyExc_SystemError,
1077 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001078 break;
1079 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001080 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001081 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001082 break;
1083
1084 case RETURN_VALUE:
1085 retval = POP();
1086 why = WHY_RETURN;
1087 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001088
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001089 case EXEC_STMT:
1090 w = POP();
1091 v = POP();
1092 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001093 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001094 Py_DECREF(u);
1095 Py_DECREF(v);
1096 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001097 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001098
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 case POP_BLOCK:
1100 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001101 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 while (STACK_LEVEL() > b->b_level) {
1103 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001104 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 }
1106 }
1107 break;
1108
1109 case END_FINALLY:
1110 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001111 if (PyInt_Check(v)) {
1112 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 if (why == WHY_RETURN)
1114 retval = POP();
1115 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001116 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001118 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001119 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001121 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001123 else if (v != Py_None) {
1124 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 "'finally' pops bad exception");
1126 why = WHY_EXCEPTION;
1127 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 break;
1130
1131 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001132 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001134 w = POP();
1135 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001137 Py_DECREF(u);
1138 Py_DECREF(v);
1139 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 break;
1141
1142 case STORE_NAME:
1143 w = GETNAMEV(oparg);
1144 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001145 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001146 PyErr_SetString(PyExc_SystemError,
1147 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001148 break;
1149 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001150 err = PyDict_SetItem(x, w, v);
1151 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 break;
1153
1154 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001155 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001156 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001157 PyErr_SetString(PyExc_SystemError,
1158 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001159 break;
1160 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001161 if ((err = PyDict_DelItem(x, w)) != 0)
1162 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001164
1165#ifdef CASE_TOO_BIG
1166 default: switch (opcode) {
1167#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001168
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001169 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001171 if (PyTuple_Check(v)) {
1172 if (PyTuple_Size(v) != oparg) {
1173 PyErr_SetString(PyExc_ValueError,
1174 "unpack tuple of wrong size");
1175 why = WHY_EXCEPTION;
1176 }
1177 else {
1178 for (; --oparg >= 0; ) {
1179 w = PyTuple_GET_ITEM(v, oparg);
1180 Py_INCREF(w);
1181 PUSH(w);
1182 }
1183 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001185 else if (PyList_Check(v)) {
1186 if (PyList_Size(v) != oparg) {
1187 PyErr_SetString(PyExc_ValueError,
1188 "unpack list of wrong size");
1189 why = WHY_EXCEPTION;
1190 }
1191 else {
1192 for (; --oparg >= 0; ) {
1193 w = PyList_GET_ITEM(v, oparg);
1194 Py_INCREF(w);
1195 PUSH(w);
1196 }
1197 }
1198 }
1199 else if (PySequence_Check(v)) {
1200 if (unpack_sequence(v, oparg,
1201 stack_pointer + oparg))
1202 stack_pointer += oparg;
1203 else
1204 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 }
1206 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001207 PyErr_SetString(PyExc_TypeError,
1208 "unpack non-sequence");
1209 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001211 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 break;
1213
1214 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001215 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 v = POP();
1217 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001218 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1219 Py_DECREF(v);
1220 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 break;
1222
1223 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001224 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001226 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1227 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001228 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 break;
1230
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001231 case STORE_GLOBAL:
1232 w = GETNAMEV(oparg);
1233 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001234 err = PyDict_SetItem(f->f_globals, w, v);
1235 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001236 break;
1237
1238 case DELETE_GLOBAL:
1239 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1241 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001242 break;
1243
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 case LOAD_CONST:
1245 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 PUSH(x);
1248 break;
1249
1250 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001251 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001252 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001253 PyErr_SetString(PyExc_SystemError,
1254 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001255 break;
1256 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001257 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001259 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001263 PyErr_SetObject(
1264 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
1266 }
1267 }
1268 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001269 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 PUSH(x);
1271 break;
1272
1273 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001274 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 x = PyDict_GetItem(f->f_globals, 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_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001279 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 break;
1281 }
1282 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 PUSH(x);
1285 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001286
Guido van Rossum9bfef441993-03-29 10:43:31 +00001287 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001288 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001289 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001290 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001292 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001293 break;
1294 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001296 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001297 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001298 break;
1299
1300 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001301 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001302 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001303 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001304
1305 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001306 x = GETLOCAL(oparg);
1307 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001308 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001309 PyTuple_GetItem(co->co_varnames,
1310 oparg));
1311 break;
1312 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001313 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001314 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001315
1316 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001317 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 if (x != NULL) {
1319 for (; --oparg >= 0;) {
1320 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 }
1323 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001324 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 }
1326 break;
1327
1328 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001329 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 if (x != NULL) {
1331 for (; --oparg >= 0;) {
1332 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001333 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 }
1335 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001336 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 }
1338 break;
1339
1340 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001341 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001343 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 break;
1345
1346 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001347 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001349 x = PyObject_GetAttr(v, w);
1350 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001352 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 break;
1354
1355 case COMPARE_OP:
1356 w = POP();
1357 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001358 if (PyInt_Check(v) && PyInt_Check(w)) {
1359 /* INLINE: cmp(int, int) */
1360 register long a, b;
1361 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001362 a = PyInt_AS_LONG(v);
1363 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001364 switch (oparg) {
1365 case LT: res = a < b; break;
1366 case LE: res = a <= b; break;
1367 case EQ: res = a == b; break;
1368 case NE: res = a != b; break;
1369 case GT: res = a > b; break;
1370 case GE: res = a >= b; break;
1371 case IS: res = v == w; break;
1372 case IS_NOT: res = v != w; break;
1373 default: goto slow_compare;
1374 }
1375 x = res ? Py_True : Py_False;
1376 Py_INCREF(x);
1377 }
1378 else {
1379 slow_compare:
1380 x = cmp_outcome(oparg, v, w);
1381 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 Py_DECREF(v);
1383 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001385 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 break;
1387
1388 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001389 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001390 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001391 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001392 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001393 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001394 break;
1395 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001396 u = find_from_args(f, INSTR_OFFSET());
1397 if (u == NULL) {
1398 x = u;
1399 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001400 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001401 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001402 w,
1403 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001404 f->f_locals == NULL ?
1405 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001406 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001407 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 if (w == NULL) {
1409 x = NULL;
1410 break;
1411 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 x = PyEval_CallObject(x, w);
1413 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001414 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001415 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 break;
1417
Thomas Wouters52152252000-08-17 22:55:00 +00001418 case IMPORT_STAR:
1419 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001422 PyErr_SetString(PyExc_SystemError,
1423 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001424 break;
1425 }
Thomas Wouters52152252000-08-17 22:55:00 +00001426 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001428 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001429 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001431
Thomas Wouters52152252000-08-17 22:55:00 +00001432 case IMPORT_FROM:
1433 w = GETNAMEV(oparg);
1434 v = TOP();
1435 x = import_from(v, w);
1436 PUSH(x);
1437 if (x != NULL) continue;
1438 break;
1439
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 case JUMP_FORWARD:
1441 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001442 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001443
1444 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001446 if (err > 0)
1447 err = 0;
1448 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001450 else
1451 break;
1452 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001453
1454 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001456 if (err > 0) {
1457 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001459 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001460 else if (err == 0)
1461 ;
1462 else
1463 break;
1464 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001465
1466 case JUMP_ABSOLUTE:
1467 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001468 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001469
1470 case FOR_LOOP:
1471 /* for v in s: ...
1472 On entry: stack contains s, i.
1473 On exit: stack contains s, i+1, s[i];
1474 but if loop exhausted:
1475 s, i are popped, and we jump */
1476 w = POP(); /* Loop index */
1477 v = POP(); /* Sequence object */
1478 u = loop_subscript(v, w);
1479 if (u != NULL) {
1480 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001481 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001484 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001485 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 }
1487 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 Py_DECREF(v);
1489 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 /* A NULL can mean "s exhausted"
1491 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001494 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001496 continue;
1497 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 }
1499 break;
1500
1501 case SETUP_LOOP:
1502 case SETUP_EXCEPT:
1503 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001504 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001506 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001507
1508 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001509#ifdef LLTRACE
1510 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001511 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001513 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001514 if (f->f_trace == NULL)
1515 continue;
1516 /* Trace each line of code reached */
1517 f->f_lasti = INSTR_OFFSET();
1518 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001519 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001521
1522 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001523 case CALL_FUNCTION_VAR:
1524 case CALL_FUNCTION_KW:
1525 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001526 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001527 int na = oparg & 0xff;
1528 int nk = (oparg>>8) & 0xff;
1529 int flags = (opcode - CALL_FUNCTION) & 3;
1530 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1531 PyObject **pfunc = stack_pointer - n - 1;
1532 PyObject *func = *pfunc;
1533 PyObject *self = NULL;
1534 PyObject *class = NULL;
1535 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1536 if (PyMethod_Check(func)) {
1537 self = PyMethod_Self(func);
1538 class = PyMethod_Class(func);
1539 func = PyMethod_Function(func);
1540 Py_INCREF(func);
1541 if (self != NULL) {
1542 Py_INCREF(self);
1543 Py_DECREF(*pfunc);
1544 *pfunc = self;
1545 na++;
1546 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001547 }
1548 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001549 /* Unbound methods must be called with an
1550 instance of the class (or a derived
1551 class) as first argument */
1552 if (na > 0 && (self = stack_pointer[-n]) != NULL
1553 && PyInstance_Check(self)
1554 && PyClass_IsSubclass((PyObject *)
1555 (((PyInstanceObject *)self)->in_class),
1556 class))
1557 /* Handy-dandy */ ;
1558 else {
1559 PyErr_SetString(PyExc_TypeError,
1560 "unbound method must be called with class instance 1st argument");
1561 x = NULL;
1562 break;
1563 }
1564 }
1565 }
1566 else
1567 Py_INCREF(func);
1568 if (PyFunction_Check(func) && flags == 0) {
1569 PyObject *co = PyFunction_GetCode(func);
1570 PyObject *globals = PyFunction_GetGlobals(func);
1571 PyObject *argdefs = PyFunction_GetDefaults(func);
1572 PyObject **d;
1573 int nd;
1574 if (argdefs != NULL) {
1575 d = &PyTuple_GET_ITEM(argdefs, 0);
1576 nd = ((PyTupleObject *)argdefs)->ob_size;
1577 }
1578 else {
1579 d = NULL;
1580 nd = 0;
1581 }
1582 x = eval_code2((PyCodeObject *)co, globals,
1583 (PyObject *)NULL, stack_pointer-n, na,
1584 stack_pointer-2*nk, nk, d, nd,
1585 class);
1586 }
1587 else {
1588 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001589 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001590 PyObject *stararg = 0;
1591 PyObject *kwdict = NULL;
1592 if (flags & 2) {
1593 kwdict = POP();
1594 if (!PyDict_Check(kwdict)) {
1595 PyErr_SetString(PyExc_TypeError,
1596 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001597 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001598 }
1599 }
1600 if (flags & 1) {
1601 stararg = POP();
1602 if (!PySequence_Check(stararg)) {
1603 PyErr_SetString(PyExc_TypeError,
1604 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001605 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001606 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001607 /* Convert abstract sequence to concrete tuple */
1608 if (!PyTuple_Check(stararg)) {
1609 PyObject *t = NULL;
1610 t = PySequence_Tuple(stararg);
1611 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001612 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001613 }
1614 Py_DECREF(stararg);
1615 stararg = t;
1616 }
1617 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001618 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001619 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001620 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001621 }
1622 if (nk > 0) {
1623 if (kwdict == NULL) {
1624 kwdict = PyDict_New();
1625 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001626 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001627 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001628 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001629 else {
1630 PyObject *d = PyDict_Copy(kwdict);
1631 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001632 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001633 }
1634 Py_DECREF(kwdict);
1635 kwdict = d;
1636 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001637 err = 0;
1638 while (--nk >= 0) {
1639 PyObject *value = POP();
1640 PyObject *key = POP();
1641 if (PyDict_GetItem(kwdict, key) != NULL) {
1642 err = 1;
1643 PyErr_Format(PyExc_TypeError,
1644 "keyword parameter redefined: %.400s",
1645 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001646 Py_DECREF(key);
1647 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001648 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001649 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 err = PyDict_SetItem(kwdict, key, value);
1651 Py_DECREF(key);
1652 Py_DECREF(value);
1653 if (err)
1654 break;
1655 }
1656 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001657 extcall_fail:
1658 Py_XDECREF(kwdict);
1659 Py_XDECREF(stararg);
1660 Py_DECREF(func);
1661 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001662 break;
1663 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001664 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001665 callargs = PyTuple_New(na + nstar);
1666 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001667 x = NULL;
1668 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001669 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001670 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001671 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001672 for (i = 0; i < nstar; i++) {
1673 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1674 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001675 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001676 }
1677 Py_DECREF(stararg);
1678 }
1679 while (--na >= 0) {
1680 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001681 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001682 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001683 x = PyEval_CallObjectWithKeywords(func,
1684 callargs,
1685 kwdict);
1686 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001687 Py_XDECREF(kwdict);
1688 }
1689 Py_DECREF(func);
1690 while (stack_pointer > pfunc) {
1691 w = POP();
1692 Py_DECREF(w);
1693 }
1694 PUSH(x);
1695 if (x != NULL) continue;
1696 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001697 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001698
Guido van Rossum681d79a1995-07-18 14:51:37 +00001699 case MAKE_FUNCTION:
1700 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001701 x = PyFunction_New(v, f->f_globals);
1702 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001703 /* XXX Maybe this should be a separate opcode? */
1704 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001705 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001706 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001708 x = NULL;
1709 break;
1710 }
1711 while (--oparg >= 0) {
1712 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001714 }
1715 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001716 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001717 }
1718 PUSH(x);
1719 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001720
1721 case BUILD_SLICE:
1722 if (oparg == 3)
1723 w = POP();
1724 else
1725 w = NULL;
1726 v = POP();
1727 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001728 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001729 Py_DECREF(u);
1730 Py_DECREF(v);
1731 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001732 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001733 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001734 break;
1735
1736
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 default:
1738 fprintf(stderr,
1739 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001740 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 why = WHY_EXCEPTION;
1743 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001744
1745#ifdef CASE_TOO_BIG
1746 }
1747#endif
1748
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 } /* switch */
1750
1751 on_error:
1752
1753 /* Quickly continue if no error occurred */
1754
1755 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001756 if (err == 0 && x != NULL) {
1757#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001758 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001760 fprintf(stderr,
1761 "XXX undetected error\n");
1762 else
1763#endif
1764 continue; /* Normal, fast path */
1765 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 err = 0;
1769 }
1770
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 /* Double-check exception status */
1772
1773 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001775 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001776 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001777 why = WHY_EXCEPTION;
1778 }
1779 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001780#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001782 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001784 fprintf(stderr,
1785 "XXX undetected error (why=%d)\n",
1786 why);
1787 why = WHY_EXCEPTION;
1788 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 }
1790#endif
1791
1792 /* Log traceback info if this is a real exception */
1793
1794 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001795 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001797 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001798 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001799
Guido van Rossume59214e1994-08-30 08:01:59 +00001800 if (f->f_trace)
1801 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001802 if (tstate->sys_profilefunc)
1803 call_exc_trace(&tstate->sys_profilefunc,
1804 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001805 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001806
1807 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1808
1809 if (why == WHY_RERAISE)
1810 why = WHY_EXCEPTION;
1811
1812 /* Unwind stacks if a (pseudo) exception occurred */
1813
1814 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 while (STACK_LEVEL() > b->b_level) {
1817 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001818 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001819 }
1820 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1821 why = WHY_NOT;
1822 JUMPTO(b->b_handler);
1823 break;
1824 }
1825 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001826 (b->b_type == SETUP_EXCEPT &&
1827 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001829 PyObject *exc, *val, *tb;
1830 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001831 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001832 val = Py_None;
1833 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001834 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 /* Make the raw exception data
1836 available to the handler,
1837 so a program can emulate the
1838 Python main loop. Don't do
1839 this for 'finally'. */
1840 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001841 PyErr_NormalizeException(
1842 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001843 set_exc_info(tstate,
1844 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001845 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001846 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 PUSH(val);
1848 PUSH(exc);
1849 }
1850 else {
1851 if (why == WHY_RETURN)
1852 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001853 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 PUSH(v);
1855 }
1856 why = WHY_NOT;
1857 JUMPTO(b->b_handler);
1858 break;
1859 }
1860 } /* unwind stack */
1861
1862 /* End the loop if we still have an error (or return) */
1863
1864 if (why != WHY_NOT)
1865 break;
1866
1867 } /* main loop */
1868
1869 /* Pop remaining stack entries */
1870
1871 while (!EMPTY()) {
1872 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001873 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001874 }
1875
Guido van Rossum96a42c81992-01-12 02:29:51 +00001876 if (why != WHY_RETURN)
1877 retval = NULL;
1878
Guido van Rossume59214e1994-08-30 08:01:59 +00001879 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001880 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001881 if (call_trace(&f->f_trace, &f->f_trace, f,
1882 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001883 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001884 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001885 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001886 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001887 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001888 }
1889
Guido van Rossuma027efa1997-05-05 20:56:21 +00001890 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1891 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001892 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001893 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001894 retval = NULL;
1895 why = WHY_EXCEPTION;
1896 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001897 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001898
Guido van Rossuma027efa1997-05-05 20:56:21 +00001899 reset_exc_info(tstate);
1900
1901 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001902
1903 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001904
Guido van Rossum374a9221991-04-04 10:40:29 +00001905 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001906
Guido van Rossuma027efa1997-05-05 20:56:21 +00001907 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001908 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001909
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001911}
1912
Guido van Rossuma027efa1997-05-05 20:56:21 +00001913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001915{
1916 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001917 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001918
Guido van Rossuma027efa1997-05-05 20:56:21 +00001919 frame = tstate->frame;
1920 if (frame->f_exc_type == NULL) {
1921 /* This frame didn't catch an exception before */
1922 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001923 if (tstate->exc_type == NULL) {
1924 Py_INCREF(Py_None);
1925 tstate->exc_type = Py_None;
1926 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001927 tmp_type = frame->f_exc_type;
1928 tmp_value = frame->f_exc_value;
1929 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001930 Py_XINCREF(tstate->exc_type);
1931 Py_XINCREF(tstate->exc_value);
1932 Py_XINCREF(tstate->exc_traceback);
1933 frame->f_exc_type = tstate->exc_type;
1934 frame->f_exc_value = tstate->exc_value;
1935 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001936 Py_XDECREF(tmp_type);
1937 Py_XDECREF(tmp_value);
1938 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001939 }
1940 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001941 tmp_type = tstate->exc_type;
1942 tmp_value = tstate->exc_value;
1943 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001944 Py_XINCREF(type);
1945 Py_XINCREF(value);
1946 Py_XINCREF(tb);
1947 tstate->exc_type = type;
1948 tstate->exc_value = value;
1949 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001950 Py_XDECREF(tmp_type);
1951 Py_XDECREF(tmp_value);
1952 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001953 /* For b/w compatibility */
1954 PySys_SetObject("exc_type", type);
1955 PySys_SetObject("exc_value", value);
1956 PySys_SetObject("exc_traceback", tb);
1957}
1958
1959static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001960reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001961{
1962 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001963 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001964 frame = tstate->frame;
1965 if (frame->f_exc_type != NULL) {
1966 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001967 tmp_type = tstate->exc_type;
1968 tmp_value = tstate->exc_value;
1969 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001970 Py_XINCREF(frame->f_exc_type);
1971 Py_XINCREF(frame->f_exc_value);
1972 Py_XINCREF(frame->f_exc_traceback);
1973 tstate->exc_type = frame->f_exc_type;
1974 tstate->exc_value = frame->f_exc_value;
1975 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001976 Py_XDECREF(tmp_type);
1977 Py_XDECREF(tmp_value);
1978 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001979 /* For b/w compatibility */
1980 PySys_SetObject("exc_type", frame->f_exc_type);
1981 PySys_SetObject("exc_value", frame->f_exc_value);
1982 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1983 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001984 tmp_type = frame->f_exc_type;
1985 tmp_value = frame->f_exc_value;
1986 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001987 frame->f_exc_type = NULL;
1988 frame->f_exc_value = NULL;
1989 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001990 Py_XDECREF(tmp_type);
1991 Py_XDECREF(tmp_value);
1992 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001993}
1994
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001995/* Logic for the raise statement (too complicated for inlining).
1996 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001997static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001999{
Guido van Rossumd295f121998-04-09 21:39:57 +00002000 if (type == NULL) {
2001 /* Reraise */
2002 PyThreadState *tstate = PyThreadState_Get();
2003 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2004 value = tstate->exc_value;
2005 tb = tstate->exc_traceback;
2006 Py_XINCREF(type);
2007 Py_XINCREF(value);
2008 Py_XINCREF(tb);
2009 }
2010
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002011 /* We support the following forms of raise:
2012 raise <class>, <classinstance>
2013 raise <class>, <argument tuple>
2014 raise <class>, None
2015 raise <class>, <argument>
2016 raise <classinstance>, None
2017 raise <string>, <object>
2018 raise <string>, None
2019
2020 An omitted second argument is the same as None.
2021
2022 In addition, raise <tuple>, <anything> is the same as
2023 raising the tuple's first item (and it better have one!);
2024 this rule is applied recursively.
2025
2026 Finally, an optional third argument can be supplied, which
2027 gives the traceback to be substituted (useful when
2028 re-raising an exception after examining it). */
2029
2030 /* First, check the traceback argument, replacing None with
2031 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 if (tb == Py_None) {
2033 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002034 tb = NULL;
2035 }
2036 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002037 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002038 "raise 3rd arg must be traceback or None");
2039 goto raise_error;
2040 }
2041
2042 /* Next, replace a missing value with None */
2043 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 value = Py_None;
2045 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002046 }
2047
2048 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2050 PyObject *tmp = type;
2051 type = PyTuple_GET_ITEM(type, 0);
2052 Py_INCREF(type);
2053 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002054 }
2055
Barry Warsaw4249f541997-08-22 21:26:19 +00002056 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002057 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002058
2059 else if (PyClass_Check(type))
2060 PyErr_NormalizeException(&type, &value, &tb);
2061
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002063 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 if (value != Py_None) {
2065 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002066 "instance exception may not have a separate value");
2067 goto raise_error;
2068 }
2069 else {
2070 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002072 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2074 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002075 }
2076 }
2077 else {
2078 /* Not something you can raise. You get an exception
2079 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002081 "exceptions must be strings, classes, or instances");
2082 goto raise_error;
2083 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002085 if (tb == NULL)
2086 return WHY_EXCEPTION;
2087 else
2088 return WHY_RERAISE;
2089 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 Py_XDECREF(value);
2091 Py_XDECREF(type);
2092 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002093 return WHY_EXCEPTION;
2094}
2095
Barry Warsawe42b18f1997-08-25 22:13:04 +00002096static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002097unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002098{
2099 int i;
2100 PyObject *w;
2101
2102 for (i = 0; i < argcnt; i++) {
2103 if (! (w = PySequence_GetItem(v, i))) {
2104 if (PyErr_ExceptionMatches(PyExc_IndexError))
2105 PyErr_SetString(PyExc_ValueError,
2106 "unpack sequence of wrong size");
2107 goto finally;
2108 }
2109 *--sp = w;
2110 }
2111 /* we better get an IndexError now */
2112 if (PySequence_GetItem(v, i) == NULL) {
2113 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2114 PyErr_Clear();
2115 return 1;
2116 }
2117 /* some other exception occurred. fall through to finally */
2118 }
2119 else
2120 PyErr_SetString(PyExc_ValueError,
2121 "unpack sequence of wrong size");
2122 /* fall through */
2123finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002124 for (; i > 0; i--, sp++)
2125 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002126
2127 return 0;
2128}
2129
2130
Guido van Rossum96a42c81992-01-12 02:29:51 +00002131#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002132static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002133prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002135 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 if (PyObject_Print(v, stdout, 0) != 0)
2137 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002139 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002144call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002145{
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002147 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002149 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 value = Py_None;
2151 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002152 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002154 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002155 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002156 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002157 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002158 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002160 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002162 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 Py_XDECREF(type);
2164 Py_XDECREF(value);
2165 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002166 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002167}
2168
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002169/* PyObject **p_trace: in/out; may not be NULL;
2170 may not point to NULL variable initially
2171 PyObject **p_newtrace: in/out; may be NULL;
2172 may point to NULL variable;
2173 may be same variable as p_newtrace */
2174
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002175static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002176call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2177 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002178{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002179 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 PyObject *args, *what;
2181 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002182
Guido van Rossuma027efa1997-05-05 20:56:21 +00002183 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002184 /* Don't do recursive traces */
2185 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002187 *p_newtrace = NULL;
2188 }
2189 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002190 }
2191
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002193 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002194 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002196 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002197 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002198 Py_INCREF(f);
2199 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2200 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002201 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002202 arg = Py_None;
2203 Py_INCREF(arg);
2204 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002205 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 PyFrame_FastToLocals(f);
2207 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2208 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002210 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002211 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002212 if (res == NULL) {
2213 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002214 PyTraceBack_Here(f);
2215 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002216 *p_trace = NULL;
2217 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002218 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002219 *p_newtrace = NULL;
2220 }
Barry Warsawf6202631999-09-08 16:26:33 +00002221 /* to be extra double plus sure we don't get recursive
2222 * calls inf either tracefunc or profilefunc gets an
2223 * exception, zap the global variables.
2224 */
2225 Py_XDECREF(tstate->sys_tracefunc);
2226 tstate->sys_tracefunc = NULL;
2227 Py_XDECREF(tstate->sys_profilefunc);
2228 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002229 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002230 }
2231 else {
2232 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 Py_XDECREF(*p_newtrace);
2234 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002235 *p_newtrace = NULL;
2236 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002237 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002238 *p_newtrace = res;
2239 }
2240 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002242 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002243 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002244}
2245
Guido van Rossumb209a111997-04-29 18:18:01 +00002246PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002247PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002248{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002249 PyThreadState *tstate = PyThreadState_Get();
2250 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002251 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002252 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002253 else
2254 return current_frame->f_builtins;
2255}
2256
Guido van Rossumb209a111997-04-29 18:18:01 +00002257PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002258PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002259{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002261 if (current_frame == NULL)
2262 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002263 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002264 return current_frame->f_locals;
2265}
2266
Guido van Rossumb209a111997-04-29 18:18:01 +00002267PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002268PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002269{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002270 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271 if (current_frame == NULL)
2272 return NULL;
2273 else
2274 return current_frame->f_globals;
2275}
2276
Guido van Rossumb209a111997-04-29 18:18:01 +00002277PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002278PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002279{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002280 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002281 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002282}
2283
Guido van Rossum6135a871995-01-09 17:53:26 +00002284int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002285PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002286{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002287 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002288 return current_frame == NULL ? 0 : current_frame->f_restricted;
2289}
2290
Guido van Rossumbe270261997-05-22 22:26:18 +00002291int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002292Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293{
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002295 if (f == NULL)
2296 return 0;
2297 if (!PyFile_SoftSpace(f, 0))
2298 return 0;
2299 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300}
2301
Guido van Rossum3f5da241990-12-20 15:06:42 +00002302
Guido van Rossum681d79a1995-07-18 14:51:37 +00002303/* External interface to call any callable object.
2304 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002305
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002306#undef PyEval_CallObject
2307/* for backward compatibility: export this interface */
2308
Guido van Rossumb209a111997-04-29 18:18:01 +00002309PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002310PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002311{
Guido van Rossumb209a111997-04-29 18:18:01 +00002312 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002313}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002314#define PyEval_CallObject(func,arg) \
2315 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002316
Guido van Rossumb209a111997-04-29 18:18:01 +00002317PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002318PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319{
2320 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002322
2323 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 arg = PyTuple_New(0);
2325 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002326 PyErr_SetString(PyExc_TypeError,
2327 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328 return NULL;
2329 }
2330 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002332
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002334 PyErr_SetString(PyExc_TypeError,
2335 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002336 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002337 return NULL;
2338 }
2339
Guido van Rossum150b2df1996-12-05 23:17:11 +00002340 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002342 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002343 result = call_function(func, arg, kw);
2344 else
2345 result = call_builtin(func, arg, kw);
2346
Guido van Rossumb209a111997-04-29 18:18:01 +00002347 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002348
Guido van Rossumb209a111997-04-29 18:18:01 +00002349 if (result == NULL && !PyErr_Occurred())
2350 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002352
2353 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002354}
2355
Guido van Rossumb209a111997-04-29 18:18:01 +00002356static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002357call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358{
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 if (PyCFunction_Check(func)) {
2360 PyCFunction meth = PyCFunction_GetFunction(func);
2361 PyObject *self = PyCFunction_GetSelf(func);
2362 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002363 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002365 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002367 else if (size == 0)
2368 arg = NULL;
2369 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002370 if (flags & METH_KEYWORDS)
2371 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002372 if (kw != NULL && PyDict_Size(kw) != 0) {
2373 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002374 "this function takes no keyword arguments");
2375 return NULL;
2376 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002379 if (PyClass_Check(func)) {
2380 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002382 if (PyInstance_Check(func)) {
2383 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002384 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002385 PyErr_Clear();
2386 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002387 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002388 return NULL;
2389 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002390 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002392 return res;
2393 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002394 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002395 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 return NULL;
2397}
2398
Guido van Rossumb209a111997-04-29 18:18:01 +00002399static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002400call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401{
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 PyObject *class = NULL; /* == owner */
2403 PyObject *argdefs;
2404 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002407
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 if (kw != NULL && !PyDict_Check(kw)) {
2409 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 return NULL;
2411 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 if (PyMethod_Check(func)) {
2414 PyObject *self = PyMethod_Self(func);
2415 class = PyMethod_Class(func);
2416 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002417 if (self == NULL) {
2418 /* Unbound methods must be called with an instance of
2419 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 if (PyTuple_Size(arg) >= 1) {
2421 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002422 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002423 PyInstance_Check(self) &&
2424 PyClass_IsSubclass((PyObject *)
2425 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002426 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002427 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002428 else
2429 self = NULL;
2430 }
2431 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002434 return NULL;
2435 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002437 }
2438 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002439 int argcount = PyTuple_Size(arg);
2440 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002442 if (newarg == NULL)
2443 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002444 Py_INCREF(self);
2445 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002447 PyObject *v = PyTuple_GET_ITEM(arg, i);
2448 Py_XINCREF(v);
2449 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002450 }
2451 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002453 if (!PyFunction_Check(func)) {
2454 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2455 Py_DECREF(arg);
2456 return result;
2457 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 }
2459 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002460 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002461 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002462 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002463 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 return NULL;
2465 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002468
2469 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2471 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2472 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002473 }
2474 else {
2475 d = NULL;
2476 nd = 0;
2477 }
2478
2479 if (kw != NULL) {
2480 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 nk = PyDict_Size(kw);
2482 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002483 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002484 PyErr_NoMemory();
2485 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002487 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002488 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002490 i += 2;
2491 nk = i/2;
2492 /* XXX This is broken if the caller deletes dict items! */
2493 }
2494 else {
2495 k = NULL;
2496 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002497 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498
Guido van Rossum681d79a1995-07-18 14:51:37 +00002499 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002500 (PyCodeObject *)PyFunction_GetCode(func),
2501 PyFunction_GetGlobals(func), (PyObject *)NULL,
2502 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002503 k, nk,
2504 d, nd,
2505 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506
Guido van Rossumb209a111997-04-29 18:18:01 +00002507 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002508 if (k != NULL)
2509 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510
Guido van Rossum681d79a1995-07-18 14:51:37 +00002511 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512}
2513
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002514#define SLICE_ERROR_MSG \
2515 "standard sequence type does not support step size other than one"
2516
Guido van Rossumb209a111997-04-29 18:18:01 +00002517static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002518loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519{
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002521 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002522 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002523 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524 return NULL;
2525 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002527 v = (*sq->sq_item)(v, i);
2528 if (v)
2529 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002530 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002531 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002532 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533}
2534
Guido van Rossum20c6add2000-05-08 14:06:50 +00002535/* Extract a slice index from a PyInt or PyLong, the index is bound to
2536 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2537 and error. Returns 1 on success.*/
2538
2539int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002540_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541{
2542 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002544 if (PyInt_Check(v)) {
2545 x = PyInt_AsLong(v);
2546 } else if (PyLong_Check(v)) {
2547 x = PyLong_AsLong(v);
2548 if (x==-1 && PyErr_Occurred()) {
2549 PyObject *long_zero;
2550
2551 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2552 /* It's not an overflow error, so just
2553 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002554 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002555 }
2556
2557 /* It's an overflow error, so we need to
2558 check the sign of the long integer,
2559 set the value to INT_MAX or 0, and clear
2560 the error. */
2561
2562 /* Create a long integer with a value of 0 */
2563 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002564 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002565
2566 /* Check sign */
2567 if (PyObject_Compare(long_zero, v) < 0)
2568 x = INT_MAX;
2569 else
2570 x = 0;
2571
2572 /* Free the long integer we created, and clear the
2573 OverflowError */
2574 Py_DECREF(long_zero);
2575 PyErr_Clear();
2576 }
2577 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 PyErr_SetString(PyExc_TypeError,
2579 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002580 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002582 /* Truncate -- very long indices are truncated anyway */
2583 if (x > INT_MAX)
2584 x = INT_MAX;
2585 else if (x < -INT_MAX)
2586 x = 0;
2587 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002589 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590}
2591
Guido van Rossumb209a111997-04-29 18:18:01 +00002592static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002593apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002595 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002596 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002598 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002599 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002600 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002602
2603static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002604assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002606 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002607 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002608 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002609 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002610 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002611 if (x == NULL)
2612 return PySequence_DelSlice(u, ilow, ihigh);
2613 else
2614 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615}
2616
Guido van Rossumb209a111997-04-29 18:18:01 +00002617static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002618cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619{
2620 register int cmp;
2621 register int res = 0;
2622 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002623 case IS:
2624 case IS_NOT:
2625 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002626 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 res = !res;
2628 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 case IN:
2630 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002631 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002632 if (res < 0)
2633 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002634 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002635 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 break;
2637 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002638 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 break;
2640 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002642 if (cmp && PyErr_Occurred())
2643 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002644 switch (op) {
2645 case LT: res = cmp < 0; break;
2646 case LE: res = cmp <= 0; break;
2647 case EQ: res = cmp == 0; break;
2648 case NE: res = cmp != 0; break;
2649 case GT: res = cmp > 0; break;
2650 case GE: res = cmp >= 0; break;
2651 /* XXX no default? (res is initialized to 0 though) */
2652 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 v = res ? Py_True : Py_False;
2655 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 return v;
2657}
2658
Thomas Wouters52152252000-08-17 22:55:00 +00002659static PyObject *
2660import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002661{
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyObject *w, *x;
2663 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002664 PyErr_SetString(PyExc_TypeError,
2665 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002666 return NULL;
2667 }
2668 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2669 x = PyDict_GetItem(w, name);
2670 if (x == NULL) {
2671 PyErr_Format(PyExc_ImportError,
2672 "cannot import name %.230s",
2673 PyString_AsString(name));
2674 } else
2675 Py_INCREF(x);
2676 return x;
2677}
2678
2679static int
2680import_all_from(PyObject *locals, PyObject *v)
2681{
2682 int pos = 0, err;
2683 PyObject *name, *value;
2684 PyObject *w;
2685
2686 if (!PyModule_Check(v)) {
2687 PyErr_SetString(PyExc_TypeError,
2688 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002689 return -1;
2690 }
Thomas Wouters52152252000-08-17 22:55:00 +00002691 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2692
2693 while (PyDict_Next(w, &pos, &name, &value)) {
2694 if (!PyString_Check(name) ||
2695 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002696 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002697 Py_INCREF(value);
2698 err = PyDict_SetItem(locals, name, value);
2699 Py_DECREF(value);
2700 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002701 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002702 }
Thomas Wouters52152252000-08-17 22:55:00 +00002703 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002704}
2705
Guido van Rossumb209a111997-04-29 18:18:01 +00002706static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002707build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002708{
Guido van Rossumcd649651997-08-22 16:56:16 +00002709 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002711 PyErr_SetString(PyExc_SystemError,
2712 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002713 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002714 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002716 PyErr_SetString(PyExc_SystemError,
2717 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002718 return NULL;
2719 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002721 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002722 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002723 return NULL;
2724 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002725 n = PyTuple_Size(bases);
2726 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 PyObject *base = PyTuple_GET_ITEM(bases, i);
2728 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002729 /* Call the base's *type*, if it is callable.
2730 This code is a hook for Donald Beaudry's
2731 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002732 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002733 since its types are not callable.
2734 Ditto: call the bases's *class*, if it has
2735 one. This makes the same thing possible
2736 without writing C code. A true meta-object
2737 protocol! */
2738 PyObject *basetype = (PyObject *)base->ob_type;
2739 PyObject *callable = NULL;
2740 if (PyCallable_Check(basetype))
2741 callable = basetype;
2742 else
2743 callable = PyObject_GetAttrString(
2744 base, "__class__");
2745 if (callable) {
2746 PyObject *args;
2747 PyObject *newclass = NULL;
2748 args = Py_BuildValue(
2749 "(OOO)", name, bases, methods);
2750 if (args != NULL) {
2751 newclass = PyEval_CallObject(
2752 callable, args);
2753 Py_DECREF(args);
2754 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002755 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002756 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002757 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002758 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002759 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002761 "base is not a class object");
2762 return NULL;
2763 }
2764 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002766}
2767
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002768static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002769exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
2770 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002771{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002772 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002774 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002775
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2777 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002778 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002780 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 locals = PyTuple_GetItem(prog, 2);
2782 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002783 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 if (globals == Py_None) {
2785 globals = PyEval_GetGlobals();
2786 if (locals == Py_None) {
2787 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002788 plain = 1;
2789 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002790 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002793 if (!PyString_Check(prog) &&
2794 !PyCode_Check(prog) &&
2795 !PyFile_Check(prog)) {
2796 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002797 "exec 1st arg must be string, code or file object");
2798 return -1;
2799 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002800 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2801 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002802 "exec 2nd/3rd args must be dict or None");
2803 return -1;
2804 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002805 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002806 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002808 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002809 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002810 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 FILE *fp = PyFile_AsFile(prog);
2812 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002813 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2814 }
2815 else {
2816 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00002817 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002818 PyErr_SetString(PyExc_ValueError,
2819 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002820 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002821 }
2822 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002823 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002824 if (plain)
2825 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002826 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002827 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002829 return 0;
2830}
Guido van Rossum24c13741995-02-14 09:42:43 +00002831
Guido van Rossum1aa14831997-01-21 05:34:20 +00002832/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002833static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002834find_from_args(PyFrameObject *f, int nexti)
Guido van Rossum24c13741995-02-14 09:42:43 +00002835{
2836 int opcode;
2837 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002839 unsigned char *next_instr;
2840
Guido van Rossumd076c731998-10-07 19:42:25 +00002841 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2842 next_instr += nexti;
2843
Guido van Rossum24c13741995-02-14 09:42:43 +00002844 opcode = (*next_instr++);
Thomas Wouters52152252000-08-17 22:55:00 +00002845 if (opcode != IMPORT_FROM && opcode != IMPORT_STAR) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002846 Py_INCREF(Py_None);
2847 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002848 }
2849
Guido van Rossumb209a111997-04-29 18:18:01 +00002850 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002851 if (list == NULL)
2852 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00002853
2854 if (opcode == IMPORT_STAR) {
2855 name = PyString_FromString("*");
2856 if (!name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002857 Py_DECREF(list);
Thomas Wouters52152252000-08-17 22:55:00 +00002858 else {
2859 if (PyList_Append(list, name) < 0)
2860 Py_DECREF(list);
2861 Py_DECREF(name);
Guido van Rossum24c13741995-02-14 09:42:43 +00002862 }
Thomas Wouters52152252000-08-17 22:55:00 +00002863 } else {
2864 do {
2865 oparg = (next_instr[1]<<8) + next_instr[0];
2866 next_instr += 2;
2867 name = Getnamev(f, oparg);
2868 if (PyList_Append(list, name) < 0) {
2869 Py_DECREF(list);
2870 break;
2871 }
2872 opcode = (*next_instr++);
2873 } while (opcode == IMPORT_FROM);
2874 }
Guido van Rossum24c13741995-02-14 09:42:43 +00002875 return list;
2876}
Guido van Rossum950361c1997-01-24 13:49:28 +00002877
2878
2879#ifdef DYNAMIC_EXECUTION_PROFILE
2880
2881PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00002883{
2884 int i;
2885 PyObject *l = PyList_New(256);
2886 if (l == NULL) return NULL;
2887 for (i = 0; i < 256; i++) {
2888 PyObject *x = PyInt_FromLong(a[i]);
2889 if (x == NULL) {
2890 Py_DECREF(l);
2891 return NULL;
2892 }
2893 PyList_SetItem(l, i, x);
2894 }
2895 for (i = 0; i < 256; i++)
2896 a[i] = 0;
2897 return l;
2898}
2899
2900PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002901_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00002902{
2903#ifndef DXPAIRS
2904 return getarray(dxp);
2905#else
2906 int i;
2907 PyObject *l = PyList_New(257);
2908 if (l == NULL) return NULL;
2909 for (i = 0; i < 257; i++) {
2910 PyObject *x = getarray(dxpairs[i]);
2911 if (x == NULL) {
2912 Py_DECREF(l);
2913 return NULL;
2914 }
2915 PyList_SetItem(l, i, x);
2916 }
2917 return l;
2918#endif
2919}
2920
2921#endif