blob: fad8c2bf58d6724e2a57e648f82c171c1582d8a4 [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 Rossumdf9db1e1997-11-19 16:05:40 +0000457 PyErr_Format(PyExc_TypeError,
458 "too many arguments; expected %d, got %d",
459 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 goto fail;
461 }
462 n = co->co_argcount;
463 }
464 for (i = 0; i < n; i++) {
465 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000466 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 SETLOCAL(i, x);
468 }
469 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000470 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000471 if (u == NULL)
472 goto fail;
473 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 for (i = n; i < argcount; i++) {
475 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000476 Py_INCREF(x);
477 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 }
480 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000481 PyObject *keyword = kws[2*i];
482 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 int j;
484 /* XXX slow -- speed up using dictionary? */
485 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000486 PyObject *nm = PyTuple_GET_ITEM(
487 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000488 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 break;
490 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000491 /* Check errors from Compare */
492 if (PyErr_Occurred())
493 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494 if (j >= co->co_argcount) {
495 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000496 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000497 "unexpected keyword argument: %.400s",
498 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 goto fail;
500 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000501 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000502 }
503 else {
504 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000505 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 "keyword parameter redefined");
507 goto fail;
508 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000509 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 SETLOCAL(j, value);
511 }
512 }
513 if (argcount < co->co_argcount) {
514 int m = co->co_argcount - defcount;
515 for (i = argcount; i < m; i++) {
516 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000517 PyErr_Format(PyExc_TypeError,
518 "not enough arguments; expected %d, got %d",
519 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 goto fail;
521 }
522 }
523 if (n > m)
524 i = n - m;
525 else
526 i = 0;
527 for (; i < defcount; i++) {
528 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000529 PyObject *def = defs[i];
530 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 SETLOCAL(m+i, def);
532 }
533 }
534 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000535 }
536 else {
537 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000538 PyErr_SetString(PyExc_TypeError,
539 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000540 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000541 }
542 }
543
Guido van Rossuma027efa1997-05-05 20:56:21 +0000544 if (tstate->sys_tracefunc != NULL) {
545 /* tstate->sys_tracefunc, if defined, is a function that
546 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000547 Its return value, if not None, is a function that
548 will be called at the start of each executed line
549 of code. (Actually, the function must return
550 itself in order to continue tracing.)
551 The trace functions are called with three arguments:
552 a pointer to the current frame, a string indicating
553 why the function is called, and an argument which
554 depends on the situation. The global trace function
555 (sys.trace) is also called whenever an exception
556 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557 if (call_trace(&tstate->sys_tracefunc,
558 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000560 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000561 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000562 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000563 }
564
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565 if (tstate->sys_profilefunc != NULL) {
566 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000567 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000568 if (call_trace(&tstate->sys_profilefunc,
569 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000570 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000571 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000572 }
573 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000574
Guido van Rossuma027efa1997-05-05 20:56:21 +0000575 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
576 --tstate->recursion_depth;
577 PyErr_SetString(PyExc_RuntimeError,
578 "Maximum recursion depth exceeded");
579 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000580 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000581 return NULL;
582 }
583
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000584 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 stack_pointer = f->f_valuestack;
586
Guido van Rossum374a9221991-04-04 10:40:29 +0000587 why = WHY_NOT;
588 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000589 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000590
591 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 /* Do periodic things. Doing this every time through
593 the loop would add too much overhead, so we do it
594 only every Nth instruction. We also do it if
595 ``things_to_do'' is set, i.e. when an asynchronous
596 event needs attention (e.g. a signal handler or
597 async I/O handler); see Py_AddPendingCall() and
598 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000599
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000601 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000602 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000603 if (Py_MakePendingCalls() < 0) {
604 why = WHY_EXCEPTION;
605 goto on_error;
606 }
607 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000608#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 /* If we have true signals, the signal handler
610 will call Py_AddPendingCall() so we don't
611 have to call sigcheck(). On the Mac and
612 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000613 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 goto on_error;
616 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000617#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000618
Guido van Rossume59214e1994-08-30 08:01:59 +0000619#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620 if (interpreter_lock) {
621 /* Give another thread a chance */
622
Guido van Rossum25ce5661997-08-02 03:10:38 +0000623 if (PyThreadState_Swap(NULL) != tstate)
624 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625 release_lock(interpreter_lock);
626
627 /* Other threads may run now */
628
629 acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000630 if (PyThreadState_Swap(tstate) != NULL)
631 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000632 }
633#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000637
Guido van Rossum408027e1996-12-30 16:17:54 +0000638#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000639 f->f_lasti = INSTR_OFFSET();
640#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000641
642 opcode = NEXTOP();
643 if (HAS_ARG(opcode))
644 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000645#ifdef DYNAMIC_EXECUTION_PROFILE
646#ifdef DXPAIRS
647 dxpairs[lastopcode][opcode]++;
648 lastopcode = opcode;
649#endif
650 dxp[opcode]++;
651#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000652
Guido van Rossum96a42c81992-01-12 02:29:51 +0000653#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 /* Instruction tracing */
655
Guido van Rossum96a42c81992-01-12 02:29:51 +0000656 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 if (HAS_ARG(opcode)) {
658 printf("%d: %d, %d\n",
659 (int) (INSTR_OFFSET() - 3),
660 opcode, oparg);
661 }
662 else {
663 printf("%d: %d\n",
664 (int) (INSTR_OFFSET() - 1), opcode);
665 }
666 }
667#endif
668
669 /* Main switch on opcode */
670
671 switch (opcode) {
672
673 /* BEWARE!
674 It is essential that any operation that fails sets either
675 x to NULL, err to nonzero, or why to anything but WHY_NOT,
676 and that no operation that succeeds does this! */
677
678 /* case STOP_CODE: this is an error! */
679
680 case POP_TOP:
681 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000682 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000683 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000684
685 case ROT_TWO:
686 v = POP();
687 w = POP();
688 PUSH(v);
689 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691
692 case ROT_THREE:
693 v = POP();
694 w = POP();
695 x = POP();
696 PUSH(v);
697 PUSH(x);
698 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000699 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000700
701 case DUP_TOP:
702 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000703 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000705 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000706
707 case UNARY_POSITIVE:
708 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000709 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000710 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000712 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 break;
714
715 case UNARY_NEGATIVE:
716 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000717 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000718 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000720 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 break;
722
723 case UNARY_NOT:
724 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000725 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000727 if (err == 0) {
728 Py_INCREF(Py_True);
729 PUSH(Py_True);
730 continue;
731 }
732 else if (err > 0) {
733 Py_INCREF(Py_False);
734 PUSH(Py_False);
735 err = 0;
736 continue;
737 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 break;
739
740 case UNARY_CONVERT:
741 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000742 x = PyObject_Repr(v);
743 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000745 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000747
748 case UNARY_INVERT:
749 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000750 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000751 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000753 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000754 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000755
Guido van Rossum50564e81996-01-12 01:13:16 +0000756 case BINARY_POWER:
757 w = POP();
758 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000759 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_DECREF(v);
761 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000764 break;
765
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 case BINARY_MULTIPLY:
767 w = POP();
768 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000769 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000770 Py_DECREF(v);
771 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 break;
775
776 case BINARY_DIVIDE:
777 w = POP();
778 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000779 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000780 Py_DECREF(v);
781 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000783 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
786 case BINARY_MODULO:
787 w = POP();
788 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000789 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000790 Py_DECREF(v);
791 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000793 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 break;
795
796 case BINARY_ADD:
797 w = POP();
798 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000799 if (PyInt_Check(v) && PyInt_Check(w)) {
800 /* INLINE: int + int */
801 register long a, b, i;
802 a = ((PyIntObject*) v)->ob_ival;
803 b = ((PyIntObject*) w)->ob_ival;
804 i = a + b;
805 if ((i^a) < 0 && (i^b) < 0) {
806 PyErr_SetString(PyExc_OverflowError,
807 "integer addition");
808 x = NULL;
809 }
810 else
811 x = PyInt_FromLong(i);
812 }
813 else
814 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000815 Py_DECREF(v);
816 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000818 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 break;
820
821 case BINARY_SUBTRACT:
822 w = POP();
823 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000824 if (PyInt_Check(v) && PyInt_Check(w)) {
825 /* INLINE: int - int */
826 register long a, b, i;
827 a = ((PyIntObject*) v)->ob_ival;
828 b = ((PyIntObject*) w)->ob_ival;
829 i = a - b;
830 if ((i^a) < 0 && (i^~b) < 0) {
831 PyErr_SetString(PyExc_OverflowError,
832 "integer subtraction");
833 x = NULL;
834 }
835 else
836 x = PyInt_FromLong(i);
837 }
838 else
839 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000840 Py_DECREF(v);
841 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 break;
845
846 case BINARY_SUBSCR:
847 w = POP();
848 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000849 if (PyList_Check(v) && PyInt_Check(w)) {
850 /* INLINE: list[int] */
851 long i = PyInt_AsLong(w);
852 if (i < 0)
853 i += ((PyListObject*) v)->ob_size;
854 if (i < 0 ||
855 i >= ((PyListObject*) v)->ob_size) {
856 PyErr_SetString(PyExc_IndexError,
857 "list index out of range");
858 x = NULL;
859 }
860 else {
861 x = ((PyListObject*) v)->ob_item[i];
862 Py_INCREF(x);
863 }
864 }
865 else
866 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(v);
868 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000870 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 break;
872
Guido van Rossum7928cd71991-10-24 14:59:31 +0000873 case BINARY_LSHIFT:
874 w = POP();
875 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000876 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000877 Py_DECREF(v);
878 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 break;
882
883 case BINARY_RSHIFT:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000891 break;
892
893 case BINARY_AND:
894 w = POP();
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
898 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000899 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000900 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901 break;
902
903 case BINARY_XOR:
904 w = POP();
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(v);
908 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000909 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000910 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000911 break;
912
913 case BINARY_OR:
914 w = POP();
915 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 Py_DECREF(v);
918 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000921 break;
922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 case SLICE+0:
924 case SLICE+1:
925 case SLICE+2:
926 case SLICE+3:
927 if ((opcode-SLICE) & 2)
928 w = POP();
929 else
930 w = NULL;
931 if ((opcode-SLICE) & 1)
932 v = POP();
933 else
934 v = NULL;
935 u = POP();
936 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000937 Py_DECREF(u);
938 Py_XDECREF(v);
939 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
943
944 case STORE_SLICE+0:
945 case STORE_SLICE+1:
946 case STORE_SLICE+2:
947 case STORE_SLICE+3:
948 if ((opcode-STORE_SLICE) & 2)
949 w = POP();
950 else
951 w = NULL;
952 if ((opcode-STORE_SLICE) & 1)
953 v = POP();
954 else
955 v = NULL;
956 u = POP();
957 t = POP();
958 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(t);
960 Py_DECREF(u);
961 Py_XDECREF(v);
962 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000963 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 break;
965
966 case DELETE_SLICE+0:
967 case DELETE_SLICE+1:
968 case DELETE_SLICE+2:
969 case DELETE_SLICE+3:
970 if ((opcode-DELETE_SLICE) & 2)
971 w = POP();
972 else
973 w = NULL;
974 if ((opcode-DELETE_SLICE) & 1)
975 v = POP();
976 else
977 v = NULL;
978 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000981 Py_DECREF(u);
982 Py_XDECREF(v);
983 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000984 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
986
987 case STORE_SUBSCR:
988 w = POP();
989 v = POP();
990 u = POP();
991 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000992 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000993 Py_DECREF(u);
994 Py_DECREF(v);
995 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000996 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 break;
998
999 case DELETE_SUBSCR:
1000 w = POP();
1001 v = POP();
1002 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001003 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001006 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 break;
1008
1009 case PRINT_EXPR:
1010 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +00001012 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001014 (err = PyDict_SetItemString(
Guido van Rossum9cc8a201997-07-19 19:55:50 +00001015 f->f_builtins, "_", v)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001016 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001017 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001018 x = PySys_GetObject("stdout");
1019 if (x == NULL)
1020 err = -1;
1021 }
1022 if (err == 0)
1023 err = PyFile_WriteObject(v, x, 0);
1024 if (err == 0) {
1025 PyFile_SoftSpace(x, 1);
1026 err = Py_FlushLine();
1027 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 break;
1031
1032 case PRINT_ITEM:
1033 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 w = PySys_GetObject("stdout");
1035 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001036 err = PyFile_WriteString(" ", w);
1037 if (err == 0)
1038 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001040 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001041 char *s = PyString_AsString(v);
1042 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001043 if (len > 0 &&
1044 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001045 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001046 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001048 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001049 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 break;
1051
1052 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001053 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001054 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001055 PyErr_SetString(PyExc_RuntimeError,
1056 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001057 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001058 err = PyFile_WriteString("\n", x);
1059 if (err == 0)
1060 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001061 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 break;
1063
1064 case BREAK_LOOP:
1065 why = WHY_BREAK;
1066 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001067
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068 case RAISE_VARARGS:
1069 u = v = w = NULL;
1070 switch (oparg) {
1071 case 3:
1072 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073 /* Fallthrough */
1074 case 2:
1075 v = POP(); /* value */
1076 /* Fallthrough */
1077 case 1:
1078 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001079 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001080 break;
1081 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001082 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001083 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001084 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001085 break;
1086 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 break;
1088
1089 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001090 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001091 PyErr_SetString(PyExc_SystemError,
1092 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001093 break;
1094 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001095 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001096 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 break;
1098
1099 case RETURN_VALUE:
1100 retval = POP();
1101 why = WHY_RETURN;
1102 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001103
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001104 case EXEC_STMT:
1105 w = POP();
1106 v = POP();
1107 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001108 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001109 Py_DECREF(u);
1110 Py_DECREF(v);
1111 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001112 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001113
Guido van Rossum374a9221991-04-04 10:40:29 +00001114 case POP_BLOCK:
1115 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001116 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 while (STACK_LEVEL() > b->b_level) {
1118 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001119 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 }
1121 }
1122 break;
1123
1124 case END_FINALLY:
1125 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001126 if (PyInt_Check(v)) {
1127 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 if (why == WHY_RETURN)
1129 retval = POP();
1130 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001131 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001133 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001134 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001136 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001138 else if (v != Py_None) {
1139 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 "'finally' pops bad exception");
1141 why = WHY_EXCEPTION;
1142 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001143 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 break;
1145
1146 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001147 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001149 w = POP();
1150 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 Py_DECREF(u);
1153 Py_DECREF(v);
1154 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 break;
1156
1157 case STORE_NAME:
1158 w = GETNAMEV(oparg);
1159 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001160 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001161 PyErr_SetString(PyExc_SystemError,
1162 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001163 break;
1164 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001165 err = PyDict_SetItem(x, w, v);
1166 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 break;
1168
1169 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001170 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001171 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001172 PyErr_SetString(PyExc_SystemError,
1173 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 break;
1175 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001176 if ((err = PyDict_DelItem(x, w)) != 0)
1177 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001179
1180#ifdef CASE_TOO_BIG
1181 default: switch (opcode) {
1182#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001183
1184 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 case UNPACK_LIST:
1186 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001187 if (PyTuple_Check(v)) {
1188 if (PyTuple_Size(v) != oparg) {
1189 PyErr_SetString(PyExc_ValueError,
1190 "unpack tuple of wrong size");
1191 why = WHY_EXCEPTION;
1192 }
1193 else {
1194 for (; --oparg >= 0; ) {
1195 w = PyTuple_GET_ITEM(v, oparg);
1196 Py_INCREF(w);
1197 PUSH(w);
1198 }
1199 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001201 else if (PyList_Check(v)) {
1202 if (PyList_Size(v) != oparg) {
1203 PyErr_SetString(PyExc_ValueError,
1204 "unpack list of wrong size");
1205 why = WHY_EXCEPTION;
1206 }
1207 else {
1208 for (; --oparg >= 0; ) {
1209 w = PyList_GET_ITEM(v, oparg);
1210 Py_INCREF(w);
1211 PUSH(w);
1212 }
1213 }
1214 }
1215 else if (PySequence_Check(v)) {
1216 if (unpack_sequence(v, oparg,
1217 stack_pointer + oparg))
1218 stack_pointer += oparg;
1219 else
1220 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 }
1222 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001223 PyErr_SetString(PyExc_TypeError,
1224 "unpack non-sequence");
1225 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 break;
1229
1230 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001231 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 v = POP();
1233 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001234 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1235 Py_DECREF(v);
1236 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 break;
1238
1239 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001240 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001242 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1243 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001244 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 break;
1246
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001247 case STORE_GLOBAL:
1248 w = GETNAMEV(oparg);
1249 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001250 err = PyDict_SetItem(f->f_globals, w, v);
1251 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001252 break;
1253
1254 case DELETE_GLOBAL:
1255 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001256 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1257 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001258 break;
1259
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 case LOAD_CONST:
1261 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 PUSH(x);
1264 break;
1265
1266 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001267 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001268 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001269 PyErr_SetString(PyExc_SystemError,
1270 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001271 break;
1272 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001273 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001275 PyErr_Clear();
1276 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 PyErr_Clear();
1279 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001281 PyErr_SetObject(
1282 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 break;
1284 }
1285 }
1286 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 PUSH(x);
1289 break;
1290
1291 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001292 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 PyErr_Clear();
1296 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001298 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 break;
1300 }
1301 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001302 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 PUSH(x);
1304 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001305
Guido van Rossum9bfef441993-03-29 10:43:31 +00001306 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001307 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001308 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 PyErr_SetObject(PyExc_NameError,
1310 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001311 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001312 break;
1313 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001314 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001315 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001316 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001317 break;
1318
1319 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001320 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001321 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001322 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001323
1324 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001325 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001326 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001327
1328 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001329 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 if (x != NULL) {
1331 for (; --oparg >= 0;) {
1332 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001333 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 }
1335 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001336 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 }
1338 break;
1339
1340 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001341 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 if (x != NULL) {
1343 for (; --oparg >= 0;) {
1344 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001345 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 if (err != 0)
1347 break;
1348 }
1349 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001350 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 }
1352 break;
1353
1354 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001357 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 break;
1359
1360 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001361 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 x = PyObject_GetAttr(v, w);
1364 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001366 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
1368
1369 case COMPARE_OP:
1370 w = POP();
1371 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001372 if (PyInt_Check(v) && PyInt_Check(w)) {
1373 /* INLINE: cmp(int, int) */
1374 register long a, b;
1375 register int res;
1376 a = ((PyIntObject*) v)->ob_ival;
1377 b = ((PyIntObject*) w)->ob_ival;
1378 switch (oparg) {
1379 case LT: res = a < b; break;
1380 case LE: res = a <= b; break;
1381 case EQ: res = a == b; break;
1382 case NE: res = a != b; break;
1383 case GT: res = a > b; break;
1384 case GE: res = a >= b; break;
1385 case IS: res = v == w; break;
1386 case IS_NOT: res = v != w; break;
1387 default: goto slow_compare;
1388 }
1389 x = res ? Py_True : Py_False;
1390 Py_INCREF(x);
1391 }
1392 else {
1393 slow_compare:
1394 x = cmp_outcome(oparg, v, w);
1395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001396 Py_DECREF(v);
1397 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001399 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 break;
1401
1402 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001403 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001405 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001406 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001407 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 break;
1409 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001410 u = find_from_args(f, INSTR_OFFSET());
1411 if (u == NULL) {
1412 x = u;
1413 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001414 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001415 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001416 w,
1417 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001418 f->f_locals == NULL ?
1419 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001420 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001421 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422 if (w == NULL) {
1423 x = NULL;
1424 break;
1425 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 x = PyEval_CallObject(x, w);
1427 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001428 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001429 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 break;
1431
1432 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001433 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001436 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001437 PyErr_SetString(PyExc_SystemError,
1438 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 break;
1440 }
1441 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001442 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001443 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001445
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 case JUMP_FORWARD:
1447 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001448 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001449
1450 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001452 if (err > 0)
1453 err = 0;
1454 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001456 else
1457 break;
1458 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001459
1460 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001461 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001462 if (err > 0) {
1463 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001465 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001466 else if (err == 0)
1467 ;
1468 else
1469 break;
1470 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001471
1472 case JUMP_ABSOLUTE:
1473 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001474 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001475
1476 case FOR_LOOP:
1477 /* for v in s: ...
1478 On entry: stack contains s, i.
1479 On exit: stack contains s, i+1, s[i];
1480 but if loop exhausted:
1481 s, i are popped, and we jump */
1482 w = POP(); /* Loop index */
1483 v = POP(); /* Sequence object */
1484 u = loop_subscript(v, w);
1485 if (u != NULL) {
1486 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001487 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001489 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001491 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 }
1493 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 Py_DECREF(v);
1495 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 /* A NULL can mean "s exhausted"
1497 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001500 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001502 continue;
1503 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 }
1505 break;
1506
1507 case SETUP_LOOP:
1508 case SETUP_EXCEPT:
1509 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001512 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001513
1514 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001515#ifdef LLTRACE
1516 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001517 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001519 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001520 if (f->f_trace == NULL)
1521 continue;
1522 /* Trace each line of code reached */
1523 f->f_lasti = INSTR_OFFSET();
1524 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001527
1528 case CALL_FUNCTION:
1529 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001530 int na = oparg & 0xff;
1531 int nk = (oparg>>8) & 0xff;
1532 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 PyObject **pfunc = stack_pointer - n - 1;
1534 PyObject *func = *pfunc;
1535 PyObject *self = NULL;
1536 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001537 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 if (PyMethod_Check(func)) {
1539 self = PyMethod_Self(func);
1540 class = PyMethod_Class(func);
1541 func = PyMethod_Function(func);
1542 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001543 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 Py_INCREF(self);
1545 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001546 *pfunc = self;
1547 na++;
1548 n++;
1549 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001550 else {
1551 /* Unbound methods must be
1552 called with an instance of
1553 the class (or a derived
1554 class) as first argument */
1555 if (na > 0 &&
1556 (self = stack_pointer[-n])
1557 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001558 PyInstance_Check(self) &&
1559 PyClass_IsSubclass(
1560 (PyObject *)
1561 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001562 ->in_class),
1563 class))
1564 /* Handy-dandy */ ;
1565 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001566 PyErr_SetString(
1567 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001569 x = NULL;
1570 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 }
1572 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001573 }
1574 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001575 Py_INCREF(func);
1576 if (PyFunction_Check(func)) {
1577 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001578 PyObject *globals =
1579 PyFunction_GetGlobals(func);
1580 PyObject *argdefs =
1581 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583 int nd;
1584 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001585 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001586 nd = ((PyTupleObject *)argdefs) ->
1587 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 }
1589 else {
1590 d = NULL;
1591 nd = 0;
1592 }
1593 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001594 (PyCodeObject *)co,
1595 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001596 stack_pointer-n, na,
1597 stack_pointer-2*nk, nk,
1598 d, nd,
1599 class);
1600 }
1601 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 PyObject *args = PyTuple_New(na);
1603 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001604 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001605 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001606 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001607 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001608 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001609 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001610 if (kwdict == NULL) {
1611 x = NULL;
1612 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001613 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001614 err = 0;
1615 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 PyObject *value = POP();
1617 PyObject *key = POP();
1618 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001619 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 Py_DECREF(key);
1621 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001622 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001623 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 }
1625 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 Py_DECREF(args);
1627 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 break;
1629 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001630 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001631 while (--na >= 0) {
1632 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001634 }
1635 x = PyEval_CallObjectWithKeywords(
1636 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 Py_DECREF(args);
1638 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001640 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001641 while (stack_pointer > pfunc) {
1642 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001643 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001644 }
1645 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001646 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001647 break;
1648 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001649
Guido van Rossum681d79a1995-07-18 14:51:37 +00001650 case MAKE_FUNCTION:
1651 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001652 x = PyFunction_New(v, f->f_globals);
1653 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001654 /* XXX Maybe this should be a separate opcode? */
1655 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001657 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659 x = NULL;
1660 break;
1661 }
1662 while (--oparg >= 0) {
1663 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001664 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001665 }
1666 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001667 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001668 }
1669 PUSH(x);
1670 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001671
1672 case BUILD_SLICE:
1673 if (oparg == 3)
1674 w = POP();
1675 else
1676 w = NULL;
1677 v = POP();
1678 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001679 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 Py_DECREF(u);
1681 Py_DECREF(v);
1682 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001683 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001684 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001685 break;
1686
1687
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 default:
1689 fprintf(stderr,
1690 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001691 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 why = WHY_EXCEPTION;
1694 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001695
1696#ifdef CASE_TOO_BIG
1697 }
1698#endif
1699
Guido van Rossum374a9221991-04-04 10:40:29 +00001700 } /* switch */
1701
1702 on_error:
1703
1704 /* Quickly continue if no error occurred */
1705
1706 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001707 if (err == 0 && x != NULL) {
1708#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001709 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001710 fprintf(stderr,
1711 "XXX undetected error\n");
1712 else
1713#endif
1714 continue; /* Normal, fast path */
1715 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001717 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 err = 0;
1719 }
1720
Guido van Rossum801dcae1992-04-08 11:32:32 +00001721#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 /* Double-check exception status */
1723
1724 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001727 PyErr_SetString(PyExc_SystemError,
1728 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 why = WHY_EXCEPTION;
1730 }
1731 }
1732 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001734 fprintf(stderr,
1735 "XXX undetected error (why=%d)\n",
1736 why);
1737 why = WHY_EXCEPTION;
1738 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 }
1740#endif
1741
1742 /* Log traceback info if this is a real exception */
1743
1744 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001745 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001747 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001749
Guido van Rossume59214e1994-08-30 08:01:59 +00001750 if (f->f_trace)
1751 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001752 if (tstate->sys_profilefunc)
1753 call_exc_trace(&tstate->sys_profilefunc,
1754 (PyObject**)0, f);
1755}
Guido van Rossum374a9221991-04-04 10:40:29 +00001756
1757 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1758
1759 if (why == WHY_RERAISE)
1760 why = WHY_EXCEPTION;
1761
1762 /* Unwind stacks if a (pseudo) exception occurred */
1763
1764 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 while (STACK_LEVEL() > b->b_level) {
1767 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001768 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 }
1770 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1771 why = WHY_NOT;
1772 JUMPTO(b->b_handler);
1773 break;
1774 }
1775 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001776 (b->b_type == SETUP_EXCEPT &&
1777 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 PyObject *exc, *val, *tb;
1780 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001781 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 val = Py_None;
1783 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 /* Make the raw exception data
1786 available to the handler,
1787 so a program can emulate the
1788 Python main loop. Don't do
1789 this for 'finally'. */
1790 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001791 PyErr_NormalizeException(
1792 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001793 set_exc_info(tstate,
1794 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001796 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 PUSH(val);
1798 PUSH(exc);
1799 }
1800 else {
1801 if (why == WHY_RETURN)
1802 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001803 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 PUSH(v);
1805 }
1806 why = WHY_NOT;
1807 JUMPTO(b->b_handler);
1808 break;
1809 }
1810 } /* unwind stack */
1811
1812 /* End the loop if we still have an error (or return) */
1813
1814 if (why != WHY_NOT)
1815 break;
1816
1817 } /* main loop */
1818
1819 /* Pop remaining stack entries */
1820
1821 while (!EMPTY()) {
1822 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001823 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 }
1825
Guido van Rossum96a42c81992-01-12 02:29:51 +00001826 if (why != WHY_RETURN)
1827 retval = NULL;
1828
Guido van Rossume59214e1994-08-30 08:01:59 +00001829 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001830 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001831 if (call_trace(&f->f_trace, &f->f_trace, f,
1832 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001833 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001834 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001835 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001836 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001837 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001838 }
1839
Guido van Rossuma027efa1997-05-05 20:56:21 +00001840 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1841 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001842 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001844 retval = NULL;
1845 why = WHY_EXCEPTION;
1846 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001847 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001848
Guido van Rossuma027efa1997-05-05 20:56:21 +00001849 reset_exc_info(tstate);
1850
1851 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001852
1853 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001854
Guido van Rossum374a9221991-04-04 10:40:29 +00001855 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001856
Guido van Rossuma027efa1997-05-05 20:56:21 +00001857 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001858 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001859
Guido van Rossum96a42c81992-01-12 02:29:51 +00001860 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001861}
1862
Guido van Rossuma027efa1997-05-05 20:56:21 +00001863static void
1864set_exc_info(tstate, type, value, tb)
1865 PyThreadState *tstate;
1866 PyObject *type;
1867 PyObject *value;
1868 PyObject *tb;
1869{
1870 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001871 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001872
Guido van Rossuma027efa1997-05-05 20:56:21 +00001873 frame = tstate->frame;
1874 if (frame->f_exc_type == NULL) {
1875 /* This frame didn't catch an exception before */
1876 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001877 if (tstate->exc_type == NULL) {
1878 Py_INCREF(Py_None);
1879 tstate->exc_type = Py_None;
1880 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001881 tmp_type = frame->f_exc_type;
1882 tmp_value = frame->f_exc_value;
1883 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001884 Py_XINCREF(tstate->exc_type);
1885 Py_XINCREF(tstate->exc_value);
1886 Py_XINCREF(tstate->exc_traceback);
1887 frame->f_exc_type = tstate->exc_type;
1888 frame->f_exc_value = tstate->exc_value;
1889 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001890 Py_XDECREF(tmp_type);
1891 Py_XDECREF(tmp_value);
1892 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001893 }
1894 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001895 tmp_type = tstate->exc_type;
1896 tmp_value = tstate->exc_value;
1897 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001898 Py_XINCREF(type);
1899 Py_XINCREF(value);
1900 Py_XINCREF(tb);
1901 tstate->exc_type = type;
1902 tstate->exc_value = value;
1903 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001904 Py_XDECREF(tmp_type);
1905 Py_XDECREF(tmp_value);
1906 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001907 /* For b/w compatibility */
1908 PySys_SetObject("exc_type", type);
1909 PySys_SetObject("exc_value", value);
1910 PySys_SetObject("exc_traceback", tb);
1911}
1912
1913static void
1914reset_exc_info(tstate)
1915 PyThreadState *tstate;
1916{
1917 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001918 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001919 frame = tstate->frame;
1920 if (frame->f_exc_type != NULL) {
1921 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001922 tmp_type = tstate->exc_type;
1923 tmp_value = tstate->exc_value;
1924 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001925 Py_XINCREF(frame->f_exc_type);
1926 Py_XINCREF(frame->f_exc_value);
1927 Py_XINCREF(frame->f_exc_traceback);
1928 tstate->exc_type = frame->f_exc_type;
1929 tstate->exc_value = frame->f_exc_value;
1930 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001931 Py_XDECREF(tmp_type);
1932 Py_XDECREF(tmp_value);
1933 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001934 /* For b/w compatibility */
1935 PySys_SetObject("exc_type", frame->f_exc_type);
1936 PySys_SetObject("exc_value", frame->f_exc_value);
1937 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1938 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001939 tmp_type = frame->f_exc_type;
1940 tmp_value = frame->f_exc_value;
1941 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001942 frame->f_exc_type = NULL;
1943 frame->f_exc_value = NULL;
1944 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001945 Py_XDECREF(tmp_type);
1946 Py_XDECREF(tmp_value);
1947 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001948}
1949
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001950/* Logic for the raise statement (too complicated for inlining).
1951 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001952static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001953do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001954 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001955{
1956 /* We support the following forms of raise:
1957 raise <class>, <classinstance>
1958 raise <class>, <argument tuple>
1959 raise <class>, None
1960 raise <class>, <argument>
1961 raise <classinstance>, None
1962 raise <string>, <object>
1963 raise <string>, None
1964
1965 An omitted second argument is the same as None.
1966
1967 In addition, raise <tuple>, <anything> is the same as
1968 raising the tuple's first item (and it better have one!);
1969 this rule is applied recursively.
1970
1971 Finally, an optional third argument can be supplied, which
1972 gives the traceback to be substituted (useful when
1973 re-raising an exception after examining it). */
1974
1975 /* First, check the traceback argument, replacing None with
1976 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001977 if (tb == Py_None) {
1978 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001979 tb = NULL;
1980 }
1981 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001982 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001983 "raise 3rd arg must be traceback or None");
1984 goto raise_error;
1985 }
1986
1987 /* Next, replace a missing value with None */
1988 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001989 value = Py_None;
1990 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001991 }
1992
1993 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1995 PyObject *tmp = type;
1996 type = PyTuple_GET_ITEM(type, 0);
1997 Py_INCREF(type);
1998 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001999 }
2000
Barry Warsaw4249f541997-08-22 21:26:19 +00002001 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002002 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002003
2004 else if (PyClass_Check(type))
2005 PyErr_NormalizeException(&type, &value, &tb);
2006
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002008 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 if (value != Py_None) {
2010 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002011 "instance exception may not have a separate value");
2012 goto raise_error;
2013 }
2014 else {
2015 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002016 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002017 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2019 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002020 }
2021 }
2022 else {
2023 /* Not something you can raise. You get an exception
2024 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002026 "exceptions must be strings, classes, or instances");
2027 goto raise_error;
2028 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002030 if (tb == NULL)
2031 return WHY_EXCEPTION;
2032 else
2033 return WHY_RERAISE;
2034 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 Py_XDECREF(value);
2036 Py_XDECREF(type);
2037 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002038 return WHY_EXCEPTION;
2039}
2040
Barry Warsawe42b18f1997-08-25 22:13:04 +00002041static int
2042unpack_sequence(v, argcnt, sp)
2043 PyObject *v;
2044 int argcnt;
2045 PyObject **sp;
2046{
2047 int i;
2048 PyObject *w;
2049
2050 for (i = 0; i < argcnt; i++) {
2051 if (! (w = PySequence_GetItem(v, i))) {
2052 if (PyErr_ExceptionMatches(PyExc_IndexError))
2053 PyErr_SetString(PyExc_ValueError,
2054 "unpack sequence of wrong size");
2055 goto finally;
2056 }
2057 *--sp = w;
2058 }
2059 /* we better get an IndexError now */
2060 if (PySequence_GetItem(v, i) == NULL) {
2061 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2062 PyErr_Clear();
2063 return 1;
2064 }
2065 /* some other exception occurred. fall through to finally */
2066 }
2067 else
2068 PyErr_SetString(PyExc_ValueError,
2069 "unpack sequence of wrong size");
2070 /* fall through */
2071finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002072 for (; i > 0; i--, sp++)
2073 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002074
2075 return 0;
2076}
2077
2078
Guido van Rossum96a42c81992-01-12 02:29:51 +00002079#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080static int
2081prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002082 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002086 if (PyObject_Print(v, stdout, 0) != 0)
2087 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002092static void
2093call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 PyObject **p_trace, **p_newtrace;
2095 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002096{
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002098 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002100 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002101 value = Py_None;
2102 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002103 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002106 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002108 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002110 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002111 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002112 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002114 Py_XDECREF(type);
2115 Py_XDECREF(value);
2116 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002117 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002118}
2119
2120static int
2121call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002122 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002123 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002125 may point to NULL variable;
2126 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002128 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002130{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002131 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 PyObject *args, *what;
2133 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002134
Guido van Rossuma027efa1997-05-05 20:56:21 +00002135 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002136 /* Don't do recursive traces */
2137 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002139 *p_newtrace = NULL;
2140 }
2141 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002142 }
2143
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002145 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002146 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002148 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002149 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 Py_INCREF(f);
2151 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2152 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002153 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 arg = Py_None;
2155 Py_INCREF(arg);
2156 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002157 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 PyFrame_FastToLocals(f);
2159 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2160 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002161 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002162 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002164 if (res == NULL) {
2165 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 PyTraceBack_Here(f);
2167 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002168 *p_trace = NULL;
2169 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002171 *p_newtrace = NULL;
2172 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002173 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002174 }
2175 else {
2176 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 Py_XDECREF(*p_newtrace);
2178 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002179 *p_newtrace = NULL;
2180 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002182 *p_newtrace = res;
2183 }
2184 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002186 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002187 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002188}
2189
Guido van Rossumb209a111997-04-29 18:18:01 +00002190PyObject *
2191PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002192{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002193 PyThreadState *tstate = PyThreadState_Get();
2194 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002195 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002196 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002197 else
2198 return current_frame->f_builtins;
2199}
2200
Guido van Rossumb209a111997-04-29 18:18:01 +00002201PyObject *
2202PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002203{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002204 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002205 if (current_frame == NULL)
2206 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002208 return current_frame->f_locals;
2209}
2210
Guido van Rossumb209a111997-04-29 18:18:01 +00002211PyObject *
2212PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002213{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002214 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002215 if (current_frame == NULL)
2216 return NULL;
2217 else
2218 return current_frame->f_globals;
2219}
2220
Guido van Rossumb209a111997-04-29 18:18:01 +00002221PyObject *
2222PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002223{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002224 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002226}
2227
Guido van Rossum6135a871995-01-09 17:53:26 +00002228int
Guido van Rossumb209a111997-04-29 18:18:01 +00002229PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002230{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002231 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002232 return current_frame == NULL ? 0 : current_frame->f_restricted;
2233}
2234
Guido van Rossumbe270261997-05-22 22:26:18 +00002235int
Guido van Rossumb209a111997-04-29 18:18:01 +00002236Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237{
Guido van Rossumb209a111997-04-29 18:18:01 +00002238 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002239 if (f == NULL)
2240 return 0;
2241 if (!PyFile_SoftSpace(f, 0))
2242 return 0;
2243 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244}
2245
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246
Guido van Rossum681d79a1995-07-18 14:51:37 +00002247/* External interface to call any callable object.
2248 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002249
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002250#undef PyEval_CallObject
2251/* for backward compatibility: export this interface */
2252
Guido van Rossumb209a111997-04-29 18:18:01 +00002253PyObject *
2254PyEval_CallObject(func, arg)
2255 PyObject *func;
2256 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002257{
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002259}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002260#define PyEval_CallObject(func,arg) \
2261 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002262
Guido van Rossumb209a111997-04-29 18:18:01 +00002263PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002264PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002265 PyObject *func;
2266 PyObject *arg;
2267 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002268{
2269 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002270 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002271
2272 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002273 arg = PyTuple_New(0);
2274 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002275 PyErr_SetString(PyExc_TypeError,
2276 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002277 return NULL;
2278 }
2279 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002280 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002281
Guido van Rossumb209a111997-04-29 18:18:01 +00002282 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002283 PyErr_SetString(PyExc_TypeError,
2284 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002285 return NULL;
2286 }
2287
Guido van Rossum150b2df1996-12-05 23:17:11 +00002288 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002289 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002290 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291 result = call_function(func, arg, kw);
2292 else
2293 result = call_builtin(func, arg, kw);
2294
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002296
Guido van Rossumb209a111997-04-29 18:18:01 +00002297 if (result == NULL && !PyErr_Occurred())
2298 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002299 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002300
2301 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002302}
2303
Guido van Rossumb209a111997-04-29 18:18:01 +00002304static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002305call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002306 PyObject *func;
2307 PyObject *arg;
2308 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309{
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 if (PyCFunction_Check(func)) {
2311 PyCFunction meth = PyCFunction_GetFunction(func);
2312 PyObject *self = PyCFunction_GetSelf(func);
2313 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002314 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002315 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002316 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002318 else if (size == 0)
2319 arg = NULL;
2320 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002321 if (flags & METH_KEYWORDS)
2322 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002323 if (kw != NULL && PyDict_Size(kw) != 0) {
2324 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002325 "this function takes no keyword arguments");
2326 return NULL;
2327 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002328 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002330 if (PyClass_Check(func)) {
2331 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 if (PyInstance_Check(func)) {
2334 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002335 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002336 PyErr_Clear();
2337 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002339 return NULL;
2340 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002341 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002342 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002343 return res;
2344 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002345 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 return NULL;
2347}
2348
Guido van Rossumb209a111997-04-29 18:18:01 +00002349static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002350call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002351 PyObject *func;
2352 PyObject *arg;
2353 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354{
Guido van Rossumb209a111997-04-29 18:18:01 +00002355 PyObject *class = NULL; /* == owner */
2356 PyObject *argdefs;
2357 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002358 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360
Guido van Rossumb209a111997-04-29 18:18:01 +00002361 if (kw != NULL && !PyDict_Check(kw)) {
2362 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002363 return NULL;
2364 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 if (PyMethod_Check(func)) {
2367 PyObject *self = PyMethod_Self(func);
2368 class = PyMethod_Class(func);
2369 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002370 if (self == NULL) {
2371 /* Unbound methods must be called with an instance of
2372 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 if (PyTuple_Size(arg) >= 1) {
2374 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002375 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002376 PyInstance_Check(self) &&
2377 PyClass_IsSubclass((PyObject *)
2378 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002379 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002380 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002381 else
2382 self = NULL;
2383 }
2384 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002385 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002386 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002387 return NULL;
2388 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002390 }
2391 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002392 int argcount = PyTuple_Size(arg);
2393 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002394 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002395 if (newarg == NULL)
2396 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 Py_INCREF(self);
2398 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002399 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 PyObject *v = PyTuple_GET_ITEM(arg, i);
2401 Py_XINCREF(v);
2402 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002403 }
2404 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 }
2406 }
2407 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002409 PyErr_SetString(PyExc_TypeError,
2410 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 return NULL;
2412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415
2416 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2418 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2419 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002420 }
2421 else {
2422 d = NULL;
2423 nd = 0;
2424 }
2425
2426 if (kw != NULL) {
2427 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 nk = PyDict_Size(kw);
2429 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 PyErr_NoMemory();
2432 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002433 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002434 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 i += 2;
2438 nk = i/2;
2439 /* XXX This is broken if the caller deletes dict items! */
2440 }
2441 else {
2442 k = NULL;
2443 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002444 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002447 (PyCodeObject *)PyFunction_GetCode(func),
2448 PyFunction_GetGlobals(func), (PyObject *)NULL,
2449 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 k, nk,
2451 d, nd,
2452 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453
Guido van Rossumb209a111997-04-29 18:18:01 +00002454 Py_DECREF(arg);
2455 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456
Guido van Rossum681d79a1995-07-18 14:51:37 +00002457 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458}
2459
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002460#define SLICE_ERROR_MSG \
2461 "standard sequence type does not support step size other than one"
2462
Guido van Rossumb209a111997-04-29 18:18:01 +00002463static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002464loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002465 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466{
Guido van Rossumb209a111997-04-29 18:18:01 +00002467 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002468 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 return NULL;
2472 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002473 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002474 v = (*sq->sq_item)(v, i);
2475 if (v)
2476 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002477 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002478 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002479 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480}
2481
2482static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002483slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002484 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 int *pi;
2486{
2487 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002488 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002490 PyErr_SetString(PyExc_TypeError,
2491 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002492 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002494 x = PyInt_AsLong(v);
2495 /* Truncate -- very long indices are truncated anyway */
2496 if (x > INT_MAX)
2497 x = INT_MAX;
2498 else if (x < -INT_MAX)
2499 x = 0;
2500 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002502 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503}
2504
Guido van Rossumb209a111997-04-29 18:18:01 +00002505static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002507 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002509 int ilow = 0, ihigh = INT_MAX;
2510 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002512 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002513 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002514 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516
2517static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002518assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002519 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002521 int ilow = 0, ihigh = INT_MAX;
2522 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002524 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002525 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526 if (x == NULL)
2527 return PySequence_DelSlice(u, ilow, ihigh);
2528 else
2529 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530}
2531
2532static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002533cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002535{
Guido van Rossume59214e1994-08-30 08:01:59 +00002536 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002537 PyObject *x;
2538 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002539 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002540 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002541 register char *s, *end;
2542 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2544 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002545 "string member test needs char left operand");
2546 return -1;
2547 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 c = PyString_AsString(v)[0];
2549 s = PyString_AsString(w);
2550 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002551 while (s < end) {
2552 if (c == *s++)
2553 return 1;
2554 }
2555 return 0;
2556 }
2557 sq = w->ob_type->tp_as_sequence;
2558 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002559 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002560 "'in' or 'not in' needs sequence right argument");
2561 return -1;
2562 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002563 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002564 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002565 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002566 if (PyErr_Occurred() == PyExc_IndexError) {
2567 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002568 break;
2569 }
2570 return -1;
2571 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002572 cmp = PyObject_Compare(v, x);
2573 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574 if (cmp == 0)
2575 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002576 if (PyErr_Occurred())
2577 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002578 }
2579 return 0;
2580}
2581
Guido van Rossumb209a111997-04-29 18:18:01 +00002582static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002583cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002584 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002585 register PyObject *v;
2586 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587{
2588 register int cmp;
2589 register int res = 0;
2590 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002591 case IS:
2592 case IS_NOT:
2593 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002594 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 res = !res;
2596 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 case IN:
2598 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599 res = cmp_member(v, w);
2600 if (res < 0)
2601 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002602 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 break;
2605 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002606 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 break;
2608 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002609 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002610 if (cmp && PyErr_Occurred())
2611 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002612 switch (op) {
2613 case LT: res = cmp < 0; break;
2614 case LE: res = cmp <= 0; break;
2615 case EQ: res = cmp == 0; break;
2616 case NE: res = cmp != 0; break;
2617 case GT: res = cmp > 0; break;
2618 case GE: res = cmp >= 0; break;
2619 /* XXX no default? (res is initialized to 0 though) */
2620 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 v = res ? Py_True : Py_False;
2623 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 return v;
2625}
2626
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627static int
2628import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002629 PyObject *locals;
2630 PyObject *v;
2631 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002632{
Guido van Rossumb209a111997-04-29 18:18:01 +00002633 PyObject *w, *x;
2634 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002635 PyErr_SetString(PyExc_TypeError,
2636 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002637 return -1;
2638 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002639 w = PyModule_GetDict(v);
2640 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002641 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002642 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002643 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 while (PyDict_Next(w, &pos, &name, &value)) {
2645 if (!PyString_Check(name) ||
2646 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002647 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002648 Py_INCREF(value);
2649 err = PyDict_SetItem(locals, name, value);
2650 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002651 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002653 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002654 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002655 }
2656 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002658 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002659 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002660 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 PyString_AsString(name));
2662 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002663 return -1;
2664 }
2665 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002667 }
2668}
2669
Guido van Rossumb209a111997-04-29 18:18:01 +00002670static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002671build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002672 PyObject *methods; /* dictionary */
2673 PyObject *bases; /* tuple containing classes */
2674 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002675{
Guido van Rossumcd649651997-08-22 16:56:16 +00002676 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002678 PyErr_SetString(PyExc_SystemError,
2679 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002680 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002681 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002683 PyErr_SetString(PyExc_SystemError,
2684 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002685 return NULL;
2686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002688 PyErr_SetString(PyExc_SystemError,
2689 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002690 return NULL;
2691 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002692 n = PyTuple_Size(bases);
2693 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 PyObject *base = PyTuple_GET_ITEM(bases, i);
2695 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002696 /* Call the base's *type*, if it is callable.
2697 This code is a hook for Donald Beaudry's
2698 and Jim Fulton's type extensions. In
2699 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002700 since its types are not callable.
2701 Ditto: call the bases's *class*, if it has
2702 one. This makes the same thing possible
2703 without writing C code. A true meta-object
2704 protocol! */
2705 PyObject *basetype = (PyObject *)base->ob_type;
2706 PyObject *callable = NULL;
2707 if (PyCallable_Check(basetype))
2708 callable = basetype;
2709 else
2710 callable = PyObject_GetAttrString(
2711 base, "__class__");
2712 if (callable) {
2713 PyObject *args;
2714 PyObject *newclass = NULL;
2715 args = Py_BuildValue(
2716 "(OOO)", name, bases, methods);
2717 if (args != NULL) {
2718 newclass = PyEval_CallObject(
2719 callable, args);
2720 Py_DECREF(args);
2721 }
2722 if (callable != basetype)
2723 Py_DECREF(callable);
2724 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002725 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002727 "base is not a class object");
2728 return NULL;
2729 }
2730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002732}
2733
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002734static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002735exec_statement(f, prog, globals, locals)
2736 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 PyObject *prog;
2738 PyObject *globals;
2739 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002740{
2741 char *s;
2742 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002745
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2747 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002748 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002750 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 locals = PyTuple_GetItem(prog, 2);
2752 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002753 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 if (globals == Py_None) {
2755 globals = PyEval_GetGlobals();
2756 if (locals == Py_None) {
2757 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002758 plain = 1;
2759 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002760 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002762 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 if (!PyString_Check(prog) &&
2764 !PyCode_Check(prog) &&
2765 !PyFile_Check(prog)) {
2766 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002767 "exec 1st arg must be string, code or file object");
2768 return -1;
2769 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002770 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2771 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002772 "exec 2nd/3rd args must be dict or None");
2773 return -1;
2774 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002776 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 if (PyCode_Check(prog)) {
Guido van Rossumdfed7251997-11-11 16:29:38 +00002778 v = PyEval_EvalCode((PyCodeObject *) prog,
2779 globals, locals);
2780 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002781 return -1;
Guido van Rossumdfed7251997-11-11 16:29:38 +00002782 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002783 return 0;
2784 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002785 if (PyFile_Check(prog)) {
2786 FILE *fp = PyFile_AsFile(prog);
2787 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002788 if (PyRun_File(fp, name, Py_file_input,
2789 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002790 return -1;
2791 return 0;
2792 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002793 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002794 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002795 PyErr_SetString(PyExc_ValueError,
2796 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002797 return -1;
2798 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002799 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002800 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002801 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002803 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002804 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002805 return 0;
2806}
Guido van Rossum24c13741995-02-14 09:42:43 +00002807
Guido van Rossum1aa14831997-01-21 05:34:20 +00002808/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002809static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002810find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002812 int nexti;
2813{
2814 int opcode;
2815 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002817 unsigned char *next_instr;
2818
2819 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2820 opcode = (*next_instr++);
2821 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 Py_INCREF(Py_None);
2823 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002824 }
2825
Guido van Rossumb209a111997-04-29 18:18:01 +00002826 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002827 if (list == NULL)
2828 return NULL;
2829
2830 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002831 oparg = (next_instr[1]<<8) + next_instr[0];
2832 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002833 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 if (PyList_Append(list, name) < 0) {
2835 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002836 break;
2837 }
2838 opcode = (*next_instr++);
2839 } while (opcode == IMPORT_FROM);
2840
2841 return list;
2842}
Guido van Rossum950361c1997-01-24 13:49:28 +00002843
2844
2845#ifdef DYNAMIC_EXECUTION_PROFILE
2846
2847PyObject *
2848getarray(a)
2849 long a[256];
2850{
2851 int i;
2852 PyObject *l = PyList_New(256);
2853 if (l == NULL) return NULL;
2854 for (i = 0; i < 256; i++) {
2855 PyObject *x = PyInt_FromLong(a[i]);
2856 if (x == NULL) {
2857 Py_DECREF(l);
2858 return NULL;
2859 }
2860 PyList_SetItem(l, i, x);
2861 }
2862 for (i = 0; i < 256; i++)
2863 a[i] = 0;
2864 return l;
2865}
2866
2867PyObject *
2868_Py_GetDXProfile(self, args)
2869 PyObject *self, *args;
2870{
2871#ifndef DXPAIRS
2872 return getarray(dxp);
2873#else
2874 int i;
2875 PyObject *l = PyList_New(257);
2876 if (l == NULL) return NULL;
2877 for (i = 0; i < 257; i++) {
2878 PyObject *x = getarray(dxpairs[i]);
2879 if (x == NULL) {
2880 Py_DECREF(l);
2881 return NULL;
2882 }
2883 PyList_SetItem(l, i, x);
2884 }
2885 return l;
2886#endif
2887}
2888
2889#endif