blob: 23c477b4875488893c787517091a247c9d4e41b9 [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();
Guido van Rossum950361c1997-01-24 13:49:28 +0000616#ifdef DYNAMIC_EXECUTION_PROFILE
617#ifdef DXPAIRS
618 dxpairs[lastopcode][opcode]++;
619 lastopcode = opcode;
620#endif
621 dxp[opcode]++;
622#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000623
Guido van Rossum96a42c81992-01-12 02:29:51 +0000624#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 /* Instruction tracing */
626
Guido van Rossum96a42c81992-01-12 02:29:51 +0000627 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000628 if (HAS_ARG(opcode)) {
629 printf("%d: %d, %d\n",
630 (int) (INSTR_OFFSET() - 3),
631 opcode, oparg);
632 }
633 else {
634 printf("%d: %d\n",
635 (int) (INSTR_OFFSET() - 1), opcode);
636 }
637 }
638#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000639 /* Main switch on opcode */
640
641 switch (opcode) {
642
643 /* BEWARE!
644 It is essential that any operation that fails sets either
645 x to NULL, err to nonzero, or why to anything but WHY_NOT,
646 and that no operation that succeeds does this! */
647
648 /* case STOP_CODE: this is an error! */
649
650 case POP_TOP:
651 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000652 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000653 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000654
655 case ROT_TWO:
656 v = POP();
657 w = POP();
658 PUSH(v);
659 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000660 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000661
662 case ROT_THREE:
663 v = POP();
664 w = POP();
665 x = POP();
666 PUSH(v);
667 PUSH(x);
668 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000669 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000670
671 case DUP_TOP:
672 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000673 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000674 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000675 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000676
677 case UNARY_POSITIVE:
678 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000679 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000680 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000682 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 break;
684
685 case UNARY_NEGATIVE:
686 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000687 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000688 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 break;
692
693 case UNARY_NOT:
694 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000695 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000696 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000697 if (err == 0) {
698 Py_INCREF(Py_True);
699 PUSH(Py_True);
700 continue;
701 }
702 else if (err > 0) {
703 Py_INCREF(Py_False);
704 PUSH(Py_False);
705 err = 0;
706 continue;
707 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 break;
709
710 case UNARY_CONVERT:
711 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000712 x = PyObject_Repr(v);
713 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000715 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000717
718 case UNARY_INVERT:
719 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000720 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000721 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000722 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000723 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000724 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000725
Guido van Rossum50564e81996-01-12 01:13:16 +0000726 case BINARY_POWER:
727 w = POP();
728 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000729 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000730 Py_DECREF(v);
731 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000732 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000734 break;
735
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 case BINARY_MULTIPLY:
737 w = POP();
738 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000739 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000740 Py_DECREF(v);
741 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000743 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 break;
745
746 case BINARY_DIVIDE:
747 w = POP();
748 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000749 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000750 Py_DECREF(v);
751 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000753 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 break;
755
756 case BINARY_MODULO:
757 w = POP();
758 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000759 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_DECREF(v);
761 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 break;
765
766 case BINARY_ADD:
767 w = POP();
768 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000769 if (PyInt_Check(v) && PyInt_Check(w)) {
770 /* INLINE: int + int */
771 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000772 a = PyInt_AS_LONG(v);
773 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000774 i = a + b;
775 if ((i^a) < 0 && (i^b) < 0) {
776 PyErr_SetString(PyExc_OverflowError,
777 "integer addition");
778 x = NULL;
779 }
780 else
781 x = PyInt_FromLong(i);
782 }
783 else
784 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000785 Py_DECREF(v);
786 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 break;
790
791 case BINARY_SUBTRACT:
792 w = POP();
793 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000794 if (PyInt_Check(v) && PyInt_Check(w)) {
795 /* INLINE: int - int */
796 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000797 a = PyInt_AS_LONG(v);
798 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000799 i = a - b;
800 if ((i^a) < 0 && (i^~b) < 0) {
801 PyErr_SetString(PyExc_OverflowError,
802 "integer subtraction");
803 x = NULL;
804 }
805 else
806 x = PyInt_FromLong(i);
807 }
808 else
809 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000810 Py_DECREF(v);
811 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000813 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 break;
815
816 case BINARY_SUBSCR:
817 w = POP();
818 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000819 if (PyList_Check(v) && PyInt_Check(w)) {
820 /* INLINE: list[int] */
821 long i = PyInt_AsLong(w);
822 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000823 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000824 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000825 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000826 PyErr_SetString(PyExc_IndexError,
827 "list index out of range");
828 x = NULL;
829 }
830 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000831 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000832 Py_INCREF(x);
833 }
834 }
835 else
836 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
838 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
842
Guido van Rossum7928cd71991-10-24 14:59:31 +0000843 case BINARY_LSHIFT:
844 w = POP();
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
848 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000851 break;
852
853 case BINARY_RSHIFT:
854 w = POP();
855 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
858 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000859 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000860 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000861 break;
862
863 case BINARY_AND:
864 w = POP();
865 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000866 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(v);
868 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000870 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000871 break;
872
873 case BINARY_XOR:
874 w = POP();
875 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000876 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000877 Py_DECREF(v);
878 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 break;
882
883 case BINARY_OR:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000891 break;
892
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 case SLICE+0:
894 case SLICE+1:
895 case SLICE+2:
896 case SLICE+3:
897 if ((opcode-SLICE) & 2)
898 w = POP();
899 else
900 w = NULL;
901 if ((opcode-SLICE) & 1)
902 v = POP();
903 else
904 v = NULL;
905 u = POP();
906 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(u);
908 Py_XDECREF(v);
909 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 break;
913
914 case STORE_SLICE+0:
915 case STORE_SLICE+1:
916 case STORE_SLICE+2:
917 case STORE_SLICE+3:
918 if ((opcode-STORE_SLICE) & 2)
919 w = POP();
920 else
921 w = NULL;
922 if ((opcode-STORE_SLICE) & 1)
923 v = POP();
924 else
925 v = NULL;
926 u = POP();
927 t = POP();
928 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 Py_DECREF(t);
930 Py_DECREF(u);
931 Py_XDECREF(v);
932 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000933 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 break;
935
936 case DELETE_SLICE+0:
937 case DELETE_SLICE+1:
938 case DELETE_SLICE+2:
939 case DELETE_SLICE+3:
940 if ((opcode-DELETE_SLICE) & 2)
941 w = POP();
942 else
943 w = NULL;
944 if ((opcode-DELETE_SLICE) & 1)
945 v = POP();
946 else
947 v = NULL;
948 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000951 Py_DECREF(u);
952 Py_XDECREF(v);
953 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000954 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 break;
956
957 case STORE_SUBSCR:
958 w = POP();
959 v = POP();
960 u = POP();
961 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000962 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 Py_DECREF(u);
964 Py_DECREF(v);
965 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000966 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 break;
968
969 case DELETE_SUBSCR:
970 w = POP();
971 v = POP();
972 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000973 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000974 Py_DECREF(v);
975 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000976 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000978
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 case PRINT_EXPR:
980 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000981 /* Print value except if None */
982 /* After printing, also assign to '_' */
983 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +0000984 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000985 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000986 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000987 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +0000988 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000989 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +0000990 if (x == NULL) {
991 PyErr_SetString(
992 PyExc_RuntimeError,
993 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +0000994 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +0000995 }
Guido van Rossumbe270261997-05-22 22:26:18 +0000996 }
997 if (err == 0)
998 err = PyFile_WriteObject(v, x, 0);
999 if (err == 0) {
1000 PyFile_SoftSpace(x, 1);
1001 err = Py_FlushLine();
1002 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001003 if (err == 0) {
1004 err = PyDict_SetItemString(
1005 f->f_builtins, "_", v);
1006 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001008 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001009 break;
1010
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001011 case PRINT_ITEM_TO:
1012 w = stream = POP();
1013 /* fall through to PRINT_ITEM */
1014
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 case PRINT_ITEM:
1016 v = POP();
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001017 if (stream == NULL) {
1018 w = PySys_GetObject("stdout");
1019 if (w == NULL) {
1020 PyErr_SetString(PyExc_RuntimeError,
1021 "lost sys.stdout");
1022 err = -1;
1023 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001024 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001025 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001026 err = PyFile_WriteString(" ", w);
1027 if (err == 0)
1028 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001030 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001031 char *s = PyString_AsString(v);
1032 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001033 if (len > 0 &&
1034 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001035 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001036 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001038 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001039 Py_XDECREF(stream);
1040 stream = NULL;
1041 if (err == 0)
1042 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 break;
1044
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001045 case PRINT_NEWLINE_TO:
1046 w = stream = POP();
1047 /* fall through to PRINT_NEWLINE */
1048
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 case PRINT_NEWLINE:
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001050 if (stream == NULL) {
1051 w = PySys_GetObject("stdout");
1052 if (w == NULL)
1053 PyErr_SetString(PyExc_RuntimeError,
1054 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001055 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001056 if (w != NULL) {
1057 err = PyFile_WriteString("\n", w);
1058 if (err == 0)
1059 PyFile_SoftSpace(w, 0);
1060 }
1061 Py_XDECREF(stream);
1062 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
1064
1065 case BREAK_LOOP:
1066 why = WHY_BREAK;
1067 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068
Guido van Rossumf10570b1995-07-07 22:53:21 +00001069 case RAISE_VARARGS:
1070 u = v = w = NULL;
1071 switch (oparg) {
1072 case 3:
1073 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001074 /* Fallthrough */
1075 case 2:
1076 v = POP(); /* value */
1077 /* Fallthrough */
1078 case 1:
1079 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001080 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001081 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 break;
1083 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001084 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001085 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001086 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001087 break;
1088 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001089 break;
1090
1091 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001092 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001093 PyErr_SetString(PyExc_SystemError,
1094 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001095 break;
1096 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001097 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001098 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 break;
1100
1101 case RETURN_VALUE:
1102 retval = POP();
1103 why = WHY_RETURN;
1104 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001105
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001106 case EXEC_STMT:
1107 w = POP();
1108 v = POP();
1109 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001110 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001111 Py_DECREF(u);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001114 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001115
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 case POP_BLOCK:
1117 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001118 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 while (STACK_LEVEL() > b->b_level) {
1120 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001121 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 }
1123 }
1124 break;
1125
1126 case END_FINALLY:
1127 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 if (PyInt_Check(v)) {
1129 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 if (why == WHY_RETURN)
1131 retval = POP();
1132 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001135 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001136 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001138 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001140 else if (v != Py_None) {
1141 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 "'finally' pops bad exception");
1143 why = WHY_EXCEPTION;
1144 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001145 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 break;
1147
1148 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001149 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001151 w = POP();
1152 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001154 Py_DECREF(u);
1155 Py_DECREF(v);
1156 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 break;
1158
1159 case STORE_NAME:
1160 w = GETNAMEV(oparg);
1161 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001162 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001163 PyErr_SetString(PyExc_SystemError,
1164 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001165 break;
1166 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001167 err = PyDict_SetItem(x, w, v);
1168 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 break;
1170
1171 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001172 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001173 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001174 PyErr_SetString(PyExc_SystemError,
1175 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001176 break;
1177 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001178 if ((err = PyDict_DelItem(x, w)) != 0)
1179 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001181
1182#ifdef CASE_TOO_BIG
1183 default: switch (opcode) {
1184#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001185
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001186 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001188 if (PyTuple_Check(v)) {
1189 if (PyTuple_Size(v) != oparg) {
1190 PyErr_SetString(PyExc_ValueError,
1191 "unpack tuple of wrong size");
1192 why = WHY_EXCEPTION;
1193 }
1194 else {
1195 for (; --oparg >= 0; ) {
1196 w = PyTuple_GET_ITEM(v, oparg);
1197 Py_INCREF(w);
1198 PUSH(w);
1199 }
1200 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001202 else if (PyList_Check(v)) {
1203 if (PyList_Size(v) != oparg) {
1204 PyErr_SetString(PyExc_ValueError,
1205 "unpack list of wrong size");
1206 why = WHY_EXCEPTION;
1207 }
1208 else {
1209 for (; --oparg >= 0; ) {
1210 w = PyList_GET_ITEM(v, oparg);
1211 Py_INCREF(w);
1212 PUSH(w);
1213 }
1214 }
1215 }
1216 else if (PySequence_Check(v)) {
1217 if (unpack_sequence(v, oparg,
1218 stack_pointer + oparg))
1219 stack_pointer += oparg;
1220 else
1221 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 }
1223 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001224 PyErr_SetString(PyExc_TypeError,
1225 "unpack non-sequence");
1226 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001228 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 break;
1230
1231 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001232 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 v = POP();
1234 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001235 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1236 Py_DECREF(v);
1237 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 break;
1239
1240 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001241 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001243 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1244 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001245 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 break;
1247
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001248 case STORE_GLOBAL:
1249 w = GETNAMEV(oparg);
1250 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 err = PyDict_SetItem(f->f_globals, w, v);
1252 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001253 break;
1254
1255 case DELETE_GLOBAL:
1256 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001257 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1258 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001259 break;
1260
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 case LOAD_CONST:
1262 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 PUSH(x);
1265 break;
1266
1267 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001268 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001269 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001270 PyErr_SetString(PyExc_SystemError,
1271 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001272 break;
1273 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001280 PyErr_SetObject(
1281 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 break;
1283 }
1284 }
1285 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001286 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 PUSH(x);
1288 break;
1289
1290 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001291 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 break;
1298 }
1299 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001300 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 PUSH(x);
1302 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303
Guido van Rossum9bfef441993-03-29 10:43:31 +00001304 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001305 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001306 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001307 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001308 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001309 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001310 break;
1311 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001313 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001314 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001315 break;
1316
1317 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001318 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001320 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001321
1322 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001323 x = GETLOCAL(oparg);
1324 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001325 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001326 PyTuple_GetItem(co->co_varnames,
1327 oparg));
1328 break;
1329 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001330 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001331 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332
1333 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 if (x != NULL) {
1336 for (; --oparg >= 0;) {
1337 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001338 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 }
1340 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001341 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 }
1343 break;
1344
1345 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 if (x != NULL) {
1348 for (; --oparg >= 0;) {
1349 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001350 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 }
1352 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001353 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 }
1355 break;
1356
1357 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001358 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001360 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 break;
1362
1363 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001364 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001366 x = PyObject_GetAttr(v, w);
1367 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 break;
1371
1372 case COMPARE_OP:
1373 w = POP();
1374 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001375 if (PyInt_Check(v) && PyInt_Check(w)) {
1376 /* INLINE: cmp(int, int) */
1377 register long a, b;
1378 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001379 a = PyInt_AS_LONG(v);
1380 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001381 switch (oparg) {
1382 case LT: res = a < b; break;
1383 case LE: res = a <= b; break;
1384 case EQ: res = a == b; break;
1385 case NE: res = a != b; break;
1386 case GT: res = a > b; break;
1387 case GE: res = a >= b; break;
1388 case IS: res = v == w; break;
1389 case IS_NOT: res = v != w; break;
1390 default: goto slow_compare;
1391 }
1392 x = res ? Py_True : Py_False;
1393 Py_INCREF(x);
1394 }
1395 else {
1396 slow_compare:
1397 x = cmp_outcome(oparg, v, w);
1398 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 Py_DECREF(v);
1400 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001402 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 break;
1404
1405 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001407 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001410 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001411 break;
1412 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001413 u = find_from_args(f, INSTR_OFFSET());
1414 if (u == NULL) {
1415 x = u;
1416 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001419 w,
1420 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001421 f->f_locals == NULL ?
1422 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001423 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001424 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001425 if (w == NULL) {
1426 x = NULL;
1427 break;
1428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001429 x = PyEval_CallObject(x, w);
1430 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001431 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001432 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 break;
1434
Thomas Wouters52152252000-08-17 22:55:00 +00001435 case IMPORT_STAR:
1436 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001438 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001439 PyErr_SetString(PyExc_SystemError,
1440 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 break;
1442 }
Thomas Wouters52152252000-08-17 22:55:00 +00001443 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001445 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001446 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001448
Thomas Wouters52152252000-08-17 22:55:00 +00001449 case IMPORT_FROM:
1450 w = GETNAMEV(oparg);
1451 v = TOP();
1452 x = import_from(v, w);
1453 PUSH(x);
1454 if (x != NULL) continue;
1455 break;
1456
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 case JUMP_FORWARD:
1458 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001459 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460
1461 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001463 if (err > 0)
1464 err = 0;
1465 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001466 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001467 else
1468 break;
1469 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001470
1471 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001472 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001473 if (err > 0) {
1474 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001476 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001477 else if (err == 0)
1478 ;
1479 else
1480 break;
1481 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001482
1483 case JUMP_ABSOLUTE:
1484 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001485 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001486
1487 case FOR_LOOP:
1488 /* for v in s: ...
1489 On entry: stack contains s, i.
1490 On exit: stack contains s, i+1, s[i];
1491 but if loop exhausted:
1492 s, i are popped, and we jump */
1493 w = POP(); /* Loop index */
1494 v = POP(); /* Sequence object */
1495 u = loop_subscript(v, w);
1496 if (u != NULL) {
1497 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001500 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001502 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 }
1504 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 Py_DECREF(v);
1506 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 /* A NULL can mean "s exhausted"
1508 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001511 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001513 continue;
1514 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 }
1516 break;
1517
1518 case SETUP_LOOP:
1519 case SETUP_EXCEPT:
1520 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001521 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001523 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001524
1525 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001526#ifdef LLTRACE
1527 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001528 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001529#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001530 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001531 if (f->f_trace == NULL)
1532 continue;
1533 /* Trace each line of code reached */
1534 f->f_lasti = INSTR_OFFSET();
1535 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001538
1539 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001540 case CALL_FUNCTION_VAR:
1541 case CALL_FUNCTION_KW:
1542 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001543 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001544 int na = oparg & 0xff;
1545 int nk = (oparg>>8) & 0xff;
1546 int flags = (opcode - CALL_FUNCTION) & 3;
1547 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1548 PyObject **pfunc = stack_pointer - n - 1;
1549 PyObject *func = *pfunc;
1550 PyObject *self = NULL;
1551 PyObject *class = NULL;
1552 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1553 if (PyMethod_Check(func)) {
1554 self = PyMethod_Self(func);
1555 class = PyMethod_Class(func);
1556 func = PyMethod_Function(func);
1557 Py_INCREF(func);
1558 if (self != NULL) {
1559 Py_INCREF(self);
1560 Py_DECREF(*pfunc);
1561 *pfunc = self;
1562 na++;
1563 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001564 }
1565 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001566 /* Unbound methods must be called with an
1567 instance of the class (or a derived
1568 class) as first argument */
1569 if (na > 0 && (self = stack_pointer[-n]) != NULL
1570 && PyInstance_Check(self)
1571 && PyClass_IsSubclass((PyObject *)
1572 (((PyInstanceObject *)self)->in_class),
1573 class))
1574 /* Handy-dandy */ ;
1575 else {
1576 PyErr_SetString(PyExc_TypeError,
1577 "unbound method must be called with class instance 1st argument");
1578 x = NULL;
1579 break;
1580 }
1581 }
1582 }
1583 else
1584 Py_INCREF(func);
1585 if (PyFunction_Check(func) && flags == 0) {
1586 PyObject *co = PyFunction_GetCode(func);
1587 PyObject *globals = PyFunction_GetGlobals(func);
1588 PyObject *argdefs = PyFunction_GetDefaults(func);
1589 PyObject **d;
1590 int nd;
1591 if (argdefs != NULL) {
1592 d = &PyTuple_GET_ITEM(argdefs, 0);
1593 nd = ((PyTupleObject *)argdefs)->ob_size;
1594 }
1595 else {
1596 d = NULL;
1597 nd = 0;
1598 }
1599 x = eval_code2((PyCodeObject *)co, globals,
1600 (PyObject *)NULL, stack_pointer-n, na,
1601 stack_pointer-2*nk, nk, d, nd,
1602 class);
1603 }
1604 else {
1605 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001606 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001607 PyObject *stararg = 0;
1608 PyObject *kwdict = NULL;
1609 if (flags & 2) {
1610 kwdict = POP();
1611 if (!PyDict_Check(kwdict)) {
1612 PyErr_SetString(PyExc_TypeError,
1613 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001614 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001615 }
1616 }
1617 if (flags & 1) {
1618 stararg = POP();
1619 if (!PySequence_Check(stararg)) {
1620 PyErr_SetString(PyExc_TypeError,
1621 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001622 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001623 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001624 /* Convert abstract sequence to concrete tuple */
1625 if (!PyTuple_Check(stararg)) {
1626 PyObject *t = NULL;
1627 t = PySequence_Tuple(stararg);
1628 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001629 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001630 }
1631 Py_DECREF(stararg);
1632 stararg = t;
1633 }
1634 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001635 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001636 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001637 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001638 }
1639 if (nk > 0) {
1640 if (kwdict == NULL) {
1641 kwdict = PyDict_New();
1642 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001643 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001644 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001645 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001646 else {
1647 PyObject *d = PyDict_Copy(kwdict);
1648 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001649 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001650 }
1651 Py_DECREF(kwdict);
1652 kwdict = d;
1653 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001654 err = 0;
1655 while (--nk >= 0) {
1656 PyObject *value = POP();
1657 PyObject *key = POP();
1658 if (PyDict_GetItem(kwdict, key) != NULL) {
1659 err = 1;
1660 PyErr_Format(PyExc_TypeError,
1661 "keyword parameter redefined: %.400s",
1662 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001663 Py_DECREF(key);
1664 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001665 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001667 err = PyDict_SetItem(kwdict, key, value);
1668 Py_DECREF(key);
1669 Py_DECREF(value);
1670 if (err)
1671 break;
1672 }
1673 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001674 extcall_fail:
1675 Py_XDECREF(kwdict);
1676 Py_XDECREF(stararg);
1677 Py_DECREF(func);
1678 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001679 break;
1680 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001681 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001682 callargs = PyTuple_New(na + nstar);
1683 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001684 x = NULL;
1685 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001686 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001687 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001688 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001689 for (i = 0; i < nstar; i++) {
1690 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1691 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001692 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001693 }
1694 Py_DECREF(stararg);
1695 }
1696 while (--na >= 0) {
1697 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001698 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001699 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001700 x = PyEval_CallObjectWithKeywords(func,
1701 callargs,
1702 kwdict);
1703 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001704 Py_XDECREF(kwdict);
1705 }
1706 Py_DECREF(func);
1707 while (stack_pointer > pfunc) {
1708 w = POP();
1709 Py_DECREF(w);
1710 }
1711 PUSH(x);
1712 if (x != NULL) continue;
1713 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001714 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001715
Guido van Rossum681d79a1995-07-18 14:51:37 +00001716 case MAKE_FUNCTION:
1717 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 x = PyFunction_New(v, f->f_globals);
1719 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001720 /* XXX Maybe this should be a separate opcode? */
1721 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001723 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001724 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001725 x = NULL;
1726 break;
1727 }
1728 while (--oparg >= 0) {
1729 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001731 }
1732 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001734 }
1735 PUSH(x);
1736 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001737
1738 case BUILD_SLICE:
1739 if (oparg == 3)
1740 w = POP();
1741 else
1742 w = NULL;
1743 v = POP();
1744 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001745 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 Py_DECREF(u);
1747 Py_DECREF(v);
1748 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001749 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001750 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001751 break;
1752
1753
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 default:
1755 fprintf(stderr,
1756 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001757 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 why = WHY_EXCEPTION;
1760 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001761
1762#ifdef CASE_TOO_BIG
1763 }
1764#endif
1765
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 } /* switch */
1767
1768 on_error:
1769
1770 /* Quickly continue if no error occurred */
1771
1772 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001773 if (err == 0 && x != NULL) {
1774#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001775 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001776 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001777 fprintf(stderr,
1778 "XXX undetected error\n");
1779 else
1780#endif
1781 continue; /* Normal, fast path */
1782 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 err = 0;
1786 }
1787
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 /* Double-check exception status */
1789
1790 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001791 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001792 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001793 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 why = WHY_EXCEPTION;
1795 }
1796 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001797#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001799 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001801 fprintf(stderr,
1802 "XXX undetected error (why=%d)\n",
1803 why);
1804 why = WHY_EXCEPTION;
1805 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 }
1807#endif
1808
1809 /* Log traceback info if this is a real exception */
1810
1811 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001812 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001814 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001815 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001816
Guido van Rossume59214e1994-08-30 08:01:59 +00001817 if (f->f_trace)
1818 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001819 if (tstate->sys_profilefunc)
1820 call_exc_trace(&tstate->sys_profilefunc,
1821 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001822 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001823
1824 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1825
1826 if (why == WHY_RERAISE)
1827 why = WHY_EXCEPTION;
1828
1829 /* Unwind stacks if a (pseudo) exception occurred */
1830
1831 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001832 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 while (STACK_LEVEL() > b->b_level) {
1834 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001835 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001836 }
1837 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1838 why = WHY_NOT;
1839 JUMPTO(b->b_handler);
1840 break;
1841 }
1842 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001843 (b->b_type == SETUP_EXCEPT &&
1844 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001845 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 PyObject *exc, *val, *tb;
1847 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 val = Py_None;
1850 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 /* Make the raw exception data
1853 available to the handler,
1854 so a program can emulate the
1855 Python main loop. Don't do
1856 this for 'finally'. */
1857 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001858 PyErr_NormalizeException(
1859 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001860 set_exc_info(tstate,
1861 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001863 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 PUSH(val);
1865 PUSH(exc);
1866 }
1867 else {
1868 if (why == WHY_RETURN)
1869 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001870 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 PUSH(v);
1872 }
1873 why = WHY_NOT;
1874 JUMPTO(b->b_handler);
1875 break;
1876 }
1877 } /* unwind stack */
1878
1879 /* End the loop if we still have an error (or return) */
1880
1881 if (why != WHY_NOT)
1882 break;
1883
1884 } /* main loop */
1885
1886 /* Pop remaining stack entries */
1887
1888 while (!EMPTY()) {
1889 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001890 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001891 }
1892
Guido van Rossum96a42c81992-01-12 02:29:51 +00001893 if (why != WHY_RETURN)
1894 retval = NULL;
1895
Guido van Rossume59214e1994-08-30 08:01:59 +00001896 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001897 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001898 if (call_trace(&f->f_trace, &f->f_trace, f,
1899 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001900 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001901 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001902 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001903 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001904 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001905 }
1906
Guido van Rossuma027efa1997-05-05 20:56:21 +00001907 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1908 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001909 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001910 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001911 retval = NULL;
1912 why = WHY_EXCEPTION;
1913 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001914 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001915
Guido van Rossuma027efa1997-05-05 20:56:21 +00001916 reset_exc_info(tstate);
1917
1918 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001919
1920 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001921
Guido van Rossum374a9221991-04-04 10:40:29 +00001922 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001923
Guido van Rossuma027efa1997-05-05 20:56:21 +00001924 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001926
Guido van Rossum96a42c81992-01-12 02:29:51 +00001927 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001928}
1929
Guido van Rossuma027efa1997-05-05 20:56:21 +00001930static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931set_exc_info(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001932{
1933 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001934 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001935
Guido van Rossuma027efa1997-05-05 20:56:21 +00001936 frame = tstate->frame;
1937 if (frame->f_exc_type == NULL) {
1938 /* This frame didn't catch an exception before */
1939 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001940 if (tstate->exc_type == NULL) {
1941 Py_INCREF(Py_None);
1942 tstate->exc_type = Py_None;
1943 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001944 tmp_type = frame->f_exc_type;
1945 tmp_value = frame->f_exc_value;
1946 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001947 Py_XINCREF(tstate->exc_type);
1948 Py_XINCREF(tstate->exc_value);
1949 Py_XINCREF(tstate->exc_traceback);
1950 frame->f_exc_type = tstate->exc_type;
1951 frame->f_exc_value = tstate->exc_value;
1952 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001953 Py_XDECREF(tmp_type);
1954 Py_XDECREF(tmp_value);
1955 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001956 }
1957 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001958 tmp_type = tstate->exc_type;
1959 tmp_value = tstate->exc_value;
1960 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001961 Py_XINCREF(type);
1962 Py_XINCREF(value);
1963 Py_XINCREF(tb);
1964 tstate->exc_type = type;
1965 tstate->exc_value = value;
1966 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001967 Py_XDECREF(tmp_type);
1968 Py_XDECREF(tmp_value);
1969 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001970 /* For b/w compatibility */
1971 PySys_SetObject("exc_type", type);
1972 PySys_SetObject("exc_value", value);
1973 PySys_SetObject("exc_traceback", tb);
1974}
1975
1976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001977reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001978{
1979 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001980 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001981 frame = tstate->frame;
1982 if (frame->f_exc_type != NULL) {
1983 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001984 tmp_type = tstate->exc_type;
1985 tmp_value = tstate->exc_value;
1986 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001987 Py_XINCREF(frame->f_exc_type);
1988 Py_XINCREF(frame->f_exc_value);
1989 Py_XINCREF(frame->f_exc_traceback);
1990 tstate->exc_type = frame->f_exc_type;
1991 tstate->exc_value = frame->f_exc_value;
1992 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001993 Py_XDECREF(tmp_type);
1994 Py_XDECREF(tmp_value);
1995 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001996 /* For b/w compatibility */
1997 PySys_SetObject("exc_type", frame->f_exc_type);
1998 PySys_SetObject("exc_value", frame->f_exc_value);
1999 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2000 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002001 tmp_type = frame->f_exc_type;
2002 tmp_value = frame->f_exc_value;
2003 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002004 frame->f_exc_type = NULL;
2005 frame->f_exc_value = NULL;
2006 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002007 Py_XDECREF(tmp_type);
2008 Py_XDECREF(tmp_value);
2009 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002010}
2011
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002012/* Logic for the raise statement (too complicated for inlining).
2013 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002014static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002015do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002016{
Guido van Rossumd295f121998-04-09 21:39:57 +00002017 if (type == NULL) {
2018 /* Reraise */
2019 PyThreadState *tstate = PyThreadState_Get();
2020 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2021 value = tstate->exc_value;
2022 tb = tstate->exc_traceback;
2023 Py_XINCREF(type);
2024 Py_XINCREF(value);
2025 Py_XINCREF(tb);
2026 }
2027
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002028 /* We support the following forms of raise:
2029 raise <class>, <classinstance>
2030 raise <class>, <argument tuple>
2031 raise <class>, None
2032 raise <class>, <argument>
2033 raise <classinstance>, None
2034 raise <string>, <object>
2035 raise <string>, None
2036
2037 An omitted second argument is the same as None.
2038
2039 In addition, raise <tuple>, <anything> is the same as
2040 raising the tuple's first item (and it better have one!);
2041 this rule is applied recursively.
2042
2043 Finally, an optional third argument can be supplied, which
2044 gives the traceback to be substituted (useful when
2045 re-raising an exception after examining it). */
2046
2047 /* First, check the traceback argument, replacing None with
2048 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 if (tb == Py_None) {
2050 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002051 tb = NULL;
2052 }
2053 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002055 "raise 3rd arg must be traceback or None");
2056 goto raise_error;
2057 }
2058
2059 /* Next, replace a missing value with None */
2060 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 value = Py_None;
2062 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002063 }
2064
2065 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2067 PyObject *tmp = type;
2068 type = PyTuple_GET_ITEM(type, 0);
2069 Py_INCREF(type);
2070 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002071 }
2072
Barry Warsaw4249f541997-08-22 21:26:19 +00002073 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002074 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002075
2076 else if (PyClass_Check(type))
2077 PyErr_NormalizeException(&type, &value, &tb);
2078
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002080 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 if (value != Py_None) {
2082 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002083 "instance exception may not have a separate value");
2084 goto raise_error;
2085 }
2086 else {
2087 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002088 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002089 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2091 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002092 }
2093 }
2094 else {
2095 /* Not something you can raise. You get an exception
2096 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002098 "exceptions must be strings, classes, or instances");
2099 goto raise_error;
2100 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002101 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002102 if (tb == NULL)
2103 return WHY_EXCEPTION;
2104 else
2105 return WHY_RERAISE;
2106 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 Py_XDECREF(value);
2108 Py_XDECREF(type);
2109 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002110 return WHY_EXCEPTION;
2111}
2112
Barry Warsawe42b18f1997-08-25 22:13:04 +00002113static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002115{
2116 int i;
2117 PyObject *w;
2118
2119 for (i = 0; i < argcnt; i++) {
2120 if (! (w = PySequence_GetItem(v, i))) {
2121 if (PyErr_ExceptionMatches(PyExc_IndexError))
2122 PyErr_SetString(PyExc_ValueError,
2123 "unpack sequence of wrong size");
2124 goto finally;
2125 }
2126 *--sp = w;
2127 }
2128 /* we better get an IndexError now */
2129 if (PySequence_GetItem(v, i) == NULL) {
2130 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2131 PyErr_Clear();
2132 return 1;
2133 }
2134 /* some other exception occurred. fall through to finally */
2135 }
2136 else
2137 PyErr_SetString(PyExc_ValueError,
2138 "unpack sequence of wrong size");
2139 /* fall through */
2140finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002141 for (; i > 0; i--, sp++)
2142 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002143
2144 return 0;
2145}
2146
2147
Guido van Rossum96a42c81992-01-12 02:29:51 +00002148#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002149static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002150prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002152 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 if (PyObject_Print(v, stdout, 0) != 0)
2154 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002155 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002156 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002158#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002161call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002162{
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002164 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002166 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 value = Py_None;
2168 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002169 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002171 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002173 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002174 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002175 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002177 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002179 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 Py_XDECREF(type);
2181 Py_XDECREF(value);
2182 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002183 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002184}
2185
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002186/* PyObject **p_trace: in/out; may not be NULL;
2187 may not point to NULL variable initially
2188 PyObject **p_newtrace: in/out; may be NULL;
2189 may point to NULL variable;
2190 may be same variable as p_newtrace */
2191
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002193call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2194 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002195{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002196 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 PyObject *args, *what;
2198 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002199
Guido van Rossuma027efa1997-05-05 20:56:21 +00002200 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002201 /* Don't do recursive traces */
2202 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002204 *p_newtrace = NULL;
2205 }
2206 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002207 }
2208
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002210 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002211 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002213 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002214 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 Py_INCREF(f);
2216 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2217 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002218 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 arg = Py_None;
2220 Py_INCREF(arg);
2221 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002222 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002223 PyFrame_FastToLocals(f);
2224 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2225 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002226 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002227 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002229 if (res == NULL) {
2230 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002231 PyTraceBack_Here(f);
2232 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002233 *p_trace = NULL;
2234 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002235 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002236 *p_newtrace = NULL;
2237 }
Barry Warsawf6202631999-09-08 16:26:33 +00002238 /* to be extra double plus sure we don't get recursive
2239 * calls inf either tracefunc or profilefunc gets an
2240 * exception, zap the global variables.
2241 */
2242 Py_XDECREF(tstate->sys_tracefunc);
2243 tstate->sys_tracefunc = NULL;
2244 Py_XDECREF(tstate->sys_profilefunc);
2245 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002246 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002247 }
2248 else {
2249 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 Py_XDECREF(*p_newtrace);
2251 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002252 *p_newtrace = NULL;
2253 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002255 *p_newtrace = res;
2256 }
2257 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002259 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002260 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002261}
2262
Guido van Rossumb209a111997-04-29 18:18:01 +00002263PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002264PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002265{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002266 PyThreadState *tstate = PyThreadState_Get();
2267 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002268 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002269 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002270 else
2271 return current_frame->f_builtins;
2272}
2273
Guido van Rossumb209a111997-04-29 18:18:01 +00002274PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002275PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002276{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002277 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002278 if (current_frame == NULL)
2279 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002280 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002281 return current_frame->f_locals;
2282}
2283
Guido van Rossumb209a111997-04-29 18:18:01 +00002284PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002285PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002287 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002288 if (current_frame == NULL)
2289 return NULL;
2290 else
2291 return current_frame->f_globals;
2292}
2293
Guido van Rossumb209a111997-04-29 18:18:01 +00002294PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002295PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002296{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002297 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002298 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002299}
2300
Guido van Rossum6135a871995-01-09 17:53:26 +00002301int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002302PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002303{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002304 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002305 return current_frame == NULL ? 0 : current_frame->f_restricted;
2306}
2307
Guido van Rossumbe270261997-05-22 22:26:18 +00002308int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002309Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310{
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002312 if (f == NULL)
2313 return 0;
2314 if (!PyFile_SoftSpace(f, 0))
2315 return 0;
2316 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317}
2318
Guido van Rossum3f5da241990-12-20 15:06:42 +00002319
Guido van Rossum681d79a1995-07-18 14:51:37 +00002320/* External interface to call any callable object.
2321 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002322
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002323#undef PyEval_CallObject
2324/* for backward compatibility: export this interface */
2325
Guido van Rossumb209a111997-04-29 18:18:01 +00002326PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002327PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002328{
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002330}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002331#define PyEval_CallObject(func,arg) \
2332 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002333
Guido van Rossumb209a111997-04-29 18:18:01 +00002334PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002335PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336{
2337 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002339
2340 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 arg = PyTuple_New(0);
2342 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002343 PyErr_SetString(PyExc_TypeError,
2344 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002345 return NULL;
2346 }
2347 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002349
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002351 PyErr_SetString(PyExc_TypeError,
2352 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002353 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002354 return NULL;
2355 }
2356
Guido van Rossum150b2df1996-12-05 23:17:11 +00002357 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002358 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360 result = call_function(func, arg, kw);
2361 else
2362 result = call_builtin(func, arg, kw);
2363
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002365
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 if (result == NULL && !PyErr_Occurred())
2367 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002368 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002369
2370 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002371}
2372
Guido van Rossumb209a111997-04-29 18:18:01 +00002373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002374call_builtin(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375{
Guido van Rossumb209a111997-04-29 18:18:01 +00002376 if (PyCFunction_Check(func)) {
2377 PyCFunction meth = PyCFunction_GetFunction(func);
2378 PyObject *self = PyCFunction_GetSelf(func);
2379 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002380 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002382 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002384 else if (size == 0)
2385 arg = NULL;
2386 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002387 if (flags & METH_KEYWORDS)
2388 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 if (kw != NULL && PyDict_Size(kw) != 0) {
2390 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002391 "this function takes no keyword arguments");
2392 return NULL;
2393 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 if (PyClass_Check(func)) {
2397 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002399 if (PyInstance_Check(func)) {
2400 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002401 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 PyErr_Clear();
2403 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002404 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002405 return NULL;
2406 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002407 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002409 return res;
2410 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002411 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002412 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 return NULL;
2414}
2415
Guido van Rossumb209a111997-04-29 18:18:01 +00002416static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002417call_function(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418{
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 PyObject *class = NULL; /* == owner */
2420 PyObject *argdefs;
2421 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002422 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002423 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 if (kw != NULL && !PyDict_Check(kw)) {
2426 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002427 return NULL;
2428 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429
Guido van Rossumb209a111997-04-29 18:18:01 +00002430 if (PyMethod_Check(func)) {
2431 PyObject *self = PyMethod_Self(func);
2432 class = PyMethod_Class(func);
2433 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002434 if (self == NULL) {
2435 /* Unbound methods must be called with an instance of
2436 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002437 if (PyTuple_Size(arg) >= 1) {
2438 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002439 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 PyInstance_Check(self) &&
2441 PyClass_IsSubclass((PyObject *)
2442 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002443 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002445 else
2446 self = NULL;
2447 }
2448 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002449 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002451 return NULL;
2452 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002454 }
2455 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 int argcount = PyTuple_Size(arg);
2457 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002458 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002459 if (newarg == NULL)
2460 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 Py_INCREF(self);
2462 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002463 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyObject *v = PyTuple_GET_ITEM(arg, i);
2465 Py_XINCREF(v);
2466 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002467 }
2468 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002470 if (!PyFunction_Check(func)) {
2471 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2472 Py_DECREF(arg);
2473 return result;
2474 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 }
2476 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002478 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002479 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002480 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 return NULL;
2482 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002485
2486 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2488 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2489 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002490 }
2491 else {
2492 d = NULL;
2493 nd = 0;
2494 }
2495
2496 if (kw != NULL) {
2497 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 nk = PyDict_Size(kw);
2499 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002500 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 PyErr_NoMemory();
2502 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002503 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002504 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002505 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002506 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002507 i += 2;
2508 nk = i/2;
2509 /* XXX This is broken if the caller deletes dict items! */
2510 }
2511 else {
2512 k = NULL;
2513 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002514 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515
Guido van Rossum681d79a1995-07-18 14:51:37 +00002516 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002517 (PyCodeObject *)PyFunction_GetCode(func),
2518 PyFunction_GetGlobals(func), (PyObject *)NULL,
2519 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002520 k, nk,
2521 d, nd,
2522 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523
Guido van Rossumb209a111997-04-29 18:18:01 +00002524 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002525 if (k != NULL)
2526 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527
Guido van Rossum681d79a1995-07-18 14:51:37 +00002528 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529}
2530
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002531#define SLICE_ERROR_MSG \
2532 "standard sequence type does not support step size other than one"
2533
Guido van Rossumb209a111997-04-29 18:18:01 +00002534static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002535loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536{
Guido van Rossumb209a111997-04-29 18:18:01 +00002537 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002538 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002539 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002540 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 return NULL;
2542 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002544 v = (*sq->sq_item)(v, i);
2545 if (v)
2546 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002547 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002549 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550}
2551
Guido van Rossum20c6add2000-05-08 14:06:50 +00002552/* Extract a slice index from a PyInt or PyLong, the index is bound to
2553 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2554 and error. Returns 1 on success.*/
2555
2556int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002557_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558{
2559 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002561 if (PyInt_Check(v)) {
2562 x = PyInt_AsLong(v);
2563 } else if (PyLong_Check(v)) {
2564 x = PyLong_AsLong(v);
2565 if (x==-1 && PyErr_Occurred()) {
2566 PyObject *long_zero;
2567
2568 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2569 /* It's not an overflow error, so just
2570 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002571 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002572 }
2573
2574 /* It's an overflow error, so we need to
2575 check the sign of the long integer,
2576 set the value to INT_MAX or 0, and clear
2577 the error. */
2578
2579 /* Create a long integer with a value of 0 */
2580 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002581 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002582
2583 /* Check sign */
2584 if (PyObject_Compare(long_zero, v) < 0)
2585 x = INT_MAX;
2586 else
2587 x = 0;
2588
2589 /* Free the long integer we created, and clear the
2590 OverflowError */
2591 Py_DECREF(long_zero);
2592 PyErr_Clear();
2593 }
2594 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002595 PyErr_SetString(PyExc_TypeError,
2596 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002597 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002599 /* Truncate -- very long indices are truncated anyway */
2600 if (x > INT_MAX)
2601 x = INT_MAX;
2602 else if (x < -INT_MAX)
2603 x = 0;
2604 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002606 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607}
2608
Guido van Rossumb209a111997-04-29 18:18:01 +00002609static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002612 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002613 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002615 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002616 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002619
2620static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002621assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002623 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002624 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002625 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002626 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002628 if (x == NULL)
2629 return PySequence_DelSlice(u, ilow, ihigh);
2630 else
2631 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632}
2633
Guido van Rossumb209a111997-04-29 18:18:01 +00002634static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002635cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636{
2637 register int cmp;
2638 register int res = 0;
2639 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640 case IS:
2641 case IS_NOT:
2642 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002643 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002644 res = !res;
2645 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 case IN:
2647 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002648 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649 if (res < 0)
2650 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002651 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 break;
2654 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002655 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 break;
2657 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002659 if (cmp && PyErr_Occurred())
2660 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002661 switch (op) {
2662 case LT: res = cmp < 0; break;
2663 case LE: res = cmp <= 0; break;
2664 case EQ: res = cmp == 0; break;
2665 case NE: res = cmp != 0; break;
2666 case GT: res = cmp > 0; break;
2667 case GE: res = cmp >= 0; break;
2668 /* XXX no default? (res is initialized to 0 though) */
2669 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 v = res ? Py_True : Py_False;
2672 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 return v;
2674}
2675
Thomas Wouters52152252000-08-17 22:55:00 +00002676static PyObject *
2677import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002678{
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 PyObject *w, *x;
2680 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002681 PyErr_SetString(PyExc_TypeError,
2682 "import-from requires module object");
Thomas Wouters52152252000-08-17 22:55:00 +00002683 return NULL;
2684 }
2685 w = PyModule_GetDict(v); /* TDB: can this not fail ? */
2686 x = PyDict_GetItem(w, name);
2687 if (x == NULL) {
2688 PyErr_Format(PyExc_ImportError,
2689 "cannot import name %.230s",
2690 PyString_AsString(name));
2691 } else
2692 Py_INCREF(x);
2693 return x;
2694}
2695
2696static int
2697import_all_from(PyObject *locals, PyObject *v)
2698{
2699 int pos = 0, err;
2700 PyObject *name, *value;
2701 PyObject *w;
2702
2703 if (!PyModule_Check(v)) {
2704 PyErr_SetString(PyExc_TypeError,
2705 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002706 return -1;
2707 }
Thomas Wouters52152252000-08-17 22:55:00 +00002708 w = PyModule_GetDict(v); /* TBD: can this not fail ? */
2709
2710 while (PyDict_Next(w, &pos, &name, &value)) {
2711 if (!PyString_Check(name) ||
2712 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002713 continue;
Thomas Wouters52152252000-08-17 22:55:00 +00002714 Py_INCREF(value);
2715 err = PyDict_SetItem(locals, name, value);
2716 Py_DECREF(value);
2717 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002718 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002719 }
Thomas Wouters52152252000-08-17 22:55:00 +00002720 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002721}
2722
Guido van Rossumb209a111997-04-29 18:18:01 +00002723static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002724build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002725{
Guido van Rossumcd649651997-08-22 16:56:16 +00002726 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002728 PyErr_SetString(PyExc_SystemError,
2729 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002730 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002731 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002733 PyErr_SetString(PyExc_SystemError,
2734 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002735 return NULL;
2736 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002738 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002739 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002740 return NULL;
2741 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002742 n = PyTuple_Size(bases);
2743 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 PyObject *base = PyTuple_GET_ITEM(bases, i);
2745 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002746 /* Call the base's *type*, if it is callable.
2747 This code is a hook for Donald Beaudry's
2748 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00002749 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002750 since its types are not callable.
2751 Ditto: call the bases's *class*, if it has
2752 one. This makes the same thing possible
2753 without writing C code. A true meta-object
2754 protocol! */
2755 PyObject *basetype = (PyObject *)base->ob_type;
2756 PyObject *callable = NULL;
2757 if (PyCallable_Check(basetype))
2758 callable = basetype;
2759 else
2760 callable = PyObject_GetAttrString(
2761 base, "__class__");
2762 if (callable) {
2763 PyObject *args;
2764 PyObject *newclass = NULL;
2765 args = Py_BuildValue(
2766 "(OOO)", name, bases, methods);
2767 if (args != NULL) {
2768 newclass = PyEval_CallObject(
2769 callable, args);
2770 Py_DECREF(args);
2771 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002772 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002773 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002774 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002775 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002776 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002778 "base is not a class object");
2779 return NULL;
2780 }
2781 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002783}
2784
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002785static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002786exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
2787 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002788{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002789 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002791 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002792
Guido van Rossumb209a111997-04-29 18:18:01 +00002793 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2794 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002795 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002797 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002798 locals = PyTuple_GetItem(prog, 2);
2799 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002800 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 if (globals == Py_None) {
2802 globals = PyEval_GetGlobals();
2803 if (locals == Py_None) {
2804 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002805 plain = 1;
2806 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002807 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002809 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002810 if (!PyString_Check(prog) &&
2811 !PyCode_Check(prog) &&
2812 !PyFile_Check(prog)) {
2813 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002814 "exec 1st arg must be string, code or file object");
2815 return -1;
2816 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002817 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2818 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002819 "exec 2nd/3rd args must be dict or None");
2820 return -1;
2821 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002823 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002825 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002826 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002827 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 FILE *fp = PyFile_AsFile(prog);
2829 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002830 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2831 }
2832 else {
2833 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00002834 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002835 PyErr_SetString(PyExc_ValueError,
2836 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002837 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002838 }
2839 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002840 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002841 if (plain)
2842 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002843 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002844 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002846 return 0;
2847}
Guido van Rossum24c13741995-02-14 09:42:43 +00002848
Guido van Rossum1aa14831997-01-21 05:34:20 +00002849/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002850static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002851find_from_args(PyFrameObject *f, int nexti)
Guido van Rossum24c13741995-02-14 09:42:43 +00002852{
2853 int opcode;
2854 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002855 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002856 unsigned char *next_instr;
2857
Guido van Rossumd076c731998-10-07 19:42:25 +00002858 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2859 next_instr += nexti;
2860
Guido van Rossum24c13741995-02-14 09:42:43 +00002861 opcode = (*next_instr++);
Thomas Wouters52152252000-08-17 22:55:00 +00002862 if (opcode != IMPORT_FROM && opcode != IMPORT_STAR) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002863 Py_INCREF(Py_None);
2864 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002865 }
2866
Guido van Rossumb209a111997-04-29 18:18:01 +00002867 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002868 if (list == NULL)
2869 return NULL;
Thomas Wouters52152252000-08-17 22:55:00 +00002870
2871 if (opcode == IMPORT_STAR) {
2872 name = PyString_FromString("*");
2873 if (!name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002874 Py_DECREF(list);
Thomas Wouters52152252000-08-17 22:55:00 +00002875 else {
Fred Drake04e654a2000-08-18 19:53:25 +00002876 if (PyList_Append(list, name) < 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002877 Py_DECREF(list);
Fred Drake04e654a2000-08-18 19:53:25 +00002878 }
Thomas Wouters52152252000-08-17 22:55:00 +00002879 Py_DECREF(name);
Guido van Rossum24c13741995-02-14 09:42:43 +00002880 }
Thomas Wouters52152252000-08-17 22:55:00 +00002881 } else {
2882 do {
2883 oparg = (next_instr[1]<<8) + next_instr[0];
Thomas Wouters04005152000-08-20 14:01:53 +00002884 /* Jump over our own argument, the next instruction
2885 (which is a STORE), and its argument.*/
2886 next_instr += 5;
Thomas Wouters52152252000-08-17 22:55:00 +00002887 name = Getnamev(f, oparg);
2888 if (PyList_Append(list, name) < 0) {
2889 Py_DECREF(list);
2890 break;
2891 }
2892 opcode = (*next_instr++);
2893 } while (opcode == IMPORT_FROM);
2894 }
Guido van Rossum24c13741995-02-14 09:42:43 +00002895 return list;
2896}
Guido van Rossum950361c1997-01-24 13:49:28 +00002897
2898
2899#ifdef DYNAMIC_EXECUTION_PROFILE
2900
2901PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002902getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00002903{
2904 int i;
2905 PyObject *l = PyList_New(256);
2906 if (l == NULL) return NULL;
2907 for (i = 0; i < 256; i++) {
2908 PyObject *x = PyInt_FromLong(a[i]);
2909 if (x == NULL) {
2910 Py_DECREF(l);
2911 return NULL;
2912 }
2913 PyList_SetItem(l, i, x);
2914 }
2915 for (i = 0; i < 256; i++)
2916 a[i] = 0;
2917 return l;
2918}
2919
2920PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002921_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00002922{
2923#ifndef DXPAIRS
2924 return getarray(dxp);
2925#else
2926 int i;
2927 PyObject *l = PyList_New(257);
2928 if (l == NULL) return NULL;
2929 for (i = 0; i < 257; i++) {
2930 PyObject *x = getarray(dxpairs[i]);
2931 if (x == NULL) {
2932 Py_DECREF(l);
2933 return NULL;
2934 }
2935 PyList_SetItem(l, i, x);
2936 }
2937 return l;
2938#endif
2939}
2940
2941#endif