blob: 8b7447cc2448c7472f7da6e9cf6cea933ec74da3 [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 Rossumaa06b0e1997-12-26 22:15:57 +00001011 /* Print value except if None */
1012 /* After printing, also assign to '_' */
1013 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001015 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001016 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001017 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001019 x = PySys_GetObject("stdout");
1020 if (x == NULL)
1021 err = -1;
1022 }
1023 if (err == 0)
1024 err = PyFile_WriteObject(v, x, 0);
1025 if (err == 0) {
1026 PyFile_SoftSpace(x, 1);
1027 err = Py_FlushLine();
1028 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001029 if (err == 0) {
1030 err = PyDict_SetItemString(
1031 f->f_builtins, "_", v);
1032 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 break;
1036
1037 case PRINT_ITEM:
1038 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 w = PySys_GetObject("stdout");
1040 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001041 err = PyFile_WriteString(" ", w);
1042 if (err == 0)
1043 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001044 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001045 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001046 char *s = PyString_AsString(v);
1047 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001048 if (len > 0 &&
1049 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001050 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001051 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001053 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001054 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 break;
1056
1057 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001058 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001059 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001060 PyErr_SetString(PyExc_RuntimeError,
1061 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001062 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001063 err = PyFile_WriteString("\n", x);
1064 if (err == 0)
1065 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001066 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001067 break;
1068
1069 case BREAK_LOOP:
1070 why = WHY_BREAK;
1071 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001072
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073 case RAISE_VARARGS:
1074 u = v = w = NULL;
1075 switch (oparg) {
1076 case 3:
1077 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001078 /* Fallthrough */
1079 case 2:
1080 v = POP(); /* value */
1081 /* Fallthrough */
1082 case 1:
1083 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001084 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001085 break;
1086 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001087 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001088 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001089 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001090 break;
1091 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001092 break;
1093
1094 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001095 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001096 PyErr_SetString(PyExc_SystemError,
1097 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001098 break;
1099 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001100 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001101 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 break;
1103
1104 case RETURN_VALUE:
1105 retval = POP();
1106 why = WHY_RETURN;
1107 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001108
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001109 case EXEC_STMT:
1110 w = POP();
1111 v = POP();
1112 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001113 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001114 Py_DECREF(u);
1115 Py_DECREF(v);
1116 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001117 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001118
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 case POP_BLOCK:
1120 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001121 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 while (STACK_LEVEL() > b->b_level) {
1123 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001124 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 }
1126 }
1127 break;
1128
1129 case END_FINALLY:
1130 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001131 if (PyInt_Check(v)) {
1132 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 if (why == WHY_RETURN)
1134 retval = POP();
1135 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001136 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001138 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001139 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001141 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001143 else if (v != Py_None) {
1144 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 "'finally' pops bad exception");
1146 why = WHY_EXCEPTION;
1147 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001148 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 break;
1150
1151 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001152 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001154 w = POP();
1155 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001157 Py_DECREF(u);
1158 Py_DECREF(v);
1159 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 break;
1161
1162 case STORE_NAME:
1163 w = GETNAMEV(oparg);
1164 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001165 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001166 PyErr_SetString(PyExc_SystemError,
1167 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001168 break;
1169 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001170 err = PyDict_SetItem(x, w, v);
1171 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 break;
1173
1174 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001175 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001176 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001177 PyErr_SetString(PyExc_SystemError,
1178 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001179 break;
1180 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001181 if ((err = PyDict_DelItem(x, w)) != 0)
1182 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001184
1185#ifdef CASE_TOO_BIG
1186 default: switch (opcode) {
1187#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001188
1189 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 case UNPACK_LIST:
1191 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001192 if (PyTuple_Check(v)) {
1193 if (PyTuple_Size(v) != oparg) {
1194 PyErr_SetString(PyExc_ValueError,
1195 "unpack tuple of wrong size");
1196 why = WHY_EXCEPTION;
1197 }
1198 else {
1199 for (; --oparg >= 0; ) {
1200 w = PyTuple_GET_ITEM(v, oparg);
1201 Py_INCREF(w);
1202 PUSH(w);
1203 }
1204 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001206 else if (PyList_Check(v)) {
1207 if (PyList_Size(v) != oparg) {
1208 PyErr_SetString(PyExc_ValueError,
1209 "unpack list of wrong size");
1210 why = WHY_EXCEPTION;
1211 }
1212 else {
1213 for (; --oparg >= 0; ) {
1214 w = PyList_GET_ITEM(v, oparg);
1215 Py_INCREF(w);
1216 PUSH(w);
1217 }
1218 }
1219 }
1220 else if (PySequence_Check(v)) {
1221 if (unpack_sequence(v, oparg,
1222 stack_pointer + oparg))
1223 stack_pointer += oparg;
1224 else
1225 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 }
1227 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001228 PyErr_SetString(PyExc_TypeError,
1229 "unpack non-sequence");
1230 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001232 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 break;
1234
1235 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001236 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 v = POP();
1238 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1240 Py_DECREF(v);
1241 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
1243
1244 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001245 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001247 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1248 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 break;
1251
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001252 case STORE_GLOBAL:
1253 w = GETNAMEV(oparg);
1254 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001255 err = PyDict_SetItem(f->f_globals, w, v);
1256 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001257 break;
1258
1259 case DELETE_GLOBAL:
1260 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1262 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001263 break;
1264
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 case LOAD_CONST:
1266 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001267 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 PUSH(x);
1269 break;
1270
1271 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001272 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001273 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001274 PyErr_SetString(PyExc_SystemError,
1275 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001276 break;
1277 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 PyErr_Clear();
1281 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001283 PyErr_Clear();
1284 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001286 PyErr_SetObject(
1287 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
1289 }
1290 }
1291 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 PUSH(x);
1294 break;
1295
1296 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001297 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001298 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001300 PyErr_Clear();
1301 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001303 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 break;
1305 }
1306 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 PUSH(x);
1309 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001310
Guido van Rossum9bfef441993-03-29 10:43:31 +00001311 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001312 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001313 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001314 PyErr_SetObject(PyExc_NameError,
1315 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001316 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001317 break;
1318 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001319 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001320 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001321 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001322 break;
1323
1324 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001325 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001326 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001327 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001328
1329 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001330 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001331 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332
1333 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 if (x != NULL) {
1336 for (; --oparg >= 0;) {
1337 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001338 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 }
1340 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001341 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 }
1343 break;
1344
1345 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 if (x != NULL) {
1348 for (; --oparg >= 0;) {
1349 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 if (err != 0)
1352 break;
1353 }
1354 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001355 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 }
1357 break;
1358
1359 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001360 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001362 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 break;
1364
1365 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001366 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001368 x = PyObject_GetAttr(v, w);
1369 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001371 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 break;
1373
1374 case COMPARE_OP:
1375 w = POP();
1376 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001377 if (PyInt_Check(v) && PyInt_Check(w)) {
1378 /* INLINE: cmp(int, int) */
1379 register long a, b;
1380 register int res;
1381 a = ((PyIntObject*) v)->ob_ival;
1382 b = ((PyIntObject*) w)->ob_ival;
1383 switch (oparg) {
1384 case LT: res = a < b; break;
1385 case LE: res = a <= b; break;
1386 case EQ: res = a == b; break;
1387 case NE: res = a != b; break;
1388 case GT: res = a > b; break;
1389 case GE: res = a >= b; break;
1390 case IS: res = v == w; break;
1391 case IS_NOT: res = v != w; break;
1392 default: goto slow_compare;
1393 }
1394 x = res ? Py_True : Py_False;
1395 Py_INCREF(x);
1396 }
1397 else {
1398 slow_compare:
1399 x = cmp_outcome(oparg, v, w);
1400 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001401 Py_DECREF(v);
1402 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001404 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 break;
1406
1407 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001410 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001411 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001412 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001413 break;
1414 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001415 u = find_from_args(f, INSTR_OFFSET());
1416 if (u == NULL) {
1417 x = u;
1418 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001419 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 w,
1422 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001423 f->f_locals == NULL ?
1424 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001425 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001427 if (w == NULL) {
1428 x = NULL;
1429 break;
1430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 x = PyEval_CallObject(x, w);
1432 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001433 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001434 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 break;
1436
1437 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001438 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001442 PyErr_SetString(PyExc_SystemError,
1443 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001444 break;
1445 }
1446 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001447 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001448 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001450
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 case JUMP_FORWARD:
1452 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001453 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001454
1455 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001456 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001457 if (err > 0)
1458 err = 0;
1459 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001461 else
1462 break;
1463 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001464
1465 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001466 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001467 if (err > 0) {
1468 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001470 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001471 else if (err == 0)
1472 ;
1473 else
1474 break;
1475 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001476
1477 case JUMP_ABSOLUTE:
1478 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001479 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001480
1481 case FOR_LOOP:
1482 /* for v in s: ...
1483 On entry: stack contains s, i.
1484 On exit: stack contains s, i+1, s[i];
1485 but if loop exhausted:
1486 s, i are popped, and we jump */
1487 w = POP(); /* Loop index */
1488 v = POP(); /* Sequence object */
1489 u = loop_subscript(v, w);
1490 if (u != NULL) {
1491 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001496 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 }
1498 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 Py_DECREF(v);
1500 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 /* A NULL can mean "s exhausted"
1502 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001505 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001507 continue;
1508 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 }
1510 break;
1511
1512 case SETUP_LOOP:
1513 case SETUP_EXCEPT:
1514 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001517 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001518
1519 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001520#ifdef LLTRACE
1521 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001522 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001524 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001525 if (f->f_trace == NULL)
1526 continue;
1527 /* Trace each line of code reached */
1528 f->f_lasti = INSTR_OFFSET();
1529 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001532
1533 case CALL_FUNCTION:
1534 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001535 int na = oparg & 0xff;
1536 int nk = (oparg>>8) & 0xff;
1537 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 PyObject **pfunc = stack_pointer - n - 1;
1539 PyObject *func = *pfunc;
1540 PyObject *self = NULL;
1541 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001542 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 if (PyMethod_Check(func)) {
1544 self = PyMethod_Self(func);
1545 class = PyMethod_Class(func);
1546 func = PyMethod_Function(func);
1547 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001548 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 Py_INCREF(self);
1550 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001551 *pfunc = self;
1552 na++;
1553 n++;
1554 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 else {
1556 /* Unbound methods must be
1557 called with an instance of
1558 the class (or a derived
1559 class) as first argument */
1560 if (na > 0 &&
1561 (self = stack_pointer[-n])
1562 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 PyInstance_Check(self) &&
1564 PyClass_IsSubclass(
1565 (PyObject *)
1566 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 ->in_class),
1568 class))
1569 /* Handy-dandy */ ;
1570 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001571 PyErr_SetString(
1572 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001573 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001574 x = NULL;
1575 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001576 }
1577 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 }
1579 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 Py_INCREF(func);
1581 if (PyFunction_Check(func)) {
1582 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001583 PyObject *globals =
1584 PyFunction_GetGlobals(func);
1585 PyObject *argdefs =
1586 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 int nd;
1589 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001591 nd = ((PyTupleObject *)argdefs) ->
1592 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 }
1594 else {
1595 d = NULL;
1596 nd = 0;
1597 }
1598 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 (PyCodeObject *)co,
1600 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 stack_pointer-n, na,
1602 stack_pointer-2*nk, nk,
1603 d, nd,
1604 class);
1605 }
1606 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 PyObject *args = PyTuple_New(na);
1608 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001609 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001610 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001611 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001613 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001615 if (kwdict == NULL) {
1616 x = NULL;
1617 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001619 err = 0;
1620 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001621 PyObject *value = POP();
1622 PyObject *key = POP();
1623 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 Py_DECREF(key);
1626 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001627 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001629 }
1630 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 Py_DECREF(args);
1632 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001633 break;
1634 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001635 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001636 while (--na >= 0) {
1637 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001639 }
1640 x = PyEval_CallObjectWithKeywords(
1641 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_DECREF(args);
1643 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001646 while (stack_pointer > pfunc) {
1647 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001649 }
1650 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001651 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001652 break;
1653 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001654
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 case MAKE_FUNCTION:
1656 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 x = PyFunction_New(v, f->f_globals);
1658 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659 /* XXX Maybe this should be a separate opcode? */
1660 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001662 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001664 x = NULL;
1665 break;
1666 }
1667 while (--oparg >= 0) {
1668 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 }
1671 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 }
1674 PUSH(x);
1675 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001676
1677 case BUILD_SLICE:
1678 if (oparg == 3)
1679 w = POP();
1680 else
1681 w = NULL;
1682 v = POP();
1683 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001684 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 Py_DECREF(u);
1686 Py_DECREF(v);
1687 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001688 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001689 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001690 break;
1691
1692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 default:
1694 fprintf(stderr,
1695 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 why = WHY_EXCEPTION;
1699 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001700
1701#ifdef CASE_TOO_BIG
1702 }
1703#endif
1704
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 } /* switch */
1706
1707 on_error:
1708
1709 /* Quickly continue if no error occurred */
1710
1711 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001712 if (err == 0 && x != NULL) {
1713#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001715 fprintf(stderr,
1716 "XXX undetected error\n");
1717 else
1718#endif
1719 continue; /* Normal, fast path */
1720 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 err = 0;
1724 }
1725
Guido van Rossum801dcae1992-04-08 11:32:32 +00001726#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 /* Double-check exception status */
1728
1729 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001732 PyErr_SetString(PyExc_SystemError,
1733 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 why = WHY_EXCEPTION;
1735 }
1736 }
1737 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001738 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001739 fprintf(stderr,
1740 "XXX undetected error (why=%d)\n",
1741 why);
1742 why = WHY_EXCEPTION;
1743 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 }
1745#endif
1746
1747 /* Log traceback info if this is a real exception */
1748
1749 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001750 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001752 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001754
Guido van Rossume59214e1994-08-30 08:01:59 +00001755 if (f->f_trace)
1756 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001757 if (tstate->sys_profilefunc)
1758 call_exc_trace(&tstate->sys_profilefunc,
1759 (PyObject**)0, f);
1760}
Guido van Rossum374a9221991-04-04 10:40:29 +00001761
1762 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1763
1764 if (why == WHY_RERAISE)
1765 why = WHY_EXCEPTION;
1766
1767 /* Unwind stacks if a (pseudo) exception occurred */
1768
1769 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001770 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 while (STACK_LEVEL() > b->b_level) {
1772 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001773 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 }
1775 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1776 why = WHY_NOT;
1777 JUMPTO(b->b_handler);
1778 break;
1779 }
1780 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001781 (b->b_type == SETUP_EXCEPT &&
1782 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 PyObject *exc, *val, *tb;
1785 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 val = Py_None;
1788 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 /* Make the raw exception data
1791 available to the handler,
1792 so a program can emulate the
1793 Python main loop. Don't do
1794 this for 'finally'. */
1795 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001796 PyErr_NormalizeException(
1797 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001798 set_exc_info(tstate,
1799 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001801 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 PUSH(val);
1803 PUSH(exc);
1804 }
1805 else {
1806 if (why == WHY_RETURN)
1807 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001808 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 PUSH(v);
1810 }
1811 why = WHY_NOT;
1812 JUMPTO(b->b_handler);
1813 break;
1814 }
1815 } /* unwind stack */
1816
1817 /* End the loop if we still have an error (or return) */
1818
1819 if (why != WHY_NOT)
1820 break;
1821
1822 } /* main loop */
1823
1824 /* Pop remaining stack entries */
1825
1826 while (!EMPTY()) {
1827 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001828 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 }
1830
Guido van Rossum96a42c81992-01-12 02:29:51 +00001831 if (why != WHY_RETURN)
1832 retval = NULL;
1833
Guido van Rossume59214e1994-08-30 08:01:59 +00001834 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001835 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001836 if (call_trace(&f->f_trace, &f->f_trace, f,
1837 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001838 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001839 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001840 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001841 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001842 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001843 }
1844
Guido van Rossuma027efa1997-05-05 20:56:21 +00001845 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1846 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001847 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001848 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001849 retval = NULL;
1850 why = WHY_EXCEPTION;
1851 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001853
Guido van Rossuma027efa1997-05-05 20:56:21 +00001854 reset_exc_info(tstate);
1855
1856 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001857
1858 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001859
Guido van Rossum374a9221991-04-04 10:40:29 +00001860 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001861
Guido van Rossuma027efa1997-05-05 20:56:21 +00001862 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001864
Guido van Rossum96a42c81992-01-12 02:29:51 +00001865 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001866}
1867
Guido van Rossuma027efa1997-05-05 20:56:21 +00001868static void
1869set_exc_info(tstate, type, value, tb)
1870 PyThreadState *tstate;
1871 PyObject *type;
1872 PyObject *value;
1873 PyObject *tb;
1874{
1875 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001876 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001877
Guido van Rossuma027efa1997-05-05 20:56:21 +00001878 frame = tstate->frame;
1879 if (frame->f_exc_type == NULL) {
1880 /* This frame didn't catch an exception before */
1881 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001882 if (tstate->exc_type == NULL) {
1883 Py_INCREF(Py_None);
1884 tstate->exc_type = Py_None;
1885 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001886 tmp_type = frame->f_exc_type;
1887 tmp_value = frame->f_exc_value;
1888 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001889 Py_XINCREF(tstate->exc_type);
1890 Py_XINCREF(tstate->exc_value);
1891 Py_XINCREF(tstate->exc_traceback);
1892 frame->f_exc_type = tstate->exc_type;
1893 frame->f_exc_value = tstate->exc_value;
1894 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001895 Py_XDECREF(tmp_type);
1896 Py_XDECREF(tmp_value);
1897 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001898 }
1899 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001900 tmp_type = tstate->exc_type;
1901 tmp_value = tstate->exc_value;
1902 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001903 Py_XINCREF(type);
1904 Py_XINCREF(value);
1905 Py_XINCREF(tb);
1906 tstate->exc_type = type;
1907 tstate->exc_value = value;
1908 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001909 Py_XDECREF(tmp_type);
1910 Py_XDECREF(tmp_value);
1911 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001912 /* For b/w compatibility */
1913 PySys_SetObject("exc_type", type);
1914 PySys_SetObject("exc_value", value);
1915 PySys_SetObject("exc_traceback", tb);
1916}
1917
1918static void
1919reset_exc_info(tstate)
1920 PyThreadState *tstate;
1921{
1922 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001923 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001924 frame = tstate->frame;
1925 if (frame->f_exc_type != NULL) {
1926 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001927 tmp_type = tstate->exc_type;
1928 tmp_value = tstate->exc_value;
1929 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001930 Py_XINCREF(frame->f_exc_type);
1931 Py_XINCREF(frame->f_exc_value);
1932 Py_XINCREF(frame->f_exc_traceback);
1933 tstate->exc_type = frame->f_exc_type;
1934 tstate->exc_value = frame->f_exc_value;
1935 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001936 Py_XDECREF(tmp_type);
1937 Py_XDECREF(tmp_value);
1938 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001939 /* For b/w compatibility */
1940 PySys_SetObject("exc_type", frame->f_exc_type);
1941 PySys_SetObject("exc_value", frame->f_exc_value);
1942 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1943 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001944 tmp_type = frame->f_exc_type;
1945 tmp_value = frame->f_exc_value;
1946 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001947 frame->f_exc_type = NULL;
1948 frame->f_exc_value = NULL;
1949 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001950 Py_XDECREF(tmp_type);
1951 Py_XDECREF(tmp_value);
1952 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001953}
1954
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001955/* Logic for the raise statement (too complicated for inlining).
1956 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001957static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001958do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001959 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001960{
1961 /* We support the following forms of raise:
1962 raise <class>, <classinstance>
1963 raise <class>, <argument tuple>
1964 raise <class>, None
1965 raise <class>, <argument>
1966 raise <classinstance>, None
1967 raise <string>, <object>
1968 raise <string>, None
1969
1970 An omitted second argument is the same as None.
1971
1972 In addition, raise <tuple>, <anything> is the same as
1973 raising the tuple's first item (and it better have one!);
1974 this rule is applied recursively.
1975
1976 Finally, an optional third argument can be supplied, which
1977 gives the traceback to be substituted (useful when
1978 re-raising an exception after examining it). */
1979
1980 /* First, check the traceback argument, replacing None with
1981 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001982 if (tb == Py_None) {
1983 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001984 tb = NULL;
1985 }
1986 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001988 "raise 3rd arg must be traceback or None");
1989 goto raise_error;
1990 }
1991
1992 /* Next, replace a missing value with None */
1993 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 value = Py_None;
1995 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001996 }
1997
1998 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2000 PyObject *tmp = type;
2001 type = PyTuple_GET_ITEM(type, 0);
2002 Py_INCREF(type);
2003 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002004 }
2005
Barry Warsaw4249f541997-08-22 21:26:19 +00002006 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002007 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002008
2009 else if (PyClass_Check(type))
2010 PyErr_NormalizeException(&type, &value, &tb);
2011
Guido van Rossumb209a111997-04-29 18:18:01 +00002012 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002013 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002014 if (value != Py_None) {
2015 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002016 "instance exception may not have a separate value");
2017 goto raise_error;
2018 }
2019 else {
2020 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002022 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2024 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002025 }
2026 }
2027 else {
2028 /* Not something you can raise. You get an exception
2029 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002031 "exceptions must be strings, classes, or instances");
2032 goto raise_error;
2033 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002035 if (tb == NULL)
2036 return WHY_EXCEPTION;
2037 else
2038 return WHY_RERAISE;
2039 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 Py_XDECREF(value);
2041 Py_XDECREF(type);
2042 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002043 return WHY_EXCEPTION;
2044}
2045
Barry Warsawe42b18f1997-08-25 22:13:04 +00002046static int
2047unpack_sequence(v, argcnt, sp)
2048 PyObject *v;
2049 int argcnt;
2050 PyObject **sp;
2051{
2052 int i;
2053 PyObject *w;
2054
2055 for (i = 0; i < argcnt; i++) {
2056 if (! (w = PySequence_GetItem(v, i))) {
2057 if (PyErr_ExceptionMatches(PyExc_IndexError))
2058 PyErr_SetString(PyExc_ValueError,
2059 "unpack sequence of wrong size");
2060 goto finally;
2061 }
2062 *--sp = w;
2063 }
2064 /* we better get an IndexError now */
2065 if (PySequence_GetItem(v, i) == NULL) {
2066 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2067 PyErr_Clear();
2068 return 1;
2069 }
2070 /* some other exception occurred. fall through to finally */
2071 }
2072 else
2073 PyErr_SetString(PyExc_ValueError,
2074 "unpack sequence of wrong size");
2075 /* fall through */
2076finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002077 for (; i > 0; i--, sp++)
2078 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002079
2080 return 0;
2081}
2082
2083
Guido van Rossum96a42c81992-01-12 02:29:51 +00002084#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085static int
2086prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002091 if (PyObject_Print(v, stdout, 0) != 0)
2092 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002093 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002097static void
2098call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 PyObject **p_trace, **p_newtrace;
2100 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002101{
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002103 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002105 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002106 value = Py_None;
2107 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002108 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002109 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002113 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002116 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002117 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 Py_XDECREF(type);
2120 Py_XDECREF(value);
2121 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002122 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002123}
2124
2125static int
2126call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002128 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002130 may point to NULL variable;
2131 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002133 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002134 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002135{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002136 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 PyObject *args, *what;
2138 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002139
Guido van Rossuma027efa1997-05-05 20:56:21 +00002140 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002141 /* Don't do recursive traces */
2142 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002144 *p_newtrace = NULL;
2145 }
2146 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002147 }
2148
Guido van Rossumb209a111997-04-29 18:18:01 +00002149 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002150 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002151 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002153 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002154 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002155 Py_INCREF(f);
2156 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2157 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002158 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 arg = Py_None;
2160 Py_INCREF(arg);
2161 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002162 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 PyFrame_FastToLocals(f);
2164 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2165 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002166 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002167 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002169 if (res == NULL) {
2170 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 PyTraceBack_Here(f);
2172 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002173 *p_trace = NULL;
2174 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002175 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002176 *p_newtrace = NULL;
2177 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002178 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002179 }
2180 else {
2181 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 Py_XDECREF(*p_newtrace);
2183 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002184 *p_newtrace = NULL;
2185 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002187 *p_newtrace = res;
2188 }
2189 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002191 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002192 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002193}
2194
Guido van Rossumb209a111997-04-29 18:18:01 +00002195PyObject *
2196PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002197{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002198 PyThreadState *tstate = PyThreadState_Get();
2199 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002200 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002201 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002202 else
2203 return current_frame->f_builtins;
2204}
2205
Guido van Rossumb209a111997-04-29 18:18:01 +00002206PyObject *
2207PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002208{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002210 if (current_frame == NULL)
2211 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002213 return current_frame->f_locals;
2214}
2215
Guido van Rossumb209a111997-04-29 18:18:01 +00002216PyObject *
2217PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002219 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002220 if (current_frame == NULL)
2221 return NULL;
2222 else
2223 return current_frame->f_globals;
2224}
2225
Guido van Rossumb209a111997-04-29 18:18:01 +00002226PyObject *
2227PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002228{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002229 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002231}
2232
Guido van Rossum6135a871995-01-09 17:53:26 +00002233int
Guido van Rossumb209a111997-04-29 18:18:01 +00002234PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002235{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002237 return current_frame == NULL ? 0 : current_frame->f_restricted;
2238}
2239
Guido van Rossumbe270261997-05-22 22:26:18 +00002240int
Guido van Rossumb209a111997-04-29 18:18:01 +00002241Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242{
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002244 if (f == NULL)
2245 return 0;
2246 if (!PyFile_SoftSpace(f, 0))
2247 return 0;
2248 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249}
2250
Guido van Rossum3f5da241990-12-20 15:06:42 +00002251
Guido van Rossum681d79a1995-07-18 14:51:37 +00002252/* External interface to call any callable object.
2253 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002254
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002255#undef PyEval_CallObject
2256/* for backward compatibility: export this interface */
2257
Guido van Rossumb209a111997-04-29 18:18:01 +00002258PyObject *
2259PyEval_CallObject(func, arg)
2260 PyObject *func;
2261 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002262{
Guido van Rossumb209a111997-04-29 18:18:01 +00002263 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002264}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002265#define PyEval_CallObject(func,arg) \
2266 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002267
Guido van Rossumb209a111997-04-29 18:18:01 +00002268PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002269PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002270 PyObject *func;
2271 PyObject *arg;
2272 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002273{
2274 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002275 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002276
2277 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002278 arg = PyTuple_New(0);
2279 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002280 PyErr_SetString(PyExc_TypeError,
2281 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002282 return NULL;
2283 }
2284 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002285 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002286
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002288 PyErr_SetString(PyExc_TypeError,
2289 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002290 return NULL;
2291 }
2292
Guido van Rossum150b2df1996-12-05 23:17:11 +00002293 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002294 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002296 result = call_function(func, arg, kw);
2297 else
2298 result = call_builtin(func, arg, kw);
2299
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 if (result == NULL && !PyErr_Occurred())
2303 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002304 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002305
2306 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002307}
2308
Guido van Rossumb209a111997-04-29 18:18:01 +00002309static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002310call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 PyObject *func;
2312 PyObject *arg;
2313 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314{
Guido van Rossumb209a111997-04-29 18:18:01 +00002315 if (PyCFunction_Check(func)) {
2316 PyCFunction meth = PyCFunction_GetFunction(func);
2317 PyObject *self = PyCFunction_GetSelf(func);
2318 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002319 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002321 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002323 else if (size == 0)
2324 arg = NULL;
2325 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002326 if (flags & METH_KEYWORDS)
2327 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002328 if (kw != NULL && PyDict_Size(kw) != 0) {
2329 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002330 "this function takes no keyword arguments");
2331 return NULL;
2332 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 if (PyClass_Check(func)) {
2336 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 if (PyInstance_Check(func)) {
2339 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002340 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 PyErr_Clear();
2342 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002343 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002344 return NULL;
2345 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002346 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002347 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002348 return res;
2349 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 return NULL;
2352}
2353
Guido van Rossumb209a111997-04-29 18:18:01 +00002354static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002355call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 PyObject *func;
2357 PyObject *arg;
2358 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359{
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 PyObject *class = NULL; /* == owner */
2361 PyObject *argdefs;
2362 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002363 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002365
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 if (kw != NULL && !PyDict_Check(kw)) {
2367 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002368 return NULL;
2369 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 if (PyMethod_Check(func)) {
2372 PyObject *self = PyMethod_Self(func);
2373 class = PyMethod_Class(func);
2374 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002375 if (self == NULL) {
2376 /* Unbound methods must be called with an instance of
2377 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002378 if (PyTuple_Size(arg) >= 1) {
2379 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002380 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 PyInstance_Check(self) &&
2382 PyClass_IsSubclass((PyObject *)
2383 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002384 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002385 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002386 else
2387 self = NULL;
2388 }
2389 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002392 return NULL;
2393 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002394 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002395 }
2396 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 int argcount = PyTuple_Size(arg);
2398 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002399 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002400 if (newarg == NULL)
2401 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 Py_INCREF(self);
2403 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002404 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 PyObject *v = PyTuple_GET_ITEM(arg, i);
2406 Py_XINCREF(v);
2407 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002408 }
2409 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 }
2411 }
2412 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002414 PyErr_SetString(PyExc_TypeError,
2415 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 return NULL;
2417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002420
2421 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2423 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2424 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 }
2426 else {
2427 d = NULL;
2428 nd = 0;
2429 }
2430
2431 if (kw != NULL) {
2432 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 nk = PyDict_Size(kw);
2434 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002436 PyErr_NoMemory();
2437 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002438 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002439 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002440 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002441 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002442 i += 2;
2443 nk = i/2;
2444 /* XXX This is broken if the caller deletes dict items! */
2445 }
2446 else {
2447 k = NULL;
2448 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002449 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002452 (PyCodeObject *)PyFunction_GetCode(func),
2453 PyFunction_GetGlobals(func), (PyObject *)NULL,
2454 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002455 k, nk,
2456 d, nd,
2457 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458
Guido van Rossumb209a111997-04-29 18:18:01 +00002459 Py_DECREF(arg);
2460 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461
Guido van Rossum681d79a1995-07-18 14:51:37 +00002462 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463}
2464
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002465#define SLICE_ERROR_MSG \
2466 "standard sequence type does not support step size other than one"
2467
Guido van Rossumb209a111997-04-29 18:18:01 +00002468static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471{
Guido van Rossumb209a111997-04-29 18:18:01 +00002472 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002473 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002475 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 return NULL;
2477 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002478 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002479 v = (*sq->sq_item)(v, i);
2480 if (v)
2481 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002482 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002484 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485}
2486
2487static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002488slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 int *pi;
2491{
2492 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002493 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002494 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002495 PyErr_SetString(PyExc_TypeError,
2496 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002499 x = PyInt_AsLong(v);
2500 /* Truncate -- very long indices are truncated anyway */
2501 if (x > INT_MAX)
2502 x = INT_MAX;
2503 else if (x < -INT_MAX)
2504 x = 0;
2505 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002507 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508}
2509
Guido van Rossumb209a111997-04-29 18:18:01 +00002510static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002511apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002512 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002514 int ilow = 0, ihigh = INT_MAX;
2515 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002517 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002518 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521
2522static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002524 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526 int ilow = 0, ihigh = INT_MAX;
2527 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002528 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002529 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002530 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002531 if (x == NULL)
2532 return PySequence_DelSlice(u, ilow, ihigh);
2533 else
2534 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535}
2536
2537static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002540{
Guido van Rossume59214e1994-08-30 08:01:59 +00002541 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002542 PyObject *x;
2543 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002545 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002546 register char *s, *end;
2547 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2549 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002550 "string member test needs char left operand");
2551 return -1;
2552 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 c = PyString_AsString(v)[0];
2554 s = PyString_AsString(w);
2555 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002556 while (s < end) {
2557 if (c == *s++)
2558 return 1;
2559 }
2560 return 0;
2561 }
2562 sq = w->ob_type->tp_as_sequence;
2563 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002564 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002565 "'in' or 'not in' needs sequence right argument");
2566 return -1;
2567 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002568 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002570 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 if (PyErr_Occurred() == PyExc_IndexError) {
2572 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002573 break;
2574 }
2575 return -1;
2576 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002577 cmp = PyObject_Compare(v, x);
2578 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 if (cmp == 0)
2580 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002581 if (PyErr_Occurred())
2582 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002583 }
2584 return 0;
2585}
2586
Guido van Rossumb209a111997-04-29 18:18:01 +00002587static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002589 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002590 register PyObject *v;
2591 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592{
2593 register int cmp;
2594 register int res = 0;
2595 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 case IS:
2597 case IS_NOT:
2598 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002599 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002600 res = !res;
2601 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 case IN:
2603 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 res = cmp_member(v, w);
2605 if (res < 0)
2606 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002607 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002608 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 break;
2610 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002611 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 break;
2613 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002614 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002615 if (cmp && PyErr_Occurred())
2616 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002617 switch (op) {
2618 case LT: res = cmp < 0; break;
2619 case LE: res = cmp <= 0; break;
2620 case EQ: res = cmp == 0; break;
2621 case NE: res = cmp != 0; break;
2622 case GT: res = cmp > 0; break;
2623 case GE: res = cmp >= 0; break;
2624 /* XXX no default? (res is initialized to 0 though) */
2625 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 v = res ? Py_True : Py_False;
2628 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 return v;
2630}
2631
Guido van Rossum3f5da241990-12-20 15:06:42 +00002632static int
2633import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002634 PyObject *locals;
2635 PyObject *v;
2636 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002637{
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 PyObject *w, *x;
2639 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002640 PyErr_SetString(PyExc_TypeError,
2641 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002642 return -1;
2643 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 w = PyModule_GetDict(v);
2645 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002646 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002648 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 while (PyDict_Next(w, &pos, &name, &value)) {
2650 if (!PyString_Check(name) ||
2651 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002652 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 Py_INCREF(value);
2654 err = PyDict_SetItem(locals, name, value);
2655 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002656 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002657 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002658 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002659 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002660 }
2661 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002663 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002664 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002665 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 PyString_AsString(name));
2667 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002668 return -1;
2669 }
2670 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002672 }
2673}
2674
Guido van Rossumb209a111997-04-29 18:18:01 +00002675static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002676build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 PyObject *methods; /* dictionary */
2678 PyObject *bases; /* tuple containing classes */
2679 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002680{
Guido van Rossumcd649651997-08-22 16:56:16 +00002681 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002683 PyErr_SetString(PyExc_SystemError,
2684 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002685 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002688 PyErr_SetString(PyExc_SystemError,
2689 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002690 return NULL;
2691 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002693 PyErr_SetString(PyExc_SystemError,
2694 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002695 return NULL;
2696 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002697 n = PyTuple_Size(bases);
2698 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 PyObject *base = PyTuple_GET_ITEM(bases, i);
2700 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002701 /* Call the base's *type*, if it is callable.
2702 This code is a hook for Donald Beaudry's
2703 and Jim Fulton's type extensions. In
2704 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002705 since its types are not callable.
2706 Ditto: call the bases's *class*, if it has
2707 one. This makes the same thing possible
2708 without writing C code. A true meta-object
2709 protocol! */
2710 PyObject *basetype = (PyObject *)base->ob_type;
2711 PyObject *callable = NULL;
2712 if (PyCallable_Check(basetype))
2713 callable = basetype;
2714 else
2715 callable = PyObject_GetAttrString(
2716 base, "__class__");
2717 if (callable) {
2718 PyObject *args;
2719 PyObject *newclass = NULL;
2720 args = Py_BuildValue(
2721 "(OOO)", name, bases, methods);
2722 if (args != NULL) {
2723 newclass = PyEval_CallObject(
2724 callable, args);
2725 Py_DECREF(args);
2726 }
2727 if (callable != basetype)
2728 Py_DECREF(callable);
2729 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002732 "base is not a class object");
2733 return NULL;
2734 }
2735 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002737}
2738
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002739static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002740exec_statement(f, prog, globals, locals)
2741 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 PyObject *prog;
2743 PyObject *globals;
2744 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002745{
2746 char *s;
2747 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002749 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002750
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2752 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002753 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002755 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002756 locals = PyTuple_GetItem(prog, 2);
2757 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002758 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002759 if (globals == Py_None) {
2760 globals = PyEval_GetGlobals();
2761 if (locals == Py_None) {
2762 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002763 plain = 1;
2764 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002765 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002766 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002767 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 if (!PyString_Check(prog) &&
2769 !PyCode_Check(prog) &&
2770 !PyFile_Check(prog)) {
2771 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002772 "exec 1st arg must be string, code or file object");
2773 return -1;
2774 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2776 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002777 "exec 2nd/3rd args must be dict or None");
2778 return -1;
2779 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002780 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002781 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 if (PyCode_Check(prog)) {
Guido van Rossumdfed7251997-11-11 16:29:38 +00002783 v = PyEval_EvalCode((PyCodeObject *) prog,
2784 globals, locals);
2785 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002786 return -1;
Guido van Rossumdfed7251997-11-11 16:29:38 +00002787 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002788 return 0;
2789 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 if (PyFile_Check(prog)) {
2791 FILE *fp = PyFile_AsFile(prog);
2792 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002793 if (PyRun_File(fp, name, Py_file_input,
2794 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002795 return -1;
2796 return 0;
2797 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002798 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002799 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002800 PyErr_SetString(PyExc_ValueError,
2801 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002802 return -1;
2803 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002804 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002805 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002806 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002808 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002809 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002810 return 0;
2811}
Guido van Rossum24c13741995-02-14 09:42:43 +00002812
Guido van Rossum1aa14831997-01-21 05:34:20 +00002813/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002814static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002815find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002817 int nexti;
2818{
2819 int opcode;
2820 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002822 unsigned char *next_instr;
2823
2824 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2825 opcode = (*next_instr++);
2826 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002827 Py_INCREF(Py_None);
2828 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002829 }
2830
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002832 if (list == NULL)
2833 return NULL;
2834
2835 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002836 oparg = (next_instr[1]<<8) + next_instr[0];
2837 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002838 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002839 if (PyList_Append(list, name) < 0) {
2840 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002841 break;
2842 }
2843 opcode = (*next_instr++);
2844 } while (opcode == IMPORT_FROM);
2845
2846 return list;
2847}
Guido van Rossum950361c1997-01-24 13:49:28 +00002848
2849
2850#ifdef DYNAMIC_EXECUTION_PROFILE
2851
2852PyObject *
2853getarray(a)
2854 long a[256];
2855{
2856 int i;
2857 PyObject *l = PyList_New(256);
2858 if (l == NULL) return NULL;
2859 for (i = 0; i < 256; i++) {
2860 PyObject *x = PyInt_FromLong(a[i]);
2861 if (x == NULL) {
2862 Py_DECREF(l);
2863 return NULL;
2864 }
2865 PyList_SetItem(l, i, x);
2866 }
2867 for (i = 0; i < 256; i++)
2868 a[i] = 0;
2869 return l;
2870}
2871
2872PyObject *
2873_Py_GetDXProfile(self, args)
2874 PyObject *self, *args;
2875{
2876#ifndef DXPAIRS
2877 return getarray(dxp);
2878#else
2879 int i;
2880 PyObject *l = PyList_New(257);
2881 if (l == NULL) return NULL;
2882 for (i = 0; i < 257; i++) {
2883 PyObject *x = getarray(dxpairs[i]);
2884 if (x == NULL) {
2885 Py_DECREF(l);
2886 return NULL;
2887 }
2888 PyList_SetItem(l, i, x);
2889 }
2890 return l;
2891#endif
2892}
2893
2894#endif