blob: 3488b9c61523aad815eb383ee96a4f784281d296 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012
Guido van Rossum681d79a1995-07-18 14:51:37 +000013/* XXX TO DO:
14 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000015 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000016 XXX document it!
17 */
18
Guido van Rossumb209a111997-04-29 18:18:01 +000019#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000020
Guido van Rossum10dc2e81990-11-18 17:27:39 +000021#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000022#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000023#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000024#include "opcode.h"
25
Jack Jansencbf630f2000-07-11 21:59:16 +000026#ifdef macintosh
27#include "macglue.h"
28#endif
29
Guido van Rossumc6004111993-11-05 10:22:19 +000030#include <ctype.h>
31
Guido van Rossuma027efa1997-05-05 20:56:21 +000032#ifdef HAVE_LIMITS_H
33#include <limits.h>
34#else
35#define INT_MAX 2147483647
36#endif
37
Guido van Rossum04691fc1992-08-12 15:35:34 +000038/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000040
Guido van Rossum408027e1996-12-30 16:17:54 +000041#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000042/* For debugging the interpreter: */
43#define LLTRACE 1 /* Low-level trace feature */
44#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#endif
46
Guido van Rossum5b722181993-03-30 17:46:03 +000047
Guido van Rossum374a9221991-04-04 10:40:29 +000048/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000049
Tim Petersdbd9ba62000-07-09 03:09:57 +000050static PyObject *eval_code2(PyCodeObject *,
51 PyObject *, PyObject *,
52 PyObject **, int,
53 PyObject **, int,
54 PyObject **, int,
55 PyObject *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000056#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000057static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
60static int call_trace(PyObject **, PyObject **,
61 PyFrameObject *, char *, PyObject *);
62static PyObject *call_builtin(PyObject *, PyObject *, PyObject *);
63static PyObject *call_function(PyObject *, PyObject *, PyObject *);
64static PyObject *loop_subscript(PyObject *, PyObject *);
65static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
66static int assign_slice(PyObject *, PyObject *,
67 PyObject *, PyObject *);
68static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000069static PyObject *import_from(PyObject *, PyObject *);
70static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000071static PyObject *build_class(PyObject *, PyObject *, PyObject *);
72static int exec_statement(PyFrameObject *,
73 PyObject *, PyObject *, PyObject *);
74static PyObject *find_from_args(PyFrameObject *, int);
75static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
76static void reset_exc_info(PyThreadState *);
Guido van Rossum374a9221991-04-04 10:40:29 +000077
78
Guido van Rossum950361c1997-01-24 13:49:28 +000079/* Dynamic execution profile */
80#ifdef DYNAMIC_EXECUTION_PROFILE
81#ifdef DXPAIRS
82static long dxpairs[257][256];
83#define dxp dxpairs[256]
84#else
85static long dxp[256];
86#endif
87#endif
88
89
Guido van Rossume59214e1994-08-30 08:01:59 +000090#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000091
Guido van Rossum2571cc81999-04-07 16:07:23 +000092#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000093#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000094#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000095#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000096
Guido van Rossuma027efa1997-05-05 20:56:21 +000097extern int _PyThread_Started; /* Flag for Py_Exit */
98
Guido van Rossum65d5b571998-12-21 19:32:43 +000099static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000100static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101
102void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000106 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000107 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000108 interpreter_lock = PyThread_allocate_lock();
109 PyThread_acquire_lock(interpreter_lock, 1);
110 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000113void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000116 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117}
118
119void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000120PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000122 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123}
124
125void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000127{
128 if (tstate == NULL)
129 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000130 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131 if (PyThreadState_Swap(tstate) != NULL)
132 Py_FatalError(
133 "PyEval_AcquireThread: non-NULL old thread state");
134}
135
136void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000137PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000138{
139 if (tstate == NULL)
140 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
141 if (PyThreadState_Swap(NULL) != tstate)
142 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000143 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000144}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145#endif
146
Guido van Rossumff4949e1992-08-05 19:58:53 +0000147/* Functions save_thread and restore_thread are always defined so
148 dynamically loaded modules needn't be compiled separately for use
149 with and without threads: */
150
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000151PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000152PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000154 PyThreadState *tstate = PyThreadState_Swap(NULL);
155 if (tstate == NULL)
156 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000157#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000158 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000159 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000160#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000161 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162}
163
164void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000165PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000167 if (tstate == NULL)
168 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000169#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000171 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000172 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174 }
175#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000176 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177}
178
179
Guido van Rossuma9672091994-09-14 13:31:22 +0000180/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
181 signal handlers or Mac I/O completion routines) can schedule calls
182 to a function to be called synchronously.
183 The synchronous function is called with one void* argument.
184 It should return 0 for success or -1 for failure -- failure should
185 be accompanied by an exception.
186
187 If registry succeeds, the registry function returns 0; if it fails
188 (e.g. due to too many pending calls) it returns -1 (without setting
189 an exception condition).
190
191 Note that because registry may occur from within signal handlers,
192 or other asynchronous events, calling malloc() is unsafe!
193
194#ifdef WITH_THREAD
195 Any thread can schedule pending calls, but only the main thread
196 will execute them.
197#endif
198
199 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
200 There are two possible race conditions:
201 (1) nested asynchronous registry calls;
202 (2) registry calls made while pending calls are being processed.
203 While (1) is very unlikely, (2) is a real possibility.
204 The current code is safe against (2), but not against (1).
205 The safety against (2) is derived from the fact that only one
206 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000207
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208 XXX Darn! With the advent of thread state, we should have an array
209 of pending calls per thread in the thread state! Later...
210*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000211
Guido van Rossuma9672091994-09-14 13:31:22 +0000212#define NPENDINGCALLS 32
213static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000214 int (*func)(void *);
215 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000216} pendingcalls[NPENDINGCALLS];
217static volatile int pendingfirst = 0;
218static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000219static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000220
221int
Thomas Wouters334fb892000-07-25 12:56:38 +0000222Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000223{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000224 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000225 int i, j;
226 /* XXX Begin critical section */
227 /* XXX If you want this to be safe against nested
228 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000229 if (busy)
230 return -1;
231 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000232 i = pendinglast;
233 j = (i + 1) % NPENDINGCALLS;
234 if (j == pendingfirst)
235 return -1; /* Queue full */
236 pendingcalls[i].func = func;
237 pendingcalls[i].arg = arg;
238 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000240 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000241 /* XXX End critical section */
242 return 0;
243}
244
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000246Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000247{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000250 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000251 return 0;
252#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000253 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000254 return 0;
255 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000256 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000257 for (;;) {
258 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000259 int (*func)(void *);
260 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000261 i = pendingfirst;
262 if (i == pendinglast)
263 break; /* Queue empty */
264 func = pendingcalls[i].func;
265 arg = pendingcalls[i].arg;
266 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267 if (func(arg) < 0) {
268 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000269 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000270 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000272 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000273 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 return 0;
275}
276
277
Guido van Rossum374a9221991-04-04 10:40:29 +0000278/* Status code for main loop (reason for stack unwind) */
279
280enum why_code {
281 WHY_NOT, /* No error */
282 WHY_EXCEPTION, /* Exception occurred */
283 WHY_RERAISE, /* Exception re-raised by 'finally' */
284 WHY_RETURN, /* 'return' statement */
285 WHY_BREAK /* 'break' statement */
286};
287
Tim Petersdbd9ba62000-07-09 03:09:57 +0000288static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
289static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000290
Guido van Rossum374a9221991-04-04 10:40:29 +0000291
Guido van Rossumb209a111997-04-29 18:18:01 +0000292PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000293PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000294{
295 return eval_code2(co,
296 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000297 (PyObject **)NULL, 0,
298 (PyObject **)NULL, 0,
299 (PyObject **)NULL, 0,
300 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000301}
302
303
304/* Interpreter main loop */
305
Guido van Rossum8861b741996-07-30 16:49:37 +0000306#ifndef MAX_RECURSION_DEPTH
307#define MAX_RECURSION_DEPTH 10000
308#endif
309
Guido van Rossumb209a111997-04-29 18:18:01 +0000310static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000311eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
312 PyObject **args, int argcount, PyObject **kws, int kwcount,
313 PyObject **defs, int defcount, PyObject *owner)
Guido van Rossum374a9221991-04-04 10:40:29 +0000314{
Guido van Rossum950361c1997-01-24 13:49:28 +0000315#ifdef DXPAIRS
316 int lastopcode = 0;
317#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000318 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000319 register int opcode=0; /* Current opcode */
320 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000321 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000322 register enum why_code why; /* Reason for block stack unwind */
323 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 register PyObject *x; /* Result object -- NULL if error */
325 register PyObject *v; /* Temporary objects popped off stack */
326 register PyObject *w;
327 register PyObject *u;
328 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000329 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000330 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000331 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000332 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000333 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000334 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000335#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000336 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000337#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000338#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000339 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000340 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000341#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000342
343/* Code access macros */
344
345#define GETCONST(i) Getconst(f, i)
346#define GETNAME(i) Getname(f, i)
347#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000348#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000349#define NEXTOP() (*next_instr++)
350#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000351#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000352#define JUMPBY(x) (next_instr += (x))
353
354/* Stack manipulation macros */
355
356#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
357#define EMPTY() (STACK_LEVEL() == 0)
358#define TOP() (stack_pointer[-1])
359#define BASIC_PUSH(v) (*stack_pointer++ = (v))
360#define BASIC_POP() (*--stack_pointer)
361
Guido van Rossum96a42c81992-01-12 02:29:51 +0000362#ifdef LLTRACE
363#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
364#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000365#else
366#define PUSH(v) BASIC_PUSH(v)
367#define POP() BASIC_POP()
368#endif
369
Guido van Rossum681d79a1995-07-18 14:51:37 +0000370/* Local variable macros */
371
372#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000373#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000374 GETLOCAL(i) = value; } while (0)
375
Guido van Rossuma027efa1997-05-05 20:56:21 +0000376/* Start of code */
377
Guido van Rossum8861b741996-07-30 16:49:37 +0000378#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000379 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000380 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000381 return NULL;
382 }
383#endif
384
Guido van Rossum681d79a1995-07-18 14:51:37 +0000385 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000386 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000387 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000388 }
389
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000390#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000391 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000392#endif
393
Guido van Rossumb209a111997-04-29 18:18:01 +0000394 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000395 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000396 co, /*code*/
397 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000398 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000399 if (f == NULL)
400 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000401
Guido van Rossuma027efa1997-05-05 20:56:21 +0000402 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000403 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404
405 if (co->co_argcount > 0 ||
406 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
407 int i;
408 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000409 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000410 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000411 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412 if (kwdict == NULL)
413 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000414 i = co->co_argcount;
415 if (co->co_flags & CO_VARARGS)
416 i++;
417 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000418 }
419 if (argcount > co->co_argcount) {
420 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000421 PyErr_Format(PyExc_TypeError,
422 "too many arguments; expected %d, got %d",
423 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424 goto fail;
425 }
426 n = co->co_argcount;
427 }
428 for (i = 0; i < n; i++) {
429 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431 SETLOCAL(i, x);
432 }
433 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000434 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000435 if (u == NULL)
436 goto fail;
437 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000438 for (i = n; i < argcount; i++) {
439 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000440 Py_INCREF(x);
441 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 }
444 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 PyObject *keyword = kws[2*i];
446 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000448 if (keyword == NULL || !PyString_Check(keyword)) {
449 PyErr_SetString(PyExc_TypeError,
450 "keywords must be strings");
451 goto fail;
452 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 /* XXX slow -- speed up using dictionary? */
454 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000455 PyObject *nm = PyTuple_GET_ITEM(
456 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000457 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000458 break;
459 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000460 /* Check errors from Compare */
461 if (PyErr_Occurred())
462 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 if (j >= co->co_argcount) {
464 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000466 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000467 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 goto fail;
469 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000470 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 }
472 else {
473 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000474 PyErr_Format(PyExc_TypeError,
475 "keyword parameter redefined: %.400s",
476 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 goto fail;
478 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000479 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 SETLOCAL(j, value);
481 }
482 }
483 if (argcount < co->co_argcount) {
484 int m = co->co_argcount - defcount;
485 for (i = argcount; i < m; i++) {
486 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000487 PyErr_Format(PyExc_TypeError,
488 "not enough arguments; expected %d, got %d",
489 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 goto fail;
491 }
492 }
493 if (n > m)
494 i = n - m;
495 else
496 i = 0;
497 for (; i < defcount; i++) {
498 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000499 PyObject *def = defs[i];
500 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 SETLOCAL(m+i, def);
502 }
503 }
504 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 }
506 else {
507 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000508 PyErr_SetString(PyExc_TypeError,
509 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000510 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 }
512 }
513
Guido van Rossuma027efa1997-05-05 20:56:21 +0000514 if (tstate->sys_tracefunc != NULL) {
515 /* tstate->sys_tracefunc, if defined, is a function that
516 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000517 Its return value, if not None, is a function that
518 will be called at the start of each executed line
519 of code. (Actually, the function must return
520 itself in order to continue tracing.)
521 The trace functions are called with three arguments:
522 a pointer to the current frame, a string indicating
523 why the function is called, and an argument which
524 depends on the situation. The global trace function
525 (sys.trace) is also called whenever an exception
526 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000527 if (call_trace(&tstate->sys_tracefunc,
528 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000529 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000530 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000531 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000532 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000533 }
534
Guido van Rossuma027efa1997-05-05 20:56:21 +0000535 if (tstate->sys_profilefunc != NULL) {
536 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000537 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000538 if (call_trace(&tstate->sys_profilefunc,
539 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000540 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000541 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000542 }
543 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000544
Guido van Rossuma027efa1997-05-05 20:56:21 +0000545 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
546 --tstate->recursion_depth;
547 PyErr_SetString(PyExc_RuntimeError,
548 "Maximum recursion depth exceeded");
549 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000550 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000551 return NULL;
552 }
553
Guido van Rossumd076c731998-10-07 19:42:25 +0000554 _PyCode_GETCODEPTR(co, &first_instr);
555 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000556 stack_pointer = f->f_valuestack;
557
Guido van Rossum374a9221991-04-04 10:40:29 +0000558 why = WHY_NOT;
559 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000561
562 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000563 /* Do periodic things. Doing this every time through
564 the loop would add too much overhead, so we do it
565 only every Nth instruction. We also do it if
566 ``things_to_do'' is set, i.e. when an asynchronous
567 event needs attention (e.g. a signal handler or
568 async I/O handler); see Py_AddPendingCall() and
569 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000570
Guido van Rossuma027efa1997-05-05 20:56:21 +0000571 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000572 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000574 if (Py_MakePendingCalls() < 0) {
575 why = WHY_EXCEPTION;
576 goto on_error;
577 }
578 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000579#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000580 /* If we have true signals, the signal handler
581 will call Py_AddPendingCall() so we don't
582 have to call sigcheck(). On the Mac and
583 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000584 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 goto on_error;
587 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000588#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589
Guido van Rossume59214e1994-08-30 08:01:59 +0000590#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591 if (interpreter_lock) {
592 /* Give another thread a chance */
593
Guido van Rossum25ce5661997-08-02 03:10:38 +0000594 if (PyThreadState_Swap(NULL) != tstate)
595 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000596 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000597
598 /* Other threads may run now */
599
Guido van Rossum65d5b571998-12-21 19:32:43 +0000600 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000601 if (PyThreadState_Swap(tstate) != NULL)
602 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603 }
604#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000606
Guido van Rossum374a9221991-04-04 10:40:29 +0000607 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000608
Guido van Rossum408027e1996-12-30 16:17:54 +0000609#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000610 f->f_lasti = INSTR_OFFSET();
611#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000612
613 opcode = NEXTOP();
614 if (HAS_ARG(opcode))
615 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000616 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000617#ifdef DYNAMIC_EXECUTION_PROFILE
618#ifdef DXPAIRS
619 dxpairs[lastopcode][opcode]++;
620 lastopcode = opcode;
621#endif
622 dxp[opcode]++;
623#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000624
Guido van Rossum96a42c81992-01-12 02:29:51 +0000625#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 /* Instruction tracing */
627
Guido van Rossum96a42c81992-01-12 02:29:51 +0000628 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000629 if (HAS_ARG(opcode)) {
630 printf("%d: %d, %d\n",
631 (int) (INSTR_OFFSET() - 3),
632 opcode, oparg);
633 }
634 else {
635 printf("%d: %d\n",
636 (int) (INSTR_OFFSET() - 1), opcode);
637 }
638 }
639#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 /* Main switch on opcode */
641
642 switch (opcode) {
643
644 /* BEWARE!
645 It is essential that any operation that fails sets either
646 x to NULL, err to nonzero, or why to anything but WHY_NOT,
647 and that no operation that succeeds does this! */
648
649 /* case STOP_CODE: this is an error! */
650
651 case POP_TOP:
652 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000653 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000654 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000655
656 case ROT_TWO:
657 v = POP();
658 w = POP();
659 PUSH(v);
660 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000661 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662
663 case ROT_THREE:
664 v = POP();
665 w = POP();
666 x = POP();
667 PUSH(v);
668 PUSH(x);
669 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000670 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000671
Thomas Wouters434d0822000-08-24 20:11:32 +0000672 case ROT_FOUR:
673 u = POP();
674 v = POP();
675 w = POP();
676 x = POP();
677 PUSH(u);
678 PUSH(x);
679 PUSH(w);
680 PUSH(v);
681 continue;
682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 case DUP_TOP:
684 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000685 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000687 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000688
Thomas Wouters434d0822000-08-24 20:11:32 +0000689 case DUP_TOPX:
690 switch (oparg) {
691 case 5:
692 case 4:
693 case 3:
694 case 2:
695 case 1:
696 x = POP();
697 if (oparg == 1) break;
698 w = POP();
699 if (oparg == 2) break;
700 v = POP();
701 if (oparg == 3) break;
702 u = POP();
703 if (oparg == 4) break;
704 t = POP();
705 break;
706 default:
707 fprintf(stderr, "Invalid argument to DUP_TOPX: %d!\n", oparg);
708 PyErr_SetString(PyExc_SystemError,
709 "invalid argument to DUP_TOPX");
710 x = NULL;
711 }
712 if (x == NULL)
713 break;
714 switch (oparg) {
715 case 5: PUSH(t);
716 Py_INCREF(t); /* Fallthrough */
717 case 4: PUSH(u);
718 Py_INCREF(u); /* Fallthrough */
719 case 3: PUSH(v);
720 Py_INCREF(v); /* Fallthrough */
721 case 2: PUSH(w);
722 Py_INCREF(w); /* Fallthrough */
723 case 1: PUSH(x);
724 Py_INCREF(x); /* Fallthrough */
725 }
726 switch (oparg) {
727 case 5: PUSH(t); /* Fallthrough */
728 case 4: PUSH(u); /* Fallthrough */
729 case 3: PUSH(v); /* Fallthrough */
730 case 2: PUSH(w); /* Fallthrough */
731 case 1: PUSH(x); /* Fallthrough */
732 }
733 continue;
734
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 case UNARY_POSITIVE:
736 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000737 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000738 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000740 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000741 break;
742
743 case UNARY_NEGATIVE:
744 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000745 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000746 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000748 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000749 break;
750
751 case UNARY_NOT:
752 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000753 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000754 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000755 if (err == 0) {
756 Py_INCREF(Py_True);
757 PUSH(Py_True);
758 continue;
759 }
760 else if (err > 0) {
761 Py_INCREF(Py_False);
762 PUSH(Py_False);
763 err = 0;
764 continue;
765 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 break;
767
768 case UNARY_CONVERT:
769 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000770 x = PyObject_Repr(v);
771 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000775
776 case UNARY_INVERT:
777 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000778 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000779 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000780 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000781 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000782 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000783
Guido van Rossum50564e81996-01-12 01:13:16 +0000784 case BINARY_POWER:
785 w = POP();
786 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000787 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000788 Py_DECREF(v);
789 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000790 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000791 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000792 break;
793
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 case BINARY_MULTIPLY:
795 w = POP();
796 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000797 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000798 Py_DECREF(v);
799 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000800 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000801 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000802 break;
803
804 case BINARY_DIVIDE:
805 w = POP();
806 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000807 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000808 Py_DECREF(v);
809 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000811 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 break;
813
814 case BINARY_MODULO:
815 w = POP();
816 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000817 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000818 Py_DECREF(v);
819 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000821 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 break;
823
824 case BINARY_ADD:
825 w = POP();
826 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000827 if (PyInt_Check(v) && PyInt_Check(w)) {
828 /* INLINE: int + int */
829 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000830 a = PyInt_AS_LONG(v);
831 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000832 i = a + b;
833 if ((i^a) < 0 && (i^b) < 0) {
834 PyErr_SetString(PyExc_OverflowError,
835 "integer addition");
836 x = NULL;
837 }
838 else
839 x = PyInt_FromLong(i);
840 }
841 else
842 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000843 Py_DECREF(v);
844 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000846 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 break;
848
849 case BINARY_SUBTRACT:
850 w = POP();
851 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000852 if (PyInt_Check(v) && PyInt_Check(w)) {
853 /* INLINE: int - int */
854 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000855 a = PyInt_AS_LONG(v);
856 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000857 i = a - b;
858 if ((i^a) < 0 && (i^~b) < 0) {
859 PyErr_SetString(PyExc_OverflowError,
860 "integer subtraction");
861 x = NULL;
862 }
863 else
864 x = PyInt_FromLong(i);
865 }
866 else
867 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000868 Py_DECREF(v);
869 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 break;
873
874 case BINARY_SUBSCR:
875 w = POP();
876 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000877 if (PyList_Check(v) && PyInt_Check(w)) {
878 /* INLINE: list[int] */
879 long i = PyInt_AsLong(w);
880 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000881 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000882 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000883 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000884 PyErr_SetString(PyExc_IndexError,
885 "list index out of range");
886 x = NULL;
887 }
888 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000889 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000890 Py_INCREF(x);
891 }
892 }
893 else
894 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000895 Py_DECREF(v);
896 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000898 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 break;
900
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901 case BINARY_LSHIFT:
902 w = POP();
903 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000904 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000905 Py_DECREF(v);
906 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000907 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000908 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000909 break;
910
911 case BINARY_RSHIFT:
912 w = POP();
913 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000914 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 Py_DECREF(v);
916 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000918 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000919 break;
920
921 case BINARY_AND:
922 w = POP();
923 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000924 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000925 Py_DECREF(v);
926 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000927 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000928 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000929 break;
930
931 case BINARY_XOR:
932 w = POP();
933 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000934 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 Py_DECREF(v);
936 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000937 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000938 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000939 break;
940
941 case BINARY_OR:
942 w = POP();
943 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000944 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 Py_DECREF(v);
946 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000949 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000950
951 case INPLACE_POWER:
952 w = POP();
953 v = POP();
954 x = PyNumber_InPlacePower(v, w, Py_None);
955 Py_DECREF(v);
956 Py_DECREF(w);
957 PUSH(x);
958 if (x != NULL) continue;
959 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000960
Thomas Wouters434d0822000-08-24 20:11:32 +0000961 case INPLACE_MULTIPLY:
962 w = POP();
963 v = POP();
964 x = PyNumber_InPlaceMultiply(v, w);
965 Py_DECREF(v);
966 Py_DECREF(w);
967 PUSH(x);
968 if (x != NULL) continue;
969 break;
970
971 case INPLACE_DIVIDE:
972 w = POP();
973 v = POP();
974 x = PyNumber_InPlaceDivide(v, w);
975 Py_DECREF(v);
976 Py_DECREF(w);
977 PUSH(x);
978 if (x != NULL) continue;
979 break;
980
981 case INPLACE_MODULO:
982 w = POP();
983 v = POP();
984 x = PyNumber_InPlaceRemainder(v, w);
985 Py_DECREF(v);
986 Py_DECREF(w);
987 PUSH(x);
988 if (x != NULL) continue;
989 break;
990
991 case INPLACE_ADD:
992 w = POP();
993 v = POP();
994 if (PyInt_Check(v) && PyInt_Check(w)) {
995 /* INLINE: int + int */
996 register long a, b, i;
997 a = PyInt_AS_LONG(v);
998 b = PyInt_AS_LONG(w);
999 i = a + b;
1000 if ((i^a) < 0 && (i^b) < 0) {
1001 PyErr_SetString(PyExc_OverflowError,
1002 "integer addition");
1003 x = NULL;
1004 }
1005 else
1006 x = PyInt_FromLong(i);
1007 }
1008 else
1009 x = PyNumber_InPlaceAdd(v, w);
1010 Py_DECREF(v);
1011 Py_DECREF(w);
1012 PUSH(x);
1013 if (x != NULL) continue;
1014 break;
1015
1016 case INPLACE_SUBTRACT:
1017 w = POP();
1018 v = POP();
1019 if (PyInt_Check(v) && PyInt_Check(w)) {
1020 /* INLINE: int - int */
1021 register long a, b, i;
1022 a = PyInt_AS_LONG(v);
1023 b = PyInt_AS_LONG(w);
1024 i = a - b;
1025 if ((i^a) < 0 && (i^~b) < 0) {
1026 PyErr_SetString(PyExc_OverflowError,
1027 "integer subtraction");
1028 x = NULL;
1029 }
1030 else
1031 x = PyInt_FromLong(i);
1032 }
1033 else
1034 x = PyNumber_InPlaceSubtract(v, w);
1035 Py_DECREF(v);
1036 Py_DECREF(w);
1037 PUSH(x);
1038 if (x != NULL) continue;
1039 break;
1040
1041 case INPLACE_LSHIFT:
1042 w = POP();
1043 v = POP();
1044 x = PyNumber_InPlaceLshift(v, w);
1045 Py_DECREF(v);
1046 Py_DECREF(w);
1047 PUSH(x);
1048 if (x != NULL) continue;
1049 break;
1050
1051 case INPLACE_RSHIFT:
1052 w = POP();
1053 v = POP();
1054 x = PyNumber_InPlaceRshift(v, w);
1055 Py_DECREF(v);
1056 Py_DECREF(w);
1057 PUSH(x);
1058 if (x != NULL) continue;
1059 break;
1060
1061 case INPLACE_AND:
1062 w = POP();
1063 v = POP();
1064 x = PyNumber_InPlaceAnd(v, w);
1065 Py_DECREF(v);
1066 Py_DECREF(w);
1067 PUSH(x);
1068 if (x != NULL) continue;
1069 break;
1070
1071 case INPLACE_XOR:
1072 w = POP();
1073 v = POP();
1074 x = PyNumber_InPlaceXor(v, w);
1075 Py_DECREF(v);
1076 Py_DECREF(w);
1077 PUSH(x);
1078 if (x != NULL) continue;
1079 break;
1080
1081 case INPLACE_OR:
1082 w = POP();
1083 v = POP();
1084 x = PyNumber_InPlaceOr(v, w);
1085 Py_DECREF(v);
1086 Py_DECREF(w);
1087 PUSH(x);
1088 if (x != NULL) continue;
1089 break;
1090
Guido van Rossum374a9221991-04-04 10:40:29 +00001091 case SLICE+0:
1092 case SLICE+1:
1093 case SLICE+2:
1094 case SLICE+3:
1095 if ((opcode-SLICE) & 2)
1096 w = POP();
1097 else
1098 w = NULL;
1099 if ((opcode-SLICE) & 1)
1100 v = POP();
1101 else
1102 v = NULL;
1103 u = POP();
1104 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001105 Py_DECREF(u);
1106 Py_XDECREF(v);
1107 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001108 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001109 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 break;
1111
1112 case STORE_SLICE+0:
1113 case STORE_SLICE+1:
1114 case STORE_SLICE+2:
1115 case STORE_SLICE+3:
1116 if ((opcode-STORE_SLICE) & 2)
1117 w = POP();
1118 else
1119 w = NULL;
1120 if ((opcode-STORE_SLICE) & 1)
1121 v = POP();
1122 else
1123 v = NULL;
1124 u = POP();
1125 t = POP();
1126 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001127 Py_DECREF(t);
1128 Py_DECREF(u);
1129 Py_XDECREF(v);
1130 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001131 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 break;
1133
1134 case DELETE_SLICE+0:
1135 case DELETE_SLICE+1:
1136 case DELETE_SLICE+2:
1137 case DELETE_SLICE+3:
1138 if ((opcode-DELETE_SLICE) & 2)
1139 w = POP();
1140 else
1141 w = NULL;
1142 if ((opcode-DELETE_SLICE) & 1)
1143 v = POP();
1144 else
1145 v = NULL;
1146 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001147 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001149 Py_DECREF(u);
1150 Py_XDECREF(v);
1151 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001152 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 break;
1154
1155 case STORE_SUBSCR:
1156 w = POP();
1157 v = POP();
1158 u = POP();
1159 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001160 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001161 Py_DECREF(u);
1162 Py_DECREF(v);
1163 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001164 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 break;
1166
1167 case DELETE_SUBSCR:
1168 w = POP();
1169 v = POP();
1170 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001171 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001172 Py_DECREF(v);
1173 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001174 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001175 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001176
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 case PRINT_EXPR:
1178 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001179 /* Print value except if None */
1180 /* After printing, also assign to '_' */
1181 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001182 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001183 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001184 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001185 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001186 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001187 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001188 if (x == NULL) {
1189 PyErr_SetString(
1190 PyExc_RuntimeError,
1191 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001192 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001193 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001194 }
1195 if (err == 0)
1196 err = PyFile_WriteObject(v, x, 0);
1197 if (err == 0) {
1198 PyFile_SoftSpace(x, 1);
1199 err = Py_FlushLine();
1200 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001201 if (err == 0) {
1202 err = PyDict_SetItemString(
1203 f->f_builtins, "_", v);
1204 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001206 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 break;
1208
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001209 case PRINT_ITEM_TO:
1210 w = stream = POP();
1211 /* fall through to PRINT_ITEM */
1212
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 case PRINT_ITEM:
1214 v = POP();
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001215 if (stream == NULL) {
1216 w = PySys_GetObject("stdout");
1217 if (w == NULL) {
1218 PyErr_SetString(PyExc_RuntimeError,
1219 "lost sys.stdout");
1220 err = -1;
1221 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001222 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001223 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001224 err = PyFile_WriteString(" ", w);
1225 if (err == 0)
1226 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001228 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 char *s = PyString_AsString(v);
1230 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001231 if (len > 0 &&
1232 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001233 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001234 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001236 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001237 Py_XDECREF(stream);
1238 stream = NULL;
1239 if (err == 0)
1240 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 break;
1242
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001243 case PRINT_NEWLINE_TO:
1244 w = stream = POP();
1245 /* fall through to PRINT_NEWLINE */
1246
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 case PRINT_NEWLINE:
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001248 if (stream == NULL) {
1249 w = PySys_GetObject("stdout");
1250 if (w == NULL)
1251 PyErr_SetString(PyExc_RuntimeError,
1252 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001253 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001254 if (w != NULL) {
1255 err = PyFile_WriteString("\n", w);
1256 if (err == 0)
1257 PyFile_SoftSpace(w, 0);
1258 }
1259 Py_XDECREF(stream);
1260 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 break;
1262
Thomas Wouters434d0822000-08-24 20:11:32 +00001263
1264#ifdef CASE_TOO_BIG
1265 default: switch (opcode) {
1266#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 case BREAK_LOOP:
1268 why = WHY_BREAK;
1269 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001270
Guido van Rossumf10570b1995-07-07 22:53:21 +00001271 case RAISE_VARARGS:
1272 u = v = w = NULL;
1273 switch (oparg) {
1274 case 3:
1275 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001276 /* Fallthrough */
1277 case 2:
1278 v = POP(); /* value */
1279 /* Fallthrough */
1280 case 1:
1281 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001282 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001283 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001284 break;
1285 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001286 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001287 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001288 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001289 break;
1290 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 break;
1292
1293 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001294 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001295 PyErr_SetString(PyExc_SystemError,
1296 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001297 break;
1298 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001300 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
1302
1303 case RETURN_VALUE:
1304 retval = POP();
1305 why = WHY_RETURN;
1306 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001307
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001308 case EXEC_STMT:
1309 w = POP();
1310 v = POP();
1311 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001312 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001313 Py_DECREF(u);
1314 Py_DECREF(v);
1315 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001316 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001317
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 case POP_BLOCK:
1319 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 while (STACK_LEVEL() > b->b_level) {
1322 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001323 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 }
1325 }
1326 break;
1327
1328 case END_FINALLY:
1329 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 if (PyInt_Check(v)) {
1331 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 if (why == WHY_RETURN)
1333 retval = POP();
1334 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001335 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001337 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001338 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001340 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 else if (v != Py_None) {
1343 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 "'finally' pops bad exception");
1345 why = WHY_EXCEPTION;
1346 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001347 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 break;
1349
1350 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001351 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001353 w = POP();
1354 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 Py_DECREF(u);
1357 Py_DECREF(v);
1358 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 break;
1360
1361 case STORE_NAME:
1362 w = GETNAMEV(oparg);
1363 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001364 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001365 PyErr_SetString(PyExc_SystemError,
1366 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001367 break;
1368 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001369 err = PyDict_SetItem(x, w, v);
1370 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 break;
1372
1373 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001374 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001375 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001376 PyErr_SetString(PyExc_SystemError,
1377 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001378 break;
1379 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001380 if ((err = PyDict_DelItem(x, w)) != 0)
1381 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001383
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001384 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001386 if (PyTuple_Check(v)) {
1387 if (PyTuple_Size(v) != oparg) {
1388 PyErr_SetString(PyExc_ValueError,
1389 "unpack tuple of wrong size");
1390 why = WHY_EXCEPTION;
1391 }
1392 else {
1393 for (; --oparg >= 0; ) {
1394 w = PyTuple_GET_ITEM(v, oparg);
1395 Py_INCREF(w);
1396 PUSH(w);
1397 }
1398 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001400 else if (PyList_Check(v)) {
1401 if (PyList_Size(v) != oparg) {
1402 PyErr_SetString(PyExc_ValueError,
1403 "unpack list of wrong size");
1404 why = WHY_EXCEPTION;
1405 }
1406 else {
1407 for (; --oparg >= 0; ) {
1408 w = PyList_GET_ITEM(v, oparg);
1409 Py_INCREF(w);
1410 PUSH(w);
1411 }
1412 }
1413 }
1414 else if (PySequence_Check(v)) {
1415 if (unpack_sequence(v, oparg,
1416 stack_pointer + oparg))
1417 stack_pointer += oparg;
1418 else
1419 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 }
1421 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001422 PyErr_SetString(PyExc_TypeError,
1423 "unpack non-sequence");
1424 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001427 break;
1428
1429 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001430 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 v = POP();
1432 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1434 Py_DECREF(v);
1435 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 break;
1437
1438 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001439 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001441 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1442 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 break;
1445
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001446 case STORE_GLOBAL:
1447 w = GETNAMEV(oparg);
1448 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001449 err = PyDict_SetItem(f->f_globals, w, v);
1450 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001451 break;
1452
1453 case DELETE_GLOBAL:
1454 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1456 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001457 break;
1458
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 case LOAD_CONST:
1460 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001461 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 PUSH(x);
1463 break;
1464
1465 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001466 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001467 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001468 PyErr_SetString(PyExc_SystemError,
1469 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001470 break;
1471 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001472 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001478 PyErr_SetObject(
1479 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 break;
1481 }
1482 }
1483 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001484 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 PUSH(x);
1486 break;
1487
1488 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001489 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 break;
1496 }
1497 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 PUSH(x);
1500 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001501
Guido van Rossum9bfef441993-03-29 10:43:31 +00001502 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001503 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001504 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001505 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001506 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001508 break;
1509 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001511 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001512 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001513 break;
1514
1515 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001516 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001517 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001518 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001519
1520 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001521 x = GETLOCAL(oparg);
1522 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001523 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001524 PyTuple_GetItem(co->co_varnames,
1525 oparg));
1526 break;
1527 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001528 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001529 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001530
1531 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 if (x != NULL) {
1534 for (; --oparg >= 0;) {
1535 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 }
1538 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001539 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 }
1541 break;
1542
1543 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 if (x != NULL) {
1546 for (; --oparg >= 0;) {
1547 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001548 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 }
1550 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001551 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 }
1553 break;
1554
1555 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001558 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 break;
1560
1561 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001562 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 x = PyObject_GetAttr(v, w);
1565 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001567 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 break;
1569
1570 case COMPARE_OP:
1571 w = POP();
1572 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001573 if (PyInt_Check(v) && PyInt_Check(w)) {
1574 /* INLINE: cmp(int, int) */
1575 register long a, b;
1576 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001577 a = PyInt_AS_LONG(v);
1578 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001579 switch (oparg) {
1580 case LT: res = a < b; break;
1581 case LE: res = a <= b; break;
1582 case EQ: res = a == b; break;
1583 case NE: res = a != b; break;
1584 case GT: res = a > b; break;
1585 case GE: res = a >= b; break;
1586 case IS: res = v == w; break;
1587 case IS_NOT: res = v != w; break;
1588 default: goto slow_compare;
1589 }
1590 x = res ? Py_True : Py_False;
1591 Py_INCREF(x);
1592 }
1593 else {
1594 slow_compare:
1595 x = cmp_outcome(oparg, v, w);
1596 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 Py_DECREF(v);
1598 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001600 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 break;
1602
1603 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001604 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001605 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001606 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001608 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001609 break;
1610 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001611 u = find_from_args(f, INSTR_OFFSET());
1612 if (u == NULL) {
1613 x = u;
1614 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001615 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617 w,
1618 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001619 f->f_locals == NULL ?
1620 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001622 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001623 if (w == NULL) {
1624 x = NULL;
1625 break;
1626 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001627 x = PyEval_CallObject(x, w);
1628 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001629 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001630 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001631 break;
1632
Thomas Wouters52152252000-08-17 22:55:00 +00001633 case IMPORT_STAR:
1634 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001636 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001637 PyErr_SetString(PyExc_SystemError,
1638 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001639 break;
1640 }
Thomas Wouters52152252000-08-17 22:55:00 +00001641 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001643 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001644 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001646
Thomas Wouters52152252000-08-17 22:55:00 +00001647 case IMPORT_FROM:
1648 w = GETNAMEV(oparg);
1649 v = TOP();
1650 x = import_from(v, w);
1651 PUSH(x);
1652 if (x != NULL) continue;
1653 break;
1654
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 case JUMP_FORWARD:
1656 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001657 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001658
1659 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001661 if (err > 0)
1662 err = 0;
1663 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001665 else
1666 break;
1667 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001668
1669 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001671 if (err > 0) {
1672 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001674 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001675 else if (err == 0)
1676 ;
1677 else
1678 break;
1679 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001680
1681 case JUMP_ABSOLUTE:
1682 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001684
1685 case FOR_LOOP:
1686 /* for v in s: ...
1687 On entry: stack contains s, i.
1688 On exit: stack contains s, i+1, s[i];
1689 but if loop exhausted:
1690 s, i are popped, and we jump */
1691 w = POP(); /* Loop index */
1692 v = POP(); /* Sequence object */
1693 u = loop_subscript(v, w);
1694 if (u != NULL) {
1695 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001700 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 }
1702 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001703 Py_DECREF(v);
1704 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 /* A NULL can mean "s exhausted"
1706 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001709 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001711 continue;
1712 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 }
1714 break;
1715
1716 case SETUP_LOOP:
1717 case SETUP_EXCEPT:
1718 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001719 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001721 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001722
1723 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001724#ifdef LLTRACE
1725 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001726 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001728 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001729 if (f->f_trace == NULL)
1730 continue;
1731 /* Trace each line of code reached */
1732 f->f_lasti = INSTR_OFFSET();
1733 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001736
1737 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001738 case CALL_FUNCTION_VAR:
1739 case CALL_FUNCTION_KW:
1740 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001741 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001742 int na = oparg & 0xff;
1743 int nk = (oparg>>8) & 0xff;
1744 int flags = (opcode - CALL_FUNCTION) & 3;
1745 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1746 PyObject **pfunc = stack_pointer - n - 1;
1747 PyObject *func = *pfunc;
1748 PyObject *self = NULL;
1749 PyObject *class = NULL;
1750 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1751 if (PyMethod_Check(func)) {
1752 self = PyMethod_Self(func);
1753 class = PyMethod_Class(func);
1754 func = PyMethod_Function(func);
1755 Py_INCREF(func);
1756 if (self != NULL) {
1757 Py_INCREF(self);
1758 Py_DECREF(*pfunc);
1759 *pfunc = self;
1760 na++;
1761 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001762 }
1763 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001764 /* Unbound methods must be called with an
1765 instance of the class (or a derived
1766 class) as first argument */
1767 if (na > 0 && (self = stack_pointer[-n]) != NULL
1768 && PyInstance_Check(self)
1769 && PyClass_IsSubclass((PyObject *)
1770 (((PyInstanceObject *)self)->in_class),
1771 class))
1772 /* Handy-dandy */ ;
1773 else {
1774 PyErr_SetString(PyExc_TypeError,
1775 "unbound method must be called with class instance 1st argument");
1776 x = NULL;
1777 break;
1778 }
1779 }
1780 }
1781 else
1782 Py_INCREF(func);
1783 if (PyFunction_Check(func) && flags == 0) {
1784 PyObject *co = PyFunction_GetCode(func);
1785 PyObject *globals = PyFunction_GetGlobals(func);
1786 PyObject *argdefs = PyFunction_GetDefaults(func);
1787 PyObject **d;
1788 int nd;
1789 if (argdefs != NULL) {
1790 d = &PyTuple_GET_ITEM(argdefs, 0);
1791 nd = ((PyTupleObject *)argdefs)->ob_size;
1792 }
1793 else {
1794 d = NULL;
1795 nd = 0;
1796 }
1797 x = eval_code2((PyCodeObject *)co, globals,
1798 (PyObject *)NULL, stack_pointer-n, na,
1799 stack_pointer-2*nk, nk, d, nd,
1800 class);
1801 }
1802 else {
1803 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001804 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001805 PyObject *stararg = 0;
1806 PyObject *kwdict = NULL;
1807 if (flags & 2) {
1808 kwdict = POP();
1809 if (!PyDict_Check(kwdict)) {
1810 PyErr_SetString(PyExc_TypeError,
1811 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001812 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001813 }
1814 }
1815 if (flags & 1) {
1816 stararg = POP();
1817 if (!PySequence_Check(stararg)) {
1818 PyErr_SetString(PyExc_TypeError,
1819 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001820 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001821 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001822 /* Convert abstract sequence to concrete tuple */
1823 if (!PyTuple_Check(stararg)) {
1824 PyObject *t = NULL;
1825 t = PySequence_Tuple(stararg);
1826 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001827 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001828 }
1829 Py_DECREF(stararg);
1830 stararg = t;
1831 }
1832 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001833 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001834 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001835 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001836 }
1837 if (nk > 0) {
1838 if (kwdict == NULL) {
1839 kwdict = PyDict_New();
1840 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001841 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001842 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001843 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001844 else {
1845 PyObject *d = PyDict_Copy(kwdict);
1846 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001847 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001848 }
1849 Py_DECREF(kwdict);
1850 kwdict = d;
1851 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001852 err = 0;
1853 while (--nk >= 0) {
1854 PyObject *value = POP();
1855 PyObject *key = POP();
1856 if (PyDict_GetItem(kwdict, key) != NULL) {
1857 err = 1;
1858 PyErr_Format(PyExc_TypeError,
1859 "keyword parameter redefined: %.400s",
1860 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001861 Py_DECREF(key);
1862 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001863 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001864 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001865 err = PyDict_SetItem(kwdict, key, value);
1866 Py_DECREF(key);
1867 Py_DECREF(value);
1868 if (err)
1869 break;
1870 }
1871 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001872 extcall_fail:
1873 Py_XDECREF(kwdict);
1874 Py_XDECREF(stararg);
1875 Py_DECREF(func);
1876 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001877 break;
1878 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001879 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001880 callargs = PyTuple_New(na + nstar);
1881 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001882 x = NULL;
1883 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001884 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001885 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001886 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001887 for (i = 0; i < nstar; i++) {
1888 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1889 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001890 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001891 }
1892 Py_DECREF(stararg);
1893 }
1894 while (--na >= 0) {
1895 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001896 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001897 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001898 x = PyEval_CallObjectWithKeywords(func,
1899 callargs,
1900 kwdict);
1901 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001902 Py_XDECREF(kwdict);
1903 }
1904 Py_DECREF(func);
1905 while (stack_pointer > pfunc) {
1906 w = POP();
1907 Py_DECREF(w);
1908 }
1909 PUSH(x);
1910 if (x != NULL) continue;
1911 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001912 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001913
Guido van Rossum681d79a1995-07-18 14:51:37 +00001914 case MAKE_FUNCTION:
1915 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001916 x = PyFunction_New(v, f->f_globals);
1917 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001918 /* XXX Maybe this should be a separate opcode? */
1919 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001920 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001921 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001922 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001923 x = NULL;
1924 break;
1925 }
1926 while (--oparg >= 0) {
1927 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001928 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001929 }
1930 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001931 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001932 }
1933 PUSH(x);
1934 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001935
1936 case BUILD_SLICE:
1937 if (oparg == 3)
1938 w = POP();
1939 else
1940 w = NULL;
1941 v = POP();
1942 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001943 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001944 Py_DECREF(u);
1945 Py_DECREF(v);
1946 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001948 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001949 break;
1950
Fred Drakeef8ace32000-08-24 00:32:09 +00001951 case EXTENDED_ARG:
1952 opcode = NEXTOP();
1953 oparg = oparg<<16 | NEXTARG();
1954 goto dispatch_opcode;
1955 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001956
Guido van Rossum374a9221991-04-04 10:40:29 +00001957 default:
1958 fprintf(stderr,
1959 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001960 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001961 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001962 why = WHY_EXCEPTION;
1963 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001964
1965#ifdef CASE_TOO_BIG
1966 }
1967#endif
1968
Guido van Rossum374a9221991-04-04 10:40:29 +00001969 } /* switch */
1970
1971 on_error:
1972
1973 /* Quickly continue if no error occurred */
1974
1975 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001976 if (err == 0 && x != NULL) {
1977#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001978 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001980 fprintf(stderr,
1981 "XXX undetected error\n");
1982 else
1983#endif
1984 continue; /* Normal, fast path */
1985 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001986 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001988 err = 0;
1989 }
1990
Guido van Rossum374a9221991-04-04 10:40:29 +00001991 /* Double-check exception status */
1992
1993 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001995 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001996 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001997 why = WHY_EXCEPTION;
1998 }
1999 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002000#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002001 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002002 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002003 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002004 fprintf(stderr,
2005 "XXX undetected error (why=%d)\n",
2006 why);
2007 why = WHY_EXCEPTION;
2008 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002009 }
2010#endif
2011
2012 /* Log traceback info if this is a real exception */
2013
2014 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002015 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002016 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002017 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002019
Guido van Rossume59214e1994-08-30 08:01:59 +00002020 if (f->f_trace)
2021 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002022 if (tstate->sys_profilefunc)
2023 call_exc_trace(&tstate->sys_profilefunc,
2024 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002025 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002026
2027 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
2028
2029 if (why == WHY_RERAISE)
2030 why = WHY_EXCEPTION;
2031
2032 /* Unwind stacks if a (pseudo) exception occurred */
2033
2034 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002036 while (STACK_LEVEL() > b->b_level) {
2037 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002039 }
2040 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2041 why = WHY_NOT;
2042 JUMPTO(b->b_handler);
2043 break;
2044 }
2045 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002046 (b->b_type == SETUP_EXCEPT &&
2047 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002048 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 PyObject *exc, *val, *tb;
2050 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002051 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 val = Py_None;
2053 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002054 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002055 /* Make the raw exception data
2056 available to the handler,
2057 so a program can emulate the
2058 Python main loop. Don't do
2059 this for 'finally'. */
2060 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002061 PyErr_NormalizeException(
2062 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002063 set_exc_info(tstate,
2064 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002065 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002066 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002067 PUSH(val);
2068 PUSH(exc);
2069 }
2070 else {
2071 if (why == WHY_RETURN)
2072 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002074 PUSH(v);
2075 }
2076 why = WHY_NOT;
2077 JUMPTO(b->b_handler);
2078 break;
2079 }
2080 } /* unwind stack */
2081
2082 /* End the loop if we still have an error (or return) */
2083
2084 if (why != WHY_NOT)
2085 break;
2086
2087 } /* main loop */
2088
2089 /* Pop remaining stack entries */
2090
2091 while (!EMPTY()) {
2092 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002093 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002094 }
2095
Guido van Rossum96a42c81992-01-12 02:29:51 +00002096 if (why != WHY_RETURN)
2097 retval = NULL;
2098
Guido van Rossume59214e1994-08-30 08:01:59 +00002099 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002100 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002101 if (call_trace(&f->f_trace, &f->f_trace, f,
2102 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002104 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002105 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002106 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002107 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002108 }
2109
Guido van Rossuma027efa1997-05-05 20:56:21 +00002110 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2111 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002112 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002114 retval = NULL;
2115 why = WHY_EXCEPTION;
2116 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002117 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002118
Guido van Rossuma027efa1997-05-05 20:56:21 +00002119 reset_exc_info(tstate);
2120
2121 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002122
2123 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002124
Guido van Rossum374a9221991-04-04 10:40:29 +00002125 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002126
Guido van Rossuma027efa1997-05-05 20:56:21 +00002127 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00002129
Guido van Rossum96a42c81992-01-12 02:29:51 +00002130 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002131}
2132
Guido van Rossuma027efa1997-05-05 20:56:21 +00002133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002134set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002135{
2136 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002137 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002138
Guido van Rossuma027efa1997-05-05 20:56:21 +00002139 frame = tstate->frame;
2140 if (frame->f_exc_type == NULL) {
2141 /* This frame didn't catch an exception before */
2142 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002143 if (tstate->exc_type == NULL) {
2144 Py_INCREF(Py_None);
2145 tstate->exc_type = Py_None;
2146 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002147 tmp_type = frame->f_exc_type;
2148 tmp_value = frame->f_exc_value;
2149 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002150 Py_XINCREF(tstate->exc_type);
2151 Py_XINCREF(tstate->exc_value);
2152 Py_XINCREF(tstate->exc_traceback);
2153 frame->f_exc_type = tstate->exc_type;
2154 frame->f_exc_value = tstate->exc_value;
2155 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002156 Py_XDECREF(tmp_type);
2157 Py_XDECREF(tmp_value);
2158 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002159 }
2160 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002161 tmp_type = tstate->exc_type;
2162 tmp_value = tstate->exc_value;
2163 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002164 Py_XINCREF(type);
2165 Py_XINCREF(value);
2166 Py_XINCREF(tb);
2167 tstate->exc_type = type;
2168 tstate->exc_value = value;
2169 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002170 Py_XDECREF(tmp_type);
2171 Py_XDECREF(tmp_value);
2172 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002173 /* For b/w compatibility */
2174 PySys_SetObject("exc_type", type);
2175 PySys_SetObject("exc_value", value);
2176 PySys_SetObject("exc_traceback", tb);
2177}
2178
2179static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002180reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002181{
2182 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002183 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002184 frame = tstate->frame;
2185 if (frame->f_exc_type != NULL) {
2186 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002187 tmp_type = tstate->exc_type;
2188 tmp_value = tstate->exc_value;
2189 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002190 Py_XINCREF(frame->f_exc_type);
2191 Py_XINCREF(frame->f_exc_value);
2192 Py_XINCREF(frame->f_exc_traceback);
2193 tstate->exc_type = frame->f_exc_type;
2194 tstate->exc_value = frame->f_exc_value;
2195 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002196 Py_XDECREF(tmp_type);
2197 Py_XDECREF(tmp_value);
2198 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002199 /* For b/w compatibility */
2200 PySys_SetObject("exc_type", frame->f_exc_type);
2201 PySys_SetObject("exc_value", frame->f_exc_value);
2202 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2203 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002204 tmp_type = frame->f_exc_type;
2205 tmp_value = frame->f_exc_value;
2206 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002207 frame->f_exc_type = NULL;
2208 frame->f_exc_value = NULL;
2209 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002210 Py_XDECREF(tmp_type);
2211 Py_XDECREF(tmp_value);
2212 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002213}
2214
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002215/* Logic for the raise statement (too complicated for inlining).
2216 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002217static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002219{
Guido van Rossumd295f121998-04-09 21:39:57 +00002220 if (type == NULL) {
2221 /* Reraise */
2222 PyThreadState *tstate = PyThreadState_Get();
2223 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2224 value = tstate->exc_value;
2225 tb = tstate->exc_traceback;
2226 Py_XINCREF(type);
2227 Py_XINCREF(value);
2228 Py_XINCREF(tb);
2229 }
2230
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002231 /* We support the following forms of raise:
2232 raise <class>, <classinstance>
2233 raise <class>, <argument tuple>
2234 raise <class>, None
2235 raise <class>, <argument>
2236 raise <classinstance>, None
2237 raise <string>, <object>
2238 raise <string>, None
2239
2240 An omitted second argument is the same as None.
2241
2242 In addition, raise <tuple>, <anything> is the same as
2243 raising the tuple's first item (and it better have one!);
2244 this rule is applied recursively.
2245
2246 Finally, an optional third argument can be supplied, which
2247 gives the traceback to be substituted (useful when
2248 re-raising an exception after examining it). */
2249
2250 /* First, check the traceback argument, replacing None with
2251 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002252 if (tb == Py_None) {
2253 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002254 tb = NULL;
2255 }
2256 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002257 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002258 "raise 3rd arg must be traceback or None");
2259 goto raise_error;
2260 }
2261
2262 /* Next, replace a missing value with None */
2263 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002264 value = Py_None;
2265 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002266 }
2267
2268 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002269 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2270 PyObject *tmp = type;
2271 type = PyTuple_GET_ITEM(type, 0);
2272 Py_INCREF(type);
2273 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002274 }
2275
Barry Warsaw4249f541997-08-22 21:26:19 +00002276 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002277 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002278
2279 else if (PyClass_Check(type))
2280 PyErr_NormalizeException(&type, &value, &tb);
2281
Guido van Rossumb209a111997-04-29 18:18:01 +00002282 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002283 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 if (value != Py_None) {
2285 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002286 "instance exception may not have a separate value");
2287 goto raise_error;
2288 }
2289 else {
2290 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002292 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002293 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2294 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002295 }
2296 }
2297 else {
2298 /* Not something you can raise. You get an exception
2299 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002301 "exceptions must be strings, classes, or instances");
2302 goto raise_error;
2303 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002304 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002305 if (tb == NULL)
2306 return WHY_EXCEPTION;
2307 else
2308 return WHY_RERAISE;
2309 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 Py_XDECREF(value);
2311 Py_XDECREF(type);
2312 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002313 return WHY_EXCEPTION;
2314}
2315
Barry Warsawe42b18f1997-08-25 22:13:04 +00002316static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002317unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002318{
2319 int i;
2320 PyObject *w;
2321
2322 for (i = 0; i < argcnt; i++) {
2323 if (! (w = PySequence_GetItem(v, i))) {
2324 if (PyErr_ExceptionMatches(PyExc_IndexError))
2325 PyErr_SetString(PyExc_ValueError,
2326 "unpack sequence of wrong size");
2327 goto finally;
2328 }
2329 *--sp = w;
2330 }
2331 /* we better get an IndexError now */
2332 if (PySequence_GetItem(v, i) == NULL) {
2333 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2334 PyErr_Clear();
2335 return 1;
2336 }
2337 /* some other exception occurred. fall through to finally */
2338 }
2339 else
2340 PyErr_SetString(PyExc_ValueError,
2341 "unpack sequence of wrong size");
2342 /* fall through */
2343finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002344 for (; i > 0; i--, sp++)
2345 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002346
2347 return 0;
2348}
2349
2350
Guido van Rossum96a42c81992-01-12 02:29:51 +00002351#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002353prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 if (PyObject_Print(v, stdout, 0) != 0)
2357 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002358 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002359 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002361#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002364call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002365{
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002367 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002368 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002369 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 value = Py_None;
2371 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002372 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002374 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002376 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002377 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002378 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002379 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002380 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002382 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 Py_XDECREF(type);
2384 Py_XDECREF(value);
2385 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002386 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002387}
2388
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002389/* PyObject **p_trace: in/out; may not be NULL;
2390 may not point to NULL variable initially
2391 PyObject **p_newtrace: in/out; may be NULL;
2392 may point to NULL variable;
2393 may be same variable as p_newtrace */
2394
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002395static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002396call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2397 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002398{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002399 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 PyObject *args, *what;
2401 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002402
Guido van Rossuma027efa1997-05-05 20:56:21 +00002403 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002404 /* Don't do recursive traces */
2405 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002407 *p_newtrace = NULL;
2408 }
2409 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002410 }
2411
Guido van Rossumb209a111997-04-29 18:18:01 +00002412 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002413 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002414 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002415 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002416 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002417 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 Py_INCREF(f);
2419 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2420 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002421 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 arg = Py_None;
2423 Py_INCREF(arg);
2424 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002425 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 PyFrame_FastToLocals(f);
2427 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2428 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002429 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002430 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002432 if (res == NULL) {
2433 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 PyTraceBack_Here(f);
2435 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002436 *p_trace = NULL;
2437 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002439 *p_newtrace = NULL;
2440 }
Barry Warsawf6202631999-09-08 16:26:33 +00002441 /* to be extra double plus sure we don't get recursive
2442 * calls inf either tracefunc or profilefunc gets an
2443 * exception, zap the global variables.
2444 */
2445 Py_XDECREF(tstate->sys_tracefunc);
2446 tstate->sys_tracefunc = NULL;
2447 Py_XDECREF(tstate->sys_profilefunc);
2448 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002449 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002450 }
2451 else {
2452 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 Py_XDECREF(*p_newtrace);
2454 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002455 *p_newtrace = NULL;
2456 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002458 *p_newtrace = res;
2459 }
2460 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002462 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002463 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002464}
2465
Guido van Rossumb209a111997-04-29 18:18:01 +00002466PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002467PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002468{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002469 PyThreadState *tstate = PyThreadState_Get();
2470 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002471 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002472 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002473 else
2474 return current_frame->f_builtins;
2475}
2476
Guido van Rossumb209a111997-04-29 18:18:01 +00002477PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002478PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002479{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002480 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002481 if (current_frame == NULL)
2482 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002484 return current_frame->f_locals;
2485}
2486
Guido van Rossumb209a111997-04-29 18:18:01 +00002487PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002488PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002489{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002490 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491 if (current_frame == NULL)
2492 return NULL;
2493 else
2494 return current_frame->f_globals;
2495}
2496
Guido van Rossumb209a111997-04-29 18:18:01 +00002497PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002498PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002499{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002500 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002502}
2503
Guido van Rossum6135a871995-01-09 17:53:26 +00002504int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002505PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002506{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002507 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002508 return current_frame == NULL ? 0 : current_frame->f_restricted;
2509}
2510
Guido van Rossumbe270261997-05-22 22:26:18 +00002511int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002512Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513{
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002515 if (f == NULL)
2516 return 0;
2517 if (!PyFile_SoftSpace(f, 0))
2518 return 0;
2519 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520}
2521
Guido van Rossum3f5da241990-12-20 15:06:42 +00002522
Guido van Rossum681d79a1995-07-18 14:51:37 +00002523/* External interface to call any callable object.
2524 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002525
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002526#undef PyEval_CallObject
2527/* for backward compatibility: export this interface */
2528
Guido van Rossumb209a111997-04-29 18:18:01 +00002529PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002531{
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002533}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002534#define PyEval_CallObject(func,arg) \
2535 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002536
Guido van Rossumb209a111997-04-29 18:18:01 +00002537PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002538PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002539{
2540 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002542
2543 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002544 arg = PyTuple_New(0);
2545 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002546 PyErr_SetString(PyExc_TypeError,
2547 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002548 return NULL;
2549 }
2550 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002551 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002552
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002554 PyErr_SetString(PyExc_TypeError,
2555 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002556 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002557 return NULL;
2558 }
2559
Guido van Rossum150b2df1996-12-05 23:17:11 +00002560 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002562 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002563 result = call_function(func, arg, kw);
2564 else
2565 result = call_builtin(func, arg, kw);
2566
Guido van Rossumb209a111997-04-29 18:18:01 +00002567 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002568
Guido van Rossumb209a111997-04-29 18:18:01 +00002569 if (result == NULL && !PyErr_Occurred())
2570 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002571 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002572
2573 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002574}
2575
Guido van Rossumb209a111997-04-29 18:18:01 +00002576static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002577call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578{
Guido van Rossumb209a111997-04-29 18:18:01 +00002579 if (PyCFunction_Check(func)) {
2580 PyCFunction meth = PyCFunction_GetFunction(func);
2581 PyObject *self = PyCFunction_GetSelf(func);
2582 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002583 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002585 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002587 else if (size == 0)
2588 arg = NULL;
2589 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002590 if (flags & METH_KEYWORDS)
2591 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002592 if (kw != NULL && PyDict_Size(kw) != 0) {
2593 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002594 "this function takes no keyword arguments");
2595 return NULL;
2596 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002597 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002599 if (PyClass_Check(func)) {
2600 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002602 if (PyInstance_Check(func)) {
2603 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002604 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002605 PyErr_Clear();
2606 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002607 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002608 return NULL;
2609 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002610 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002611 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002612 return res;
2613 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002614 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002615 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 return NULL;
2617}
2618
Guido van Rossumb209a111997-04-29 18:18:01 +00002619static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002620call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621{
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 PyObject *class = NULL; /* == owner */
2623 PyObject *argdefs;
2624 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002625 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002626 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002627
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 if (kw != NULL && !PyDict_Check(kw)) {
2629 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002630 return NULL;
2631 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632
Guido van Rossumb209a111997-04-29 18:18:01 +00002633 if (PyMethod_Check(func)) {
2634 PyObject *self = PyMethod_Self(func);
2635 class = PyMethod_Class(func);
2636 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002637 if (self == NULL) {
2638 /* Unbound methods must be called with an instance of
2639 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 if (PyTuple_Size(arg) >= 1) {
2641 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002642 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyInstance_Check(self) &&
2644 PyClass_IsSubclass((PyObject *)
2645 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002646 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002647 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002648 else
2649 self = NULL;
2650 }
2651 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002653 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002654 return NULL;
2655 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002657 }
2658 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002659 int argcount = PyTuple_Size(arg);
2660 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002661 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002662 if (newarg == NULL)
2663 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 Py_INCREF(self);
2665 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002666 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 PyObject *v = PyTuple_GET_ITEM(arg, i);
2668 Py_XINCREF(v);
2669 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002670 }
2671 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002673 if (!PyFunction_Check(func)) {
2674 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2675 Py_DECREF(arg);
2676 return result;
2677 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 }
2679 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002681 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002682 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002683 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002684 return NULL;
2685 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002688
2689 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2691 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2692 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002693 }
2694 else {
2695 d = NULL;
2696 nd = 0;
2697 }
2698
2699 if (kw != NULL) {
2700 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 nk = PyDict_Size(kw);
2702 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002703 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 PyErr_NoMemory();
2705 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002706 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002707 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002708 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002710 i += 2;
2711 nk = i/2;
2712 /* XXX This is broken if the caller deletes dict items! */
2713 }
2714 else {
2715 k = NULL;
2716 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002717 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718
Guido van Rossum681d79a1995-07-18 14:51:37 +00002719 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 (PyCodeObject *)PyFunction_GetCode(func),
2721 PyFunction_GetGlobals(func), (PyObject *)NULL,
2722 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002723 k, nk,
2724 d, nd,
2725 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002728 if (k != NULL)
2729 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730
Guido van Rossum681d79a1995-07-18 14:51:37 +00002731 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732}
2733
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002734#define SLICE_ERROR_MSG \
2735 "standard sequence type does not support step size other than one"
2736
Guido van Rossumb209a111997-04-29 18:18:01 +00002737static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002738loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739{
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002741 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002742 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 return NULL;
2745 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002747 v = (*sq->sq_item)(v, i);
2748 if (v)
2749 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002750 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002752 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753}
2754
Guido van Rossum20c6add2000-05-08 14:06:50 +00002755/* Extract a slice index from a PyInt or PyLong, the index is bound to
2756 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2757 and error. Returns 1 on success.*/
2758
2759int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002760_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761{
2762 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002763 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002764 if (PyInt_Check(v)) {
2765 x = PyInt_AsLong(v);
2766 } else if (PyLong_Check(v)) {
2767 x = PyLong_AsLong(v);
2768 if (x==-1 && PyErr_Occurred()) {
2769 PyObject *long_zero;
2770
2771 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2772 /* It's not an overflow error, so just
2773 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002774 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002775 }
2776
2777 /* It's an overflow error, so we need to
2778 check the sign of the long integer,
2779 set the value to INT_MAX or 0, and clear
2780 the error. */
2781
2782 /* Create a long integer with a value of 0 */
2783 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002784 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002785
2786 /* Check sign */
2787 if (PyObject_Compare(long_zero, v) < 0)
2788 x = INT_MAX;
2789 else
2790 x = 0;
2791
2792 /* Free the long integer we created, and clear the
2793 OverflowError */
2794 Py_DECREF(long_zero);
2795 PyErr_Clear();
2796 }
2797 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002798 PyErr_SetString(PyExc_TypeError,
2799 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002800 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002802 /* Truncate -- very long indices are truncated anyway */
2803 if (x > INT_MAX)
2804 x = INT_MAX;
2805 else if (x < -INT_MAX)
2806 x = 0;
2807 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002809 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810}
2811
Guido van Rossumb209a111997-04-29 18:18:01 +00002812static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002813apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002815 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002816 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002818 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002819 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002820 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002822
2823static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002824assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002826 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002827 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002828 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002829 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002830 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002831 if (x == NULL)
2832 return PySequence_DelSlice(u, ilow, ihigh);
2833 else
2834 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835}
2836
Guido van Rossumb209a111997-04-29 18:18:01 +00002837static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
2840 register int cmp;
2841 register int res = 0;
2842 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002843 case IS:
2844 case IS_NOT:
2845 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002846 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 res = !res;
2848 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 case IN:
2850 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002851 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002852 if (res < 0)
2853 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002854 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 break;
2857 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002858 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 break;
2860 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002861 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002862 if (cmp && PyErr_Occurred())
2863 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002864 switch (op) {
2865 case LT: res = cmp < 0; break;
2866 case LE: res = cmp <= 0; break;
2867 case EQ: res = cmp == 0; break;
2868 case NE: res = cmp != 0; break;
2869 case GT: res = cmp > 0; break;
2870 case GE: res = cmp >= 0; break;
2871 /* XXX no default? (res is initialized to 0 though) */
2872 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002873 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002874 v = res ? Py_True : Py_False;
2875 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 return v;
2877}
2878
Thomas Wouters52152252000-08-17 22:55:00 +00002879static PyObject *
2880import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002881{
Guido van Rossumb209a111997-04-29 18:18:01 +00002882 PyObject *w, *x;
2883 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002884 PyErr_SetString(PyExc_TypeError,
2885 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002886 return NULL;
2887 }
2888 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2889 x = PyDict_GetItem(w, name);
2890 if (x == NULL) {
2891 PyErr_Format(PyExc_ImportError,
2892 "cannot import name %.230s",
2893 PyString_AsString(name));
2894 } else
2895 Py_INCREF(x);
2896 return x;
2897}
2898
2899static int
2900import_all_from(PyObject *locals, PyObject *v)
2901{
2902 int pos = 0, err;
2903 PyObject *name, *value;
2904 PyObject *w;
2905
2906 if (!PyModule_Check(v)) {
2907 PyErr_SetString(PyExc_TypeError,
2908 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002909 return -1;
2910 }
Thomas Wouters52152252000-08-17 22:55:00 +00002911 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2912
2913 while (PyDict_Next(w, &pos, &name, &value)) {
2914 if (!PyString_Check(name) ||
2915 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002916 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002917 Py_INCREF(value);
2918 err = PyDict_SetItem(locals, name, value);
2919 Py_DECREF(value);
2920 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002921 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002922 }
Thomas Wouters52152252000-08-17 22:55:00 +00002923 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002924}
2925
Guido van Rossumb209a111997-04-29 18:18:01 +00002926static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002927build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002928{
Guido van Rossumcd649651997-08-22 16:56:16 +00002929 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002930 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002931 PyErr_SetString(PyExc_SystemError,
2932 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002933 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002934 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002935 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002936 PyErr_SetString(PyExc_SystemError,
2937 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002938 return NULL;
2939 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002940 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002941 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002942 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002943 return NULL;
2944 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002945 n = PyTuple_Size(bases);
2946 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002947 PyObject *base = PyTuple_GET_ITEM(bases, i);
2948 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002949 /* Call the base's *type*, if it is callable.
2950 This code is a hook for Donald Beaudry's
2951 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002952 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002953 since its types are not callable.
2954 Ditto: call the bases's *class*, if it has
2955 one. This makes the same thing possible
2956 without writing C code. A true meta-object
2957 protocol! */
2958 PyObject *basetype = (PyObject *)base->ob_type;
2959 PyObject *callable = NULL;
2960 if (PyCallable_Check(basetype))
2961 callable = basetype;
2962 else
2963 callable = PyObject_GetAttrString(
2964 base, "__class__");
2965 if (callable) {
2966 PyObject *args;
2967 PyObject *newclass = NULL;
2968 args = Py_BuildValue(
2969 "(OOO)", name, bases, methods);
2970 if (args != NULL) {
2971 newclass = PyEval_CallObject(
2972 callable, args);
2973 Py_DECREF(args);
2974 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002975 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002976 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002977 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002978 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002979 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002980 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002981 "base is not a class object");
2982 return NULL;
2983 }
2984 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002985 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002986}
2987
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002988static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002989exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
2990 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002991{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002992 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002993 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002994 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002995
Guido van Rossumb209a111997-04-29 18:18:01 +00002996 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2997 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002998 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002999 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003000 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003001 locals = PyTuple_GetItem(prog, 2);
3002 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003003 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003004 if (globals == Py_None) {
3005 globals = PyEval_GetGlobals();
3006 if (locals == Py_None) {
3007 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003008 plain = 1;
3009 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003010 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003011 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003012 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003013 if (!PyString_Check(prog) &&
3014 !PyCode_Check(prog) &&
3015 !PyFile_Check(prog)) {
3016 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003017 "exec 1st arg must be string, code or file object");
3018 return -1;
3019 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003020 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
3021 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003022 "exec 2nd/3rd args must be dict or None");
3023 return -1;
3024 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003025 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003026 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003027 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003028 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003029 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003030 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003031 FILE *fp = PyFile_AsFile(prog);
3032 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003033 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3034 }
3035 else {
3036 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00003037 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003038 PyErr_SetString(PyExc_ValueError,
3039 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003040 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003041 }
3042 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003044 if (plain)
3045 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003047 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003048 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003049 return 0;
3050}
Guido van Rossum24c13741995-02-14 09:42:43 +00003051
Guido van Rossum1aa14831997-01-21 05:34:20 +00003052/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00003053static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003054find_from_args(PyFrameObject *f, int nexti)
Guido van Rossum24c13741995-02-14 09:42:43 +00003055{
3056 int opcode;
3057 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00003058 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00003059 unsigned char *next_instr;
3060
Guido van Rossumd076c731998-10-07 19:42:25 +00003061 _PyCode_GETCODEPTR(f->f_code, &next_instr);
3062 next_instr += nexti;
3063
Guido van Rossum24c13741995-02-14 09:42:43 +00003064 opcode = (*next_instr++);
Thomas Wouters52152252000-08-17 22:55:00 +00003065 if (opcode != IMPORT_FROM && opcode != IMPORT_STAR) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003066 Py_INCREF(Py_None);
3067 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00003068 }
3069
Guido van Rossumb209a111997-04-29 18:18:01 +00003070 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00003071 if (list == NULL)
3072 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00003073
3074 if (opcode == IMPORT_STAR) {
3075 name = PyString_FromString("*");
3076 if (!name)
Guido van Rossumb209a111997-04-29 18:18:01 +00003077 Py_DECREF(list);
Thomas Wouters52152252000-08-17 22:55:00 +00003078 else {
Fred Drake04e654a2000-08-18 19:53:25 +00003079 if (PyList_Append(list, name) < 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003080 Py_DECREF(list);
Fred Drake04e654a2000-08-18 19:53:25 +00003081 }
Thomas Wouters52152252000-08-17 22:55:00 +00003082 Py_DECREF(name);
Guido van Rossum24c13741995-02-14 09:42:43 +00003083 }
Thomas Wouters52152252000-08-17 22:55:00 +00003084 } else {
3085 do {
3086 oparg = (next_instr[1]<<8) + next_instr[0];
Thomas Wouters04005152000-08-20 14:01:53 +00003087 /* Jump over our own argument, the next instruction
3088 (which is a STORE), and its argument.*/
3089 next_instr += 5;
Thomas Wouters52152252000-08-17 22:55:00 +00003090 name = Getnamev(f, oparg);
3091 if (PyList_Append(list, name) < 0) {
3092 Py_DECREF(list);
3093 break;
3094 }
3095 opcode = (*next_instr++);
3096 } while (opcode == IMPORT_FROM);
3097 }
Guido van Rossum24c13741995-02-14 09:42:43 +00003098 return list;
3099}
Guido van Rossum950361c1997-01-24 13:49:28 +00003100
3101
3102#ifdef DYNAMIC_EXECUTION_PROFILE
3103
3104PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003105getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003106{
3107 int i;
3108 PyObject *l = PyList_New(256);
3109 if (l == NULL) return NULL;
3110 for (i = 0; i < 256; i++) {
3111 PyObject *x = PyInt_FromLong(a[i]);
3112 if (x == NULL) {
3113 Py_DECREF(l);
3114 return NULL;
3115 }
3116 PyList_SetItem(l, i, x);
3117 }
3118 for (i = 0; i < 256; i++)
3119 a[i] = 0;
3120 return l;
3121}
3122
3123PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003124_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003125{
3126#ifndef DXPAIRS
3127 return getarray(dxp);
3128#else
3129 int i;
3130 PyObject *l = PyList_New(257);
3131 if (l == NULL) return NULL;
3132 for (i = 0; i < 257; i++) {
3133 PyObject *x = getarray(dxpairs[i]);
3134 if (x == NULL) {
3135 Py_DECREF(l);
3136 return NULL;
3137 }
3138 PyList_SetItem(l, i, x);
3139 }
3140 return l;
3141#endif
3142}
3143
3144#endif