blob: dfd477693b84db972a8f4d3553be263ea90234e3 [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
Guido van Rossumc6004111993-11-05 10:22:19 +000026#include <ctype.h>
27
Guido van Rossuma027efa1997-05-05 20:56:21 +000028#ifdef HAVE_LIMITS_H
29#include <limits.h>
30#else
31#define INT_MAX 2147483647
32#endif
33
Guido van Rossum04691fc1992-08-12 15:35:34 +000034/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000035/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000036
Guido van Rossum408027e1996-12-30 16:17:54 +000037#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000038/* For debugging the interpreter: */
39#define LLTRACE 1 /* Low-level trace feature */
40#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041#endif
42
Guido van Rossum5b722181993-03-30 17:46:03 +000043
Guido van Rossum374a9221991-04-04 10:40:29 +000044/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000045
Guido van Rossumb209a111997-04-29 18:18:01 +000046static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
47 PyObject *, PyObject *,
48 PyObject **, int,
49 PyObject **, int,
50 PyObject **, int,
51 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000052#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000053static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000054#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000055static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
56 PyFrameObject *));
57static int call_trace Py_PROTO((PyObject **, PyObject **,
58 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000059static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
60static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000061static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000062static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000063static int assign_slice Py_PROTO((PyObject *, PyObject *,
64 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000065static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
66static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
67static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000068static int exec_statement Py_PROTO((PyFrameObject *,
69 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000070static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000071static void set_exc_info Py_PROTO((PyThreadState *,
72 PyObject *, PyObject *, PyObject *));
73static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000074
75
Guido van Rossum950361c1997-01-24 13:49:28 +000076/* Dynamic execution profile */
77#ifdef DYNAMIC_EXECUTION_PROFILE
78#ifdef DXPAIRS
79static long dxpairs[257][256];
80#define dxp dxpairs[256]
81#else
82static long dxp[256];
83#endif
84#endif
85
86
Guido van Rossume59214e1994-08-30 08:01:59 +000087#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000088
Guido van Rossum2571cc81999-04-07 16:07:23 +000089#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000090#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000091#endif
Guido van Rossum49b56061998-10-01 20:42:43 +000092#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000093
Guido van Rossuma027efa1997-05-05 20:56:21 +000094extern int _PyThread_Started; /* Flag for Py_Exit */
95
Guido van Rossum65d5b571998-12-21 19:32:43 +000096static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +000097static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000098
99void
Guido van Rossumb209a111997-04-29 18:18:01 +0000100PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000103 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000104 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000105 interpreter_lock = PyThread_allocate_lock();
106 PyThread_acquire_lock(interpreter_lock, 1);
107 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000109
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000110void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111PyEval_AcquireLock()
112{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000113 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114}
115
116void
117PyEval_ReleaseLock()
118{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000119 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120}
121
122void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000123PyEval_AcquireThread(tstate)
124 PyThreadState *tstate;
125{
126 if (tstate == NULL)
127 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000128 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000129 if (PyThreadState_Swap(tstate) != NULL)
130 Py_FatalError(
131 "PyEval_AcquireThread: non-NULL old thread state");
132}
133
134void
135PyEval_ReleaseThread(tstate)
136 PyThreadState *tstate;
137{
138 if (tstate == NULL)
139 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
140 if (PyThreadState_Swap(NULL) != tstate)
141 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000142 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000143}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144#endif
145
Guido van Rossumff4949e1992-08-05 19:58:53 +0000146/* Functions save_thread and restore_thread are always defined so
147 dynamically loaded modules needn't be compiled separately for use
148 with and without threads: */
149
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000150PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000151PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000153 PyThreadState *tstate = PyThreadState_Swap(NULL);
154 if (tstate == NULL)
155 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000156#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000157 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000158 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000159#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000160 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000161}
162
163void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000164PyEval_RestoreThread(tstate)
165 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 {
Guido van Rossumb209a111997-04-29 18:18:01 +0000214 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000215 ANY *arg;
216} 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
222Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000223 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000224 ANY *arg;
225{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000226 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000227 int i, j;
228 /* XXX Begin critical section */
229 /* XXX If you want this to be safe against nested
230 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000231 if (busy)
232 return -1;
233 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000234 i = pendinglast;
235 j = (i + 1) % NPENDINGCALLS;
236 if (j == pendingfirst)
237 return -1; /* Queue full */
238 pendingcalls[i].func = func;
239 pendingcalls[i].arg = arg;
240 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000241 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000242 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000243 /* XXX End critical section */
244 return 0;
245}
246
Guido van Rossum180d7b41994-09-29 09:45:57 +0000247int
248Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000249{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000250 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000252 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000253 return 0;
254#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000255 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 return 0;
257 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000258 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 for (;;) {
260 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000261 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000262 ANY *arg;
263 i = pendingfirst;
264 if (i == pendinglast)
265 break; /* Queue empty */
266 func = pendingcalls[i].func;
267 arg = pendingcalls[i].arg;
268 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000269 if (func(arg) < 0) {
270 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000271 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000272 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000273 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000275 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000276 return 0;
277}
278
279
Guido van Rossum374a9221991-04-04 10:40:29 +0000280/* Status code for main loop (reason for stack unwind) */
281
282enum why_code {
283 WHY_NOT, /* No error */
284 WHY_EXCEPTION, /* Exception occurred */
285 WHY_RERAISE, /* Exception re-raised by 'finally' */
286 WHY_RETURN, /* 'return' statement */
287 WHY_BREAK /* 'break' statement */
288};
289
Guido van Rossumb209a111997-04-29 18:18:01 +0000290static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Barry Warsawe42b18f1997-08-25 22:13:04 +0000291static int unpack_sequence Py_PROTO((PyObject *, int, PyObject **));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000292
Guido van Rossum374a9221991-04-04 10:40:29 +0000293
Guido van Rossumb209a111997-04-29 18:18:01 +0000294PyObject *
295PyEval_EvalCode(co, globals, locals)
296 PyCodeObject *co;
297 PyObject *globals;
298 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299{
300 return eval_code2(co,
301 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000302 (PyObject **)NULL, 0,
303 (PyObject **)NULL, 0,
304 (PyObject **)NULL, 0,
305 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306}
307
308
309/* Interpreter main loop */
310
Guido van Rossum8861b741996-07-30 16:49:37 +0000311#ifndef MAX_RECURSION_DEPTH
312#define MAX_RECURSION_DEPTH 10000
313#endif
314
Guido van Rossumb209a111997-04-29 18:18:01 +0000315static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316eval_code2(co, globals, locals,
317 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000318 PyCodeObject *co;
319 PyObject *globals;
320 PyObject *locals;
321 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000322 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000323 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000324 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000325 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000326 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000327 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000328{
Guido van Rossum950361c1997-01-24 13:49:28 +0000329#ifdef DXPAIRS
330 int lastopcode = 0;
331#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000332 register unsigned char *next_instr;
Guido van Rossum50cd3481998-11-17 17:02:51 +0000333 register int opcode; /* Current opcode */
334 register int oparg; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000335 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 register enum why_code why; /* Reason for block stack unwind */
337 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000338 register PyObject *x; /* Result object -- NULL if error */
339 register PyObject *v; /* Temporary objects popped off stack */
340 register PyObject *w;
341 register PyObject *u;
342 register PyObject *t;
343 register PyFrameObject *f; /* Current frame */
Guido van Rossum50cd3481998-11-17 17:02:51 +0000344 register PyObject **fastlocals;
Guido van Rossum014518f1998-11-23 21:09:51 +0000345 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000346 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000347 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000348#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000349 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000350#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000351#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000352 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000353 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000354#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000355
356/* Code access macros */
357
358#define GETCONST(i) Getconst(f, i)
359#define GETNAME(i) Getname(f, i)
360#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000361#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000362#define NEXTOP() (*next_instr++)
363#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000364#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000365#define JUMPBY(x) (next_instr += (x))
366
367/* Stack manipulation macros */
368
369#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
370#define EMPTY() (STACK_LEVEL() == 0)
371#define TOP() (stack_pointer[-1])
372#define BASIC_PUSH(v) (*stack_pointer++ = (v))
373#define BASIC_POP() (*--stack_pointer)
374
Guido van Rossum96a42c81992-01-12 02:29:51 +0000375#ifdef LLTRACE
376#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
377#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000378#else
379#define PUSH(v) BASIC_PUSH(v)
380#define POP() BASIC_POP()
381#endif
382
Guido van Rossum681d79a1995-07-18 14:51:37 +0000383/* Local variable macros */
384
385#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000386#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000387 GETLOCAL(i) = value; } while (0)
388
Guido van Rossuma027efa1997-05-05 20:56:21 +0000389/* Start of code */
390
Guido van Rossum8861b741996-07-30 16:49:37 +0000391#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000392 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000393 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000394 return NULL;
395 }
396#endif
397
Guido van Rossum681d79a1995-07-18 14:51:37 +0000398 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000399 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000400 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000401 }
402
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000403#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000404 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000405#endif
406
Guido van Rossumb209a111997-04-29 18:18:01 +0000407 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000408 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000409 co, /*code*/
410 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000411 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000412 if (f == NULL)
413 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000416 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000417
418 if (co->co_argcount > 0 ||
419 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
420 int i;
421 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000422 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000424 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 if (kwdict == NULL)
426 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000427 i = co->co_argcount;
428 if (co->co_flags & CO_VARARGS)
429 i++;
430 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431 }
432 if (argcount > co->co_argcount) {
433 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000434 PyErr_Format(PyExc_TypeError,
435 "too many arguments; expected %d, got %d",
436 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437 goto fail;
438 }
439 n = co->co_argcount;
440 }
441 for (i = 0; i < n; i++) {
442 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000443 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000444 SETLOCAL(i, x);
445 }
446 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000448 if (u == NULL)
449 goto fail;
450 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 for (i = n; i < argcount; i++) {
452 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000453 Py_INCREF(x);
454 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000455 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000456 }
457 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000458 PyObject *keyword = kws[2*i];
459 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000461 if (keyword == NULL || !PyString_Check(keyword)) {
462 PyErr_SetString(PyExc_TypeError,
463 "keywords must be strings");
464 goto fail;
465 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 /* XXX slow -- speed up using dictionary? */
467 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000468 PyObject *nm = PyTuple_GET_ITEM(
469 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000470 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 break;
472 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000473 /* Check errors from Compare */
474 if (PyErr_Occurred())
475 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 if (j >= co->co_argcount) {
477 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000479 "unexpected keyword argument: %.400s",
Jeremy Hylton76901512000-03-28 23:49:17 +0000480 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 goto fail;
482 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 }
485 else {
486 if (GETLOCAL(j) != NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +0000487 PyErr_Format(PyExc_TypeError,
488 "keyword parameter redefined: %.400s",
489 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 goto fail;
491 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000492 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000493 SETLOCAL(j, value);
494 }
495 }
496 if (argcount < co->co_argcount) {
497 int m = co->co_argcount - defcount;
498 for (i = argcount; i < m; i++) {
499 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000500 PyErr_Format(PyExc_TypeError,
501 "not enough arguments; expected %d, got %d",
502 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 goto fail;
504 }
505 }
506 if (n > m)
507 i = n - m;
508 else
509 i = 0;
510 for (; i < defcount; i++) {
511 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000512 PyObject *def = defs[i];
513 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000514 SETLOCAL(m+i, def);
515 }
516 }
517 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000518 }
519 else {
520 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000521 PyErr_SetString(PyExc_TypeError,
522 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000523 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 }
525 }
526
Guido van Rossuma027efa1997-05-05 20:56:21 +0000527 if (tstate->sys_tracefunc != NULL) {
528 /* tstate->sys_tracefunc, if defined, is a function that
529 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000530 Its return value, if not None, is a function that
531 will be called at the start of each executed line
532 of code. (Actually, the function must return
533 itself in order to continue tracing.)
534 The trace functions are called with three arguments:
535 a pointer to the current frame, a string indicating
536 why the function is called, and an argument which
537 depends on the situation. The global trace function
538 (sys.trace) is also called whenever an exception
539 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000540 if (call_trace(&tstate->sys_tracefunc,
541 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000542 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000543 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000544 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000545 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000546 }
547
Guido van Rossuma027efa1997-05-05 20:56:21 +0000548 if (tstate->sys_profilefunc != NULL) {
549 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000550 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000551 if (call_trace(&tstate->sys_profilefunc,
552 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000553 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000554 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000555 }
556 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000557
Guido van Rossuma027efa1997-05-05 20:56:21 +0000558 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
559 --tstate->recursion_depth;
560 PyErr_SetString(PyExc_RuntimeError,
561 "Maximum recursion depth exceeded");
562 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000563 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000564 return NULL;
565 }
566
Guido van Rossumd076c731998-10-07 19:42:25 +0000567 _PyCode_GETCODEPTR(co, &first_instr);
568 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000569 stack_pointer = f->f_valuestack;
570
Guido van Rossum374a9221991-04-04 10:40:29 +0000571 why = WHY_NOT;
572 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000573 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000574
575 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 /* Do periodic things. Doing this every time through
577 the loop would add too much overhead, so we do it
578 only every Nth instruction. We also do it if
579 ``things_to_do'' is set, i.e. when an asynchronous
580 event needs attention (e.g. a signal handler or
581 async I/O handler); see Py_AddPendingCall() and
582 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000583
Guido van Rossuma027efa1997-05-05 20:56:21 +0000584 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000585 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000586 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000587 if (Py_MakePendingCalls() < 0) {
588 why = WHY_EXCEPTION;
589 goto on_error;
590 }
591 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000592#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000593 /* If we have true signals, the signal handler
594 will call Py_AddPendingCall() so we don't
595 have to call sigcheck(). On the Mac and
596 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000597 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000599 goto on_error;
600 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000601#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602
Guido van Rossume59214e1994-08-30 08:01:59 +0000603#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000604 if (interpreter_lock) {
605 /* Give another thread a chance */
606
Guido van Rossum25ce5661997-08-02 03:10:38 +0000607 if (PyThreadState_Swap(NULL) != tstate)
608 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000609 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000610
611 /* Other threads may run now */
612
Guido van Rossum65d5b571998-12-21 19:32:43 +0000613 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000614 if (PyThreadState_Swap(tstate) != NULL)
615 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616 }
617#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619
Guido van Rossum374a9221991-04-04 10:40:29 +0000620 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000621
Guido van Rossum408027e1996-12-30 16:17:54 +0000622#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000623 f->f_lasti = INSTR_OFFSET();
624#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000625
626 opcode = NEXTOP();
627 if (HAS_ARG(opcode))
628 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000629#ifdef DYNAMIC_EXECUTION_PROFILE
630#ifdef DXPAIRS
631 dxpairs[lastopcode][opcode]++;
632 lastopcode = opcode;
633#endif
634 dxp[opcode]++;
635#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000636
Guido van Rossum96a42c81992-01-12 02:29:51 +0000637#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 /* Instruction tracing */
639
Guido van Rossum96a42c81992-01-12 02:29:51 +0000640 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000641 if (HAS_ARG(opcode)) {
642 printf("%d: %d, %d\n",
643 (int) (INSTR_OFFSET() - 3),
644 opcode, oparg);
645 }
646 else {
647 printf("%d: %d\n",
648 (int) (INSTR_OFFSET() - 1), opcode);
649 }
650 }
651#endif
652
653 /* Main switch on opcode */
654
655 switch (opcode) {
656
657 /* BEWARE!
658 It is essential that any operation that fails sets either
659 x to NULL, err to nonzero, or why to anything but WHY_NOT,
660 and that no operation that succeeds does this! */
661
662 /* case STOP_CODE: this is an error! */
663
664 case POP_TOP:
665 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000666 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000667 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000668
669 case ROT_TWO:
670 v = POP();
671 w = POP();
672 PUSH(v);
673 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000674 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000675
676 case ROT_THREE:
677 v = POP();
678 w = POP();
679 x = POP();
680 PUSH(v);
681 PUSH(x);
682 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000683 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000684
685 case DUP_TOP:
686 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000687 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000689 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000690
691 case UNARY_POSITIVE:
692 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000693 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000694 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000696 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 break;
698
699 case UNARY_NEGATIVE:
700 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000701 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000702 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000704 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 break;
706
707 case UNARY_NOT:
708 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000709 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000710 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000711 if (err == 0) {
712 Py_INCREF(Py_True);
713 PUSH(Py_True);
714 continue;
715 }
716 else if (err > 0) {
717 Py_INCREF(Py_False);
718 PUSH(Py_False);
719 err = 0;
720 continue;
721 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 break;
723
724 case UNARY_CONVERT:
725 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 x = PyObject_Repr(v);
727 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000731
732 case UNARY_INVERT:
733 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000734 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000735 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000736 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000737 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000738 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000739
Guido van Rossum50564e81996-01-12 01:13:16 +0000740 case BINARY_POWER:
741 w = POP();
742 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000743 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000744 Py_DECREF(v);
745 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000746 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000747 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000748 break;
749
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 case BINARY_MULTIPLY:
751 w = POP();
752 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000753 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000754 Py_DECREF(v);
755 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000757 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 break;
759
760 case BINARY_DIVIDE:
761 w = POP();
762 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000763 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000764 Py_DECREF(v);
765 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000767 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 break;
769
770 case BINARY_MODULO:
771 w = POP();
772 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000773 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000774 Py_DECREF(v);
775 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000776 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000777 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 break;
779
780 case BINARY_ADD:
781 w = POP();
782 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000783 if (PyInt_Check(v) && PyInt_Check(w)) {
784 /* INLINE: int + int */
785 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000786 a = PyInt_AS_LONG(v);
787 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000788 i = a + b;
789 if ((i^a) < 0 && (i^b) < 0) {
790 PyErr_SetString(PyExc_OverflowError,
791 "integer addition");
792 x = NULL;
793 }
794 else
795 x = PyInt_FromLong(i);
796 }
797 else
798 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000799 Py_DECREF(v);
800 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000801 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000802 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 break;
804
805 case BINARY_SUBTRACT:
806 w = POP();
807 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000808 if (PyInt_Check(v) && PyInt_Check(w)) {
809 /* INLINE: int - int */
810 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000811 a = PyInt_AS_LONG(v);
812 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000813 i = a - b;
814 if ((i^a) < 0 && (i^~b) < 0) {
815 PyErr_SetString(PyExc_OverflowError,
816 "integer subtraction");
817 x = NULL;
818 }
819 else
820 x = PyInt_FromLong(i);
821 }
822 else
823 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000824 Py_DECREF(v);
825 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000826 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000827 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000828 break;
829
830 case BINARY_SUBSCR:
831 w = POP();
832 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000833 if (PyList_Check(v) && PyInt_Check(w)) {
834 /* INLINE: list[int] */
835 long i = PyInt_AsLong(w);
836 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000837 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000838 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000839 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000840 PyErr_SetString(PyExc_IndexError,
841 "list index out of range");
842 x = NULL;
843 }
844 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000845 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000846 Py_INCREF(x);
847 }
848 }
849 else
850 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000851 Py_DECREF(v);
852 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000853 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000854 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000855 break;
856
Guido van Rossum7928cd71991-10-24 14:59:31 +0000857 case BINARY_LSHIFT:
858 w = POP();
859 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000860 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000861 Py_DECREF(v);
862 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000863 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000864 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000865 break;
866
867 case BINARY_RSHIFT:
868 w = POP();
869 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000870 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000871 Py_DECREF(v);
872 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000873 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000874 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000875 break;
876
877 case BINARY_AND:
878 w = POP();
879 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000880 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000881 Py_DECREF(v);
882 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000883 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000884 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000885 break;
886
887 case BINARY_XOR:
888 w = POP();
889 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000890 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000891 Py_DECREF(v);
892 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000893 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000895 break;
896
897 case BINARY_OR:
898 w = POP();
899 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000900 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000901 Py_DECREF(v);
902 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000903 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000905 break;
906
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 case SLICE+0:
908 case SLICE+1:
909 case SLICE+2:
910 case SLICE+3:
911 if ((opcode-SLICE) & 2)
912 w = POP();
913 else
914 w = NULL;
915 if ((opcode-SLICE) & 1)
916 v = POP();
917 else
918 v = NULL;
919 u = POP();
920 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000921 Py_DECREF(u);
922 Py_XDECREF(v);
923 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000925 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 break;
927
928 case STORE_SLICE+0:
929 case STORE_SLICE+1:
930 case STORE_SLICE+2:
931 case STORE_SLICE+3:
932 if ((opcode-STORE_SLICE) & 2)
933 w = POP();
934 else
935 w = NULL;
936 if ((opcode-STORE_SLICE) & 1)
937 v = POP();
938 else
939 v = NULL;
940 u = POP();
941 t = POP();
942 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000943 Py_DECREF(t);
944 Py_DECREF(u);
945 Py_XDECREF(v);
946 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000947 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 break;
949
950 case DELETE_SLICE+0:
951 case DELETE_SLICE+1:
952 case DELETE_SLICE+2:
953 case DELETE_SLICE+3:
954 if ((opcode-DELETE_SLICE) & 2)
955 w = POP();
956 else
957 w = NULL;
958 if ((opcode-DELETE_SLICE) & 1)
959 v = POP();
960 else
961 v = NULL;
962 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000965 Py_DECREF(u);
966 Py_XDECREF(v);
967 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
970
971 case STORE_SUBSCR:
972 w = POP();
973 v = POP();
974 u = POP();
975 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000976 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000977 Py_DECREF(u);
978 Py_DECREF(v);
979 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000980 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 break;
982
983 case DELETE_SUBSCR:
984 w = POP();
985 v = POP();
986 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000987 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000988 Py_DECREF(v);
989 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000990 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 break;
992
993 case PRINT_EXPR:
994 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +0000995 /* Print value except if None */
996 /* After printing, also assign to '_' */
997 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +0000998 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000999 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001000 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001001 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001002 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001003 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001004 if (x == NULL) {
1005 PyErr_SetString(
1006 PyExc_RuntimeError,
1007 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001008 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001009 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001010 }
1011 if (err == 0)
1012 err = PyFile_WriteObject(v, x, 0);
1013 if (err == 0) {
1014 PyFile_SoftSpace(x, 1);
1015 err = Py_FlushLine();
1016 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001017 if (err == 0) {
1018 err = PyDict_SetItemString(
1019 f->f_builtins, "_", v);
1020 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001022 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001023 break;
1024
1025 case PRINT_ITEM:
1026 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001028 if (w == NULL) {
1029 PyErr_SetString(PyExc_RuntimeError,
1030 "lost sys.stdout");
1031 err = -1;
1032 }
1033 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001034 err = PyFile_WriteString(" ", w);
1035 if (err == 0)
1036 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001038 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 char *s = PyString_AsString(v);
1040 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001041 if (len > 0 &&
1042 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001043 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001044 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001046 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001047 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 break;
1049
1050 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001051 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001052 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001053 PyErr_SetString(PyExc_RuntimeError,
1054 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001055 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001056 err = PyFile_WriteString("\n", x);
1057 if (err == 0)
1058 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001059 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 break;
1061
1062 case BREAK_LOOP:
1063 why = WHY_BREAK;
1064 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001065
Guido van Rossumf10570b1995-07-07 22:53:21 +00001066 case RAISE_VARARGS:
1067 u = v = w = NULL;
1068 switch (oparg) {
1069 case 3:
1070 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001071 /* Fallthrough */
1072 case 2:
1073 v = POP(); /* value */
1074 /* Fallthrough */
1075 case 1:
1076 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001077 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001078 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001079 break;
1080 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001081 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001083 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001084 break;
1085 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001086 break;
1087
1088 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001089 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001090 PyErr_SetString(PyExc_SystemError,
1091 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001092 break;
1093 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001094 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001095 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 break;
1097
1098 case RETURN_VALUE:
1099 retval = POP();
1100 why = WHY_RETURN;
1101 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001102
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001103 case EXEC_STMT:
1104 w = POP();
1105 v = POP();
1106 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001107 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001108 Py_DECREF(u);
1109 Py_DECREF(v);
1110 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001111 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001112
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 case POP_BLOCK:
1114 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 while (STACK_LEVEL() > b->b_level) {
1117 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001118 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 }
1120 }
1121 break;
1122
1123 case END_FINALLY:
1124 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001125 if (PyInt_Check(v)) {
1126 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001127 if (why == WHY_RETURN)
1128 retval = POP();
1129 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001130 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001132 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001135 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001137 else if (v != Py_None) {
1138 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 "'finally' pops bad exception");
1140 why = WHY_EXCEPTION;
1141 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001142 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 break;
1144
1145 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001146 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001148 w = POP();
1149 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001151 Py_DECREF(u);
1152 Py_DECREF(v);
1153 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 break;
1155
1156 case STORE_NAME:
1157 w = GETNAMEV(oparg);
1158 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001159 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001160 PyErr_SetString(PyExc_SystemError,
1161 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001162 break;
1163 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001164 err = PyDict_SetItem(x, w, v);
1165 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 break;
1167
1168 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001169 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001170 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001171 PyErr_SetString(PyExc_SystemError,
1172 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001173 break;
1174 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001175 if ((err = PyDict_DelItem(x, w)) != 0)
1176 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001178
1179#ifdef CASE_TOO_BIG
1180 default: switch (opcode) {
1181#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001182
1183 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 case UNPACK_LIST:
1185 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001186 if (PyTuple_Check(v)) {
1187 if (PyTuple_Size(v) != oparg) {
1188 PyErr_SetString(PyExc_ValueError,
1189 "unpack tuple of wrong size");
1190 why = WHY_EXCEPTION;
1191 }
1192 else {
1193 for (; --oparg >= 0; ) {
1194 w = PyTuple_GET_ITEM(v, oparg);
1195 Py_INCREF(w);
1196 PUSH(w);
1197 }
1198 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001200 else if (PyList_Check(v)) {
1201 if (PyList_Size(v) != oparg) {
1202 PyErr_SetString(PyExc_ValueError,
1203 "unpack list of wrong size");
1204 why = WHY_EXCEPTION;
1205 }
1206 else {
1207 for (; --oparg >= 0; ) {
1208 w = PyList_GET_ITEM(v, oparg);
1209 Py_INCREF(w);
1210 PUSH(w);
1211 }
1212 }
1213 }
1214 else if (PySequence_Check(v)) {
1215 if (unpack_sequence(v, oparg,
1216 stack_pointer + oparg))
1217 stack_pointer += oparg;
1218 else
1219 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 }
1221 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001222 PyErr_SetString(PyExc_TypeError,
1223 "unpack non-sequence");
1224 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 break;
1228
1229 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001230 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 v = POP();
1232 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1234 Py_DECREF(v);
1235 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 break;
1237
1238 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001239 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001241 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1242 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001243 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
1245
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001246 case STORE_GLOBAL:
1247 w = GETNAMEV(oparg);
1248 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 err = PyDict_SetItem(f->f_globals, w, v);
1250 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001251 break;
1252
1253 case DELETE_GLOBAL:
1254 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001255 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1256 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001257 break;
1258
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 case LOAD_CONST:
1260 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 PUSH(x);
1263 break;
1264
1265 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001266 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001267 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001268 PyErr_SetString(PyExc_SystemError,
1269 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001270 break;
1271 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001272 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001278 PyErr_SetObject(
1279 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 break;
1281 }
1282 }
1283 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001284 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 PUSH(x);
1286 break;
1287
1288 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001289 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 break;
1296 }
1297 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001298 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 PUSH(x);
1300 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001301
Guido van Rossum9bfef441993-03-29 10:43:31 +00001302 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001304 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001305 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001307 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001308 break;
1309 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001311 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001312 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001313 break;
1314
1315 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001316 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001317 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001318 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001319
1320 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001321 x = GETLOCAL(oparg);
1322 if (x == NULL) {
Guido van Rossum87460821999-06-22 14:47:32 +00001323 PyErr_SetObject(PyExc_UnboundLocalError,
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001324 PyTuple_GetItem(co->co_varnames,
1325 oparg));
1326 break;
1327 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001328 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001329 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001330
1331 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 if (x != NULL) {
1334 for (; --oparg >= 0;) {
1335 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001336 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 }
1338 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001339 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 }
1341 break;
1342
1343 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001344 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 if (x != NULL) {
1346 for (; --oparg >= 0;) {
1347 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001348 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 }
1350 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001351 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 }
1353 break;
1354
1355 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001358 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 break;
1360
1361 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001362 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 x = PyObject_GetAttr(v, w);
1365 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001367 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 break;
1369
1370 case COMPARE_OP:
1371 w = POP();
1372 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001373 if (PyInt_Check(v) && PyInt_Check(w)) {
1374 /* INLINE: cmp(int, int) */
1375 register long a, b;
1376 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001377 a = PyInt_AS_LONG(v);
1378 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001379 switch (oparg) {
1380 case LT: res = a < b; break;
1381 case LE: res = a <= b; break;
1382 case EQ: res = a == b; break;
1383 case NE: res = a != b; break;
1384 case GT: res = a > b; break;
1385 case GE: res = a >= b; break;
1386 case IS: res = v == w; break;
1387 case IS_NOT: res = v != w; break;
1388 default: goto slow_compare;
1389 }
1390 x = res ? Py_True : Py_False;
1391 Py_INCREF(x);
1392 }
1393 else {
1394 slow_compare:
1395 x = cmp_outcome(oparg, v, w);
1396 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001397 Py_DECREF(v);
1398 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001400 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
1402
1403 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001405 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001407 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001408 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001409 break;
1410 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001411 u = find_from_args(f, INSTR_OFFSET());
1412 if (u == NULL) {
1413 x = u;
1414 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001415 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001417 w,
1418 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001419 f->f_locals == NULL ?
1420 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423 if (w == NULL) {
1424 x = NULL;
1425 break;
1426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 x = PyEval_CallObject(x, w);
1428 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001429 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001430 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 break;
1432
1433 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001434 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001438 PyErr_SetString(PyExc_SystemError,
1439 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 break;
1441 }
1442 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001444 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001446
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 case JUMP_FORWARD:
1448 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001449 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001450
1451 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001452 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001453 if (err > 0)
1454 err = 0;
1455 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001457 else
1458 break;
1459 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460
1461 case JUMP_IF_TRUE:
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;
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001466 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001467 else if (err == 0)
1468 ;
1469 else
1470 break;
1471 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001472
1473 case JUMP_ABSOLUTE:
1474 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001475 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001476
1477 case FOR_LOOP:
1478 /* for v in s: ...
1479 On entry: stack contains s, i.
1480 On exit: stack contains s, i+1, s[i];
1481 but if loop exhausted:
1482 s, i are popped, and we jump */
1483 w = POP(); /* Loop index */
1484 v = POP(); /* Sequence object */
1485 u = loop_subscript(v, w);
1486 if (u != NULL) {
1487 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001492 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 }
1494 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 Py_DECREF(v);
1496 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 /* A NULL can mean "s exhausted"
1498 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001501 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001503 continue;
1504 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 }
1506 break;
1507
1508 case SETUP_LOOP:
1509 case SETUP_EXCEPT:
1510 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001513 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001514
1515 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001516#ifdef LLTRACE
1517 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001518 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001519#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001520 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001521 if (f->f_trace == NULL)
1522 continue;
1523 /* Trace each line of code reached */
1524 f->f_lasti = INSTR_OFFSET();
1525 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001528
1529 case CALL_FUNCTION:
Jeremy Hylton76901512000-03-28 23:49:17 +00001530 case CALL_FUNCTION_VAR:
1531 case CALL_FUNCTION_KW:
1532 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001533 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001534 int na = oparg & 0xff;
1535 int nk = (oparg>>8) & 0xff;
1536 int flags = (opcode - CALL_FUNCTION) & 3;
1537 int n = na + 2*nk + (flags & 1) + ((flags >> 1) & 1);
1538 PyObject **pfunc = stack_pointer - n - 1;
1539 PyObject *func = *pfunc;
1540 PyObject *self = NULL;
1541 PyObject *class = NULL;
1542 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1543 if (PyMethod_Check(func)) {
1544 self = PyMethod_Self(func);
1545 class = PyMethod_Class(func);
1546 func = PyMethod_Function(func);
1547 Py_INCREF(func);
1548 if (self != NULL) {
1549 Py_INCREF(self);
1550 Py_DECREF(*pfunc);
1551 *pfunc = self;
1552 na++;
1553 n++;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001554 }
1555 else {
Jeremy Hylton76901512000-03-28 23:49:17 +00001556 /* Unbound methods must be called with an
1557 instance of the class (or a derived
1558 class) as first argument */
1559 if (na > 0 && (self = stack_pointer[-n]) != NULL
1560 && PyInstance_Check(self)
1561 && PyClass_IsSubclass((PyObject *)
1562 (((PyInstanceObject *)self)->in_class),
1563 class))
1564 /* Handy-dandy */ ;
1565 else {
1566 PyErr_SetString(PyExc_TypeError,
1567 "unbound method must be called with class instance 1st argument");
1568 x = NULL;
1569 break;
1570 }
1571 }
1572 }
1573 else
1574 Py_INCREF(func);
1575 if (PyFunction_Check(func) && flags == 0) {
1576 PyObject *co = PyFunction_GetCode(func);
1577 PyObject *globals = PyFunction_GetGlobals(func);
1578 PyObject *argdefs = PyFunction_GetDefaults(func);
1579 PyObject **d;
1580 int nd;
1581 if (argdefs != NULL) {
1582 d = &PyTuple_GET_ITEM(argdefs, 0);
1583 nd = ((PyTupleObject *)argdefs)->ob_size;
1584 }
1585 else {
1586 d = NULL;
1587 nd = 0;
1588 }
1589 x = eval_code2((PyCodeObject *)co, globals,
1590 (PyObject *)NULL, stack_pointer-n, na,
1591 stack_pointer-2*nk, nk, d, nd,
1592 class);
1593 }
1594 else {
1595 int nstar = 0;
Jeremy Hylton387b1012000-03-31 01:22:54 +00001596 PyObject *callargs;
Jeremy Hylton76901512000-03-28 23:49:17 +00001597 PyObject *stararg = 0;
1598 PyObject *kwdict = NULL;
1599 if (flags & 2) {
1600 kwdict = POP();
1601 if (!PyDict_Check(kwdict)) {
1602 PyErr_SetString(PyExc_TypeError,
1603 "** argument must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00001604 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001605 }
1606 }
1607 if (flags & 1) {
1608 stararg = POP();
1609 if (!PySequence_Check(stararg)) {
1610 PyErr_SetString(PyExc_TypeError,
1611 "* argument must be a sequence");
Guido van Rossum25826c92000-04-21 21:17:39 +00001612 goto extcall_fail;
Jeremy Hylton76901512000-03-28 23:49:17 +00001613 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001614 /* Convert abstract sequence to concrete tuple */
1615 if (!PyTuple_Check(stararg)) {
1616 PyObject *t = NULL;
1617 t = PySequence_Tuple(stararg);
1618 if (t == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001619 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001620 }
1621 Py_DECREF(stararg);
1622 stararg = t;
1623 }
1624 nstar = PyTuple_GET_SIZE(stararg);
Barry Warsaw4961ef72000-03-29 18:30:03 +00001625 if (nstar < 0) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001626 goto extcall_fail;
Barry Warsaw4961ef72000-03-29 18:30:03 +00001627 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001628 }
1629 if (nk > 0) {
1630 if (kwdict == NULL) {
1631 kwdict = PyDict_New();
1632 if (kwdict == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001633 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001634 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001635 }
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001636 else {
1637 PyObject *d = PyDict_Copy(kwdict);
1638 if (d == NULL) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001639 goto extcall_fail;
Jeremy Hylton074c3e62000-03-30 23:55:31 +00001640 }
1641 Py_DECREF(kwdict);
1642 kwdict = d;
1643 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001644 err = 0;
1645 while (--nk >= 0) {
1646 PyObject *value = POP();
1647 PyObject *key = POP();
1648 if (PyDict_GetItem(kwdict, key) != NULL) {
1649 err = 1;
1650 PyErr_Format(PyExc_TypeError,
1651 "keyword parameter redefined: %.400s",
1652 PyString_AsString(key));
Jeremy Hylton387b1012000-03-31 01:22:54 +00001653 Py_DECREF(key);
1654 Py_DECREF(value);
Guido van Rossum25826c92000-04-21 21:17:39 +00001655 goto extcall_fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001656 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001657 err = PyDict_SetItem(kwdict, key, value);
1658 Py_DECREF(key);
1659 Py_DECREF(value);
1660 if (err)
1661 break;
1662 }
1663 if (err) {
Guido van Rossum25826c92000-04-21 21:17:39 +00001664 extcall_fail:
1665 Py_XDECREF(kwdict);
1666 Py_XDECREF(stararg);
1667 Py_DECREF(func);
1668 x=NULL;
Jeremy Hylton76901512000-03-28 23:49:17 +00001669 break;
1670 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001671 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001672 callargs = PyTuple_New(na + nstar);
1673 if (callargs == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001674 x = NULL;
1675 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001676 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001677 if (stararg) {
Jeremy Hylton76901512000-03-28 23:49:17 +00001678 int i;
Jeremy Hylton76901512000-03-28 23:49:17 +00001679 for (i = 0; i < nstar; i++) {
1680 PyObject *a = PyTuple_GET_ITEM(stararg, i);
1681 Py_INCREF(a);
Jeremy Hylton387b1012000-03-31 01:22:54 +00001682 PyTuple_SET_ITEM(callargs, na + i, a);
Jeremy Hylton76901512000-03-28 23:49:17 +00001683 }
1684 Py_DECREF(stararg);
1685 }
1686 while (--na >= 0) {
1687 w = POP();
Jeremy Hylton387b1012000-03-31 01:22:54 +00001688 PyTuple_SET_ITEM(callargs, na, w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001689 }
Jeremy Hylton387b1012000-03-31 01:22:54 +00001690 x = PyEval_CallObjectWithKeywords(func,
1691 callargs,
1692 kwdict);
1693 Py_DECREF(callargs);
Jeremy Hylton76901512000-03-28 23:49:17 +00001694 Py_XDECREF(kwdict);
1695 }
1696 Py_DECREF(func);
1697 while (stack_pointer > pfunc) {
1698 w = POP();
1699 Py_DECREF(w);
1700 }
1701 PUSH(x);
1702 if (x != NULL) continue;
1703 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001704 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001705
Guido van Rossum681d79a1995-07-18 14:51:37 +00001706 case MAKE_FUNCTION:
1707 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 x = PyFunction_New(v, f->f_globals);
1709 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001710 /* XXX Maybe this should be a separate opcode? */
1711 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001712 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001713 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001715 x = NULL;
1716 break;
1717 }
1718 while (--oparg >= 0) {
1719 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001721 }
1722 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 }
1725 PUSH(x);
1726 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001727
1728 case BUILD_SLICE:
1729 if (oparg == 3)
1730 w = POP();
1731 else
1732 w = NULL;
1733 v = POP();
1734 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001735 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001736 Py_DECREF(u);
1737 Py_DECREF(v);
1738 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001739 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001740 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001741 break;
1742
1743
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 default:
1745 fprintf(stderr,
1746 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001747 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 why = WHY_EXCEPTION;
1750 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001751
1752#ifdef CASE_TOO_BIG
1753 }
1754#endif
1755
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 } /* switch */
1757
1758 on_error:
1759
1760 /* Quickly continue if no error occurred */
1761
1762 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001763 if (err == 0 && x != NULL) {
1764#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001765 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001767 fprintf(stderr,
1768 "XXX undetected error\n");
1769 else
1770#endif
1771 continue; /* Normal, fast path */
1772 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 err = 0;
1776 }
1777
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 /* Double-check exception status */
1779
1780 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001782 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001783 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 why = WHY_EXCEPTION;
1785 }
1786 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001787#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00001789 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00001790 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001791 fprintf(stderr,
1792 "XXX undetected error (why=%d)\n",
1793 why);
1794 why = WHY_EXCEPTION;
1795 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 }
1797#endif
1798
1799 /* Log traceback info if this is a real exception */
1800
1801 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001802 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001804 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001806
Guido van Rossume59214e1994-08-30 08:01:59 +00001807 if (f->f_trace)
1808 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001809 if (tstate->sys_profilefunc)
1810 call_exc_trace(&tstate->sys_profilefunc,
1811 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00001812 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001813
1814 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1815
1816 if (why == WHY_RERAISE)
1817 why = WHY_EXCEPTION;
1818
1819 /* Unwind stacks if a (pseudo) exception occurred */
1820
1821 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001822 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001823 while (STACK_LEVEL() > b->b_level) {
1824 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001825 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001826 }
1827 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1828 why = WHY_NOT;
1829 JUMPTO(b->b_handler);
1830 break;
1831 }
1832 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001833 (b->b_type == SETUP_EXCEPT &&
1834 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001835 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 PyObject *exc, *val, *tb;
1837 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 val = Py_None;
1840 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 /* Make the raw exception data
1843 available to the handler,
1844 so a program can emulate the
1845 Python main loop. Don't do
1846 this for 'finally'. */
1847 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001848 PyErr_NormalizeException(
1849 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001850 set_exc_info(tstate,
1851 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001852 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001853 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 PUSH(val);
1855 PUSH(exc);
1856 }
1857 else {
1858 if (why == WHY_RETURN)
1859 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001860 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001861 PUSH(v);
1862 }
1863 why = WHY_NOT;
1864 JUMPTO(b->b_handler);
1865 break;
1866 }
1867 } /* unwind stack */
1868
1869 /* End the loop if we still have an error (or return) */
1870
1871 if (why != WHY_NOT)
1872 break;
1873
1874 } /* main loop */
1875
1876 /* Pop remaining stack entries */
1877
1878 while (!EMPTY()) {
1879 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001880 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 }
1882
Guido van Rossum96a42c81992-01-12 02:29:51 +00001883 if (why != WHY_RETURN)
1884 retval = NULL;
1885
Guido van Rossume59214e1994-08-30 08:01:59 +00001886 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001887 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001888 if (call_trace(&f->f_trace, &f->f_trace, f,
1889 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001890 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001891 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001892 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001893 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001894 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001895 }
1896
Guido van Rossuma027efa1997-05-05 20:56:21 +00001897 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1898 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001899 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001900 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001901 retval = NULL;
1902 why = WHY_EXCEPTION;
1903 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001904 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001905
Guido van Rossuma027efa1997-05-05 20:56:21 +00001906 reset_exc_info(tstate);
1907
1908 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001909
1910 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001911
Guido van Rossum374a9221991-04-04 10:40:29 +00001912 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001913
Guido van Rossuma027efa1997-05-05 20:56:21 +00001914 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001915 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001916
Guido van Rossum96a42c81992-01-12 02:29:51 +00001917 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001918}
1919
Guido van Rossuma027efa1997-05-05 20:56:21 +00001920static void
1921set_exc_info(tstate, type, value, tb)
1922 PyThreadState *tstate;
1923 PyObject *type;
1924 PyObject *value;
1925 PyObject *tb;
1926{
1927 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001928 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001929
Guido van Rossuma027efa1997-05-05 20:56:21 +00001930 frame = tstate->frame;
1931 if (frame->f_exc_type == NULL) {
1932 /* This frame didn't catch an exception before */
1933 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001934 if (tstate->exc_type == NULL) {
1935 Py_INCREF(Py_None);
1936 tstate->exc_type = Py_None;
1937 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001938 tmp_type = frame->f_exc_type;
1939 tmp_value = frame->f_exc_value;
1940 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001941 Py_XINCREF(tstate->exc_type);
1942 Py_XINCREF(tstate->exc_value);
1943 Py_XINCREF(tstate->exc_traceback);
1944 frame->f_exc_type = tstate->exc_type;
1945 frame->f_exc_value = tstate->exc_value;
1946 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001947 Py_XDECREF(tmp_type);
1948 Py_XDECREF(tmp_value);
1949 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001950 }
1951 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001952 tmp_type = tstate->exc_type;
1953 tmp_value = tstate->exc_value;
1954 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001955 Py_XINCREF(type);
1956 Py_XINCREF(value);
1957 Py_XINCREF(tb);
1958 tstate->exc_type = type;
1959 tstate->exc_value = value;
1960 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001961 Py_XDECREF(tmp_type);
1962 Py_XDECREF(tmp_value);
1963 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001964 /* For b/w compatibility */
1965 PySys_SetObject("exc_type", type);
1966 PySys_SetObject("exc_value", value);
1967 PySys_SetObject("exc_traceback", tb);
1968}
1969
1970static void
1971reset_exc_info(tstate)
1972 PyThreadState *tstate;
1973{
1974 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001975 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001976 frame = tstate->frame;
1977 if (frame->f_exc_type != NULL) {
1978 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001979 tmp_type = tstate->exc_type;
1980 tmp_value = tstate->exc_value;
1981 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001982 Py_XINCREF(frame->f_exc_type);
1983 Py_XINCREF(frame->f_exc_value);
1984 Py_XINCREF(frame->f_exc_traceback);
1985 tstate->exc_type = frame->f_exc_type;
1986 tstate->exc_value = frame->f_exc_value;
1987 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001988 Py_XDECREF(tmp_type);
1989 Py_XDECREF(tmp_value);
1990 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001991 /* For b/w compatibility */
1992 PySys_SetObject("exc_type", frame->f_exc_type);
1993 PySys_SetObject("exc_value", frame->f_exc_value);
1994 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1995 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001996 tmp_type = frame->f_exc_type;
1997 tmp_value = frame->f_exc_value;
1998 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001999 frame->f_exc_type = NULL;
2000 frame->f_exc_value = NULL;
2001 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002002 Py_XDECREF(tmp_type);
2003 Py_XDECREF(tmp_value);
2004 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002005}
2006
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002007/* Logic for the raise statement (too complicated for inlining).
2008 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002009static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002010do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002012{
Guido van Rossumd295f121998-04-09 21:39:57 +00002013 if (type == NULL) {
2014 /* Reraise */
2015 PyThreadState *tstate = PyThreadState_Get();
2016 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2017 value = tstate->exc_value;
2018 tb = tstate->exc_traceback;
2019 Py_XINCREF(type);
2020 Py_XINCREF(value);
2021 Py_XINCREF(tb);
2022 }
2023
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002024 /* We support the following forms of raise:
2025 raise <class>, <classinstance>
2026 raise <class>, <argument tuple>
2027 raise <class>, None
2028 raise <class>, <argument>
2029 raise <classinstance>, None
2030 raise <string>, <object>
2031 raise <string>, None
2032
2033 An omitted second argument is the same as None.
2034
2035 In addition, raise <tuple>, <anything> is the same as
2036 raising the tuple's first item (and it better have one!);
2037 this rule is applied recursively.
2038
2039 Finally, an optional third argument can be supplied, which
2040 gives the traceback to be substituted (useful when
2041 re-raising an exception after examining it). */
2042
2043 /* First, check the traceback argument, replacing None with
2044 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 if (tb == Py_None) {
2046 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002047 tb = NULL;
2048 }
2049 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002051 "raise 3rd arg must be traceback or None");
2052 goto raise_error;
2053 }
2054
2055 /* Next, replace a missing value with None */
2056 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002057 value = Py_None;
2058 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002059 }
2060
2061 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2063 PyObject *tmp = type;
2064 type = PyTuple_GET_ITEM(type, 0);
2065 Py_INCREF(type);
2066 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002067 }
2068
Barry Warsaw4249f541997-08-22 21:26:19 +00002069 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002070 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002071
2072 else if (PyClass_Check(type))
2073 PyErr_NormalizeException(&type, &value, &tb);
2074
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002076 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 if (value != Py_None) {
2078 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002079 "instance exception may not have a separate value");
2080 goto raise_error;
2081 }
2082 else {
2083 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002085 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002086 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2087 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002088 }
2089 }
2090 else {
2091 /* Not something you can raise. You get an exception
2092 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002093 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002094 "exceptions must be strings, classes, or instances");
2095 goto raise_error;
2096 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002098 if (tb == NULL)
2099 return WHY_EXCEPTION;
2100 else
2101 return WHY_RERAISE;
2102 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 Py_XDECREF(value);
2104 Py_XDECREF(type);
2105 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002106 return WHY_EXCEPTION;
2107}
2108
Barry Warsawe42b18f1997-08-25 22:13:04 +00002109static int
2110unpack_sequence(v, argcnt, sp)
2111 PyObject *v;
2112 int argcnt;
2113 PyObject **sp;
2114{
2115 int i;
2116 PyObject *w;
2117
2118 for (i = 0; i < argcnt; i++) {
2119 if (! (w = PySequence_GetItem(v, i))) {
2120 if (PyErr_ExceptionMatches(PyExc_IndexError))
2121 PyErr_SetString(PyExc_ValueError,
2122 "unpack sequence of wrong size");
2123 goto finally;
2124 }
2125 *--sp = w;
2126 }
2127 /* we better get an IndexError now */
2128 if (PySequence_GetItem(v, i) == NULL) {
2129 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2130 PyErr_Clear();
2131 return 1;
2132 }
2133 /* some other exception occurred. fall through to finally */
2134 }
2135 else
2136 PyErr_SetString(PyExc_ValueError,
2137 "unpack sequence of wrong size");
2138 /* fall through */
2139finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002140 for (; i > 0; i--, sp++)
2141 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002142
2143 return 0;
2144}
2145
2146
Guido van Rossum96a42c81992-01-12 02:29:51 +00002147#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148static int
2149prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002151 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002153 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 if (PyObject_Print(v, stdout, 0) != 0)
2155 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002156 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002157 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002159#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002161static void
2162call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 PyObject **p_trace, **p_newtrace;
2164 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002165{
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002167 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002169 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 value = Py_None;
2171 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002172 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002174 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002176 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002177 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002180 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002182 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 Py_XDECREF(type);
2184 Py_XDECREF(value);
2185 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002187}
2188
2189static int
2190call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002192 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002193 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002194 may point to NULL variable;
2195 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002197 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002198 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002199{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002200 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002201 PyObject *args, *what;
2202 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002203
Guido van Rossuma027efa1997-05-05 20:56:21 +00002204 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002205 /* Don't do recursive traces */
2206 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002208 *p_newtrace = NULL;
2209 }
2210 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002211 }
2212
Guido van Rossumb209a111997-04-29 18:18:01 +00002213 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002214 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002215 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002217 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002218 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 Py_INCREF(f);
2220 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2221 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002222 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002223 arg = Py_None;
2224 Py_INCREF(arg);
2225 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002226 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002227 PyFrame_FastToLocals(f);
2228 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2229 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002230 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002231 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002232 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002233 if (res == NULL) {
2234 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002235 PyTraceBack_Here(f);
2236 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002237 *p_trace = NULL;
2238 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002239 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002240 *p_newtrace = NULL;
2241 }
Barry Warsawf6202631999-09-08 16:26:33 +00002242 /* to be extra double plus sure we don't get recursive
2243 * calls inf either tracefunc or profilefunc gets an
2244 * exception, zap the global variables.
2245 */
2246 Py_XDECREF(tstate->sys_tracefunc);
2247 tstate->sys_tracefunc = NULL;
2248 Py_XDECREF(tstate->sys_profilefunc);
2249 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002250 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002251 }
2252 else {
2253 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 Py_XDECREF(*p_newtrace);
2255 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002256 *p_newtrace = NULL;
2257 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002259 *p_newtrace = res;
2260 }
2261 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002263 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002264 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002265}
2266
Guido van Rossumb209a111997-04-29 18:18:01 +00002267PyObject *
2268PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002269{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002270 PyThreadState *tstate = PyThreadState_Get();
2271 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002272 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002273 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002274 else
2275 return current_frame->f_builtins;
2276}
2277
Guido van Rossumb209a111997-04-29 18:18:01 +00002278PyObject *
2279PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002280{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002281 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002282 if (current_frame == NULL)
2283 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002285 return current_frame->f_locals;
2286}
2287
Guido van Rossumb209a111997-04-29 18:18:01 +00002288PyObject *
2289PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002291 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292 if (current_frame == NULL)
2293 return NULL;
2294 else
2295 return current_frame->f_globals;
2296}
2297
Guido van Rossumb209a111997-04-29 18:18:01 +00002298PyObject *
2299PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002300{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002301 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002303}
2304
Guido van Rossum6135a871995-01-09 17:53:26 +00002305int
Guido van Rossumb209a111997-04-29 18:18:01 +00002306PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002307{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002308 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002309 return current_frame == NULL ? 0 : current_frame->f_restricted;
2310}
2311
Guido van Rossumbe270261997-05-22 22:26:18 +00002312int
Guido van Rossumb209a111997-04-29 18:18:01 +00002313Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314{
Guido van Rossumb209a111997-04-29 18:18:01 +00002315 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002316 if (f == NULL)
2317 return 0;
2318 if (!PyFile_SoftSpace(f, 0))
2319 return 0;
2320 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321}
2322
Guido van Rossum3f5da241990-12-20 15:06:42 +00002323
Guido van Rossum681d79a1995-07-18 14:51:37 +00002324/* External interface to call any callable object.
2325 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002326
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002327#undef PyEval_CallObject
2328/* for backward compatibility: export this interface */
2329
Guido van Rossumb209a111997-04-29 18:18:01 +00002330PyObject *
2331PyEval_CallObject(func, arg)
2332 PyObject *func;
2333 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002334{
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002337#define PyEval_CallObject(func,arg) \
2338 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002339
Guido van Rossumb209a111997-04-29 18:18:01 +00002340PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002342 PyObject *func;
2343 PyObject *arg;
2344 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002345{
2346 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002347 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002348
2349 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 arg = PyTuple_New(0);
2351 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002352 PyErr_SetString(PyExc_TypeError,
2353 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002354 return NULL;
2355 }
2356 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002357 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002358
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002360 PyErr_SetString(PyExc_TypeError,
2361 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002362 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002363 return NULL;
2364 }
2365
Guido van Rossum150b2df1996-12-05 23:17:11 +00002366 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002367 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002368 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002369 result = call_function(func, arg, kw);
2370 else
2371 result = call_builtin(func, arg, kw);
2372
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002374
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 if (result == NULL && !PyErr_Occurred())
2376 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002377 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002378
2379 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002380}
2381
Guido van Rossumb209a111997-04-29 18:18:01 +00002382static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002383call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 PyObject *func;
2385 PyObject *arg;
2386 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387{
Guido van Rossumb209a111997-04-29 18:18:01 +00002388 if (PyCFunction_Check(func)) {
2389 PyCFunction meth = PyCFunction_GetFunction(func);
2390 PyObject *self = PyCFunction_GetSelf(func);
2391 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002392 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002394 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002396 else if (size == 0)
2397 arg = NULL;
2398 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002399 if (flags & METH_KEYWORDS)
2400 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002401 if (kw != NULL && PyDict_Size(kw) != 0) {
2402 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002403 "this function takes no keyword arguments");
2404 return NULL;
2405 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002406 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 if (PyClass_Check(func)) {
2409 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 if (PyInstance_Check(func)) {
2412 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002413 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 PyErr_Clear();
2415 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002417 return NULL;
2418 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002419 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002421 return res;
2422 }
Guido van Rossumba98a421999-11-15 19:29:33 +00002423 PyErr_Format(PyExc_TypeError, "call of non-function (type %.400s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002424 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 return NULL;
2426}
2427
Guido van Rossumb209a111997-04-29 18:18:01 +00002428static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002429call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002430 PyObject *func;
2431 PyObject *arg;
2432 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433{
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 PyObject *class = NULL; /* == owner */
2435 PyObject *argdefs;
2436 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002439
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 if (kw != NULL && !PyDict_Check(kw)) {
2441 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002442 return NULL;
2443 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 if (PyMethod_Check(func)) {
2446 PyObject *self = PyMethod_Self(func);
2447 class = PyMethod_Class(func);
2448 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002449 if (self == NULL) {
2450 /* Unbound methods must be called with an instance of
2451 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 if (PyTuple_Size(arg) >= 1) {
2453 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002454 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 PyInstance_Check(self) &&
2456 PyClass_IsSubclass((PyObject *)
2457 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002458 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002459 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002460 else
2461 self = NULL;
2462 }
2463 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002465 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002466 return NULL;
2467 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002469 }
2470 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 int argcount = PyTuple_Size(arg);
2472 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002473 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002474 if (newarg == NULL)
2475 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002476 Py_INCREF(self);
2477 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002478 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002479 PyObject *v = PyTuple_GET_ITEM(arg, i);
2480 Py_XINCREF(v);
2481 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002482 }
2483 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002485 if (!PyFunction_Check(func)) {
2486 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2487 Py_DECREF(arg);
2488 return result;
2489 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
2491 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002493 PyErr_Format(PyExc_TypeError,
Guido van Rossum5db862d2000-04-10 12:46:51 +00002494 "call of non-function (type %.200s)",
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002495 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 return NULL;
2497 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002500
2501 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002502 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2503 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2504 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002505 }
2506 else {
2507 d = NULL;
2508 nd = 0;
2509 }
2510
2511 if (kw != NULL) {
2512 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 nk = PyDict_Size(kw);
2514 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002515 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 PyErr_NoMemory();
2517 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002518 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002519 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002520 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002521 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002522 i += 2;
2523 nk = i/2;
2524 /* XXX This is broken if the caller deletes dict items! */
2525 }
2526 else {
2527 k = NULL;
2528 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002529 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530
Guido van Rossum681d79a1995-07-18 14:51:37 +00002531 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 (PyCodeObject *)PyFunction_GetCode(func),
2533 PyFunction_GetGlobals(func), (PyObject *)NULL,
2534 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002535 k, nk,
2536 d, nd,
2537 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 Py_DECREF(arg);
Guido van Rossumb18618d2000-05-03 23:44:39 +00002540 if (k != NULL)
2541 PyMem_DEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542
Guido van Rossum681d79a1995-07-18 14:51:37 +00002543 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544}
2545
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002546#define SLICE_ERROR_MSG \
2547 "standard sequence type does not support step size other than one"
2548
Guido van Rossumb209a111997-04-29 18:18:01 +00002549static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002550loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002551 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552{
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002554 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002555 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002556 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 return NULL;
2558 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002559 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002560 v = (*sq->sq_item)(v, i);
2561 if (v)
2562 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002563 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002564 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002565 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566}
2567
Guido van Rossum20c6add2000-05-08 14:06:50 +00002568/* Extract a slice index from a PyInt or PyLong, the index is bound to
2569 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
2570 and error. Returns 1 on success.*/
2571
2572int
2573_PyEval_SliceIndex(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002574 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 int *pi;
2576{
2577 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002579 if (PyInt_Check(v)) {
2580 x = PyInt_AsLong(v);
2581 } else if (PyLong_Check(v)) {
2582 x = PyLong_AsLong(v);
2583 if (x==-1 && PyErr_Occurred()) {
2584 PyObject *long_zero;
2585
2586 if (!PyErr_ExceptionMatches( PyExc_OverflowError ) ) {
2587 /* It's not an overflow error, so just
2588 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00002589 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002590 }
2591
2592 /* It's an overflow error, so we need to
2593 check the sign of the long integer,
2594 set the value to INT_MAX or 0, and clear
2595 the error. */
2596
2597 /* Create a long integer with a value of 0 */
2598 long_zero = PyLong_FromLong( 0L );
Guido van Rossum20c6add2000-05-08 14:06:50 +00002599 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00002600
2601 /* Check sign */
2602 if (PyObject_Compare(long_zero, v) < 0)
2603 x = INT_MAX;
2604 else
2605 x = 0;
2606
2607 /* Free the long integer we created, and clear the
2608 OverflowError */
2609 Py_DECREF(long_zero);
2610 PyErr_Clear();
2611 }
2612 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002613 PyErr_SetString(PyExc_TypeError,
2614 "slice index must be int");
Guido van Rossum20c6add2000-05-08 14:06:50 +00002615 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 /* Truncate -- very long indices are truncated anyway */
2618 if (x > INT_MAX)
2619 x = INT_MAX;
2620 else if (x < -INT_MAX)
2621 x = 0;
2622 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00002624 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625}
2626
Guido van Rossumb209a111997-04-29 18:18:01 +00002627static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002628apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002629 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002631 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002632 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002634 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00002635 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002636 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002638
2639static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002643 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002644 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002645 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00002646 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002647 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002648 if (x == NULL)
2649 return PySequence_DelSlice(u, ilow, ihigh);
2650 else
2651 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652}
2653
Guido van Rossumb209a111997-04-29 18:18:01 +00002654static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002655cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002656 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 register PyObject *v;
2658 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659{
2660 register int cmp;
2661 register int res = 0;
2662 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002663 case IS:
2664 case IS_NOT:
2665 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002666 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 res = !res;
2668 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669 case IN:
2670 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002671 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002672 if (res < 0)
2673 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002674 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002675 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 break;
2677 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002678 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679 break;
2680 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002682 if (cmp && PyErr_Occurred())
2683 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002684 switch (op) {
2685 case LT: res = cmp < 0; break;
2686 case LE: res = cmp <= 0; break;
2687 case EQ: res = cmp == 0; break;
2688 case NE: res = cmp != 0; break;
2689 case GT: res = cmp > 0; break;
2690 case GE: res = cmp >= 0; break;
2691 /* XXX no default? (res is initialized to 0 though) */
2692 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 v = res ? Py_True : Py_False;
2695 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 return v;
2697}
2698
Guido van Rossum3f5da241990-12-20 15:06:42 +00002699static int
2700import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 PyObject *locals;
2702 PyObject *v;
2703 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002704{
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 PyObject *w, *x;
2706 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002707 PyErr_SetString(PyExc_TypeError,
2708 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002709 return -1;
2710 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 w = PyModule_GetDict(v);
2712 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002713 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002714 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002715 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 while (PyDict_Next(w, &pos, &name, &value)) {
2717 if (!PyString_Check(name) ||
2718 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002719 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002720 Py_INCREF(value);
2721 err = PyDict_SetItem(locals, name, value);
2722 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002723 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002724 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002725 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002726 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002727 }
2728 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 if (x == NULL) {
Jeremy Hylton76901512000-03-28 23:49:17 +00002731 PyErr_Format(PyExc_ImportError,
2732 "cannot import name %.230s",
2733 PyString_AsString(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002734 return -1;
2735 }
2736 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002738 }
2739}
2740
Guido van Rossumb209a111997-04-29 18:18:01 +00002741static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002742build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 PyObject *methods; /* dictionary */
2744 PyObject *bases; /* tuple containing classes */
2745 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002746{
Guido van Rossumcd649651997-08-22 16:56:16 +00002747 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002749 PyErr_SetString(PyExc_SystemError,
2750 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002751 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002752 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002753 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002754 PyErr_SetString(PyExc_SystemError,
2755 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002756 return NULL;
2757 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002759 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00002760 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002761 return NULL;
2762 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002763 n = PyTuple_Size(bases);
2764 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 PyObject *base = PyTuple_GET_ITEM(bases, i);
2766 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002767 /* Call the base's *type*, if it is callable.
2768 This code is a hook for Donald Beaudry's
2769 and Jim Fulton's type extensions. In
2770 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002771 since its types are not callable.
2772 Ditto: call the bases's *class*, if it has
2773 one. This makes the same thing possible
2774 without writing C code. A true meta-object
2775 protocol! */
2776 PyObject *basetype = (PyObject *)base->ob_type;
2777 PyObject *callable = NULL;
2778 if (PyCallable_Check(basetype))
2779 callable = basetype;
2780 else
2781 callable = PyObject_GetAttrString(
2782 base, "__class__");
2783 if (callable) {
2784 PyObject *args;
2785 PyObject *newclass = NULL;
2786 args = Py_BuildValue(
2787 "(OOO)", name, bases, methods);
2788 if (args != NULL) {
2789 newclass = PyEval_CallObject(
2790 callable, args);
2791 Py_DECREF(args);
2792 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002793 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002794 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002795 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002796 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002797 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002798 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002799 "base is not a class object");
2800 return NULL;
2801 }
2802 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002804}
2805
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002806static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002807exec_statement(f, prog, globals, locals)
2808 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyObject *prog;
2810 PyObject *globals;
2811 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002812{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002813 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002815 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002816
Guido van Rossumb209a111997-04-29 18:18:01 +00002817 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2818 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002819 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002821 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 locals = PyTuple_GetItem(prog, 2);
2823 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002824 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 if (globals == Py_None) {
2826 globals = PyEval_GetGlobals();
2827 if (locals == Py_None) {
2828 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002829 plain = 1;
2830 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002831 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002833 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 if (!PyString_Check(prog) &&
2835 !PyCode_Check(prog) &&
2836 !PyFile_Check(prog)) {
2837 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002838 "exec 1st arg must be string, code or file object");
2839 return -1;
2840 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2842 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002843 "exec 2nd/3rd args must be dict or None");
2844 return -1;
2845 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002846 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002847 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002848 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002849 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002850 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002851 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002852 FILE *fp = PyFile_AsFile(prog);
2853 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002854 v = PyRun_File(fp, name, Py_file_input, globals, locals);
2855 }
2856 else {
2857 char *s = PyString_AsString(prog);
Guido van Rossum582acec2000-06-28 22:07:35 +00002858 if (strlen(s) != (size_t)PyString_Size(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002859 PyErr_SetString(PyExc_ValueError,
2860 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002861 return -1;
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002862 }
2863 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002864 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00002865 if (plain)
2866 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002867 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002868 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002869 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002870 return 0;
2871}
Guido van Rossum24c13741995-02-14 09:42:43 +00002872
Guido van Rossum1aa14831997-01-21 05:34:20 +00002873/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002874static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002875find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002876 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002877 int nexti;
2878{
2879 int opcode;
2880 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002881 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002882 unsigned char *next_instr;
2883
Guido van Rossumd076c731998-10-07 19:42:25 +00002884 _PyCode_GETCODEPTR(f->f_code, &next_instr);
2885 next_instr += nexti;
2886
Guido van Rossum24c13741995-02-14 09:42:43 +00002887 opcode = (*next_instr++);
2888 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002889 Py_INCREF(Py_None);
2890 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002891 }
2892
Guido van Rossumb209a111997-04-29 18:18:01 +00002893 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002894 if (list == NULL)
2895 return NULL;
2896
2897 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002898 oparg = (next_instr[1]<<8) + next_instr[0];
2899 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002900 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002901 if (PyList_Append(list, name) < 0) {
2902 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002903 break;
2904 }
2905 opcode = (*next_instr++);
2906 } while (opcode == IMPORT_FROM);
2907
2908 return list;
2909}
Guido van Rossum950361c1997-01-24 13:49:28 +00002910
2911
2912#ifdef DYNAMIC_EXECUTION_PROFILE
2913
2914PyObject *
2915getarray(a)
2916 long a[256];
2917{
2918 int i;
2919 PyObject *l = PyList_New(256);
2920 if (l == NULL) return NULL;
2921 for (i = 0; i < 256; i++) {
2922 PyObject *x = PyInt_FromLong(a[i]);
2923 if (x == NULL) {
2924 Py_DECREF(l);
2925 return NULL;
2926 }
2927 PyList_SetItem(l, i, x);
2928 }
2929 for (i = 0; i < 256; i++)
2930 a[i] = 0;
2931 return l;
2932}
2933
2934PyObject *
2935_Py_GetDXProfile(self, args)
2936 PyObject *self, *args;
2937{
2938#ifndef DXPAIRS
2939 return getarray(dxp);
2940#else
2941 int i;
2942 PyObject *l = PyList_New(257);
2943 if (l == NULL) return NULL;
2944 for (i = 0; i < 257; i++) {
2945 PyObject *x = getarray(dxpairs[i]);
2946 if (x == NULL) {
2947 Py_DECREF(l);
2948 return NULL;
2949 }
2950 PyList_SetItem(l, i, x);
2951 }
2952 return l;
2953#endif
2954}
2955
2956#endif