blob: fb179d1aa6e1a18724ce7f4d98a10ae038439d1c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossumb209a111997-04-29 18:18:01 +000040#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
46
Guido van Rossumc6004111993-11-05 10:22:19 +000047#include <ctype.h>
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049#ifdef HAVE_LIMITS_H
50#include <limits.h>
51#else
52#define INT_MAX 2147483647
53#endif
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossum408027e1996-12-30 16:17:54 +000058#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000059/* For debugging the interpreter: */
60#define LLTRACE 1 /* Low-level trace feature */
61#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062#endif
63
Guido van Rossum5b722181993-03-30 17:46:03 +000064
Guido van Rossum374a9221991-04-04 10:40:29 +000065/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
68 PyObject *, PyObject *,
69 PyObject **, int,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000073#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000074static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000076static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
77 PyFrameObject *));
78static int call_trace Py_PROTO((PyObject **, PyObject **,
79 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000080static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
81static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000082static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000083static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000084static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000085static int assign_slice Py_PROTO((PyObject *, PyObject *,
86 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000087static int cmp_member Py_PROTO((PyObject *, PyObject *));
88static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
89static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
90static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000091static int exec_statement Py_PROTO((PyFrameObject *,
92 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000093static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000094static void set_exc_info Py_PROTO((PyThreadState *,
95 PyObject *, PyObject *, PyObject *));
96static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000097
98
Guido van Rossum950361c1997-01-24 13:49:28 +000099/* Dynamic execution profile */
100#ifdef DYNAMIC_EXECUTION_PROFILE
101#ifdef DXPAIRS
102static long dxpairs[257][256];
103#define dxp dxpairs[256]
104#else
105static long dxp[256];
106#endif
107#endif
108
109
Guido van Rossume59214e1994-08-30 08:01:59 +0000110#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112#include <errno.h>
113#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000114
Guido van Rossuma027efa1997-05-05 20:56:21 +0000115extern int _PyThread_Started; /* Flag for Py_Exit */
116
Guido van Rossuma9672091994-09-14 13:31:22 +0000117static type_lock interpreter_lock = 0;
118static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119
120void
Guido van Rossumb209a111997-04-29 18:18:01 +0000121PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000124 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125 _PyThread_Started = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126 interpreter_lock = allocate_lock();
127 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000128 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000130
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132PyEval_AcquireLock()
133{
134 acquire_lock(interpreter_lock, 1);
135}
136
137void
138PyEval_ReleaseLock()
139{
140 release_lock(interpreter_lock);
141}
142
143void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000144PyEval_AcquireThread(tstate)
145 PyThreadState *tstate;
146{
147 if (tstate == NULL)
148 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
149 acquire_lock(interpreter_lock, 1);
150 if (PyThreadState_Swap(tstate) != NULL)
151 Py_FatalError(
152 "PyEval_AcquireThread: non-NULL old thread state");
153}
154
155void
156PyEval_ReleaseThread(tstate)
157 PyThreadState *tstate;
158{
159 if (tstate == NULL)
160 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
161 if (PyThreadState_Swap(NULL) != tstate)
162 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
163 release_lock(interpreter_lock);
164}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165#endif
166
Guido van Rossumff4949e1992-08-05 19:58:53 +0000167/* Functions save_thread and restore_thread are always defined so
168 dynamically loaded modules needn't be compiled separately for use
169 with and without threads: */
170
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000171PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000172PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000174 PyThreadState *tstate = PyThreadState_Swap(NULL);
175 if (tstate == NULL)
176 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000177#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000178 if (interpreter_lock)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179 release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000180#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000181 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182}
183
184void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000185PyEval_RestoreThread(tstate)
186 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000188 if (tstate == NULL)
189 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000190#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000192 int err = errno;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000193 acquire_lock(interpreter_lock, 1);
194 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000195 }
196#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000197 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198}
199
200
Guido van Rossuma9672091994-09-14 13:31:22 +0000201/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
202 signal handlers or Mac I/O completion routines) can schedule calls
203 to a function to be called synchronously.
204 The synchronous function is called with one void* argument.
205 It should return 0 for success or -1 for failure -- failure should
206 be accompanied by an exception.
207
208 If registry succeeds, the registry function returns 0; if it fails
209 (e.g. due to too many pending calls) it returns -1 (without setting
210 an exception condition).
211
212 Note that because registry may occur from within signal handlers,
213 or other asynchronous events, calling malloc() is unsafe!
214
215#ifdef WITH_THREAD
216 Any thread can schedule pending calls, but only the main thread
217 will execute them.
218#endif
219
220 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
221 There are two possible race conditions:
222 (1) nested asynchronous registry calls;
223 (2) registry calls made while pending calls are being processed.
224 While (1) is very unlikely, (2) is a real possibility.
225 The current code is safe against (2), but not against (1).
226 The safety against (2) is derived from the fact that only one
227 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000228
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229 XXX Darn! With the advent of thread state, we should have an array
230 of pending calls per thread in the thread state! Later...
231*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000232
Guido van Rossuma9672091994-09-14 13:31:22 +0000233#define NPENDINGCALLS 32
234static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000235 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000236 ANY *arg;
237} pendingcalls[NPENDINGCALLS];
238static volatile int pendingfirst = 0;
239static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000240static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000241
242int
243Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000244 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000245 ANY *arg;
246{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000247 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 int i, j;
249 /* XXX Begin critical section */
250 /* XXX If you want this to be safe against nested
251 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000252 if (busy)
253 return -1;
254 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000255 i = pendinglast;
256 j = (i + 1) % NPENDINGCALLS;
257 if (j == pendingfirst)
258 return -1; /* Queue full */
259 pendingcalls[i].func = func;
260 pendingcalls[i].arg = arg;
261 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 /* XXX End critical section */
265 return 0;
266}
267
Guido van Rossum180d7b41994-09-29 09:45:57 +0000268int
269Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000270{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000272#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000273 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 return 0;
275#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000276 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000277 return 0;
278 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000279 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000280 for (;;) {
281 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000282 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000283 ANY *arg;
284 i = pendingfirst;
285 if (i == pendinglast)
286 break; /* Queue empty */
287 func = pendingcalls[i].func;
288 arg = pendingcalls[i].arg;
289 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000290 if (func(arg) < 0) {
291 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000292 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000293 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000294 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000295 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000296 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000297 return 0;
298}
299
300
Guido van Rossum374a9221991-04-04 10:40:29 +0000301/* Status code for main loop (reason for stack unwind) */
302
303enum why_code {
304 WHY_NOT, /* No error */
305 WHY_EXCEPTION, /* Exception occurred */
306 WHY_RERAISE, /* Exception re-raised by 'finally' */
307 WHY_RETURN, /* 'return' statement */
308 WHY_BREAK /* 'break' statement */
309};
310
Guido van Rossumb209a111997-04-29 18:18:01 +0000311static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Barry Warsawe42b18f1997-08-25 22:13:04 +0000312static int unpack_sequence Py_PROTO((PyObject *, int, PyObject **));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000313
Guido van Rossum374a9221991-04-04 10:40:29 +0000314
Guido van Rossum681d79a1995-07-18 14:51:37 +0000315/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000316
Guido van Rossumb209a111997-04-29 18:18:01 +0000317PyObject *
318PyEval_EvalCode(co, globals, locals)
319 PyCodeObject *co;
320 PyObject *globals;
321 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000322{
323 return eval_code2(co,
324 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000325 (PyObject **)NULL, 0,
326 (PyObject **)NULL, 0,
327 (PyObject **)NULL, 0,
328 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000329}
330
331
332/* Interpreter main loop */
333
Guido van Rossum8861b741996-07-30 16:49:37 +0000334#ifndef MAX_RECURSION_DEPTH
335#define MAX_RECURSION_DEPTH 10000
336#endif
337
Guido van Rossumb209a111997-04-29 18:18:01 +0000338static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000339eval_code2(co, globals, locals,
340 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 PyCodeObject *co;
342 PyObject *globals;
343 PyObject *locals;
344 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000345 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000346 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000347 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000348 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000349 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000350 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000351{
Guido van Rossum950361c1997-01-24 13:49:28 +0000352#ifdef DXPAIRS
353 int lastopcode = 0;
354#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000355 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000356 register int opcode = 0; /* Current opcode */
357 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000358 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000359 register enum why_code why; /* Reason for block stack unwind */
360 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000361 register PyObject *x; /* Result object -- NULL if error */
362 register PyObject *v; /* Temporary objects popped off stack */
363 register PyObject *w;
364 register PyObject *u;
365 register PyObject *t;
366 register PyFrameObject *f; /* Current frame */
367 register PyObject **fastlocals = NULL;
368 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000369 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000370#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000371 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000373#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000374 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000375 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000376#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000377
378/* Code access macros */
379
380#define GETCONST(i) Getconst(f, i)
381#define GETNAME(i) Getname(f, i)
382#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000383#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000384#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
385#define NEXTOP() (*next_instr++)
386#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
387#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
388#define JUMPBY(x) (next_instr += (x))
389
390/* Stack manipulation macros */
391
392#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
393#define EMPTY() (STACK_LEVEL() == 0)
394#define TOP() (stack_pointer[-1])
395#define BASIC_PUSH(v) (*stack_pointer++ = (v))
396#define BASIC_POP() (*--stack_pointer)
397
Guido van Rossum96a42c81992-01-12 02:29:51 +0000398#ifdef LLTRACE
399#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
400#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000401#else
402#define PUSH(v) BASIC_PUSH(v)
403#define POP() BASIC_POP()
404#endif
405
Guido van Rossum681d79a1995-07-18 14:51:37 +0000406/* Local variable macros */
407
408#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000409#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000410 GETLOCAL(i) = value; } while (0)
411
Guido van Rossuma027efa1997-05-05 20:56:21 +0000412/* Start of code */
413
Guido van Rossum8861b741996-07-30 16:49:37 +0000414#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000416 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000417 return NULL;
418 }
419#endif
420
Guido van Rossum681d79a1995-07-18 14:51:37 +0000421 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000422 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000423 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000424 }
425
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000426#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000427 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000428#endif
429
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000431 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 co, /*code*/
433 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000434 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000435 if (f == NULL)
436 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437
Guido van Rossuma027efa1997-05-05 20:56:21 +0000438 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000439 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440
441 if (co->co_argcount > 0 ||
442 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
443 int i;
444 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 if (kwdict == NULL)
449 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000450 i = co->co_argcount;
451 if (co->co_flags & CO_VARARGS)
452 i++;
453 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000454 }
455 if (argcount > co->co_argcount) {
456 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000457 PyErr_SetString(PyExc_TypeError,
458 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 goto fail;
460 }
461 n = co->co_argcount;
462 }
463 for (i = 0; i < n; i++) {
464 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 SETLOCAL(i, x);
467 }
468 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000470 if (u == NULL)
471 goto fail;
472 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 for (i = n; i < argcount; i++) {
474 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 Py_INCREF(x);
476 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 }
479 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 PyObject *keyword = kws[2*i];
481 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 int j;
483 /* XXX slow -- speed up using dictionary? */
484 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000485 PyObject *nm = PyTuple_GET_ITEM(
486 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 break;
489 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000490 /* Check errors from Compare */
491 if (PyErr_Occurred())
492 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000493 if (j >= co->co_argcount) {
494 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000495 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000496 "unexpected keyword argument: %.400s",
497 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 goto fail;
499 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000500 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 }
502 else {
503 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000504 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 "keyword parameter redefined");
506 goto fail;
507 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000508 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 SETLOCAL(j, value);
510 }
511 }
512 if (argcount < co->co_argcount) {
513 int m = co->co_argcount - defcount;
514 for (i = argcount; i < m; i++) {
515 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000516 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517 "not enough arguments");
518 goto fail;
519 }
520 }
521 if (n > m)
522 i = n - m;
523 else
524 i = 0;
525 for (; i < defcount; i++) {
526 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000527 PyObject *def = defs[i];
528 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 SETLOCAL(m+i, def);
530 }
531 }
532 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000533 }
534 else {
535 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000536 PyErr_SetString(PyExc_TypeError,
537 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000538 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000539 }
540 }
541
Guido van Rossuma027efa1997-05-05 20:56:21 +0000542 if (tstate->sys_tracefunc != NULL) {
543 /* tstate->sys_tracefunc, if defined, is a function that
544 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000545 Its return value, if not None, is a function that
546 will be called at the start of each executed line
547 of code. (Actually, the function must return
548 itself in order to continue tracing.)
549 The trace functions are called with three arguments:
550 a pointer to the current frame, a string indicating
551 why the function is called, and an argument which
552 depends on the situation. The global trace function
553 (sys.trace) is also called whenever an exception
554 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000555 if (call_trace(&tstate->sys_tracefunc,
556 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000557 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000558 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000559 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000560 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000561 }
562
Guido van Rossuma027efa1997-05-05 20:56:21 +0000563 if (tstate->sys_profilefunc != NULL) {
564 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000565 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (call_trace(&tstate->sys_profilefunc,
567 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000568 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000569 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000570 }
571 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000572
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
576 "Maximum recursion depth exceeded");
577 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000578 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000579 return NULL;
580 }
581
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000582 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000583 stack_pointer = f->f_valuestack;
584
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 why = WHY_NOT;
586 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000587 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000588
589 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000590 /* Do periodic things. Doing this every time through
591 the loop would add too much overhead, so we do it
592 only every Nth instruction. We also do it if
593 ``things_to_do'' is set, i.e. when an asynchronous
594 event needs attention (e.g. a signal handler or
595 async I/O handler); see Py_AddPendingCall() and
596 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000597
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000599 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000601 if (Py_MakePendingCalls() < 0) {
602 why = WHY_EXCEPTION;
603 goto on_error;
604 }
605 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000606#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000607 /* If we have true signals, the signal handler
608 will call Py_AddPendingCall() so we don't
609 have to call sigcheck(). On the Mac and
610 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000611 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000612 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000613 goto on_error;
614 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000615#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616
Guido van Rossume59214e1994-08-30 08:01:59 +0000617#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000618 if (interpreter_lock) {
619 /* Give another thread a chance */
620
Guido van Rossum25ce5661997-08-02 03:10:38 +0000621 if (PyThreadState_Swap(NULL) != tstate)
622 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000623 release_lock(interpreter_lock);
624
625 /* Other threads may run now */
626
627 acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000628 if (PyThreadState_Swap(tstate) != NULL)
629 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000630 }
631#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000635
Guido van Rossum408027e1996-12-30 16:17:54 +0000636#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000637 f->f_lasti = INSTR_OFFSET();
638#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000639
640 opcode = NEXTOP();
641 if (HAS_ARG(opcode))
642 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000643#ifdef DYNAMIC_EXECUTION_PROFILE
644#ifdef DXPAIRS
645 dxpairs[lastopcode][opcode]++;
646 lastopcode = opcode;
647#endif
648 dxp[opcode]++;
649#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000650
Guido van Rossum96a42c81992-01-12 02:29:51 +0000651#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000652 /* Instruction tracing */
653
Guido van Rossum96a42c81992-01-12 02:29:51 +0000654 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000655 if (HAS_ARG(opcode)) {
656 printf("%d: %d, %d\n",
657 (int) (INSTR_OFFSET() - 3),
658 opcode, oparg);
659 }
660 else {
661 printf("%d: %d\n",
662 (int) (INSTR_OFFSET() - 1), opcode);
663 }
664 }
665#endif
666
667 /* Main switch on opcode */
668
669 switch (opcode) {
670
671 /* BEWARE!
672 It is essential that any operation that fails sets either
673 x to NULL, err to nonzero, or why to anything but WHY_NOT,
674 and that no operation that succeeds does this! */
675
676 /* case STOP_CODE: this is an error! */
677
678 case POP_TOP:
679 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000680 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000681 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000682
683 case ROT_TWO:
684 v = POP();
685 w = POP();
686 PUSH(v);
687 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000688 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000689
690 case ROT_THREE:
691 v = POP();
692 w = POP();
693 x = POP();
694 PUSH(v);
695 PUSH(x);
696 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000697 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000698
699 case DUP_TOP:
700 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000701 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000703 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000704
705 case UNARY_POSITIVE:
706 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000707 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000708 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 break;
712
713 case UNARY_NEGATIVE:
714 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000715 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000716 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000718 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 break;
720
721 case UNARY_NOT:
722 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000723 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000724 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000725 if (err == 0) {
726 Py_INCREF(Py_True);
727 PUSH(Py_True);
728 continue;
729 }
730 else if (err > 0) {
731 Py_INCREF(Py_False);
732 PUSH(Py_False);
733 err = 0;
734 continue;
735 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 break;
737
738 case UNARY_CONVERT:
739 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000740 x = PyObject_Repr(v);
741 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000743 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000745
746 case UNARY_INVERT:
747 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000748 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000749 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000750 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000751 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000753
Guido van Rossum50564e81996-01-12 01:13:16 +0000754 case BINARY_POWER:
755 w = POP();
756 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000757 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000758 Py_DECREF(v);
759 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000760 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000761 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000762 break;
763
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 case BINARY_MULTIPLY:
765 w = POP();
766 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000767 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000768 Py_DECREF(v);
769 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000771 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 break;
773
774 case BINARY_DIVIDE:
775 w = POP();
776 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000777 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000778 Py_DECREF(v);
779 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000780 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000781 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 break;
783
784 case BINARY_MODULO:
785 w = POP();
786 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000787 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000788 Py_DECREF(v);
789 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000791 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 break;
793
794 case BINARY_ADD:
795 w = POP();
796 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000797 if (PyInt_Check(v) && PyInt_Check(w)) {
798 /* INLINE: int + int */
799 register long a, b, i;
800 a = ((PyIntObject*) v)->ob_ival;
801 b = ((PyIntObject*) w)->ob_ival;
802 i = a + b;
803 if ((i^a) < 0 && (i^b) < 0) {
804 PyErr_SetString(PyExc_OverflowError,
805 "integer addition");
806 x = NULL;
807 }
808 else
809 x = PyInt_FromLong(i);
810 }
811 else
812 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000813 Py_DECREF(v);
814 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 break;
818
819 case BINARY_SUBTRACT:
820 w = POP();
821 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000822 if (PyInt_Check(v) && PyInt_Check(w)) {
823 /* INLINE: int - int */
824 register long a, b, i;
825 a = ((PyIntObject*) v)->ob_ival;
826 b = ((PyIntObject*) w)->ob_ival;
827 i = a - b;
828 if ((i^a) < 0 && (i^~b) < 0) {
829 PyErr_SetString(PyExc_OverflowError,
830 "integer subtraction");
831 x = NULL;
832 }
833 else
834 x = PyInt_FromLong(i);
835 }
836 else
837 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 Py_DECREF(v);
839 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 break;
843
844 case BINARY_SUBSCR:
845 w = POP();
846 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000847 if (PyList_Check(v) && PyInt_Check(w)) {
848 /* INLINE: list[int] */
849 long i = PyInt_AsLong(w);
850 if (i < 0)
851 i += ((PyListObject*) v)->ob_size;
852 if (i < 0 ||
853 i >= ((PyListObject*) v)->ob_size) {
854 PyErr_SetString(PyExc_IndexError,
855 "list index out of range");
856 x = NULL;
857 }
858 else {
859 x = ((PyListObject*) v)->ob_item[i];
860 Py_INCREF(x);
861 }
862 }
863 else
864 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000865 Py_DECREF(v);
866 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000868 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
870
Guido van Rossum7928cd71991-10-24 14:59:31 +0000871 case BINARY_LSHIFT:
872 w = POP();
873 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000874 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000875 Py_DECREF(v);
876 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000877 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000878 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 break;
880
881 case BINARY_RSHIFT:
882 w = POP();
883 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000884 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000885 Py_DECREF(v);
886 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000887 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000888 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889 break;
890
891 case BINARY_AND:
892 w = POP();
893 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000894 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000895 Py_DECREF(v);
896 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000897 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000898 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000899 break;
900
901 case BINARY_XOR:
902 w = POP();
903 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000904 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000905 Py_DECREF(v);
906 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000907 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000908 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000909 break;
910
911 case BINARY_OR:
912 w = POP();
913 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000914 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000915 Py_DECREF(v);
916 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000917 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000918 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000919 break;
920
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 case SLICE+0:
922 case SLICE+1:
923 case SLICE+2:
924 case SLICE+3:
925 if ((opcode-SLICE) & 2)
926 w = POP();
927 else
928 w = NULL;
929 if ((opcode-SLICE) & 1)
930 v = POP();
931 else
932 v = NULL;
933 u = POP();
934 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 Py_DECREF(u);
936 Py_XDECREF(v);
937 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000939 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 break;
941
942 case STORE_SLICE+0:
943 case STORE_SLICE+1:
944 case STORE_SLICE+2:
945 case STORE_SLICE+3:
946 if ((opcode-STORE_SLICE) & 2)
947 w = POP();
948 else
949 w = NULL;
950 if ((opcode-STORE_SLICE) & 1)
951 v = POP();
952 else
953 v = NULL;
954 u = POP();
955 t = POP();
956 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000957 Py_DECREF(t);
958 Py_DECREF(u);
959 Py_XDECREF(v);
960 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000961 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 break;
963
964 case DELETE_SLICE+0:
965 case DELETE_SLICE+1:
966 case DELETE_SLICE+2:
967 case DELETE_SLICE+3:
968 if ((opcode-DELETE_SLICE) & 2)
969 w = POP();
970 else
971 w = NULL;
972 if ((opcode-DELETE_SLICE) & 1)
973 v = POP();
974 else
975 v = NULL;
976 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000977 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 Py_DECREF(u);
980 Py_XDECREF(v);
981 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000982 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
984
985 case STORE_SUBSCR:
986 w = POP();
987 v = POP();
988 u = POP();
989 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000990 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000991 Py_DECREF(u);
992 Py_DECREF(v);
993 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000994 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 break;
996
997 case DELETE_SUBSCR:
998 w = POP();
999 v = POP();
1000 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001001 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001002 Py_DECREF(v);
1003 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001004 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001005 break;
1006
1007 case PRINT_EXPR:
1008 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001009 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +00001010 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +00001011 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001012 (err = PyDict_SetItemString(
Guido van Rossum9cc8a201997-07-19 19:55:50 +00001013 f->f_builtins, "_", v)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001014 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001015 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001016 x = PySys_GetObject("stdout");
1017 if (x == NULL)
1018 err = -1;
1019 }
1020 if (err == 0)
1021 err = PyFile_WriteObject(v, x, 0);
1022 if (err == 0) {
1023 PyFile_SoftSpace(x, 1);
1024 err = Py_FlushLine();
1025 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 break;
1029
1030 case PRINT_ITEM:
1031 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 w = PySys_GetObject("stdout");
1033 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 Rossum0aa9ee61996-12-10 18:07:35 +00001077 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001078 break;
1079 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001080 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001081 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001083 break;
1084 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001085 break;
1086
1087 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001088 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001089 PyErr_SetString(PyExc_SystemError,
1090 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001091 break;
1092 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001093 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001094 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 break;
1096
1097 case RETURN_VALUE:
1098 retval = POP();
1099 why = WHY_RETURN;
1100 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001101
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001102 case EXEC_STMT:
1103 w = POP();
1104 v = POP();
1105 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001106 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001107 Py_DECREF(u);
1108 Py_DECREF(v);
1109 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001110 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001111
Guido van Rossum374a9221991-04-04 10:40:29 +00001112 case POP_BLOCK:
1113 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001114 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001115 while (STACK_LEVEL() > b->b_level) {
1116 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001117 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 }
1119 }
1120 break;
1121
1122 case END_FINALLY:
1123 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001124 if (PyInt_Check(v)) {
1125 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 if (why == WHY_RETURN)
1127 retval = POP();
1128 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001129 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001131 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001132 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001134 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001136 else if (v != Py_None) {
1137 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 "'finally' pops bad exception");
1139 why = WHY_EXCEPTION;
1140 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001141 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 break;
1143
1144 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001145 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001147 w = POP();
1148 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001150 Py_DECREF(u);
1151 Py_DECREF(v);
1152 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 break;
1154
1155 case STORE_NAME:
1156 w = GETNAMEV(oparg);
1157 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001158 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001159 PyErr_SetString(PyExc_SystemError,
1160 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001161 break;
1162 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001163 err = PyDict_SetItem(x, w, v);
1164 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 break;
1166
1167 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001168 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001169 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001170 PyErr_SetString(PyExc_SystemError,
1171 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001172 break;
1173 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001174 if ((err = PyDict_DelItem(x, w)) != 0)
1175 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001176 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001177
1178#ifdef CASE_TOO_BIG
1179 default: switch (opcode) {
1180#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001181
1182 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 case UNPACK_LIST:
1184 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001185 if (PyTuple_Check(v)) {
1186 if (PyTuple_Size(v) != oparg) {
1187 PyErr_SetString(PyExc_ValueError,
1188 "unpack tuple of wrong size");
1189 why = WHY_EXCEPTION;
1190 }
1191 else {
1192 for (; --oparg >= 0; ) {
1193 w = PyTuple_GET_ITEM(v, oparg);
1194 Py_INCREF(w);
1195 PUSH(w);
1196 }
1197 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001199 else if (PyList_Check(v)) {
1200 if (PyList_Size(v) != oparg) {
1201 PyErr_SetString(PyExc_ValueError,
1202 "unpack list of wrong size");
1203 why = WHY_EXCEPTION;
1204 }
1205 else {
1206 for (; --oparg >= 0; ) {
1207 w = PyList_GET_ITEM(v, oparg);
1208 Py_INCREF(w);
1209 PUSH(w);
1210 }
1211 }
1212 }
1213 else if (PySequence_Check(v)) {
1214 if (unpack_sequence(v, oparg,
1215 stack_pointer + oparg))
1216 stack_pointer += oparg;
1217 else
1218 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001219 }
1220 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001221 PyErr_SetString(PyExc_TypeError,
1222 "unpack non-sequence");
1223 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001225 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 break;
1227
1228 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001229 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 v = POP();
1231 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001232 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1233 Py_DECREF(v);
1234 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 break;
1236
1237 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001238 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001240 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1241 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001242 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
1244
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001245 case STORE_GLOBAL:
1246 w = GETNAMEV(oparg);
1247 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 err = PyDict_SetItem(f->f_globals, w, v);
1249 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001250 break;
1251
1252 case DELETE_GLOBAL:
1253 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001254 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1255 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001256 break;
1257
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 case LOAD_CONST:
1259 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 PUSH(x);
1262 break;
1263
1264 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001265 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001266 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001267 PyErr_SetString(PyExc_SystemError,
1268 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001269 break;
1270 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001273 PyErr_Clear();
1274 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 PyErr_Clear();
1277 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001279 PyErr_SetObject(
1280 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 break;
1282 }
1283 }
1284 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 PUSH(x);
1287 break;
1288
1289 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001290 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 PyErr_Clear();
1294 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 break;
1298 }
1299 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001300 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 PUSH(x);
1302 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303
Guido van Rossum9bfef441993-03-29 10:43:31 +00001304 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001305 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001306 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 PyErr_SetObject(PyExc_NameError,
1308 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001309 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001310 break;
1311 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001313 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001314 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001315 break;
1316
1317 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001318 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001320 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001321
1322 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001323 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001324 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001325
1326 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 if (x != NULL) {
1329 for (; --oparg >= 0;) {
1330 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 }
1333 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001334 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 }
1336 break;
1337
1338 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 if (x != NULL) {
1341 for (; --oparg >= 0;) {
1342 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 if (err != 0)
1345 break;
1346 }
1347 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001348 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 }
1350 break;
1351
1352 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001355 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 break;
1357
1358 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001359 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 x = PyObject_GetAttr(v, w);
1362 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001364 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
1366
1367 case COMPARE_OP:
1368 w = POP();
1369 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001370 if (PyInt_Check(v) && PyInt_Check(w)) {
1371 /* INLINE: cmp(int, int) */
1372 register long a, b;
1373 register int res;
1374 a = ((PyIntObject*) v)->ob_ival;
1375 b = ((PyIntObject*) w)->ob_ival;
1376 switch (oparg) {
1377 case LT: res = a < b; break;
1378 case LE: res = a <= b; break;
1379 case EQ: res = a == b; break;
1380 case NE: res = a != b; break;
1381 case GT: res = a > b; break;
1382 case GE: res = a >= b; break;
1383 case IS: res = v == w; break;
1384 case IS_NOT: res = v != w; break;
1385 default: goto slow_compare;
1386 }
1387 x = res ? Py_True : Py_False;
1388 Py_INCREF(x);
1389 }
1390 else {
1391 slow_compare:
1392 x = cmp_outcome(oparg, v, w);
1393 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001394 Py_DECREF(v);
1395 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001397 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 break;
1399
1400 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001401 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001403 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001405 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 break;
1407 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001408 u = find_from_args(f, INSTR_OFFSET());
1409 if (u == NULL) {
1410 x = u;
1411 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001414 w,
1415 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001416 f->f_locals == NULL ?
1417 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001418 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001420 if (w == NULL) {
1421 x = NULL;
1422 break;
1423 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001424 x = PyEval_CallObject(x, w);
1425 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001426 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001427 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 break;
1429
1430 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001431 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001435 PyErr_SetString(PyExc_SystemError,
1436 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 break;
1438 }
1439 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001441 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001443
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 case JUMP_FORWARD:
1445 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001446 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001447
1448 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001449 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001450 if (err > 0)
1451 err = 0;
1452 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001454 else
1455 break;
1456 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001457
1458 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001459 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460 if (err > 0) {
1461 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001463 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001464 else if (err == 0)
1465 ;
1466 else
1467 break;
1468 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001469
1470 case JUMP_ABSOLUTE:
1471 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001472 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001473
1474 case FOR_LOOP:
1475 /* for v in s: ...
1476 On entry: stack contains s, i.
1477 On exit: stack contains s, i+1, s[i];
1478 but if loop exhausted:
1479 s, i are popped, and we jump */
1480 w = POP(); /* Loop index */
1481 v = POP(); /* Sequence object */
1482 u = loop_subscript(v, w);
1483 if (u != NULL) {
1484 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001485 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001487 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001489 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 }
1491 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 Py_DECREF(v);
1493 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 /* A NULL can mean "s exhausted"
1495 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001496 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001498 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001500 continue;
1501 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 }
1503 break;
1504
1505 case SETUP_LOOP:
1506 case SETUP_EXCEPT:
1507 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001508 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001510 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001511
1512 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001513#ifdef LLTRACE
1514 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001515 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001517 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001518 if (f->f_trace == NULL)
1519 continue;
1520 /* Trace each line of code reached */
1521 f->f_lasti = INSTR_OFFSET();
1522 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001524 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001525
1526 case CALL_FUNCTION:
1527 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001528 int na = oparg & 0xff;
1529 int nk = (oparg>>8) & 0xff;
1530 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 PyObject **pfunc = stack_pointer - n - 1;
1532 PyObject *func = *pfunc;
1533 PyObject *self = NULL;
1534 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001535 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 if (PyMethod_Check(func)) {
1537 self = PyMethod_Self(func);
1538 class = PyMethod_Class(func);
1539 func = PyMethod_Function(func);
1540 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 Py_INCREF(self);
1543 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 *pfunc = self;
1545 na++;
1546 n++;
1547 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001548 else {
1549 /* Unbound methods must be
1550 called with an instance of
1551 the class (or a derived
1552 class) as first argument */
1553 if (na > 0 &&
1554 (self = stack_pointer[-n])
1555 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 PyInstance_Check(self) &&
1557 PyClass_IsSubclass(
1558 (PyObject *)
1559 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001560 ->in_class),
1561 class))
1562 /* Handy-dandy */ ;
1563 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001564 PyErr_SetString(
1565 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001567 x = NULL;
1568 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001569 }
1570 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001571 }
1572 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001573 Py_INCREF(func);
1574 if (PyFunction_Check(func)) {
1575 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001576 PyObject *globals =
1577 PyFunction_GetGlobals(func);
1578 PyObject *argdefs =
1579 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 int nd;
1582 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001584 nd = ((PyTupleObject *)argdefs) ->
1585 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001586 }
1587 else {
1588 d = NULL;
1589 nd = 0;
1590 }
1591 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001592 (PyCodeObject *)co,
1593 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001594 stack_pointer-n, na,
1595 stack_pointer-2*nk, nk,
1596 d, nd,
1597 class);
1598 }
1599 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 PyObject *args = PyTuple_New(na);
1601 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001602 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001603 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001604 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001606 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001608 if (kwdict == NULL) {
1609 x = NULL;
1610 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001611 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001612 err = 0;
1613 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 PyObject *value = POP();
1615 PyObject *key = POP();
1616 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001617 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001618 Py_DECREF(key);
1619 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001620 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001621 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001622 }
1623 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001624 Py_DECREF(args);
1625 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001626 break;
1627 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001628 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001629 while (--na >= 0) {
1630 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001632 }
1633 x = PyEval_CallObjectWithKeywords(
1634 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 Py_DECREF(args);
1636 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001637 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001639 while (stack_pointer > pfunc) {
1640 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001642 }
1643 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001644 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001645 break;
1646 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001647
Guido van Rossum681d79a1995-07-18 14:51:37 +00001648 case MAKE_FUNCTION:
1649 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001650 x = PyFunction_New(v, f->f_globals);
1651 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001652 /* XXX Maybe this should be a separate opcode? */
1653 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001657 x = NULL;
1658 break;
1659 }
1660 while (--oparg >= 0) {
1661 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 }
1664 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001665 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 }
1667 PUSH(x);
1668 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001669
1670 case BUILD_SLICE:
1671 if (oparg == 3)
1672 w = POP();
1673 else
1674 w = NULL;
1675 v = POP();
1676 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001677 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 Py_DECREF(u);
1679 Py_DECREF(v);
1680 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001681 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001682 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001683 break;
1684
1685
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 default:
1687 fprintf(stderr,
1688 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001689 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001690 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 why = WHY_EXCEPTION;
1692 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001693
1694#ifdef CASE_TOO_BIG
1695 }
1696#endif
1697
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 } /* switch */
1699
1700 on_error:
1701
1702 /* Quickly continue if no error occurred */
1703
1704 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001705 if (err == 0 && x != NULL) {
1706#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001707 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001708 fprintf(stderr,
1709 "XXX undetected error\n");
1710 else
1711#endif
1712 continue; /* Normal, fast path */
1713 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001715 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 err = 0;
1717 }
1718
Guido van Rossum801dcae1992-04-08 11:32:32 +00001719#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 /* Double-check exception status */
1721
1722 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001725 PyErr_SetString(PyExc_SystemError,
1726 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 why = WHY_EXCEPTION;
1728 }
1729 }
1730 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001732 fprintf(stderr,
1733 "XXX undetected error (why=%d)\n",
1734 why);
1735 why = WHY_EXCEPTION;
1736 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 }
1738#endif
1739
1740 /* Log traceback info if this is a real exception */
1741
1742 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001743 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001745 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001747
Guido van Rossume59214e1994-08-30 08:01:59 +00001748 if (f->f_trace)
1749 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001750 if (tstate->sys_profilefunc)
1751 call_exc_trace(&tstate->sys_profilefunc,
1752 (PyObject**)0, f);
1753}
Guido van Rossum374a9221991-04-04 10:40:29 +00001754
1755 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1756
1757 if (why == WHY_RERAISE)
1758 why = WHY_EXCEPTION;
1759
1760 /* Unwind stacks if a (pseudo) exception occurred */
1761
1762 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 while (STACK_LEVEL() > b->b_level) {
1765 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 }
1768 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1769 why = WHY_NOT;
1770 JUMPTO(b->b_handler);
1771 break;
1772 }
1773 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001774 (b->b_type == SETUP_EXCEPT &&
1775 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001777 PyObject *exc, *val, *tb;
1778 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 val = Py_None;
1781 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 /* Make the raw exception data
1784 available to the handler,
1785 so a program can emulate the
1786 Python main loop. Don't do
1787 this for 'finally'. */
1788 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001789 PyErr_NormalizeException(
1790 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001791 set_exc_info(tstate,
1792 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001794 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 PUSH(val);
1796 PUSH(exc);
1797 }
1798 else {
1799 if (why == WHY_RETURN)
1800 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001801 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 PUSH(v);
1803 }
1804 why = WHY_NOT;
1805 JUMPTO(b->b_handler);
1806 break;
1807 }
1808 } /* unwind stack */
1809
1810 /* End the loop if we still have an error (or return) */
1811
1812 if (why != WHY_NOT)
1813 break;
1814
1815 } /* main loop */
1816
1817 /* Pop remaining stack entries */
1818
1819 while (!EMPTY()) {
1820 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 }
1823
Guido van Rossum96a42c81992-01-12 02:29:51 +00001824 if (why != WHY_RETURN)
1825 retval = NULL;
1826
Guido van Rossume59214e1994-08-30 08:01:59 +00001827 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001828 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001829 if (call_trace(&f->f_trace, &f->f_trace, f,
1830 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001831 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001832 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001833 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001834 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001835 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001836 }
1837
Guido van Rossuma027efa1997-05-05 20:56:21 +00001838 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1839 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001840 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001842 retval = NULL;
1843 why = WHY_EXCEPTION;
1844 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001845 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001846
Guido van Rossuma027efa1997-05-05 20:56:21 +00001847 reset_exc_info(tstate);
1848
1849 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001850
1851 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001854
Guido van Rossuma027efa1997-05-05 20:56:21 +00001855 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001857
Guido van Rossum96a42c81992-01-12 02:29:51 +00001858 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001859}
1860
Guido van Rossuma027efa1997-05-05 20:56:21 +00001861static void
1862set_exc_info(tstate, type, value, tb)
1863 PyThreadState *tstate;
1864 PyObject *type;
1865 PyObject *value;
1866 PyObject *tb;
1867{
1868 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001869 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001870
Guido van Rossuma027efa1997-05-05 20:56:21 +00001871 frame = tstate->frame;
1872 if (frame->f_exc_type == NULL) {
1873 /* This frame didn't catch an exception before */
1874 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001875 if (tstate->exc_type == NULL) {
1876 Py_INCREF(Py_None);
1877 tstate->exc_type = Py_None;
1878 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001879 tmp_type = frame->f_exc_type;
1880 tmp_value = frame->f_exc_value;
1881 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001882 Py_XINCREF(tstate->exc_type);
1883 Py_XINCREF(tstate->exc_value);
1884 Py_XINCREF(tstate->exc_traceback);
1885 frame->f_exc_type = tstate->exc_type;
1886 frame->f_exc_value = tstate->exc_value;
1887 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001888 Py_XDECREF(tmp_type);
1889 Py_XDECREF(tmp_value);
1890 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001891 }
1892 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001893 tmp_type = tstate->exc_type;
1894 tmp_value = tstate->exc_value;
1895 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001896 Py_XINCREF(type);
1897 Py_XINCREF(value);
1898 Py_XINCREF(tb);
1899 tstate->exc_type = type;
1900 tstate->exc_value = value;
1901 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001902 Py_XDECREF(tmp_type);
1903 Py_XDECREF(tmp_value);
1904 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001905 /* For b/w compatibility */
1906 PySys_SetObject("exc_type", type);
1907 PySys_SetObject("exc_value", value);
1908 PySys_SetObject("exc_traceback", tb);
1909}
1910
1911static void
1912reset_exc_info(tstate)
1913 PyThreadState *tstate;
1914{
1915 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001916 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001917 frame = tstate->frame;
1918 if (frame->f_exc_type != NULL) {
1919 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001920 tmp_type = tstate->exc_type;
1921 tmp_value = tstate->exc_value;
1922 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001923 Py_XINCREF(frame->f_exc_type);
1924 Py_XINCREF(frame->f_exc_value);
1925 Py_XINCREF(frame->f_exc_traceback);
1926 tstate->exc_type = frame->f_exc_type;
1927 tstate->exc_value = frame->f_exc_value;
1928 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001929 Py_XDECREF(tmp_type);
1930 Py_XDECREF(tmp_value);
1931 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001932 /* For b/w compatibility */
1933 PySys_SetObject("exc_type", frame->f_exc_type);
1934 PySys_SetObject("exc_value", frame->f_exc_value);
1935 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1936 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001937 tmp_type = frame->f_exc_type;
1938 tmp_value = frame->f_exc_value;
1939 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001940 frame->f_exc_type = NULL;
1941 frame->f_exc_value = NULL;
1942 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001943 Py_XDECREF(tmp_type);
1944 Py_XDECREF(tmp_value);
1945 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001946}
1947
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001948/* Logic for the raise statement (too complicated for inlining).
1949 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001950static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001951do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001952 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001953{
1954 /* We support the following forms of raise:
1955 raise <class>, <classinstance>
1956 raise <class>, <argument tuple>
1957 raise <class>, None
1958 raise <class>, <argument>
1959 raise <classinstance>, None
1960 raise <string>, <object>
1961 raise <string>, None
1962
1963 An omitted second argument is the same as None.
1964
1965 In addition, raise <tuple>, <anything> is the same as
1966 raising the tuple's first item (and it better have one!);
1967 this rule is applied recursively.
1968
1969 Finally, an optional third argument can be supplied, which
1970 gives the traceback to be substituted (useful when
1971 re-raising an exception after examining it). */
1972
1973 /* First, check the traceback argument, replacing None with
1974 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001975 if (tb == Py_None) {
1976 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001977 tb = NULL;
1978 }
1979 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001980 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001981 "raise 3rd arg must be traceback or None");
1982 goto raise_error;
1983 }
1984
1985 /* Next, replace a missing value with None */
1986 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 value = Py_None;
1988 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001989 }
1990
1991 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001992 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1993 PyObject *tmp = type;
1994 type = PyTuple_GET_ITEM(type, 0);
1995 Py_INCREF(type);
1996 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001997 }
1998
Barry Warsaw4249f541997-08-22 21:26:19 +00001999 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002000 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002001
2002 else if (PyClass_Check(type))
2003 PyErr_NormalizeException(&type, &value, &tb);
2004
Guido van Rossumb209a111997-04-29 18:18:01 +00002005 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002006 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 if (value != Py_None) {
2008 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002009 "instance exception may not have a separate value");
2010 goto raise_error;
2011 }
2012 else {
2013 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002014 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002015 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002016 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2017 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002018 }
2019 }
2020 else {
2021 /* Not something you can raise. You get an exception
2022 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002024 "exceptions must be strings, classes, or instances");
2025 goto raise_error;
2026 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002027 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002028 if (tb == NULL)
2029 return WHY_EXCEPTION;
2030 else
2031 return WHY_RERAISE;
2032 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002033 Py_XDECREF(value);
2034 Py_XDECREF(type);
2035 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002036 return WHY_EXCEPTION;
2037}
2038
Barry Warsawe42b18f1997-08-25 22:13:04 +00002039static int
2040unpack_sequence(v, argcnt, sp)
2041 PyObject *v;
2042 int argcnt;
2043 PyObject **sp;
2044{
2045 int i;
2046 PyObject *w;
2047
2048 for (i = 0; i < argcnt; i++) {
2049 if (! (w = PySequence_GetItem(v, i))) {
2050 if (PyErr_ExceptionMatches(PyExc_IndexError))
2051 PyErr_SetString(PyExc_ValueError,
2052 "unpack sequence of wrong size");
2053 goto finally;
2054 }
2055 *--sp = w;
2056 }
2057 /* we better get an IndexError now */
2058 if (PySequence_GetItem(v, i) == NULL) {
2059 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2060 PyErr_Clear();
2061 return 1;
2062 }
2063 /* some other exception occurred. fall through to finally */
2064 }
2065 else
2066 PyErr_SetString(PyExc_ValueError,
2067 "unpack sequence of wrong size");
2068 /* fall through */
2069finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002070 for (; i > 0; i--, sp++)
2071 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002072
2073 return 0;
2074}
2075
2076
Guido van Rossum96a42c81992-01-12 02:29:51 +00002077#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002078static int
2079prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002081 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 if (PyObject_Print(v, stdout, 0) != 0)
2085 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002090static void
2091call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 PyObject **p_trace, **p_newtrace;
2093 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002094{
Guido van Rossumb209a111997-04-29 18:18:01 +00002095 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002096 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002098 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 value = Py_None;
2100 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002101 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002106 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002110 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002111 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002112 Py_XDECREF(type);
2113 Py_XDECREF(value);
2114 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002115 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002116}
2117
2118static int
2119call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002121 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002122 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002123 may point to NULL variable;
2124 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002126 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002128{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002129 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 PyObject *args, *what;
2131 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002132
Guido van Rossuma027efa1997-05-05 20:56:21 +00002133 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002134 /* Don't do recursive traces */
2135 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002137 *p_newtrace = NULL;
2138 }
2139 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002140 }
2141
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002143 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002144 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002146 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002147 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 Py_INCREF(f);
2149 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2150 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002151 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 arg = Py_None;
2153 Py_INCREF(arg);
2154 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002155 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyFrame_FastToLocals(f);
2157 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2158 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002159 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002160 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002162 if (res == NULL) {
2163 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 PyTraceBack_Here(f);
2165 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002166 *p_trace = NULL;
2167 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002169 *p_newtrace = NULL;
2170 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002171 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002172 }
2173 else {
2174 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 Py_XDECREF(*p_newtrace);
2176 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002177 *p_newtrace = NULL;
2178 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002180 *p_newtrace = res;
2181 }
2182 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002184 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002185 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002186}
2187
Guido van Rossumb209a111997-04-29 18:18:01 +00002188PyObject *
2189PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002190{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002191 PyThreadState *tstate = PyThreadState_Get();
2192 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002193 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002194 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002195 else
2196 return current_frame->f_builtins;
2197}
2198
Guido van Rossumb209a111997-04-29 18:18:01 +00002199PyObject *
2200PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002201{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002202 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002203 if (current_frame == NULL)
2204 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002206 return current_frame->f_locals;
2207}
2208
Guido van Rossumb209a111997-04-29 18:18:01 +00002209PyObject *
2210PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002211{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002212 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002213 if (current_frame == NULL)
2214 return NULL;
2215 else
2216 return current_frame->f_globals;
2217}
2218
Guido van Rossumb209a111997-04-29 18:18:01 +00002219PyObject *
2220PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002221{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002222 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002223 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002224}
2225
Guido van Rossum6135a871995-01-09 17:53:26 +00002226int
Guido van Rossumb209a111997-04-29 18:18:01 +00002227PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002228{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002229 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002230 return current_frame == NULL ? 0 : current_frame->f_restricted;
2231}
2232
Guido van Rossumbe270261997-05-22 22:26:18 +00002233int
Guido van Rossumb209a111997-04-29 18:18:01 +00002234Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235{
Guido van Rossumb209a111997-04-29 18:18:01 +00002236 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002237 if (f == NULL)
2238 return 0;
2239 if (!PyFile_SoftSpace(f, 0))
2240 return 0;
2241 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242}
2243
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244
Guido van Rossum681d79a1995-07-18 14:51:37 +00002245/* External interface to call any callable object.
2246 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002247
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002248#undef PyEval_CallObject
2249/* for backward compatibility: export this interface */
2250
Guido van Rossumb209a111997-04-29 18:18:01 +00002251PyObject *
2252PyEval_CallObject(func, arg)
2253 PyObject *func;
2254 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002255{
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002257}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002258#define PyEval_CallObject(func,arg) \
2259 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002260
Guido van Rossumb209a111997-04-29 18:18:01 +00002261PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002262PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002263 PyObject *func;
2264 PyObject *arg;
2265 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002266{
2267 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002268 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002269
2270 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 arg = PyTuple_New(0);
2272 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002273 PyErr_SetString(PyExc_TypeError,
2274 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002275 return NULL;
2276 }
2277 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002278 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002279
Guido van Rossumb209a111997-04-29 18:18:01 +00002280 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002281 PyErr_SetString(PyExc_TypeError,
2282 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002283 return NULL;
2284 }
2285
Guido van Rossum150b2df1996-12-05 23:17:11 +00002286 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002287 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002289 result = call_function(func, arg, kw);
2290 else
2291 result = call_builtin(func, arg, kw);
2292
Guido van Rossumb209a111997-04-29 18:18:01 +00002293 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002294
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 if (result == NULL && !PyErr_Occurred())
2296 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002297 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002298
2299 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002300}
2301
Guido van Rossumb209a111997-04-29 18:18:01 +00002302static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002303call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002304 PyObject *func;
2305 PyObject *arg;
2306 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307{
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 if (PyCFunction_Check(func)) {
2309 PyCFunction meth = PyCFunction_GetFunction(func);
2310 PyObject *self = PyCFunction_GetSelf(func);
2311 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002312 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002313 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002314 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002315 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002316 else if (size == 0)
2317 arg = NULL;
2318 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002319 if (flags & METH_KEYWORDS)
2320 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 if (kw != NULL && PyDict_Size(kw) != 0) {
2322 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002323 "this function takes no keyword arguments");
2324 return NULL;
2325 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002326 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002328 if (PyClass_Check(func)) {
2329 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 if (PyInstance_Check(func)) {
2332 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002333 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 PyErr_Clear();
2335 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002337 return NULL;
2338 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002339 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002340 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002341 return res;
2342 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002343 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 return NULL;
2345}
2346
Guido van Rossumb209a111997-04-29 18:18:01 +00002347static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002348call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002349 PyObject *func;
2350 PyObject *arg;
2351 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352{
Guido van Rossumb209a111997-04-29 18:18:01 +00002353 PyObject *class = NULL; /* == owner */
2354 PyObject *argdefs;
2355 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002356 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002357 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002358
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 if (kw != NULL && !PyDict_Check(kw)) {
2360 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002361 return NULL;
2362 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 if (PyMethod_Check(func)) {
2365 PyObject *self = PyMethod_Self(func);
2366 class = PyMethod_Class(func);
2367 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002368 if (self == NULL) {
2369 /* Unbound methods must be called with an instance of
2370 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 if (PyTuple_Size(arg) >= 1) {
2372 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002373 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 PyInstance_Check(self) &&
2375 PyClass_IsSubclass((PyObject *)
2376 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002377 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002378 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002379 else
2380 self = NULL;
2381 }
2382 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002384 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002385 return NULL;
2386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002388 }
2389 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 int argcount = PyTuple_Size(arg);
2391 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002392 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002393 if (newarg == NULL)
2394 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 Py_INCREF(self);
2396 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002397 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 PyObject *v = PyTuple_GET_ITEM(arg, i);
2399 Py_XINCREF(v);
2400 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002401 }
2402 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 }
2404 }
2405 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002407 PyErr_SetString(PyExc_TypeError,
2408 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 return NULL;
2410 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413
2414 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002415 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2416 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2417 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 }
2419 else {
2420 d = NULL;
2421 nd = 0;
2422 }
2423
2424 if (kw != NULL) {
2425 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 nk = PyDict_Size(kw);
2427 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 PyErr_NoMemory();
2430 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002431 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002432 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 i += 2;
2436 nk = i/2;
2437 /* XXX This is broken if the caller deletes dict items! */
2438 }
2439 else {
2440 k = NULL;
2441 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002442 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 (PyCodeObject *)PyFunction_GetCode(func),
2446 PyFunction_GetGlobals(func), (PyObject *)NULL,
2447 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 k, nk,
2449 d, nd,
2450 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 Py_DECREF(arg);
2453 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454
Guido van Rossum681d79a1995-07-18 14:51:37 +00002455 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456}
2457
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002458#define SLICE_ERROR_MSG \
2459 "standard sequence type does not support step size other than one"
2460
Guido van Rossumb209a111997-04-29 18:18:01 +00002461static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002463 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464{
Guido van Rossumb209a111997-04-29 18:18:01 +00002465 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002466 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 return NULL;
2470 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002472 v = (*sq->sq_item)(v, i);
2473 if (v)
2474 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002475 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002476 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002477 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478}
2479
2480static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002481slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 int *pi;
2484{
2485 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002486 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002488 PyErr_SetString(PyExc_TypeError,
2489 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002490 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002492 x = PyInt_AsLong(v);
2493 /* Truncate -- very long indices are truncated anyway */
2494 if (x > INT_MAX)
2495 x = INT_MAX;
2496 else if (x < -INT_MAX)
2497 x = 0;
2498 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501}
2502
Guido van Rossumb209a111997-04-29 18:18:01 +00002503static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002504apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002505 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002507 int ilow = 0, ihigh = INT_MAX;
2508 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002510 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002511 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002512 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514
2515static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002517 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519 int ilow = 0, ihigh = INT_MAX;
2520 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002522 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002524 if (x == NULL)
2525 return PySequence_DelSlice(u, ilow, ihigh);
2526 else
2527 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528}
2529
2530static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002531cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002533{
Guido van Rossume59214e1994-08-30 08:01:59 +00002534 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 PyObject *x;
2536 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002537 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002538 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002539 register char *s, *end;
2540 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2542 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002543 "string member test needs char left operand");
2544 return -1;
2545 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002546 c = PyString_AsString(v)[0];
2547 s = PyString_AsString(w);
2548 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549 while (s < end) {
2550 if (c == *s++)
2551 return 1;
2552 }
2553 return 0;
2554 }
2555 sq = w->ob_type->tp_as_sequence;
2556 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558 "'in' or 'not in' needs sequence right argument");
2559 return -1;
2560 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002561 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002562 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002563 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002564 if (PyErr_Occurred() == PyExc_IndexError) {
2565 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002566 break;
2567 }
2568 return -1;
2569 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 cmp = PyObject_Compare(v, x);
2571 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002572 if (cmp == 0)
2573 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002574 if (PyErr_Occurred())
2575 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 }
2577 return 0;
2578}
2579
Guido van Rossumb209a111997-04-29 18:18:01 +00002580static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002581cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002582 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002583 register PyObject *v;
2584 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585{
2586 register int cmp;
2587 register int res = 0;
2588 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589 case IS:
2590 case IS_NOT:
2591 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002592 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593 res = !res;
2594 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 case IN:
2596 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002597 res = cmp_member(v, w);
2598 if (res < 0)
2599 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002600 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 break;
2603 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002604 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 break;
2606 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002608 if (cmp && PyErr_Occurred())
2609 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002610 switch (op) {
2611 case LT: res = cmp < 0; break;
2612 case LE: res = cmp <= 0; break;
2613 case EQ: res = cmp == 0; break;
2614 case NE: res = cmp != 0; break;
2615 case GT: res = cmp > 0; break;
2616 case GE: res = cmp >= 0; break;
2617 /* XXX no default? (res is initialized to 0 though) */
2618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002620 v = res ? Py_True : Py_False;
2621 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 return v;
2623}
2624
Guido van Rossum3f5da241990-12-20 15:06:42 +00002625static int
2626import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 PyObject *locals;
2628 PyObject *v;
2629 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002630{
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 PyObject *w, *x;
2632 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002633 PyErr_SetString(PyExc_TypeError,
2634 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002635 return -1;
2636 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002637 w = PyModule_GetDict(v);
2638 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002639 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002641 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 while (PyDict_Next(w, &pos, &name, &value)) {
2643 if (!PyString_Check(name) ||
2644 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002645 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002646 Py_INCREF(value);
2647 err = PyDict_SetItem(locals, name, value);
2648 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002649 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002651 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002653 }
2654 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002656 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002657 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002658 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002659 PyString_AsString(name));
2660 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002661 return -1;
2662 }
2663 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002665 }
2666}
2667
Guido van Rossumb209a111997-04-29 18:18:01 +00002668static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002669build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002670 PyObject *methods; /* dictionary */
2671 PyObject *bases; /* tuple containing classes */
2672 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002673{
Guido van Rossumcd649651997-08-22 16:56:16 +00002674 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002676 PyErr_SetString(PyExc_SystemError,
2677 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002678 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002679 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002681 PyErr_SetString(PyExc_SystemError,
2682 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002683 return NULL;
2684 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002686 PyErr_SetString(PyExc_SystemError,
2687 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002688 return NULL;
2689 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002690 n = PyTuple_Size(bases);
2691 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 PyObject *base = PyTuple_GET_ITEM(bases, i);
2693 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002694 /* Call the base's *type*, if it is callable.
2695 This code is a hook for Donald Beaudry's
2696 and Jim Fulton's type extensions. In
2697 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002698 since its types are not callable.
2699 Ditto: call the bases's *class*, if it has
2700 one. This makes the same thing possible
2701 without writing C code. A true meta-object
2702 protocol! */
2703 PyObject *basetype = (PyObject *)base->ob_type;
2704 PyObject *callable = NULL;
2705 if (PyCallable_Check(basetype))
2706 callable = basetype;
2707 else
2708 callable = PyObject_GetAttrString(
2709 base, "__class__");
2710 if (callable) {
2711 PyObject *args;
2712 PyObject *newclass = NULL;
2713 args = Py_BuildValue(
2714 "(OOO)", name, bases, methods);
2715 if (args != NULL) {
2716 newclass = PyEval_CallObject(
2717 callable, args);
2718 Py_DECREF(args);
2719 }
2720 if (callable != basetype)
2721 Py_DECREF(callable);
2722 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002723 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002725 "base is not a class object");
2726 return NULL;
2727 }
2728 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002730}
2731
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002732static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002733exec_statement(f, prog, globals, locals)
2734 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 PyObject *prog;
2736 PyObject *globals;
2737 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002738{
2739 char *s;
2740 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002742 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002743
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2745 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002746 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002748 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 locals = PyTuple_GetItem(prog, 2);
2750 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002751 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 if (globals == Py_None) {
2753 globals = PyEval_GetGlobals();
2754 if (locals == Py_None) {
2755 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002756 plain = 1;
2757 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002758 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002759 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002760 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 if (!PyString_Check(prog) &&
2762 !PyCode_Check(prog) &&
2763 !PyFile_Check(prog)) {
2764 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002765 "exec 1st arg must be string, code or file object");
2766 return -1;
2767 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2769 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002770 "exec 2nd/3rd args must be dict or None");
2771 return -1;
2772 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002774 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 if (PyCode_Check(prog)) {
Guido van Rossumdfed7251997-11-11 16:29:38 +00002776 v = PyEval_EvalCode((PyCodeObject *) prog,
2777 globals, locals);
2778 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002779 return -1;
Guido van Rossumdfed7251997-11-11 16:29:38 +00002780 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002781 return 0;
2782 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 if (PyFile_Check(prog)) {
2784 FILE *fp = PyFile_AsFile(prog);
2785 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002786 if (PyRun_File(fp, name, Py_file_input,
2787 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002788 return -1;
2789 return 0;
2790 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002792 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002793 PyErr_SetString(PyExc_ValueError,
2794 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002795 return -1;
2796 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002797 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002798 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002799 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002800 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002801 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002802 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002803 return 0;
2804}
Guido van Rossum24c13741995-02-14 09:42:43 +00002805
Guido van Rossum1aa14831997-01-21 05:34:20 +00002806/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002807static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002808find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002810 int nexti;
2811{
2812 int opcode;
2813 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002815 unsigned char *next_instr;
2816
2817 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2818 opcode = (*next_instr++);
2819 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 Py_INCREF(Py_None);
2821 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002822 }
2823
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002825 if (list == NULL)
2826 return NULL;
2827
2828 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002829 oparg = (next_instr[1]<<8) + next_instr[0];
2830 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002831 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 if (PyList_Append(list, name) < 0) {
2833 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002834 break;
2835 }
2836 opcode = (*next_instr++);
2837 } while (opcode == IMPORT_FROM);
2838
2839 return list;
2840}
Guido van Rossum950361c1997-01-24 13:49:28 +00002841
2842
2843#ifdef DYNAMIC_EXECUTION_PROFILE
2844
2845PyObject *
2846getarray(a)
2847 long a[256];
2848{
2849 int i;
2850 PyObject *l = PyList_New(256);
2851 if (l == NULL) return NULL;
2852 for (i = 0; i < 256; i++) {
2853 PyObject *x = PyInt_FromLong(a[i]);
2854 if (x == NULL) {
2855 Py_DECREF(l);
2856 return NULL;
2857 }
2858 PyList_SetItem(l, i, x);
2859 }
2860 for (i = 0; i < 256; i++)
2861 a[i] = 0;
2862 return l;
2863}
2864
2865PyObject *
2866_Py_GetDXProfile(self, args)
2867 PyObject *self, *args;
2868{
2869#ifndef DXPAIRS
2870 return getarray(dxp);
2871#else
2872 int i;
2873 PyObject *l = PyList_New(257);
2874 if (l == NULL) return NULL;
2875 for (i = 0; i < 257; i++) {
2876 PyObject *x = getarray(dxpairs[i]);
2877 if (x == NULL) {
2878 Py_DECREF(l);
2879 return NULL;
2880 }
2881 PyList_SetItem(l, i, x);
2882 }
2883 return l;
2884#endif
2885}
2886
2887#endif