blob: b29b5f973b2ea6687102f4d4f0fce14051abe3a3 [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");
Guido van Rossum8f183201997-12-31 05:53:15 +00001020 if (x == NULL) {
1021 PyErr_SetString(
1022 PyExc_RuntimeError,
1023 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001024 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001025 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001026 }
1027 if (err == 0)
1028 err = PyFile_WriteObject(v, x, 0);
1029 if (err == 0) {
1030 PyFile_SoftSpace(x, 1);
1031 err = Py_FlushLine();
1032 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001033 if (err == 0) {
1034 err = PyDict_SetItemString(
1035 f->f_builtins, "_", v);
1036 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001038 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 break;
1040
1041 case PRINT_ITEM:
1042 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001043 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001044 if (w == NULL) {
1045 PyErr_SetString(PyExc_RuntimeError,
1046 "lost sys.stdout");
1047 err = -1;
1048 }
1049 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001050 err = PyFile_WriteString(" ", w);
1051 if (err == 0)
1052 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001053 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001054 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001055 char *s = PyString_AsString(v);
1056 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001057 if (len > 0 &&
1058 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001059 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001060 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001062 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001063 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 break;
1065
1066 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001067 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001068 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001069 PyErr_SetString(PyExc_RuntimeError,
1070 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001071 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001072 err = PyFile_WriteString("\n", x);
1073 if (err == 0)
1074 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001075 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 break;
1077
1078 case BREAK_LOOP:
1079 why = WHY_BREAK;
1080 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001081
Guido van Rossumf10570b1995-07-07 22:53:21 +00001082 case RAISE_VARARGS:
1083 u = v = w = NULL;
1084 switch (oparg) {
1085 case 3:
1086 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001087 /* Fallthrough */
1088 case 2:
1089 v = POP(); /* value */
1090 /* Fallthrough */
1091 case 1:
1092 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001093 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001094 break;
1095 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001096 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001097 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001098 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001099 break;
1100 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 break;
1102
1103 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001104 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001105 PyErr_SetString(PyExc_SystemError,
1106 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001107 break;
1108 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001109 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001110 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 break;
1112
1113 case RETURN_VALUE:
1114 retval = POP();
1115 why = WHY_RETURN;
1116 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001117
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001118 case EXEC_STMT:
1119 w = POP();
1120 v = POP();
1121 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001122 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001123 Py_DECREF(u);
1124 Py_DECREF(v);
1125 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001126 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001127
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 case POP_BLOCK:
1129 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001130 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 while (STACK_LEVEL() > b->b_level) {
1132 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 }
1135 }
1136 break;
1137
1138 case END_FINALLY:
1139 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001140 if (PyInt_Check(v)) {
1141 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 if (why == WHY_RETURN)
1143 retval = POP();
1144 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001145 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001147 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001148 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001150 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 else if (v != Py_None) {
1153 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 "'finally' pops bad exception");
1155 why = WHY_EXCEPTION;
1156 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001157 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 break;
1159
1160 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001161 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001163 w = POP();
1164 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001166 Py_DECREF(u);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 break;
1170
1171 case STORE_NAME:
1172 w = GETNAMEV(oparg);
1173 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001175 PyErr_SetString(PyExc_SystemError,
1176 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001177 break;
1178 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001179 err = PyDict_SetItem(x, w, v);
1180 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 break;
1182
1183 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001184 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001185 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001186 PyErr_SetString(PyExc_SystemError,
1187 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001188 break;
1189 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001190 if ((err = PyDict_DelItem(x, w)) != 0)
1191 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001193
1194#ifdef CASE_TOO_BIG
1195 default: switch (opcode) {
1196#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001197
1198 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 case UNPACK_LIST:
1200 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001201 if (PyTuple_Check(v)) {
1202 if (PyTuple_Size(v) != oparg) {
1203 PyErr_SetString(PyExc_ValueError,
1204 "unpack tuple of wrong size");
1205 why = WHY_EXCEPTION;
1206 }
1207 else {
1208 for (; --oparg >= 0; ) {
1209 w = PyTuple_GET_ITEM(v, oparg);
1210 Py_INCREF(w);
1211 PUSH(w);
1212 }
1213 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001215 else if (PyList_Check(v)) {
1216 if (PyList_Size(v) != oparg) {
1217 PyErr_SetString(PyExc_ValueError,
1218 "unpack list of wrong size");
1219 why = WHY_EXCEPTION;
1220 }
1221 else {
1222 for (; --oparg >= 0; ) {
1223 w = PyList_GET_ITEM(v, oparg);
1224 Py_INCREF(w);
1225 PUSH(w);
1226 }
1227 }
1228 }
1229 else if (PySequence_Check(v)) {
1230 if (unpack_sequence(v, oparg,
1231 stack_pointer + oparg))
1232 stack_pointer += oparg;
1233 else
1234 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 }
1236 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001237 PyErr_SetString(PyExc_TypeError,
1238 "unpack non-sequence");
1239 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001241 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
1243
1244 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001245 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 v = POP();
1247 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1249 Py_DECREF(v);
1250 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 break;
1252
1253 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001254 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001256 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1257 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001258 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 break;
1260
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001261 case STORE_GLOBAL:
1262 w = GETNAMEV(oparg);
1263 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 err = PyDict_SetItem(f->f_globals, w, v);
1265 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001266 break;
1267
1268 case DELETE_GLOBAL:
1269 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001270 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1271 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001272 break;
1273
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 case LOAD_CONST:
1275 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 PUSH(x);
1278 break;
1279
1280 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001281 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001282 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001283 PyErr_SetString(PyExc_SystemError,
1284 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001285 break;
1286 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001289 PyErr_Clear();
1290 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 PyErr_Clear();
1293 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001295 PyErr_SetObject(
1296 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 break;
1298 }
1299 }
1300 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 PUSH(x);
1303 break;
1304
1305 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001306 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 PyErr_Clear();
1310 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 break;
1314 }
1315 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 PUSH(x);
1318 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319
Guido van Rossum9bfef441993-03-29 10:43:31 +00001320 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001321 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001322 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001323 PyErr_SetObject(PyExc_NameError,
1324 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001325 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001326 break;
1327 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001329 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001330 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001331 break;
1332
1333 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001334 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001335 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001336 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001337
1338 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001339 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001340 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001341
1342 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 if (x != NULL) {
1345 for (; --oparg >= 0;) {
1346 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001347 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 }
1349 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001350 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 }
1352 break;
1353
1354 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 if (x != NULL) {
1357 for (; --oparg >= 0;) {
1358 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001359 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 if (err != 0)
1361 break;
1362 }
1363 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001364 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 }
1366 break;
1367
1368 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001369 x = PyDict_New();
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 LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001375 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 x = PyObject_GetAttr(v, w);
1378 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001380 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
1382
1383 case COMPARE_OP:
1384 w = POP();
1385 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001386 if (PyInt_Check(v) && PyInt_Check(w)) {
1387 /* INLINE: cmp(int, int) */
1388 register long a, b;
1389 register int res;
1390 a = ((PyIntObject*) v)->ob_ival;
1391 b = ((PyIntObject*) w)->ob_ival;
1392 switch (oparg) {
1393 case LT: res = a < b; break;
1394 case LE: res = a <= b; break;
1395 case EQ: res = a == b; break;
1396 case NE: res = a != b; break;
1397 case GT: res = a > b; break;
1398 case GE: res = a >= b; break;
1399 case IS: res = v == w; break;
1400 case IS_NOT: res = v != w; break;
1401 default: goto slow_compare;
1402 }
1403 x = res ? Py_True : Py_False;
1404 Py_INCREF(x);
1405 }
1406 else {
1407 slow_compare:
1408 x = cmp_outcome(oparg, v, w);
1409 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001410 Py_DECREF(v);
1411 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001413 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 break;
1415
1416 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001418 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001419 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001421 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422 break;
1423 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001424 u = find_from_args(f, INSTR_OFFSET());
1425 if (u == NULL) {
1426 x = u;
1427 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001428 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001429 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001430 w,
1431 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001432 f->f_locals == NULL ?
1433 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001436 if (w == NULL) {
1437 x = NULL;
1438 break;
1439 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 x = PyEval_CallObject(x, w);
1441 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001442 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001443 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 break;
1445
1446 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001447 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001449 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001450 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001451 PyErr_SetString(PyExc_SystemError,
1452 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001453 break;
1454 }
1455 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001456 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001457 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001459
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 case JUMP_FORWARD:
1461 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001462 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001463
1464 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001466 if (err > 0)
1467 err = 0;
1468 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001470 else
1471 break;
1472 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001473
1474 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001476 if (err > 0) {
1477 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001479 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001480 else if (err == 0)
1481 ;
1482 else
1483 break;
1484 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001485
1486 case JUMP_ABSOLUTE:
1487 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001488 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001489
1490 case FOR_LOOP:
1491 /* for v in s: ...
1492 On entry: stack contains s, i.
1493 On exit: stack contains s, i+1, s[i];
1494 but if loop exhausted:
1495 s, i are popped, and we jump */
1496 w = POP(); /* Loop index */
1497 v = POP(); /* Sequence object */
1498 u = loop_subscript(v, w);
1499 if (u != NULL) {
1500 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001501 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001505 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 }
1507 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001508 Py_DECREF(v);
1509 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 /* A NULL can mean "s exhausted"
1511 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001514 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001516 continue;
1517 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 }
1519 break;
1520
1521 case SETUP_LOOP:
1522 case SETUP_EXCEPT:
1523 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001526 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001527
1528 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001529#ifdef LLTRACE
1530 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001531 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001532#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001533 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001534 if (f->f_trace == NULL)
1535 continue;
1536 /* Trace each line of code reached */
1537 f->f_lasti = INSTR_OFFSET();
1538 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541
1542 case CALL_FUNCTION:
1543 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 int na = oparg & 0xff;
1545 int nk = (oparg>>8) & 0xff;
1546 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 PyObject **pfunc = stack_pointer - n - 1;
1548 PyObject *func = *pfunc;
1549 PyObject *self = NULL;
1550 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001551 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 if (PyMethod_Check(func)) {
1553 self = PyMethod_Self(func);
1554 class = PyMethod_Class(func);
1555 func = PyMethod_Function(func);
1556 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001557 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001558 Py_INCREF(self);
1559 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001560 *pfunc = self;
1561 na++;
1562 n++;
1563 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001564 else {
1565 /* Unbound methods must be
1566 called with an instance of
1567 the class (or a derived
1568 class) as first argument */
1569 if (na > 0 &&
1570 (self = stack_pointer[-n])
1571 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 PyInstance_Check(self) &&
1573 PyClass_IsSubclass(
1574 (PyObject *)
1575 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576 ->in_class),
1577 class))
1578 /* Handy-dandy */ ;
1579 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001580 PyErr_SetString(
1581 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001582 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001583 x = NULL;
1584 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001585 }
1586 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001587 }
1588 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 Py_INCREF(func);
1590 if (PyFunction_Check(func)) {
1591 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001592 PyObject *globals =
1593 PyFunction_GetGlobals(func);
1594 PyObject *argdefs =
1595 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001597 int nd;
1598 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001600 nd = ((PyTupleObject *)argdefs) ->
1601 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001602 }
1603 else {
1604 d = NULL;
1605 nd = 0;
1606 }
1607 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001608 (PyCodeObject *)co,
1609 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001610 stack_pointer-n, na,
1611 stack_pointer-2*nk, nk,
1612 d, nd,
1613 class);
1614 }
1615 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001616 PyObject *args = PyTuple_New(na);
1617 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001618 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001619 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001620 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001622 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001623 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 if (kwdict == NULL) {
1625 x = NULL;
1626 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001627 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 err = 0;
1629 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001630 PyObject *value = POP();
1631 PyObject *key = POP();
1632 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001633 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 Py_DECREF(key);
1635 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001636 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001637 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001638 }
1639 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001640 Py_DECREF(args);
1641 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001642 break;
1643 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001644 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001645 while (--na >= 0) {
1646 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001648 }
1649 x = PyEval_CallObjectWithKeywords(
1650 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 Py_DECREF(args);
1652 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001653 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 while (stack_pointer > pfunc) {
1656 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 }
1659 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001660 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001661 break;
1662 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001663
Guido van Rossum681d79a1995-07-18 14:51:37 +00001664 case MAKE_FUNCTION:
1665 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001666 x = PyFunction_New(v, f->f_globals);
1667 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001668 /* XXX Maybe this should be a separate opcode? */
1669 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001671 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 x = NULL;
1674 break;
1675 }
1676 while (--oparg >= 0) {
1677 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001678 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001679 }
1680 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001682 }
1683 PUSH(x);
1684 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001685
1686 case BUILD_SLICE:
1687 if (oparg == 3)
1688 w = POP();
1689 else
1690 w = NULL;
1691 v = POP();
1692 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001693 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001694 Py_DECREF(u);
1695 Py_DECREF(v);
1696 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001697 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001698 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001699 break;
1700
1701
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 default:
1703 fprintf(stderr,
1704 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001705 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001706 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 why = WHY_EXCEPTION;
1708 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001709
1710#ifdef CASE_TOO_BIG
1711 }
1712#endif
1713
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 } /* switch */
1715
1716 on_error:
1717
1718 /* Quickly continue if no error occurred */
1719
1720 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001721 if (err == 0 && x != NULL) {
1722#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001723 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 fprintf(stderr,
1725 "XXX undetected error\n");
1726 else
1727#endif
1728 continue; /* Normal, fast path */
1729 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 err = 0;
1733 }
1734
Guido van Rossum801dcae1992-04-08 11:32:32 +00001735#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 /* Double-check exception status */
1737
1738 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001739 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001741 PyErr_SetString(PyExc_SystemError,
1742 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 why = WHY_EXCEPTION;
1744 }
1745 }
1746 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001747 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001748 fprintf(stderr,
1749 "XXX undetected error (why=%d)\n",
1750 why);
1751 why = WHY_EXCEPTION;
1752 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 }
1754#endif
1755
1756 /* Log traceback info if this is a real exception */
1757
1758 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001759 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001761 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001763
Guido van Rossume59214e1994-08-30 08:01:59 +00001764 if (f->f_trace)
1765 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001766 if (tstate->sys_profilefunc)
1767 call_exc_trace(&tstate->sys_profilefunc,
1768 (PyObject**)0, f);
1769}
Guido van Rossum374a9221991-04-04 10:40:29 +00001770
1771 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1772
1773 if (why == WHY_RERAISE)
1774 why = WHY_EXCEPTION;
1775
1776 /* Unwind stacks if a (pseudo) exception occurred */
1777
1778 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001779 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 while (STACK_LEVEL() > b->b_level) {
1781 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 }
1784 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1785 why = WHY_NOT;
1786 JUMPTO(b->b_handler);
1787 break;
1788 }
1789 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001790 (b->b_type == SETUP_EXCEPT &&
1791 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 PyObject *exc, *val, *tb;
1794 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001796 val = Py_None;
1797 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 /* Make the raw exception data
1800 available to the handler,
1801 so a program can emulate the
1802 Python main loop. Don't do
1803 this for 'finally'. */
1804 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001805 PyErr_NormalizeException(
1806 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001807 set_exc_info(tstate,
1808 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 PUSH(val);
1812 PUSH(exc);
1813 }
1814 else {
1815 if (why == WHY_RETURN)
1816 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001817 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001818 PUSH(v);
1819 }
1820 why = WHY_NOT;
1821 JUMPTO(b->b_handler);
1822 break;
1823 }
1824 } /* unwind stack */
1825
1826 /* End the loop if we still have an error (or return) */
1827
1828 if (why != WHY_NOT)
1829 break;
1830
1831 } /* main loop */
1832
1833 /* Pop remaining stack entries */
1834
1835 while (!EMPTY()) {
1836 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001837 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 }
1839
Guido van Rossum96a42c81992-01-12 02:29:51 +00001840 if (why != WHY_RETURN)
1841 retval = NULL;
1842
Guido van Rossume59214e1994-08-30 08:01:59 +00001843 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001844 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001845 if (call_trace(&f->f_trace, &f->f_trace, f,
1846 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001848 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001849 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001850 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001851 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001852 }
1853
Guido van Rossuma027efa1997-05-05 20:56:21 +00001854 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1855 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001856 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001857 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001858 retval = NULL;
1859 why = WHY_EXCEPTION;
1860 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001861 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001862
Guido van Rossuma027efa1997-05-05 20:56:21 +00001863 reset_exc_info(tstate);
1864
1865 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001866
1867 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001868
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001870
Guido van Rossuma027efa1997-05-05 20:56:21 +00001871 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001872 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001873
Guido van Rossum96a42c81992-01-12 02:29:51 +00001874 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001875}
1876
Guido van Rossuma027efa1997-05-05 20:56:21 +00001877static void
1878set_exc_info(tstate, type, value, tb)
1879 PyThreadState *tstate;
1880 PyObject *type;
1881 PyObject *value;
1882 PyObject *tb;
1883{
1884 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001885 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001886
Guido van Rossuma027efa1997-05-05 20:56:21 +00001887 frame = tstate->frame;
1888 if (frame->f_exc_type == NULL) {
1889 /* This frame didn't catch an exception before */
1890 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001891 if (tstate->exc_type == NULL) {
1892 Py_INCREF(Py_None);
1893 tstate->exc_type = Py_None;
1894 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001895 tmp_type = frame->f_exc_type;
1896 tmp_value = frame->f_exc_value;
1897 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001898 Py_XINCREF(tstate->exc_type);
1899 Py_XINCREF(tstate->exc_value);
1900 Py_XINCREF(tstate->exc_traceback);
1901 frame->f_exc_type = tstate->exc_type;
1902 frame->f_exc_value = tstate->exc_value;
1903 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001904 Py_XDECREF(tmp_type);
1905 Py_XDECREF(tmp_value);
1906 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001907 }
1908 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001909 tmp_type = tstate->exc_type;
1910 tmp_value = tstate->exc_value;
1911 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001912 Py_XINCREF(type);
1913 Py_XINCREF(value);
1914 Py_XINCREF(tb);
1915 tstate->exc_type = type;
1916 tstate->exc_value = value;
1917 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001918 Py_XDECREF(tmp_type);
1919 Py_XDECREF(tmp_value);
1920 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001921 /* For b/w compatibility */
1922 PySys_SetObject("exc_type", type);
1923 PySys_SetObject("exc_value", value);
1924 PySys_SetObject("exc_traceback", tb);
1925}
1926
1927static void
1928reset_exc_info(tstate)
1929 PyThreadState *tstate;
1930{
1931 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001932 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001933 frame = tstate->frame;
1934 if (frame->f_exc_type != NULL) {
1935 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001936 tmp_type = tstate->exc_type;
1937 tmp_value = tstate->exc_value;
1938 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001939 Py_XINCREF(frame->f_exc_type);
1940 Py_XINCREF(frame->f_exc_value);
1941 Py_XINCREF(frame->f_exc_traceback);
1942 tstate->exc_type = frame->f_exc_type;
1943 tstate->exc_value = frame->f_exc_value;
1944 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001945 Py_XDECREF(tmp_type);
1946 Py_XDECREF(tmp_value);
1947 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001948 /* For b/w compatibility */
1949 PySys_SetObject("exc_type", frame->f_exc_type);
1950 PySys_SetObject("exc_value", frame->f_exc_value);
1951 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1952 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001953 tmp_type = frame->f_exc_type;
1954 tmp_value = frame->f_exc_value;
1955 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001956 frame->f_exc_type = NULL;
1957 frame->f_exc_value = NULL;
1958 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001959 Py_XDECREF(tmp_type);
1960 Py_XDECREF(tmp_value);
1961 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001962}
1963
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001964/* Logic for the raise statement (too complicated for inlining).
1965 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001966static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001967do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001968 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001969{
1970 /* We support the following forms of raise:
1971 raise <class>, <classinstance>
1972 raise <class>, <argument tuple>
1973 raise <class>, None
1974 raise <class>, <argument>
1975 raise <classinstance>, None
1976 raise <string>, <object>
1977 raise <string>, None
1978
1979 An omitted second argument is the same as None.
1980
1981 In addition, raise <tuple>, <anything> is the same as
1982 raising the tuple's first item (and it better have one!);
1983 this rule is applied recursively.
1984
1985 Finally, an optional third argument can be supplied, which
1986 gives the traceback to be substituted (useful when
1987 re-raising an exception after examining it). */
1988
1989 /* First, check the traceback argument, replacing None with
1990 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 if (tb == Py_None) {
1992 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001993 tb = NULL;
1994 }
1995 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001997 "raise 3rd arg must be traceback or None");
1998 goto raise_error;
1999 }
2000
2001 /* Next, replace a missing value with None */
2002 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002003 value = Py_None;
2004 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002005 }
2006
2007 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002008 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2009 PyObject *tmp = type;
2010 type = PyTuple_GET_ITEM(type, 0);
2011 Py_INCREF(type);
2012 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002013 }
2014
Barry Warsaw4249f541997-08-22 21:26:19 +00002015 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002016 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002017
2018 else if (PyClass_Check(type))
2019 PyErr_NormalizeException(&type, &value, &tb);
2020
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002022 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 if (value != Py_None) {
2024 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002025 "instance exception may not have a separate value");
2026 goto raise_error;
2027 }
2028 else {
2029 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002031 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2033 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002034 }
2035 }
2036 else {
2037 /* Not something you can raise. You get an exception
2038 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002039 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002040 "exceptions must be strings, classes, or instances");
2041 goto raise_error;
2042 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002044 if (tb == NULL)
2045 return WHY_EXCEPTION;
2046 else
2047 return WHY_RERAISE;
2048 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 Py_XDECREF(value);
2050 Py_XDECREF(type);
2051 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002052 return WHY_EXCEPTION;
2053}
2054
Barry Warsawe42b18f1997-08-25 22:13:04 +00002055static int
2056unpack_sequence(v, argcnt, sp)
2057 PyObject *v;
2058 int argcnt;
2059 PyObject **sp;
2060{
2061 int i;
2062 PyObject *w;
2063
2064 for (i = 0; i < argcnt; i++) {
2065 if (! (w = PySequence_GetItem(v, i))) {
2066 if (PyErr_ExceptionMatches(PyExc_IndexError))
2067 PyErr_SetString(PyExc_ValueError,
2068 "unpack sequence of wrong size");
2069 goto finally;
2070 }
2071 *--sp = w;
2072 }
2073 /* we better get an IndexError now */
2074 if (PySequence_GetItem(v, i) == NULL) {
2075 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2076 PyErr_Clear();
2077 return 1;
2078 }
2079 /* some other exception occurred. fall through to finally */
2080 }
2081 else
2082 PyErr_SetString(PyExc_ValueError,
2083 "unpack sequence of wrong size");
2084 /* fall through */
2085finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002086 for (; i > 0; i--, sp++)
2087 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002088
2089 return 0;
2090}
2091
2092
Guido van Rossum96a42c81992-01-12 02:29:51 +00002093#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094static int
2095prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002096 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 if (PyObject_Print(v, stdout, 0) != 0)
2101 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002102 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002104#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002106static void
2107call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 PyObject **p_trace, **p_newtrace;
2109 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002110{
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002112 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002114 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 value = Py_None;
2116 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002117 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002119 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002121 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002122 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002123 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002125 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002127 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 Py_XDECREF(type);
2129 Py_XDECREF(value);
2130 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002131 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002132}
2133
2134static int
2135call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002137 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002139 may point to NULL variable;
2140 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002142 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002144{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002145 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 PyObject *args, *what;
2147 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002148
Guido van Rossuma027efa1997-05-05 20:56:21 +00002149 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002150 /* Don't do recursive traces */
2151 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002153 *p_newtrace = NULL;
2154 }
2155 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002156 }
2157
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002159 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002160 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002162 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002163 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 Py_INCREF(f);
2165 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2166 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002167 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 arg = Py_None;
2169 Py_INCREF(arg);
2170 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002171 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 PyFrame_FastToLocals(f);
2173 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2174 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002176 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002178 if (res == NULL) {
2179 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002180 PyTraceBack_Here(f);
2181 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002182 *p_trace = NULL;
2183 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002185 *p_newtrace = NULL;
2186 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002187 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002188 }
2189 else {
2190 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 Py_XDECREF(*p_newtrace);
2192 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002193 *p_newtrace = NULL;
2194 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002196 *p_newtrace = res;
2197 }
2198 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002200 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002201 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002202}
2203
Guido van Rossumb209a111997-04-29 18:18:01 +00002204PyObject *
2205PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002206{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002207 PyThreadState *tstate = PyThreadState_Get();
2208 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002209 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002210 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002211 else
2212 return current_frame->f_builtins;
2213}
2214
Guido van Rossumb209a111997-04-29 18:18:01 +00002215PyObject *
2216PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002217{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002218 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002219 if (current_frame == NULL)
2220 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002222 return current_frame->f_locals;
2223}
2224
Guido van Rossumb209a111997-04-29 18:18:01 +00002225PyObject *
2226PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002227{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002228 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002229 if (current_frame == NULL)
2230 return NULL;
2231 else
2232 return current_frame->f_globals;
2233}
2234
Guido van Rossumb209a111997-04-29 18:18:01 +00002235PyObject *
2236PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002237{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002238 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002239 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002240}
2241
Guido van Rossum6135a871995-01-09 17:53:26 +00002242int
Guido van Rossumb209a111997-04-29 18:18:01 +00002243PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002244{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002245 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002246 return current_frame == NULL ? 0 : current_frame->f_restricted;
2247}
2248
Guido van Rossumbe270261997-05-22 22:26:18 +00002249int
Guido van Rossumb209a111997-04-29 18:18:01 +00002250Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251{
Guido van Rossumb209a111997-04-29 18:18:01 +00002252 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002253 if (f == NULL)
2254 return 0;
2255 if (!PyFile_SoftSpace(f, 0))
2256 return 0;
2257 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258}
2259
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260
Guido van Rossum681d79a1995-07-18 14:51:37 +00002261/* External interface to call any callable object.
2262 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002263
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002264#undef PyEval_CallObject
2265/* for backward compatibility: export this interface */
2266
Guido van Rossumb209a111997-04-29 18:18:01 +00002267PyObject *
2268PyEval_CallObject(func, arg)
2269 PyObject *func;
2270 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002271{
Guido van Rossumb209a111997-04-29 18:18:01 +00002272 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002273}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002274#define PyEval_CallObject(func,arg) \
2275 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002276
Guido van Rossumb209a111997-04-29 18:18:01 +00002277PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002278PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002279 PyObject *func;
2280 PyObject *arg;
2281 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002282{
2283 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002285
2286 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 arg = PyTuple_New(0);
2288 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002289 PyErr_SetString(PyExc_TypeError,
2290 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291 return NULL;
2292 }
2293 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002295
Guido van Rossumb209a111997-04-29 18:18:01 +00002296 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002297 PyErr_SetString(PyExc_TypeError,
2298 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002299 return NULL;
2300 }
2301
Guido van Rossum150b2df1996-12-05 23:17:11 +00002302 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002303 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002304 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002305 result = call_function(func, arg, kw);
2306 else
2307 result = call_builtin(func, arg, kw);
2308
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002310
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 if (result == NULL && !PyErr_Occurred())
2312 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002313 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002314
2315 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002316}
2317
Guido van Rossumb209a111997-04-29 18:18:01 +00002318static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 PyObject *func;
2321 PyObject *arg;
2322 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323{
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (PyCFunction_Check(func)) {
2325 PyCFunction meth = PyCFunction_GetFunction(func);
2326 PyObject *self = PyCFunction_GetSelf(func);
2327 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002328 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002330 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002332 else if (size == 0)
2333 arg = NULL;
2334 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002335 if (flags & METH_KEYWORDS)
2336 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 if (kw != NULL && PyDict_Size(kw) != 0) {
2338 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002339 "this function takes no keyword arguments");
2340 return NULL;
2341 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002342 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 if (PyClass_Check(func)) {
2345 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002347 if (PyInstance_Check(func)) {
2348 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002349 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 PyErr_Clear();
2351 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002352 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002353 return NULL;
2354 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002355 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002357 return res;
2358 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 return NULL;
2361}
2362
Guido van Rossumb209a111997-04-29 18:18:01 +00002363static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002364call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 PyObject *func;
2366 PyObject *arg;
2367 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368{
Guido van Rossumb209a111997-04-29 18:18:01 +00002369 PyObject *class = NULL; /* == owner */
2370 PyObject *argdefs;
2371 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002372 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002374
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 if (kw != NULL && !PyDict_Check(kw)) {
2376 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002377 return NULL;
2378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 if (PyMethod_Check(func)) {
2381 PyObject *self = PyMethod_Self(func);
2382 class = PyMethod_Class(func);
2383 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002384 if (self == NULL) {
2385 /* Unbound methods must be called with an instance of
2386 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 if (PyTuple_Size(arg) >= 1) {
2388 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002389 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 PyInstance_Check(self) &&
2391 PyClass_IsSubclass((PyObject *)
2392 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002393 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002394 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002395 else
2396 self = NULL;
2397 }
2398 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002399 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002400 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002401 return NULL;
2402 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002403 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002404 }
2405 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 int argcount = PyTuple_Size(arg);
2407 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002408 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002409 if (newarg == NULL)
2410 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 Py_INCREF(self);
2412 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 PyObject *v = PyTuple_GET_ITEM(arg, i);
2415 Py_XINCREF(v);
2416 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002417 }
2418 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 }
2420 }
2421 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002423 PyErr_SetString(PyExc_TypeError,
2424 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 return NULL;
2426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002429
2430 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2432 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2433 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434 }
2435 else {
2436 d = NULL;
2437 nd = 0;
2438 }
2439
2440 if (kw != NULL) {
2441 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002442 nk = PyDict_Size(kw);
2443 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PyErr_NoMemory();
2446 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002447 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002448 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002449 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 i += 2;
2452 nk = i/2;
2453 /* XXX This is broken if the caller deletes dict items! */
2454 }
2455 else {
2456 k = NULL;
2457 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002458 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459
Guido van Rossum681d79a1995-07-18 14:51:37 +00002460 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 (PyCodeObject *)PyFunction_GetCode(func),
2462 PyFunction_GetGlobals(func), (PyObject *)NULL,
2463 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 k, nk,
2465 d, nd,
2466 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 Py_DECREF(arg);
2469 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470
Guido van Rossum681d79a1995-07-18 14:51:37 +00002471 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472}
2473
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002474#define SLICE_ERROR_MSG \
2475 "standard sequence type does not support step size other than one"
2476
Guido van Rossumb209a111997-04-29 18:18:01 +00002477static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002478loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002479 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480{
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002482 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002484 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 return NULL;
2486 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002488 v = (*sq->sq_item)(v, i);
2489 if (v)
2490 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002491 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002493 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494}
2495
2496static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002497slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 int *pi;
2500{
2501 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002502 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002503 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002504 PyErr_SetString(PyExc_TypeError,
2505 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002508 x = PyInt_AsLong(v);
2509 /* Truncate -- very long indices are truncated anyway */
2510 if (x > INT_MAX)
2511 x = INT_MAX;
2512 else if (x < -INT_MAX)
2513 x = 0;
2514 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517}
2518
Guido van Rossumb209a111997-04-29 18:18:01 +00002519static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002520apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002521 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002523 int ilow = 0, ihigh = INT_MAX;
2524 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002527 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002528 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002530
2531static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002532assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002535 int ilow = 0, ihigh = INT_MAX;
2536 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002537 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002538 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002539 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002540 if (x == NULL)
2541 return PySequence_DelSlice(u, ilow, ihigh);
2542 else
2543 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544}
2545
2546static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549{
Guido van Rossume59214e1994-08-30 08:01:59 +00002550 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002551 PyObject *x;
2552 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002553 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002554 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002555 register char *s, *end;
2556 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2558 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 "string member test needs char left operand");
2560 return -1;
2561 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002562 c = PyString_AsString(v)[0];
2563 s = PyString_AsString(w);
2564 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002565 while (s < end) {
2566 if (c == *s++)
2567 return 1;
2568 }
2569 return 0;
2570 }
2571 sq = w->ob_type->tp_as_sequence;
2572 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002573 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574 "'in' or 'not in' needs sequence right argument");
2575 return -1;
2576 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002577 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002578 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002579 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002580 if (PyErr_Occurred() == PyExc_IndexError) {
2581 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002582 break;
2583 }
2584 return -1;
2585 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 cmp = PyObject_Compare(v, x);
2587 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588 if (cmp == 0)
2589 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002590 if (PyErr_Occurred())
2591 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 }
2593 return 0;
2594}
2595
Guido van Rossumb209a111997-04-29 18:18:01 +00002596static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002597cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002598 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002599 register PyObject *v;
2600 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601{
2602 register int cmp;
2603 register int res = 0;
2604 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605 case IS:
2606 case IS_NOT:
2607 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002608 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002609 res = !res;
2610 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 case IN:
2612 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613 res = cmp_member(v, w);
2614 if (res < 0)
2615 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002616 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002617 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 break;
2619 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002620 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 break;
2622 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002624 if (cmp && PyErr_Occurred())
2625 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626 switch (op) {
2627 case LT: res = cmp < 0; break;
2628 case LE: res = cmp <= 0; break;
2629 case EQ: res = cmp == 0; break;
2630 case NE: res = cmp != 0; break;
2631 case GT: res = cmp > 0; break;
2632 case GE: res = cmp >= 0; break;
2633 /* XXX no default? (res is initialized to 0 though) */
2634 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 v = res ? Py_True : Py_False;
2637 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 return v;
2639}
2640
Guido van Rossum3f5da241990-12-20 15:06:42 +00002641static int
2642import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyObject *locals;
2644 PyObject *v;
2645 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002646{
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 PyObject *w, *x;
2648 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002649 PyErr_SetString(PyExc_TypeError,
2650 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002651 return -1;
2652 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 w = PyModule_GetDict(v);
2654 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002655 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002657 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 while (PyDict_Next(w, &pos, &name, &value)) {
2659 if (!PyString_Check(name) ||
2660 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002661 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 Py_INCREF(value);
2663 err = PyDict_SetItem(locals, name, value);
2664 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002665 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002667 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002668 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002669 }
2670 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002672 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002673 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002674 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002675 PyString_AsString(name));
2676 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002677 return -1;
2678 }
2679 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002681 }
2682}
2683
Guido van Rossumb209a111997-04-29 18:18:01 +00002684static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002685build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 PyObject *methods; /* dictionary */
2687 PyObject *bases; /* tuple containing classes */
2688 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002689{
Guido van Rossumcd649651997-08-22 16:56:16 +00002690 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002692 PyErr_SetString(PyExc_SystemError,
2693 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002694 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002695 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002696 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002697 PyErr_SetString(PyExc_SystemError,
2698 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002699 return NULL;
2700 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002701 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002702 PyErr_SetString(PyExc_SystemError,
2703 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002704 return NULL;
2705 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002706 n = PyTuple_Size(bases);
2707 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002708 PyObject *base = PyTuple_GET_ITEM(bases, i);
2709 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002710 /* Call the base's *type*, if it is callable.
2711 This code is a hook for Donald Beaudry's
2712 and Jim Fulton's type extensions. In
2713 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002714 since its types are not callable.
2715 Ditto: call the bases's *class*, if it has
2716 one. This makes the same thing possible
2717 without writing C code. A true meta-object
2718 protocol! */
2719 PyObject *basetype = (PyObject *)base->ob_type;
2720 PyObject *callable = NULL;
2721 if (PyCallable_Check(basetype))
2722 callable = basetype;
2723 else
2724 callable = PyObject_GetAttrString(
2725 base, "__class__");
2726 if (callable) {
2727 PyObject *args;
2728 PyObject *newclass = NULL;
2729 args = Py_BuildValue(
2730 "(OOO)", name, bases, methods);
2731 if (args != NULL) {
2732 newclass = PyEval_CallObject(
2733 callable, args);
2734 Py_DECREF(args);
2735 }
2736 if (callable != basetype)
2737 Py_DECREF(callable);
2738 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002739 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002741 "base is not a class object");
2742 return NULL;
2743 }
2744 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002746}
2747
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002748static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002749exec_statement(f, prog, globals, locals)
2750 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 PyObject *prog;
2752 PyObject *globals;
2753 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002754{
2755 char *s;
2756 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002758 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002759
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2761 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002762 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002764 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 locals = PyTuple_GetItem(prog, 2);
2766 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002767 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002768 if (globals == Py_None) {
2769 globals = PyEval_GetGlobals();
2770 if (locals == Py_None) {
2771 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002772 plain = 1;
2773 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002774 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002776 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 if (!PyString_Check(prog) &&
2778 !PyCode_Check(prog) &&
2779 !PyFile_Check(prog)) {
2780 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002781 "exec 1st arg must be string, code or file object");
2782 return -1;
2783 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2785 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002786 "exec 2nd/3rd args must be dict or None");
2787 return -1;
2788 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002790 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 if (PyCode_Check(prog)) {
Guido van Rossumdfed7251997-11-11 16:29:38 +00002792 v = PyEval_EvalCode((PyCodeObject *) prog,
2793 globals, locals);
2794 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002795 return -1;
Guido van Rossumdfed7251997-11-11 16:29:38 +00002796 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002797 return 0;
2798 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 if (PyFile_Check(prog)) {
2800 FILE *fp = PyFile_AsFile(prog);
2801 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002802 if (PyRun_File(fp, name, Py_file_input,
2803 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002804 return -1;
2805 return 0;
2806 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002808 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002809 PyErr_SetString(PyExc_ValueError,
2810 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002811 return -1;
2812 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002813 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002814 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002815 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002816 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002817 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002818 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002819 return 0;
2820}
Guido van Rossum24c13741995-02-14 09:42:43 +00002821
Guido van Rossum1aa14831997-01-21 05:34:20 +00002822/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002823static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002824find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002826 int nexti;
2827{
2828 int opcode;
2829 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002830 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002831 unsigned char *next_instr;
2832
2833 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2834 opcode = (*next_instr++);
2835 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 Py_INCREF(Py_None);
2837 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002838 }
2839
Guido van Rossumb209a111997-04-29 18:18:01 +00002840 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002841 if (list == NULL)
2842 return NULL;
2843
2844 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002845 oparg = (next_instr[1]<<8) + next_instr[0];
2846 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002847 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002848 if (PyList_Append(list, name) < 0) {
2849 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002850 break;
2851 }
2852 opcode = (*next_instr++);
2853 } while (opcode == IMPORT_FROM);
2854
2855 return list;
2856}
Guido van Rossum950361c1997-01-24 13:49:28 +00002857
2858
2859#ifdef DYNAMIC_EXECUTION_PROFILE
2860
2861PyObject *
2862getarray(a)
2863 long a[256];
2864{
2865 int i;
2866 PyObject *l = PyList_New(256);
2867 if (l == NULL) return NULL;
2868 for (i = 0; i < 256; i++) {
2869 PyObject *x = PyInt_FromLong(a[i]);
2870 if (x == NULL) {
2871 Py_DECREF(l);
2872 return NULL;
2873 }
2874 PyList_SetItem(l, i, x);
2875 }
2876 for (i = 0; i < 256; i++)
2877 a[i] = 0;
2878 return l;
2879}
2880
2881PyObject *
2882_Py_GetDXProfile(self, args)
2883 PyObject *self, *args;
2884{
2885#ifndef DXPAIRS
2886 return getarray(dxp);
2887#else
2888 int i;
2889 PyObject *l = PyList_New(257);
2890 if (l == NULL) return NULL;
2891 for (i = 0; i < 257; i++) {
2892 PyObject *x = getarray(dxpairs[i]);
2893 if (x == NULL) {
2894 Py_DECREF(l);
2895 return NULL;
2896 }
2897 PyList_SetItem(l, i, x);
2898 }
2899 return l;
2900#endif
2901}
2902
2903#endif