blob: 26b3ce34cd2b90670b20d4c49671ff057bfd30eb [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume59214e1994-08-30 08:01:59 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum34679b71993-01-26 13:33:44 +00003Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "import.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "sysmodule.h"
31#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000033#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000035#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000036#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "traceback.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000038#include "graminit.h"
39#include "pythonrun.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040
Guido van Rossumc6004111993-11-05 10:22:19 +000041#include <ctype.h>
42
Guido van Rossume59214e1994-08-30 08:01:59 +000043extern int suppress_print; /* Declared in pythonrun.c, set in pythonmain.c */
44
Guido van Rossum04691fc1992-08-12 15:35:34 +000045/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000046/* #define CASE_TOO_BIG 1 /**/
Guido van Rossum04691fc1992-08-12 15:35:34 +000047
Guido van Rossumacbe8da1993-04-15 15:33:52 +000048/* Turn this on if you want to debug the interpreter: */
49/* (This can be on even if NDEBUG is defined) */
50/* #define DEBUG 1 /**/
51
52#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000053/* For debugging the interpreter: */
54#define LLTRACE 1 /* Low-level trace feature */
55#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000056#endif
57
Guido van Rossum5b722181993-03-30 17:46:03 +000058
Guido van Rossum374a9221991-04-04 10:40:29 +000059/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000060
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
62static int prtrace PROTO((object *, char *));
63#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000064static void call_exc_trace PROTO((object **, object**, frameobject *));
65static int call_trace
66 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000067static object *add PROTO((object *, object *));
68static object *sub PROTO((object *, object *));
69static object *mul PROTO((object *, object *));
70static object *divide PROTO((object *, object *));
71static object *rem PROTO((object *, object *));
72static object *neg PROTO((object *));
73static object *pos PROTO((object *));
74static object *not PROTO((object *));
75static object *invert PROTO((object *));
76static object *lshift PROTO((object *, object *));
77static object *rshift PROTO((object *, object *));
78static object *and PROTO((object *, object *));
79static object *xor PROTO((object *, object *));
80static object *or PROTO((object *, object *));
81static object *call_builtin PROTO((object *, object *));
82static object *call_function PROTO((object *, object *));
83static object *apply_subscript PROTO((object *, object *));
84static object *loop_subscript PROTO((object *, object *));
85static int slice_index PROTO((object *, int, int *));
86static object *apply_slice PROTO((object *, object *, object *));
87static int assign_subscript PROTO((object *, object *, object *));
88static int assign_slice PROTO((object *, object *, object *, object *));
89static int cmp_exception PROTO((object *, object *));
90static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000091static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000092static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000093static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000094static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000095static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum0a066c01992-03-27 17:29:15 +000098/* Pointer to current frame, used to link new frames to */
99
Guido van Rossum374a9221991-04-04 10:40:29 +0000100static frameobject *current_frame;
101
Guido van Rossume59214e1994-08-30 08:01:59 +0000102#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000103
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104#include <errno.h>
105#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
Guido van Rossuma9672091994-09-14 13:31:22 +0000107static type_lock interpreter_lock = 0;
108static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109
110void
111init_save_thread()
112{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000114 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115 interpreter_lock = allocate_lock();
116 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000117 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000119
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120#endif
121
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122/* Functions save_thread and restore_thread are always defined so
123 dynamically loaded modules needn't be compiled separately for use
124 with and without threads: */
125
Guido van Rossum04691fc1992-08-12 15:35:34 +0000126object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127save_thread()
128{
Guido van Rossume59214e1994-08-30 08:01:59 +0000129#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000131 object *res;
132 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133 current_frame = NULL;
134 release_lock(interpreter_lock);
135 return res;
136 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000138 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139}
140
141void
142restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000143 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144{
Guido van Rossume59214e1994-08-30 08:01:59 +0000145#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 if (interpreter_lock) {
147 int err;
148 err = errno;
149 acquire_lock(interpreter_lock, 1);
150 errno = err;
151 current_frame = (frameobject *)x;
152 }
153#endif
154}
155
156
Guido van Rossuma9672091994-09-14 13:31:22 +0000157/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
158 signal handlers or Mac I/O completion routines) can schedule calls
159 to a function to be called synchronously.
160 The synchronous function is called with one void* argument.
161 It should return 0 for success or -1 for failure -- failure should
162 be accompanied by an exception.
163
164 If registry succeeds, the registry function returns 0; if it fails
165 (e.g. due to too many pending calls) it returns -1 (without setting
166 an exception condition).
167
168 Note that because registry may occur from within signal handlers,
169 or other asynchronous events, calling malloc() is unsafe!
170
171#ifdef WITH_THREAD
172 Any thread can schedule pending calls, but only the main thread
173 will execute them.
174#endif
175
176 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
177 There are two possible race conditions:
178 (1) nested asynchronous registry calls;
179 (2) registry calls made while pending calls are being processed.
180 While (1) is very unlikely, (2) is a real possibility.
181 The current code is safe against (2), but not against (1).
182 The safety against (2) is derived from the fact that only one
183 thread (the main thread) ever takes things out of the queue.
184*/
185
186#define NPENDINGCALLS 32
187static struct {
188 int (*func) PROTO((ANY *));
189 ANY *arg;
190} pendingcalls[NPENDINGCALLS];
191static volatile int pendingfirst = 0;
192static volatile int pendinglast = 0;
193
194int
195Py_AddPendingCall(func, arg)
196 int (*func) PROTO((ANY *));
197 ANY *arg;
198{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000199 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000200 int i, j;
201 /* XXX Begin critical section */
202 /* XXX If you want this to be safe against nested
203 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000204 if (busy)
205 return -1;
206 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000207 i = pendinglast;
208 j = (i + 1) % NPENDINGCALLS;
209 if (j == pendingfirst)
210 return -1; /* Queue full */
211 pendingcalls[i].func = func;
212 pendingcalls[i].arg = arg;
213 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000215 /* XXX End critical section */
216 return 0;
217}
218
Guido van Rossum180d7b41994-09-29 09:45:57 +0000219int
220Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000221{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000222 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000223#ifdef WITH_THREAD
224 if (get_thread_ident() != main_thread)
225 return 0;
226#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000227 if (busy)
228 return 0;
229 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000230 for (;;) {
231 int i;
232 int (*func) PROTO((ANY *));
233 ANY *arg;
234 i = pendingfirst;
235 if (i == pendinglast)
236 break; /* Queue empty */
237 func = pendingcalls[i].func;
238 arg = pendingcalls[i].arg;
239 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000240 if (func(arg) < 0) {
241 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000242 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000243 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 return 0;
247}
248
249
Guido van Rossum374a9221991-04-04 10:40:29 +0000250/* Status code for main loop (reason for stack unwind) */
251
252enum why_code {
253 WHY_NOT, /* No error */
254 WHY_EXCEPTION, /* Exception occurred */
255 WHY_RERAISE, /* Exception re-raised by 'finally' */
256 WHY_RETURN, /* 'return' statement */
257 WHY_BREAK /* 'break' statement */
258};
259
260
261/* Interpreter main loop */
262
263object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000264eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000265 codeobject *co;
266 object *globals;
267 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000268 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000269 object *arg;
270{
271 register unsigned char *next_instr;
272 register int opcode; /* Current opcode */
273 register int oparg; /* Current opcode argument, if any */
274 register object **stack_pointer;
275 register enum why_code why; /* Reason for block stack unwind */
276 register int err; /* Error status -- nonzero if error */
277 register object *x; /* Result object -- NULL if error */
278 register object *v; /* Temporary objects popped off stack */
279 register object *w;
280 register object *u;
281 register object *t;
282 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000283 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000284 object *retval; /* Return value iff why == WHY_RETURN */
285 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000286 int needmerge = 0; /* Set if need to merge locals back at end */
287 int defmode = 0; /* Default access mode for new variables */
Guido van Rossume59214e1994-08-30 08:01:59 +0000288 int ticker_count = 10; /* Check for intr every Nth instruction */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000289#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000290 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000291#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000292#ifdef DEBUG
293 /* Make it easier to find out where we are with dbx */
294 char *filename = getstringvalue(co->co_filename);
295#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000296
297/* Code access macros */
298
299#define GETCONST(i) Getconst(f, i)
300#define GETNAME(i) Getname(f, i)
301#define GETNAMEV(i) Getnamev(f, i)
302#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
303#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
304#define NEXTOP() (*next_instr++)
305#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
306#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
307#define JUMPBY(x) (next_instr += (x))
308
309/* Stack manipulation macros */
310
311#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
312#define EMPTY() (STACK_LEVEL() == 0)
313#define TOP() (stack_pointer[-1])
314#define BASIC_PUSH(v) (*stack_pointer++ = (v))
315#define BASIC_POP() (*--stack_pointer)
316
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000317#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
318 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
319
Guido van Rossum96a42c81992-01-12 02:29:51 +0000320#ifdef LLTRACE
321#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
322#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000323#else
324#define PUSH(v) BASIC_PUSH(v)
325#define POP() BASIC_POP()
326#endif
327
Guido van Rossum5b722181993-03-30 17:46:03 +0000328 if (globals == NULL) {
329 globals = getglobals();
330 if (locals == NULL) {
331 locals = getlocals();
332 needmerge = 1;
333 }
334 }
335 else {
336 if (locals == NULL)
337 locals = globals;
338 }
339
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000340#ifdef LLTRACE
341 lltrace = dictlookup(globals, "__lltrace__") != NULL;
342#endif
343
Guido van Rossum374a9221991-04-04 10:40:29 +0000344 f = newframeobject(
345 current_frame, /*back*/
346 co, /*code*/
347 globals, /*globals*/
348 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000349 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000350 50, /*nvalues*/
351 20); /*nblocks*/
352 if (f == NULL)
353 return NULL;
354
355 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000356
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000357 if (sys_trace != NULL) {
358 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000359 be called on *every* entry to a code block.
360 Its return value, if not None, is a function that
361 will be called at the start of each executed line
362 of code. (Actually, the function must return
363 itself in order to continue tracing.)
364 The trace functions are called with three arguments:
365 a pointer to the current frame, a string indicating
366 why the function is called, and an argument which
367 depends on the situation. The global trace function
368 (sys.trace) is also called whenever an exception
369 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000370 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000371 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000372 current_frame = f->f_back;
373 DECREF(f);
374 return NULL;
375 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000376 }
377
378 if (sys_profile != NULL) {
379 /* Similar for sys_profile, except it needn't return
380 itself and isn't called for "line" events */
381 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
382 current_frame = f->f_back;
383 DECREF(f);
384 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000385 }
386 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000387
388 x = sysget("check_interval");
389 if (x != NULL && is_intobject(x))
390 ticker_count = getintvalue(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000391
392 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000393 stack_pointer = f->f_valuestack;
394
395 if (arg != NULL) {
396 INCREF(arg);
397 PUSH(arg);
398 }
399
400 why = WHY_NOT;
401 err = 0;
402 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000403
404 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000405 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000406
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000407 /* Do periodic things.
408 Doing this every time through the loop would add
409 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000410 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000411
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000413 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000414 why = WHY_EXCEPTION;
415 goto on_error;
416 }
417 }
418
Guido van Rossum374a9221991-04-04 10:40:29 +0000419 if (--ticker < 0) {
Guido van Rossume59214e1994-08-30 08:01:59 +0000420 ticker = ticker_count;
421 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000422 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000423 goto on_error;
424 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000425
Guido van Rossume59214e1994-08-30 08:01:59 +0000426#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427 if (interpreter_lock) {
428 /* Give another thread a chance */
429
430 current_frame = NULL;
431 release_lock(interpreter_lock);
432
433 /* Other threads may run now */
434
435 acquire_lock(interpreter_lock, 1);
436 current_frame = f;
437 }
438#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000439 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440
Guido van Rossum374a9221991-04-04 10:40:29 +0000441 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000442
443#ifdef DEBUG
444 f->f_lasti = INSTR_OFFSET();
445#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000446
447 opcode = NEXTOP();
448 if (HAS_ARG(opcode))
449 oparg = NEXTARG();
450
Guido van Rossum96a42c81992-01-12 02:29:51 +0000451#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000452 /* Instruction tracing */
453
Guido van Rossum96a42c81992-01-12 02:29:51 +0000454 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000455 if (HAS_ARG(opcode)) {
456 printf("%d: %d, %d\n",
457 (int) (INSTR_OFFSET() - 3),
458 opcode, oparg);
459 }
460 else {
461 printf("%d: %d\n",
462 (int) (INSTR_OFFSET() - 1), opcode);
463 }
464 }
465#endif
466
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000467 if (!CHECK_STACK(3)) {
468 x = NULL;
469 break;
470 }
471
Guido van Rossum374a9221991-04-04 10:40:29 +0000472 /* Main switch on opcode */
473
474 switch (opcode) {
475
476 /* BEWARE!
477 It is essential that any operation that fails sets either
478 x to NULL, err to nonzero, or why to anything but WHY_NOT,
479 and that no operation that succeeds does this! */
480
481 /* case STOP_CODE: this is an error! */
482
483 case POP_TOP:
484 v = POP();
485 DECREF(v);
486 break;
487
488 case ROT_TWO:
489 v = POP();
490 w = POP();
491 PUSH(v);
492 PUSH(w);
493 break;
494
495 case ROT_THREE:
496 v = POP();
497 w = POP();
498 x = POP();
499 PUSH(v);
500 PUSH(x);
501 PUSH(w);
502 break;
503
504 case DUP_TOP:
505 v = TOP();
506 INCREF(v);
507 PUSH(v);
508 break;
509
510 case UNARY_POSITIVE:
511 v = POP();
512 x = pos(v);
513 DECREF(v);
514 PUSH(x);
515 break;
516
517 case UNARY_NEGATIVE:
518 v = POP();
519 x = neg(v);
520 DECREF(v);
521 PUSH(x);
522 break;
523
524 case UNARY_NOT:
525 v = POP();
526 x = not(v);
527 DECREF(v);
528 PUSH(x);
529 break;
530
531 case UNARY_CONVERT:
532 v = POP();
533 x = reprobject(v);
534 DECREF(v);
535 PUSH(x);
536 break;
537
538 case UNARY_CALL:
539 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000540 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000541 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000542 DECREF(v);
543 PUSH(x);
544 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000545
546 case UNARY_INVERT:
547 v = POP();
548 x = invert(v);
549 DECREF(v);
550 PUSH(x);
551 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000552
553 case BINARY_MULTIPLY:
554 w = POP();
555 v = POP();
556 x = mul(v, w);
557 DECREF(v);
558 DECREF(w);
559 PUSH(x);
560 break;
561
562 case BINARY_DIVIDE:
563 w = POP();
564 v = POP();
565 x = divide(v, w);
566 DECREF(v);
567 DECREF(w);
568 PUSH(x);
569 break;
570
571 case BINARY_MODULO:
572 w = POP();
573 v = POP();
574 x = rem(v, w);
575 DECREF(v);
576 DECREF(w);
577 PUSH(x);
578 break;
579
580 case BINARY_ADD:
581 w = POP();
582 v = POP();
583 x = add(v, w);
584 DECREF(v);
585 DECREF(w);
586 PUSH(x);
587 break;
588
589 case BINARY_SUBTRACT:
590 w = POP();
591 v = POP();
592 x = sub(v, w);
593 DECREF(v);
594 DECREF(w);
595 PUSH(x);
596 break;
597
598 case BINARY_SUBSCR:
599 w = POP();
600 v = POP();
601 x = apply_subscript(v, w);
602 DECREF(v);
603 DECREF(w);
604 PUSH(x);
605 break;
606
607 case BINARY_CALL:
608 w = POP();
609 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000610 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000611 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000612 DECREF(v);
613 DECREF(w);
614 PUSH(x);
615 break;
616
Guido van Rossum7928cd71991-10-24 14:59:31 +0000617 case BINARY_LSHIFT:
618 w = POP();
619 v = POP();
620 x = lshift(v, w);
621 DECREF(v);
622 DECREF(w);
623 PUSH(x);
624 break;
625
626 case BINARY_RSHIFT:
627 w = POP();
628 v = POP();
629 x = rshift(v, w);
630 DECREF(v);
631 DECREF(w);
632 PUSH(x);
633 break;
634
635 case BINARY_AND:
636 w = POP();
637 v = POP();
638 x = and(v, w);
639 DECREF(v);
640 DECREF(w);
641 PUSH(x);
642 break;
643
644 case BINARY_XOR:
645 w = POP();
646 v = POP();
647 x = xor(v, w);
648 DECREF(v);
649 DECREF(w);
650 PUSH(x);
651 break;
652
653 case BINARY_OR:
654 w = POP();
655 v = POP();
656 x = or(v, w);
657 DECREF(v);
658 DECREF(w);
659 PUSH(x);
660 break;
661
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 case SLICE+0:
663 case SLICE+1:
664 case SLICE+2:
665 case SLICE+3:
666 if ((opcode-SLICE) & 2)
667 w = POP();
668 else
669 w = NULL;
670 if ((opcode-SLICE) & 1)
671 v = POP();
672 else
673 v = NULL;
674 u = POP();
675 x = apply_slice(u, v, w);
676 DECREF(u);
677 XDECREF(v);
678 XDECREF(w);
679 PUSH(x);
680 break;
681
682 case STORE_SLICE+0:
683 case STORE_SLICE+1:
684 case STORE_SLICE+2:
685 case STORE_SLICE+3:
686 if ((opcode-STORE_SLICE) & 2)
687 w = POP();
688 else
689 w = NULL;
690 if ((opcode-STORE_SLICE) & 1)
691 v = POP();
692 else
693 v = NULL;
694 u = POP();
695 t = POP();
696 err = assign_slice(u, v, w, t); /* u[v:w] = t */
697 DECREF(t);
698 DECREF(u);
699 XDECREF(v);
700 XDECREF(w);
701 break;
702
703 case DELETE_SLICE+0:
704 case DELETE_SLICE+1:
705 case DELETE_SLICE+2:
706 case DELETE_SLICE+3:
707 if ((opcode-DELETE_SLICE) & 2)
708 w = POP();
709 else
710 w = NULL;
711 if ((opcode-DELETE_SLICE) & 1)
712 v = POP();
713 else
714 v = NULL;
715 u = POP();
716 err = assign_slice(u, v, w, (object *)NULL);
717 /* del u[v:w] */
718 DECREF(u);
719 XDECREF(v);
720 XDECREF(w);
721 break;
722
723 case STORE_SUBSCR:
724 w = POP();
725 v = POP();
726 u = POP();
727 /* v[w] = u */
728 err = assign_subscript(v, w, u);
729 DECREF(u);
730 DECREF(v);
731 DECREF(w);
732 break;
733
734 case DELETE_SUBSCR:
735 w = POP();
736 v = POP();
737 /* del v[w] */
738 err = assign_subscript(v, w, (object *)NULL);
739 DECREF(v);
740 DECREF(w);
741 break;
742
743 case PRINT_EXPR:
744 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000746 /* Before printing, also assign to '_' */
747 if (v != None &&
748 (err = setbuiltin("_", v)) == 0 &&
749 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000751 x = sysget("stdout");
752 softspace(x, 1);
753 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 flushline();
755 }
756 DECREF(v);
757 break;
758
759 case PRINT_ITEM:
760 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000761 w = sysget("stdout");
762 if (softspace(w, 1))
763 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000764 err = writeobject(v, w, PRINT_RAW);
765 if (err == 0 && is_stringobject(v)) {
766 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 char *s = getstringvalue(v);
768 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000769 if (len > 0 && isspace(s[len-1]) &&
770 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000771 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 DECREF(v);
774 break;
775
776 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000777 x = sysget("stdout");
778 if (x == NULL)
779 err_setstr(RuntimeError, "lost sys.stdout");
780 else {
781 writestring("\n", x);
782 softspace(x, 0);
783 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
786 case BREAK_LOOP:
787 why = WHY_BREAK;
788 break;
789
790 case RAISE_EXCEPTION:
791 v = POP();
792 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000793 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000794 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000795 u = w;
796 w = gettupleitem(u, 0);
797 DECREF(u);
798 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 if (!is_stringobject(w))
800 err_setstr(TypeError,
801 "exceptions must be strings");
802 else
803 err_setval(w, v);
804 DECREF(v);
805 DECREF(w);
806 why = WHY_EXCEPTION;
807 break;
808
809 case LOAD_LOCALS:
810 v = f->f_locals;
811 INCREF(v);
812 PUSH(v);
813 break;
814
815 case RETURN_VALUE:
816 retval = POP();
817 why = WHY_RETURN;
818 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000819
820 case LOAD_GLOBALS:
821 v = f->f_locals;
822 INCREF(v);
823 PUSH(v);
824 break;
825
826 case EXEC_STMT:
827 w = POP();
828 v = POP();
829 u = POP();
830 err = exec_statement(u, v, w);
831 DECREF(u);
832 DECREF(v);
833 DECREF(w);
834 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case BUILD_FUNCTION:
837 v = POP();
838 x = newfuncobject(v, f->f_globals);
839 DECREF(v);
840 PUSH(x);
841 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000842
843 case SET_FUNC_ARGS:
844 v = POP(); /* The function */
845 w = POP(); /* The argument list */
846 err = setfuncargstuff(v, oparg, w);
847 PUSH(v);
848 DECREF(w);
849 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850
851 case POP_BLOCK:
852 {
853 block *b = pop_block(f);
854 while (STACK_LEVEL() > b->b_level) {
855 v = POP();
856 DECREF(v);
857 }
858 }
859 break;
860
861 case END_FINALLY:
862 v = POP();
863 if (is_intobject(v)) {
864 why = (enum why_code) getintvalue(v);
865 if (why == WHY_RETURN)
866 retval = POP();
867 }
868 else if (is_stringobject(v)) {
869 w = POP();
870 err_setval(v, w);
871 DECREF(w);
872 w = POP();
873 tb_store(w);
874 DECREF(w);
875 why = WHY_RERAISE;
876 }
877 else if (v != None) {
878 err_setstr(SystemError,
879 "'finally' pops bad exception");
880 why = WHY_EXCEPTION;
881 }
882 DECREF(v);
883 break;
884
885 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000886 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000888 w = POP();
889 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000891 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 DECREF(v);
893 DECREF(w);
894 break;
895
896 case STORE_NAME:
897 w = GETNAMEV(oparg);
898 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000899 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000900 if (u == NULL) {
901 if (defmode != 0) {
902 if (v != None)
903 u = (object *)v->ob_type;
904 else
905 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000906 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000907 (typeobject *)u,
908 defmode);
909 DECREF(v);
910 if (x == NULL)
911 break;
912 v = x;
913 }
914 }
915 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000916 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000917 DECREF(v);
918 break;
919 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 err = dict2insert(f->f_locals, w, v);
921 DECREF(v);
922 break;
923
924 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000925 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000926 u = dict2lookup(f->f_locals, w);
927 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000928 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000929 (object *)NULL);
930 break;
931 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000932 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000933 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935
936#ifdef CASE_TOO_BIG
937 default: switch (opcode) {
938#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000939
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000940 case UNPACK_VARARG:
941 if (EMPTY()) {
942 err_setstr(TypeError,
943 "no argument list");
944 why = WHY_EXCEPTION;
945 break;
946 }
947 v = POP();
948 if (!is_tupleobject(v)) {
949 err_setstr(TypeError,
950 "bad argument list");
951 why = WHY_EXCEPTION;
952 }
953 else if (gettuplesize(v) < oparg) {
954 err_setstr(TypeError,
955 "not enough arguments");
956 why = WHY_EXCEPTION;
957 }
958 else if (oparg == 0) {
959 PUSH(v);
960 break;
961 }
962 else {
963 x = gettupleslice(v, oparg, gettuplesize(v));
964 if (x != NULL) {
965 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000966 if (!CHECK_STACK(oparg)) {
967 x = NULL;
968 break;
969 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000970 for (; --oparg >= 0; ) {
971 w = gettupleitem(v, oparg);
972 INCREF(w);
973 PUSH(w);
974 }
975 }
976 }
977 DECREF(v);
978 break;
979
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000980 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000981 {
982 int n;
983 if (EMPTY()) {
984 err_setstr(TypeError,
985 "no argument list");
986 why = WHY_EXCEPTION;
987 break;
988 }
989 v = POP();
990 if (!is_tupleobject(v)) {
991 err_setstr(TypeError,
992 "bad argument list");
993 why = WHY_EXCEPTION;
994 break;
995 }
996 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000997#ifdef COMPAT_HACKS
998/* Implement various compatibility hacks (for 0.9.4 or earlier):
999 (a) f(a,b,...) accepts f((1,2,...))
1000 (b) f((a,b,...)) accepts f(1,2,...)
1001 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
1002*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001003 if (n == 1 && oparg != 1) {
1004 /* Rule (a) */
1005 w = gettupleitem(v, 0);
1006 if (is_tupleobject(w)) {
1007 INCREF(w);
1008 DECREF(v);
1009 v = w;
1010 n = gettuplesize(v);
1011 }
1012 }
1013 else if (n != 1 && oparg == 1) {
1014 /* Rule (b) */
1015 PUSH(v);
1016 break;
1017 /* Don't fall through */
1018 }
1019 else if (n > 2 && oparg == 2) {
1020 /* Rule (c) */
1021 int i;
1022 w = newtupleobject(n-1);
1023 u = newtupleobject(2);
1024 if (u == NULL || w == NULL) {
1025 XDECREF(w);
1026 XDECREF(u);
1027 DECREF(v);
1028 why = WHY_EXCEPTION;
1029 break;
1030 }
1031 t = gettupleitem(v, 0);
1032 INCREF(t);
1033 settupleitem(u, 0, t);
1034 for (i = 1; i < n; i++) {
1035 t = gettupleitem(v, i);
1036 INCREF(t);
1037 settupleitem(w, i-1, t);
1038 }
1039 settupleitem(u, 1, w);
1040 DECREF(v);
1041 v = u;
1042 n = 2;
1043 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001044#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001045 if (n != oparg) {
1046 err_setstr(TypeError,
1047 "arg count mismatch");
1048 why = WHY_EXCEPTION;
1049 DECREF(v);
1050 break;
1051 }
1052 PUSH(v);
1053 }
1054 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 case UNPACK_TUPLE:
1056 v = POP();
1057 if (!is_tupleobject(v)) {
1058 err_setstr(TypeError, "unpack non-tuple");
1059 why = WHY_EXCEPTION;
1060 }
1061 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001062 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 "unpack tuple of wrong size");
1064 why = WHY_EXCEPTION;
1065 }
1066 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001067 if (!CHECK_STACK(oparg)) {
1068 x = NULL;
1069 break;
1070 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 for (; --oparg >= 0; ) {
1072 w = gettupleitem(v, oparg);
1073 INCREF(w);
1074 PUSH(w);
1075 }
1076 }
1077 DECREF(v);
1078 break;
1079
1080 case UNPACK_LIST:
1081 v = POP();
1082 if (!is_listobject(v)) {
1083 err_setstr(TypeError, "unpack non-list");
1084 why = WHY_EXCEPTION;
1085 }
1086 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001087 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001088 "unpack list of wrong size");
1089 why = WHY_EXCEPTION;
1090 }
1091 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001092 if (!CHECK_STACK(oparg)) {
1093 x = NULL;
1094 break;
1095 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 for (; --oparg >= 0; ) {
1097 w = getlistitem(v, oparg);
1098 INCREF(w);
1099 PUSH(w);
1100 }
1101 }
1102 DECREF(v);
1103 break;
1104
1105 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001106 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 v = POP();
1108 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001109 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 DECREF(v);
1111 DECREF(u);
1112 break;
1113
1114 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001117 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 DECREF(v);
1119 break;
1120
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001121 case STORE_GLOBAL:
1122 w = GETNAMEV(oparg);
1123 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001124 u = dict2lookup(f->f_locals, w);
1125 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001126 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001127 DECREF(v);
1128 break;
1129 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001130 err = dict2insert(f->f_globals, w, v);
1131 DECREF(v);
1132 break;
1133
1134 case DELETE_GLOBAL:
1135 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001136 u = dict2lookup(f->f_locals, w);
1137 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001138 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001139 (object *)NULL);
1140 break;
1141 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001142 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001143 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001144 break;
1145
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 case LOAD_CONST:
1147 x = GETCONST(oparg);
1148 INCREF(x);
1149 PUSH(x);
1150 break;
1151
1152 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001153 w = GETNAMEV(oparg);
1154 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001156 err_clear();
1157 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001159 err_clear();
1160 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001162 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 break;
1164 }
1165 }
1166 }
Guido van Rossum25831651993-05-19 14:50:45 +00001167 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001168 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001169 if (x == NULL)
1170 break;
1171 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001172 else
1173 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 PUSH(x);
1175 break;
1176
1177 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001178 w = GETNAMEV(oparg);
1179 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001181 err_clear();
1182 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001184 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 break;
1186 }
1187 }
Guido van Rossum25831651993-05-19 14:50:45 +00001188 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001189 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001190 if (x == NULL)
1191 break;
1192 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001193 else
1194 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 PUSH(x);
1196 break;
1197
1198 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001199 w = GETNAMEV(oparg);
1200 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001202 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 break;
1204 }
Guido van Rossum25831651993-05-19 14:50:45 +00001205 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001206 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001207 if (x == NULL)
1208 break;
1209 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001210 else
1211 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 PUSH(x);
1213 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001214
1215 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001216 x = GETCONST(oparg);
1217 if (x == None)
1218 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001219 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001220 err_setstr(SystemError, "bad RESERVE_FAST");
1221 x = NULL;
1222 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001223 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001224 XDECREF(f->f_fastlocals);
1225 XDECREF(f->f_localmap);
1226 INCREF(x);
1227 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001228 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001229 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001230 break;
1231
1232 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001233 x = GETLISTITEM(fastlocals, oparg);
1234 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001235 err_setval(NameError,
1236 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001237 break;
1238 }
Guido van Rossum25831651993-05-19 14:50:45 +00001239 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001240 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001241 if (x == NULL)
1242 break;
1243 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001244 else
1245 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001246 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001247 break;
1248
1249 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001250 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001251 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001252 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001253 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001254 DECREF(v);
1255 break;
1256 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001257 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001258 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001259 break;
1260
1261 case DELETE_FAST:
1262 x = GETLISTITEM(fastlocals, oparg);
1263 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001264 err_setval(NameError,
1265 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001266 break;
1267 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001268 if (x != NULL && is_accessobject(x)) {
1269 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001270 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001271 break;
1272 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001273 DECREF(x);
1274 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001275 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001276
1277 case BUILD_TUPLE:
1278 x = newtupleobject(oparg);
1279 if (x != NULL) {
1280 for (; --oparg >= 0;) {
1281 w = POP();
1282 err = settupleitem(x, oparg, w);
1283 if (err != 0)
1284 break;
1285 }
1286 PUSH(x);
1287 }
1288 break;
1289
1290 case BUILD_LIST:
1291 x = newlistobject(oparg);
1292 if (x != NULL) {
1293 for (; --oparg >= 0;) {
1294 w = POP();
1295 err = setlistitem(x, oparg, w);
1296 if (err != 0)
1297 break;
1298 }
1299 PUSH(x);
1300 }
1301 break;
1302
1303 case BUILD_MAP:
1304 x = newdictobject();
1305 PUSH(x);
1306 break;
1307
1308 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001309 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001311 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 DECREF(v);
1313 PUSH(x);
1314 break;
1315
1316 case COMPARE_OP:
1317 w = POP();
1318 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001319 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 DECREF(v);
1321 DECREF(w);
1322 PUSH(x);
1323 break;
1324
1325 case IMPORT_NAME:
1326 name = GETNAME(oparg);
1327 x = import_module(name);
1328 XINCREF(x);
1329 PUSH(x);
1330 break;
1331
1332 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001333 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001335 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001336 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001338
1339 case ACCESS_MODE:
1340 v = POP();
1341 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001342 if (getstringvalue(w)[0] == '*')
1343 defmode = getintvalue(v);
1344 else
1345 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001346 DECREF(v);
1347 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001348
1349 case JUMP_FORWARD:
1350 JUMPBY(oparg);
1351 break;
1352
1353 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001354 err = testbool(TOP());
1355 if (err > 0)
1356 err = 0;
1357 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 JUMPBY(oparg);
1359 break;
1360
1361 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001362 err = testbool(TOP());
1363 if (err > 0) {
1364 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001366 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
1368
1369 case JUMP_ABSOLUTE:
1370 JUMPTO(oparg);
1371 break;
1372
1373 case FOR_LOOP:
1374 /* for v in s: ...
1375 On entry: stack contains s, i.
1376 On exit: stack contains s, i+1, s[i];
1377 but if loop exhausted:
1378 s, i are popped, and we jump */
1379 w = POP(); /* Loop index */
1380 v = POP(); /* Sequence object */
1381 u = loop_subscript(v, w);
1382 if (u != NULL) {
1383 PUSH(v);
1384 x = newintobject(getintvalue(w)+1);
1385 PUSH(x);
1386 DECREF(w);
1387 PUSH(u);
1388 }
1389 else {
1390 DECREF(v);
1391 DECREF(w);
1392 /* A NULL can mean "s exhausted"
1393 but also an error: */
1394 if (err_occurred())
1395 why = WHY_EXCEPTION;
1396 else
1397 JUMPBY(oparg);
1398 }
1399 break;
1400
1401 case SETUP_LOOP:
1402 case SETUP_EXCEPT:
1403 case SETUP_FINALLY:
1404 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1405 STACK_LEVEL());
1406 break;
1407
1408 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001409#ifdef LLTRACE
1410 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001411 printf("--- Line %d ---\n", oparg);
1412#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001413 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001414 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001415 /* Trace each line of code reached */
1416 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001417 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001418 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001419 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 break;
1421
1422 default:
1423 fprintf(stderr,
1424 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001425 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 err_setstr(SystemError, "eval_code: unknown opcode");
1427 why = WHY_EXCEPTION;
1428 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001429
1430#ifdef CASE_TOO_BIG
1431 }
1432#endif
1433
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 } /* switch */
1435
1436 on_error:
1437
1438 /* Quickly continue if no error occurred */
1439
1440 if (why == WHY_NOT) {
1441 if (err == 0 && x != NULL)
1442 continue; /* Normal, fast path */
1443 why = WHY_EXCEPTION;
1444 x = None;
1445 err = 0;
1446 }
1447
Guido van Rossum801dcae1992-04-08 11:32:32 +00001448#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 /* Double-check exception status */
1450
1451 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1452 if (!err_occurred()) {
1453 fprintf(stderr, "XXX ghost error\n");
1454 err_setstr(SystemError, "ghost error");
1455 why = WHY_EXCEPTION;
1456 }
1457 }
1458 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001459 if (err_occurred())
1460 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 }
1462#endif
1463
1464 /* Log traceback info if this is a real exception */
1465
1466 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001467 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001469 f->f_lasti -= 2;
1470 tb_here(f);
1471
Guido van Rossume59214e1994-08-30 08:01:59 +00001472 if (f->f_trace)
1473 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001474 if (sys_profile)
1475 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 }
1477
1478 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1479
1480 if (why == WHY_RERAISE)
1481 why = WHY_EXCEPTION;
1482
1483 /* Unwind stacks if a (pseudo) exception occurred */
1484
1485 while (why != WHY_NOT && f->f_iblock > 0) {
1486 block *b = pop_block(f);
1487 while (STACK_LEVEL() > b->b_level) {
1488 v = POP();
1489 XDECREF(v);
1490 }
1491 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1492 why = WHY_NOT;
1493 JUMPTO(b->b_handler);
1494 break;
1495 }
1496 if (b->b_type == SETUP_FINALLY ||
1497 b->b_type == SETUP_EXCEPT &&
1498 why == WHY_EXCEPTION) {
1499 if (why == WHY_EXCEPTION) {
1500 object *exc, *val;
1501 err_get(&exc, &val);
1502 if (val == NULL) {
1503 val = None;
1504 INCREF(val);
1505 }
1506 v = tb_fetch();
1507 /* Make the raw exception data
1508 available to the handler,
1509 so a program can emulate the
1510 Python main loop. Don't do
1511 this for 'finally'. */
1512 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 sysset("exc_value", val);
1515 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 }
1517 PUSH(v);
1518 PUSH(val);
1519 PUSH(exc);
1520 }
1521 else {
1522 if (why == WHY_RETURN)
1523 PUSH(retval);
1524 v = newintobject((long)why);
1525 PUSH(v);
1526 }
1527 why = WHY_NOT;
1528 JUMPTO(b->b_handler);
1529 break;
1530 }
1531 } /* unwind stack */
1532
1533 /* End the loop if we still have an error (or return) */
1534
1535 if (why != WHY_NOT)
1536 break;
1537
1538 } /* main loop */
1539
1540 /* Pop remaining stack entries */
1541
1542 while (!EMPTY()) {
1543 v = POP();
1544 XDECREF(v);
1545 }
1546
Guido van Rossum96a42c81992-01-12 02:29:51 +00001547 if (why != WHY_RETURN)
1548 retval = NULL;
1549
Guido van Rossume59214e1994-08-30 08:01:59 +00001550 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001551 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001552 if (call_trace(&f->f_trace, &f->f_trace, f,
1553 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001554 XDECREF(retval);
1555 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001556 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001557 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001558 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001559 }
1560
1561 if (sys_profile && why == WHY_RETURN) {
1562 if (call_trace(&sys_profile, (object**)0,
1563 f, "return", retval)) {
1564 XDECREF(retval);
1565 retval = NULL;
1566 why = WHY_EXCEPTION;
1567 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001568 }
1569
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 /* Restore previous frame and release the current one */
1571
1572 current_frame = f->f_back;
1573 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001574
1575 if (needmerge)
1576 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577
Guido van Rossum96a42c81992-01-12 02:29:51 +00001578 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001579}
1580
Guido van Rossum96a42c81992-01-12 02:29:51 +00001581#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001582static int
1583prtrace(v, str)
1584 object *v;
1585 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001587 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001588 if (printobject(v, stdout, 0) != 0)
1589 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001592#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001594static void
1595call_exc_trace(p_trace, p_newtrace, f)
1596 object **p_trace, **p_newtrace;
1597 frameobject *f;
1598{
1599 object *type, *value, *traceback, *arg;
1600 int err;
1601 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001602 if (value == NULL) {
1603 value = None;
1604 INCREF(value);
1605 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001606 traceback = tb_fetch();
1607 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001608 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001609 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001610 settupleitem(arg, 0, type);
1611 settupleitem(arg, 1, value);
1612 settupleitem(arg, 2, traceback);
1613 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001614 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001615 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001616 /* Restore original exception */
1617 err_setval(type, value);
1618 tb_store(traceback);
1619 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001620 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001621}
1622
1623static int
1624call_trace(p_trace, p_newtrace, f, msg, arg)
1625 object **p_trace; /* in/out; may not be NULL;
1626 may not point to NULL variable initially */
1627 object **p_newtrace; /* in/out; may be NULL;
1628 may point to NULL variable;
1629 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001630 frameobject *f;
1631 char *msg;
1632 object *arg;
1633{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001634 object *arglist, *what;
1635 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001636 static int tracing = 0;
1637
1638 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001639 /* Don't do recursive traces */
1640 if (p_newtrace) {
1641 XDECREF(*p_newtrace);
1642 *p_newtrace = NULL;
1643 }
1644 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001645 }
1646
1647 arglist = newtupleobject(3);
1648 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001649 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001650 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001651 if (what == NULL)
1652 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001653 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001654 settupleitem(arglist, 0, (object *)f);
1655 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001656 if (arg == NULL)
1657 arg = None;
1658 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001659 settupleitem(arglist, 2, arg);
1660 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001661 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001662 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001663 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001664 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001665 cleanup:
1666 XDECREF(arglist);
1667 if (res == NULL) {
1668 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001669 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001670 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001671 *p_trace = NULL;
1672 if (p_newtrace) {
1673 XDECREF(*p_newtrace);
1674 *p_newtrace = NULL;
1675 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001676 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001677 }
1678 else {
1679 if (p_newtrace) {
1680 XDECREF(*p_newtrace);
1681 if (res == None)
1682 *p_newtrace = NULL;
1683 else {
1684 INCREF(res);
1685 *p_newtrace = res;
1686 }
1687 }
1688 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001689 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001690 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001691}
1692
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001694getlocals()
1695{
1696 if (current_frame == NULL)
1697 return NULL;
1698 fast_2_locals(current_frame);
1699 return current_frame->f_locals;
1700}
1701
1702object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703getglobals()
1704{
1705 if (current_frame == NULL)
1706 return NULL;
1707 else
1708 return current_frame->f_globals;
1709}
1710
Guido van Rossum81daa321993-05-20 14:24:46 +00001711object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001712getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001713{
1714 if (current_frame == NULL)
1715 return NULL;
1716 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001717 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001718}
1719
Guido van Rossume59214e1994-08-30 08:01:59 +00001720object *
1721getframe()
1722{
1723 return (object *)current_frame;
1724}
1725
Guido van Rossum3f5da241990-12-20 15:06:42 +00001726void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001727printtraceback(f)
1728 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729{
1730 object *v = tb_fetch();
1731 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001732 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735}
1736
1737
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738void
1739flushline()
1740{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001741 object *f = sysget("stdout");
1742 if (softspace(f, 0))
1743 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744}
1745
Guido van Rossum3f5da241990-12-20 15:06:42 +00001746
Guido van Rossum180d7b41994-09-29 09:45:57 +00001747#define BINOP(opname, ropname) \
1748 do { \
1749 if (is_instanceobject(v) || is_instanceobject(w)) \
1750 return instancebinop(v, w, opname, ropname); \
1751 } while (0)
1752
1753
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001755or(v, w)
1756 object *v, *w;
1757{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001758 BINOP("__or__", "__ror__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001759 if (v->ob_type->tp_as_number != NULL) {
1760 object *x;
1761 object * (*f) FPROTO((object *, object *));
1762 if (coerce(&v, &w) != 0)
1763 return NULL;
1764 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1765 x = (*f)(v, w);
1766 DECREF(v);
1767 DECREF(w);
1768 if (f != NULL)
1769 return x;
1770 }
1771 err_setstr(TypeError, "bad operand type(s) for |");
1772 return NULL;
1773}
1774
1775static object *
1776xor(v, w)
1777 object *v, *w;
1778{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001779 BINOP("__xor__", "__rxor__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001780 if (v->ob_type->tp_as_number != NULL) {
1781 object *x;
1782 object * (*f) FPROTO((object *, object *));
1783 if (coerce(&v, &w) != 0)
1784 return NULL;
1785 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1786 x = (*f)(v, w);
1787 DECREF(v);
1788 DECREF(w);
1789 if (f != NULL)
1790 return x;
1791 }
1792 err_setstr(TypeError, "bad operand type(s) for ^");
1793 return NULL;
1794}
1795
1796static object *
1797and(v, w)
1798 object *v, *w;
1799{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001800 BINOP("__and__", "__rand__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001801 if (v->ob_type->tp_as_number != NULL) {
1802 object *x;
1803 object * (*f) FPROTO((object *, object *));
1804 if (coerce(&v, &w) != 0)
1805 return NULL;
1806 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1807 x = (*f)(v, w);
1808 DECREF(v);
1809 DECREF(w);
1810 if (f != NULL)
1811 return x;
1812 }
1813 err_setstr(TypeError, "bad operand type(s) for &");
1814 return NULL;
1815}
1816
1817static object *
1818lshift(v, w)
1819 object *v, *w;
1820{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001821 BINOP("__lshift__", "__rshift__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001822 if (v->ob_type->tp_as_number != NULL) {
1823 object *x;
1824 object * (*f) FPROTO((object *, object *));
1825 if (coerce(&v, &w) != 0)
1826 return NULL;
1827 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1828 x = (*f)(v, w);
1829 DECREF(v);
1830 DECREF(w);
1831 if (f != NULL)
1832 return x;
1833 }
1834 err_setstr(TypeError, "bad operand type(s) for <<");
1835 return NULL;
1836}
1837
1838static object *
1839rshift(v, w)
1840 object *v, *w;
1841{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001842 BINOP("__rshift__", "__rrshift__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001843 if (v->ob_type->tp_as_number != NULL) {
1844 object *x;
1845 object * (*f) FPROTO((object *, object *));
1846 if (coerce(&v, &w) != 0)
1847 return NULL;
1848 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1849 x = (*f)(v, w);
1850 DECREF(v);
1851 DECREF(w);
1852 if (f != NULL)
1853 return x;
1854 }
1855 err_setstr(TypeError, "bad operand type(s) for >>");
1856 return NULL;
1857}
1858
1859static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001860add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861 object *v, *w;
1862{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001863 BINOP("__add__", "__radd__");
Guido van Rossume6eefc21992-08-14 12:06:52 +00001864 if (v->ob_type->tp_as_sequence != NULL)
1865 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1866 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001867 object *x;
1868 if (coerce(&v, &w) != 0)
1869 return NULL;
1870 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1871 DECREF(v);
1872 DECREF(w);
1873 return x;
1874 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001875 err_setstr(TypeError, "bad operand type(s) for +");
1876 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877}
1878
1879static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 object *v, *w;
1882{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001883 BINOP("__sub__", "__rsub__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001884 if (v->ob_type->tp_as_number != NULL) {
1885 object *x;
1886 if (coerce(&v, &w) != 0)
1887 return NULL;
1888 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1889 DECREF(v);
1890 DECREF(w);
1891 return x;
1892 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001893 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 return NULL;
1895}
1896
1897static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001898mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 object *v, *w;
1900{
1901 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001902 tp = v->ob_type;
Guido van Rossum180d7b41994-09-29 09:45:57 +00001903 BINOP("__mul__", "__rmul__");
Guido van Rossume6eefc21992-08-14 12:06:52 +00001904 if (tp->tp_as_number != NULL &&
1905 w->ob_type->tp_as_sequence != NULL &&
1906 !is_instanceobject(v)) {
1907 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 object *tmp = v;
1909 v = w;
1910 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001911 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001913 if (tp->tp_as_number != NULL) {
1914 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001915 if (is_instanceobject(v)) {
1916 /* Instances of user-defined classes get their
1917 other argument uncoerced, so they may
1918 implement sequence*number as well as
1919 number*number. */
1920 INCREF(v);
1921 INCREF(w);
1922 }
1923 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001924 return NULL;
1925 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1926 DECREF(v);
1927 DECREF(w);
1928 return x;
1929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 if (tp->tp_as_sequence != NULL) {
1931 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001932 err_setstr(TypeError,
1933 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 return NULL;
1935 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936 return (*tp->tp_as_sequence->sq_repeat)
1937 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001939 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 return NULL;
1941}
1942
1943static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001944divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 object *v, *w;
1946{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001947 BINOP("__div__", "__rdiv__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001948 if (v->ob_type->tp_as_number != NULL) {
1949 object *x;
1950 if (coerce(&v, &w) != 0)
1951 return NULL;
1952 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1953 DECREF(v);
1954 DECREF(w);
1955 return x;
1956 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001957 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 return NULL;
1959}
1960
1961static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 object *v, *w;
1964{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001965 BINOP("__mod__", "__rmod__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001966 if (v->ob_type->tp_as_number != NULL) {
1967 object *x;
1968 if (coerce(&v, &w) != 0)
1969 return NULL;
1970 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1971 DECREF(v);
1972 DECREF(w);
1973 return x;
1974 }
Guido van Rossume5372401993-03-16 12:15:04 +00001975 if (is_stringobject(v)) {
1976 return formatstring(v, w);
1977 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 return NULL;
1980}
1981
1982static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001983neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 object *v;
1985{
1986 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001987 return (*v->ob_type->tp_as_number->nb_negative)(v);
1988 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 return NULL;
1990}
1991
1992static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 object *v;
1995{
1996 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001997 return (*v->ob_type->tp_as_number->nb_positive)(v);
1998 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 return NULL;
2000}
2001
2002static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002003invert(v)
2004 object *v;
2005{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002006 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002007 if (v->ob_type->tp_as_number != NULL &&
2008 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2009 return (*f)(v);
2010 err_setstr(TypeError, "bad operand type(s) for unary ~");
2011 return NULL;
2012}
2013
2014static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002015not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 object *v;
2017{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002018 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002019 object *w;
2020 if (outcome < 0)
2021 return NULL;
2022 if (outcome == 0)
2023 w = True;
2024 else
2025 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002026 INCREF(w);
2027 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028}
Guido van Rossum234f9421993-06-17 12:35:49 +00002029
2030
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002031/* External interface to call any callable object. The arg may be NULL. */
2032
2033object *
2034call_object(func, arg)
2035 object *func;
2036 object *arg;
2037{
Guido van Rossume59214e1994-08-30 08:01:59 +00002038 binaryfunc call;
2039 object *result;
2040
2041 if (call = func->ob_type->tp_call) {
2042 int size = gettuplesize(arg);
2043 if (arg) {
2044 size = gettuplesize(arg);
2045 if (size == 1)
2046 arg = gettupleitem(arg, 0);
2047 else if (size == 0)
2048 arg = NULL;
2049 }
2050 result = (*call)(func, arg);
2051 }
2052 else if (is_instancemethodobject(func) || is_funcobject(func))
2053 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002054 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002055 result = call_builtin(func, arg);
2056
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002057 if (result == NULL && !err_occurred())
2058 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002059
2060 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002061}
2062
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002064call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068 if (is_methodobject(func)) {
2069 method meth = getmethod(func);
2070 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002071 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2072 int size = gettuplesize(arg);
2073 if (size == 1)
2074 arg = gettupleitem(arg, 0);
2075 else if (size == 0)
2076 arg = NULL;
2077 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002078 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 }
2080 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002081 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002083 if (is_instanceobject(func)) {
2084 object *res, *call = getattr(func,"__call__");
2085 if (call == NULL) {
2086 err_clear();
2087 err_setstr(AttributeError, "no __call__ method defined");
2088 return NULL;
2089 }
2090 res = call_object(call, arg);
2091 DECREF(call);
2092 return res;
2093 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 return NULL;
2096}
2097
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103 object *newarg = NULL;
2104 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002105 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002106 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002107 object *argdefs;
2108 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109
Guido van Rossume8122f11991-05-05 20:03:07 +00002110 if (is_instancemethodobject(func)) {
2111 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002112 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002113 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002114 if (self == NULL) {
2115 /* Unbound methods must be called with an instance of
2116 the class (or a derived class) as first argument */
2117 if (arg != NULL && is_tupleobject(arg) &&
2118 gettuplesize(arg) >= 1) {
2119 self = gettupleitem(arg, 0);
2120 if (self != NULL &&
2121 is_instanceobject(self) &&
2122 issubclass((object *)
2123 (((instanceobject *)self)->in_class),
2124 class))
2125 /* self = self */ ;
2126 else
2127 self = NULL;
2128 }
2129 if (self == NULL) {
2130 err_setstr(TypeError,
2131 "unbound method must be called with class instance argument");
2132 return NULL;
2133 }
2134 }
2135 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002136 if (arg == NULL)
2137 argcount = 0;
2138 else if (is_tupleobject(arg))
2139 argcount = gettuplesize(arg);
2140 else
2141 argcount = 1;
2142 newarg = newtupleobject(argcount + 1);
2143 if (newarg == NULL)
2144 return NULL;
2145 INCREF(self);
2146 settupleitem(newarg, 0, self);
2147 if (arg != NULL && !is_tupleobject(arg)) {
2148 INCREF(arg);
2149 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002150 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002151 else {
2152 int i;
2153 object *v;
2154 for (i = 0; i < argcount; i++) {
2155 v = gettupleitem(arg, i);
2156 XINCREF(v);
2157 settupleitem(newarg, i+1, v);
2158 }
2159 }
2160 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 }
2162 }
2163 else {
2164 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002165 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 return NULL;
2167 }
2168 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002169
2170 argdefs = getfuncargstuff(func, &argcount);
2171 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2172 int actualcount, j;
2173 /* Process default arguments */
2174 if (argcount & 0x4000)
2175 argcount ^= 0x4000;
2176 actualcount = gettuplesize(arg);
2177 j = gettuplesize(argdefs) - (argcount - actualcount);
2178 if (actualcount < argcount && j >= 0) {
2179 int i;
2180 object *v;
2181 if (newarg == NULL)
2182 INCREF(arg);
2183 newarg = newtupleobject(argcount);
2184 if (newarg == NULL) {
2185 DECREF(arg);
2186 return NULL;
2187 }
2188 for (i = 0; i < actualcount; i++) {
2189 v = gettupleitem(arg, i);
2190 XINCREF(v);
2191 settupleitem(newarg, i, v);
2192 }
2193 for (; i < argcount; i++, j++) {
2194 v = gettupleitem(argdefs, j);
2195 XINCREF(v);
2196 settupleitem(newarg, i, v);
2197 }
2198 DECREF(arg);
2199 arg = newarg;
2200 }
2201 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 co = getfunccode(func);
2204 if (co == NULL) {
2205 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 return NULL;
2207 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002208 if (!is_codeobject(co))
2209 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002210 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002212 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 return NULL;
2214 }
2215
Guido van Rossum3f5da241990-12-20 15:06:42 +00002216 newglobals = getfuncglobals(func);
2217 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218
Guido van Rossum81daa321993-05-20 14:24:46 +00002219 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220
Guido van Rossum3f5da241990-12-20 15:06:42 +00002221 DECREF(newlocals);
2222 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223
Guido van Rossum3f5da241990-12-20 15:06:42 +00002224 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225
2226 return v;
2227}
2228
2229static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002230apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 object *v, *w;
2232{
2233 typeobject *tp = v->ob_type;
2234 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002235 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 return NULL;
2237 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002238 if (tp->tp_as_mapping != NULL) {
2239 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2240 }
2241 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 int i;
2243 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 return NULL;
2246 }
2247 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002248 if (i < 0) {
2249 int len = (*tp->tp_as_sequence->sq_length)(v);
2250 if (len < 0)
2251 return NULL;
2252 i += len;
2253 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002254 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256}
2257
2258static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002259loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 object *v, *w;
2261{
2262 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002263 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002265 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 return NULL;
2267 }
2268 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002269 v = (*sq->sq_item)(v, i);
2270 if (v)
2271 return v;
2272 if (err_occurred() == IndexError)
2273 err_clear();
2274 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275}
2276
2277static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002278slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 object *v;
2280 int isize;
2281 int *pi;
2282{
2283 if (v != NULL) {
2284 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002285 err_setstr(TypeError, "slice index must be int");
2286 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 }
2288 *pi = getintvalue(v);
2289 if (*pi < 0)
2290 *pi += isize;
2291 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293}
2294
2295static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002296apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 object *u, *v, *w;
2298{
2299 typeobject *tp = u->ob_type;
2300 int ilow, ihigh, isize;
2301 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002302 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 return NULL;
2304 }
2305 ilow = 0;
2306 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002307 if (isize < 0)
2308 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002311 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315
2316static int
2317assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 object *w;
2319 object *key;
2320 object *v;
2321{
2322 typeobject *tp = w->ob_type;
2323 sequence_methods *sq;
2324 mapping_methods *mp;
2325 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002326 if ((mp = tp->tp_as_mapping) != NULL &&
2327 (func = mp->mp_ass_subscript) != NULL) {
2328 return (*func)(w, key, v);
2329 }
2330 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 (func = sq->sq_ass_item) != NULL) {
2332 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002334 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002337 else {
2338 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002339 if (i < 0) {
2340 int len = (*sq->sq_length)(w);
2341 if (len < 0)
2342 return -1;
2343 i += len;
2344 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002345 return (*func)(w, i, v);
2346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 err_setstr(TypeError,
2350 "can't assign to this subscripted object");
2351 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353}
2354
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355static int
2356assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 object *u, *v, *w, *x;
2358{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002361 if (sq == NULL) {
2362 err_setstr(TypeError, "assign to slice of non-sequence");
2363 return -1;
2364 }
2365 if (sq == NULL || sq->sq_ass_slice == NULL) {
2366 err_setstr(TypeError, "unassignable slice");
2367 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 }
2369 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002371 if (isize < 0)
2372 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002373 if (slice_index(v, isize, &ilow) != 0)
2374 return -1;
2375 if (slice_index(w, isize, &ihigh) != 0)
2376 return -1;
2377 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378}
2379
2380static int
2381cmp_exception(err, v)
2382 object *err, *v;
2383{
2384 if (is_tupleobject(v)) {
2385 int i, n;
2386 n = gettuplesize(v);
2387 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002388 /* Test recursively */
2389 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 return 1;
2391 }
2392 return 0;
2393 }
2394 return err == v;
2395}
2396
Guido van Rossum3f5da241990-12-20 15:06:42 +00002397static int
2398cmp_member(v, w)
2399 object *v, *w;
2400{
Guido van Rossume59214e1994-08-30 08:01:59 +00002401 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002402 object *x;
2403 sequence_methods *sq;
2404 /* Special case for char in string */
2405 if (is_stringobject(w)) {
2406 register char *s, *end;
2407 register char c;
2408 if (!is_stringobject(v) || getstringsize(v) != 1) {
2409 err_setstr(TypeError,
2410 "string member test needs char left operand");
2411 return -1;
2412 }
2413 c = getstringvalue(v)[0];
2414 s = getstringvalue(w);
2415 end = s + getstringsize(w);
2416 while (s < end) {
2417 if (c == *s++)
2418 return 1;
2419 }
2420 return 0;
2421 }
2422 sq = w->ob_type->tp_as_sequence;
2423 if (sq == NULL) {
2424 err_setstr(TypeError,
2425 "'in' or 'not in' needs sequence right argument");
2426 return -1;
2427 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002428 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002429 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002430 if (x == NULL) {
2431 if (err_occurred() == IndexError) {
2432 err_clear();
2433 break;
2434 }
2435 return -1;
2436 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 cmp = cmpobject(v, x);
2438 XDECREF(x);
2439 if (cmp == 0)
2440 return 1;
2441 }
2442 return 0;
2443}
2444
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002446cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002447 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 register object *v;
2449 register object *w;
2450{
2451 register int cmp;
2452 register int res = 0;
2453 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002454 case IS:
2455 case IS_NOT:
2456 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002457 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002458 res = !res;
2459 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 case IN:
2461 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 res = cmp_member(v, w);
2463 if (res < 0)
2464 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002465 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 break;
2468 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 break;
2471 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 cmp = cmpobject(v, w);
2473 switch (op) {
2474 case LT: res = cmp < 0; break;
2475 case LE: res = cmp <= 0; break;
2476 case EQ: res = cmp == 0; break;
2477 case NE: res = cmp != 0; break;
2478 case GT: res = cmp > 0; break;
2479 case GE: res = cmp >= 0; break;
2480 /* XXX no default? (res is initialized to 0 though) */
2481 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 }
2483 v = res ? True : False;
2484 INCREF(v);
2485 return v;
2486}
2487
Guido van Rossum3f5da241990-12-20 15:06:42 +00002488static int
2489import_from(locals, v, name)
2490 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002491 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002492 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002493{
2494 object *w, *x;
2495 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002496 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002497 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002498 object *name, *value;
2499 pos = 0;
2500 while (mappinggetnext(w, &pos, &name, &value)) {
2501 if (!is_stringobject(name) ||
2502 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002503 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002504 if (is_accessobject(value)) {
2505 value = getaccessvalue(value, (object *)NULL);
2506 if (value == NULL) {
2507 err_clear();
2508 continue;
2509 }
2510 }
2511 else
2512 INCREF(value);
2513 err = dict2insert(locals, name, value);
2514 DECREF(value);
2515 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002517 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002518 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002519 }
2520 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002521 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002522 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002523 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002524 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002525 getstringvalue(name));
2526 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 return -1;
2528 }
2529 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002530 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002531 }
2532}
2533
2534static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002535build_class(methods, bases, name)
2536 object *methods; /* dictionary */
2537 object *bases; /* tuple containing classes */
2538 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002539{
Guido van Rossum25831651993-05-19 14:50:45 +00002540 int i;
2541 if (!is_tupleobject(bases)) {
2542 err_setstr(SystemError, "build_class with non-tuple bases");
2543 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002544 }
Guido van Rossum25831651993-05-19 14:50:45 +00002545 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002546 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002547 return NULL;
2548 }
Guido van Rossum25831651993-05-19 14:50:45 +00002549 if (!is_stringobject(name)) {
2550 err_setstr(SystemError, "build_class witn non-string name");
2551 return NULL;
2552 }
2553 for (i = gettuplesize(bases); --i >= 0; ) {
2554 object *base = gettupleitem(bases, i);
2555 if (!is_classobject(base)) {
2556 err_setstr(TypeError,
2557 "base is not a class object");
2558 return NULL;
2559 }
2560 }
2561 return newclassobject(bases, methods, name);
2562}
2563
2564static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002565access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002566 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002567 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002568 frameobject *f;
2569{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002570 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002571 object *value, *ac;
2572 typeobject *type;
2573 int fastind, ret;
2574 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002575 if (f->f_localmap == NULL)
2576 value = dict2lookup(f->f_locals, name);
2577 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002578 object *map = f->f_localmap;
2579 value = NULL;
2580 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2581 object *fname = gettupleitem(map, fastind);
2582 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002583 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002584 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002585 }
2586 }
2587 }
2588 if (value && is_accessobject(value)) {
2589 err_setstr(AccessError, "can't override access");
2590 return -1;
2591 }
2592 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002593 if (value != NULL && value != None)
2594 type = value->ob_type;
2595 else
2596 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002597 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002598 if (ac == NULL)
2599 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002600 if (fastind >= 0)
2601 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002602 else {
2603 ret = dict2insert(f->f_locals, name, ac);
2604 DECREF(ac);
2605 }
2606 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002607}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002608
2609static int
2610exec_statement(prog, globals, locals)
2611 object *prog;
2612 object *globals;
2613 object *locals;
2614{
2615 char *s;
2616 int n;
2617
2618 if (is_tupleobject(prog) && globals == None && locals == None &&
2619 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2620 /* Backward compatibility hack */
2621 globals = gettupleitem(prog, 1);
2622 if (n == 3)
2623 locals = gettupleitem(prog, 2);
2624 prog = gettupleitem(prog, 0);
2625 }
2626 if (globals == None) {
2627 globals = getglobals();
2628 if (locals == None)
2629 locals = getlocals();
2630 }
2631 else if (locals == None)
2632 locals = globals;
2633 if (!is_stringobject(prog) &&
2634 !is_codeobject(prog) &&
2635 !is_fileobject(prog)) {
2636 err_setstr(TypeError,
2637 "exec 1st arg must be string, code or file object");
2638 return -1;
2639 }
2640 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2641 err_setstr(TypeError,
2642 "exec 2nd/3rd args must be dict or None");
2643 return -1;
2644 }
2645 if (is_codeobject(prog)) {
2646 if (eval_code((codeobject *) prog, globals, locals,
2647 (object *)NULL, (object *)NULL) == NULL)
2648 return -1;
2649 return 0;
2650 }
2651 if (is_fileobject(prog)) {
2652 FILE *fp = getfilefile(prog);
2653 char *name = getstringvalue(getfilename(prog));
2654 if (run_file(fp, name, file_input, globals, locals) == NULL)
2655 return -1;
2656 return 0;
2657 }
2658 s = getstringvalue(prog);
2659 if (strlen(s) != getstringsize(prog)) {
2660 err_setstr(ValueError, "embedded '\\0' in exec string");
2661 return -1;
2662 }
2663 if (run_string(s, file_input, globals, locals) == NULL)
2664 return -1;
2665 return 0;
2666}