blob: 5fa5dbba20a82d04e78742c6401dfc14a53bf359 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
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 Rossum1ae940a1995-01-02 19:04:15 +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) */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050/* #define DEBUG 1 */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000051
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 Rossum25831651993-05-19 14:50:45 +00001257 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001258 XDECREF(w);
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 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001274 DECREF(x);
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:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326 w = GETNAMEV(oparg);
1327 x = getbuiltins("__import__");
1328 if (x == NULL) {
1329 err_setstr(ImportError,
1330 "__import__ not found");
1331 break;
1332 }
1333 w = mkvalue("(O)", w);
1334 if (w == NULL) {
1335 x = NULL;
1336 break;
1337 }
1338 x = call_object(x, w);
1339 DECREF(w);
1340 if (x)
1341 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 break;
1343
1344 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001345 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001347 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001348 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001350
1351 case ACCESS_MODE:
1352 v = POP();
1353 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001354 if (getstringvalue(w)[0] == '*')
1355 defmode = getintvalue(v);
1356 else
1357 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001358 DECREF(v);
1359 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001360
1361 case JUMP_FORWARD:
1362 JUMPBY(oparg);
1363 break;
1364
1365 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001366 err = testbool(TOP());
1367 if (err > 0)
1368 err = 0;
1369 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 JUMPBY(oparg);
1371 break;
1372
1373 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001374 err = testbool(TOP());
1375 if (err > 0) {
1376 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001378 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 break;
1380
1381 case JUMP_ABSOLUTE:
1382 JUMPTO(oparg);
1383 break;
1384
1385 case FOR_LOOP:
1386 /* for v in s: ...
1387 On entry: stack contains s, i.
1388 On exit: stack contains s, i+1, s[i];
1389 but if loop exhausted:
1390 s, i are popped, and we jump */
1391 w = POP(); /* Loop index */
1392 v = POP(); /* Sequence object */
1393 u = loop_subscript(v, w);
1394 if (u != NULL) {
1395 PUSH(v);
1396 x = newintobject(getintvalue(w)+1);
1397 PUSH(x);
1398 DECREF(w);
1399 PUSH(u);
1400 }
1401 else {
1402 DECREF(v);
1403 DECREF(w);
1404 /* A NULL can mean "s exhausted"
1405 but also an error: */
1406 if (err_occurred())
1407 why = WHY_EXCEPTION;
1408 else
1409 JUMPBY(oparg);
1410 }
1411 break;
1412
1413 case SETUP_LOOP:
1414 case SETUP_EXCEPT:
1415 case SETUP_FINALLY:
1416 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1417 STACK_LEVEL());
1418 break;
1419
1420 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001421#ifdef LLTRACE
1422 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001424#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001425 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001426 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001427 /* Trace each line of code reached */
1428 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001429 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001430 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001431 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 break;
1433
1434 default:
1435 fprintf(stderr,
1436 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001437 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 err_setstr(SystemError, "eval_code: unknown opcode");
1439 why = WHY_EXCEPTION;
1440 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001441
1442#ifdef CASE_TOO_BIG
1443 }
1444#endif
1445
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 } /* switch */
1447
1448 on_error:
1449
1450 /* Quickly continue if no error occurred */
1451
1452 if (why == WHY_NOT) {
1453 if (err == 0 && x != NULL)
1454 continue; /* Normal, fast path */
1455 why = WHY_EXCEPTION;
1456 x = None;
1457 err = 0;
1458 }
1459
Guido van Rossum801dcae1992-04-08 11:32:32 +00001460#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 /* Double-check exception status */
1462
1463 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1464 if (!err_occurred()) {
1465 fprintf(stderr, "XXX ghost error\n");
1466 err_setstr(SystemError, "ghost error");
1467 why = WHY_EXCEPTION;
1468 }
1469 }
1470 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001471 if (err_occurred())
1472 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 }
1474#endif
1475
1476 /* Log traceback info if this is a real exception */
1477
1478 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001479 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001481 f->f_lasti -= 2;
1482 tb_here(f);
1483
Guido van Rossume59214e1994-08-30 08:01:59 +00001484 if (f->f_trace)
1485 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001486 if (sys_profile)
1487 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 }
1489
1490 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1491
1492 if (why == WHY_RERAISE)
1493 why = WHY_EXCEPTION;
1494
1495 /* Unwind stacks if a (pseudo) exception occurred */
1496
1497 while (why != WHY_NOT && f->f_iblock > 0) {
1498 block *b = pop_block(f);
1499 while (STACK_LEVEL() > b->b_level) {
1500 v = POP();
1501 XDECREF(v);
1502 }
1503 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1504 why = WHY_NOT;
1505 JUMPTO(b->b_handler);
1506 break;
1507 }
1508 if (b->b_type == SETUP_FINALLY ||
1509 b->b_type == SETUP_EXCEPT &&
1510 why == WHY_EXCEPTION) {
1511 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512 object *exc, *val, *tb;
1513 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 if (val == NULL) {
1515 val = None;
1516 INCREF(val);
1517 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 /* Make the raw exception data
1519 available to the handler,
1520 so a program can emulate the
1521 Python main loop. Don't do
1522 this for 'finally'. */
1523 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001524 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 sysset("exc_value", val);
1526 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001528 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 PUSH(val);
1530 PUSH(exc);
1531 }
1532 else {
1533 if (why == WHY_RETURN)
1534 PUSH(retval);
1535 v = newintobject((long)why);
1536 PUSH(v);
1537 }
1538 why = WHY_NOT;
1539 JUMPTO(b->b_handler);
1540 break;
1541 }
1542 } /* unwind stack */
1543
1544 /* End the loop if we still have an error (or return) */
1545
1546 if (why != WHY_NOT)
1547 break;
1548
1549 } /* main loop */
1550
1551 /* Pop remaining stack entries */
1552
1553 while (!EMPTY()) {
1554 v = POP();
1555 XDECREF(v);
1556 }
1557
Guido van Rossum96a42c81992-01-12 02:29:51 +00001558 if (why != WHY_RETURN)
1559 retval = NULL;
1560
Guido van Rossume59214e1994-08-30 08:01:59 +00001561 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001562 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001563 if (call_trace(&f->f_trace, &f->f_trace, f,
1564 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001565 XDECREF(retval);
1566 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001567 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001568 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001569 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001570 }
1571
1572 if (sys_profile && why == WHY_RETURN) {
1573 if (call_trace(&sys_profile, (object**)0,
1574 f, "return", retval)) {
1575 XDECREF(retval);
1576 retval = NULL;
1577 why = WHY_EXCEPTION;
1578 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001579 }
1580
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 /* Restore previous frame and release the current one */
1582
1583 current_frame = f->f_back;
1584 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001585
1586 if (needmerge)
1587 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588
Guido van Rossum96a42c81992-01-12 02:29:51 +00001589 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001590}
1591
Guido van Rossum96a42c81992-01-12 02:29:51 +00001592#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593static int
1594prtrace(v, str)
1595 object *v;
1596 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001598 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001599 if (printobject(v, stdout, 0) != 0)
1600 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001603#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001605static void
1606call_exc_trace(p_trace, p_newtrace, f)
1607 object **p_trace, **p_newtrace;
1608 frameobject *f;
1609{
1610 object *type, *value, *traceback, *arg;
1611 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001612 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001613 if (value == NULL) {
1614 value = None;
1615 INCREF(value);
1616 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001617 arg = mkvalue("(OOO)", type, value, traceback);
1618 if (arg == NULL) {
1619 err_restore(type, value, traceback);
1620 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001621 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001622 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1623 DECREF(arg);
1624 if (err == 0)
1625 err_restore(type, value, traceback);
1626 else {
1627 XDECREF(type);
1628 XDECREF(value);
1629 XDECREF(traceback);
1630 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001631}
1632
1633static int
1634call_trace(p_trace, p_newtrace, f, msg, arg)
1635 object **p_trace; /* in/out; may not be NULL;
1636 may not point to NULL variable initially */
1637 object **p_newtrace; /* in/out; may be NULL;
1638 may point to NULL variable;
1639 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001640 frameobject *f;
1641 char *msg;
1642 object *arg;
1643{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001644 object *arglist, *what;
1645 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001646 static int tracing = 0;
1647
1648 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001649 /* Don't do recursive traces */
1650 if (p_newtrace) {
1651 XDECREF(*p_newtrace);
1652 *p_newtrace = NULL;
1653 }
1654 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001655 }
1656
1657 arglist = newtupleobject(3);
1658 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001659 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001660 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001661 if (what == NULL)
1662 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001663 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001664 settupleitem(arglist, 0, (object *)f);
1665 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001666 if (arg == NULL)
1667 arg = None;
1668 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001669 settupleitem(arglist, 2, arg);
1670 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001671 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001672 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001673 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001674 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001675 cleanup:
1676 XDECREF(arglist);
1677 if (res == NULL) {
1678 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001679 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001680 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001681 *p_trace = NULL;
1682 if (p_newtrace) {
1683 XDECREF(*p_newtrace);
1684 *p_newtrace = NULL;
1685 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001686 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001687 }
1688 else {
1689 if (p_newtrace) {
1690 XDECREF(*p_newtrace);
1691 if (res == None)
1692 *p_newtrace = NULL;
1693 else {
1694 INCREF(res);
1695 *p_newtrace = res;
1696 }
1697 }
1698 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001699 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001700 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001701}
1702
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001704getlocals()
1705{
1706 if (current_frame == NULL)
1707 return NULL;
1708 fast_2_locals(current_frame);
1709 return current_frame->f_locals;
1710}
1711
1712object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001713getglobals()
1714{
1715 if (current_frame == NULL)
1716 return NULL;
1717 else
1718 return current_frame->f_globals;
1719}
1720
Guido van Rossum81daa321993-05-20 14:24:46 +00001721object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001722getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001723{
1724 if (current_frame == NULL)
1725 return NULL;
1726 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001727 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001728}
1729
Guido van Rossume59214e1994-08-30 08:01:59 +00001730object *
1731getframe()
1732{
1733 return (object *)current_frame;
1734}
1735
Guido van Rossum3f5da241990-12-20 15:06:42 +00001736void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737flushline()
1738{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001739 object *f = sysget("stdout");
1740 if (softspace(f, 0))
1741 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742}
1743
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744
Guido van Rossum180d7b41994-09-29 09:45:57 +00001745#define BINOP(opname, ropname) \
1746 do { \
1747 if (is_instanceobject(v) || is_instanceobject(w)) \
1748 return instancebinop(v, w, opname, ropname); \
1749 } while (0)
1750
1751
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001752static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001753or(v, w)
1754 object *v, *w;
1755{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001756 BINOP("__or__", "__ror__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001757 if (v->ob_type->tp_as_number != NULL) {
1758 object *x;
1759 object * (*f) FPROTO((object *, object *));
1760 if (coerce(&v, &w) != 0)
1761 return NULL;
1762 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1763 x = (*f)(v, w);
1764 DECREF(v);
1765 DECREF(w);
1766 if (f != NULL)
1767 return x;
1768 }
1769 err_setstr(TypeError, "bad operand type(s) for |");
1770 return NULL;
1771}
1772
1773static object *
1774xor(v, w)
1775 object *v, *w;
1776{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001777 BINOP("__xor__", "__rxor__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001778 if (v->ob_type->tp_as_number != NULL) {
1779 object *x;
1780 object * (*f) FPROTO((object *, object *));
1781 if (coerce(&v, &w) != 0)
1782 return NULL;
1783 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1784 x = (*f)(v, w);
1785 DECREF(v);
1786 DECREF(w);
1787 if (f != NULL)
1788 return x;
1789 }
1790 err_setstr(TypeError, "bad operand type(s) for ^");
1791 return NULL;
1792}
1793
1794static object *
1795and(v, w)
1796 object *v, *w;
1797{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001798 BINOP("__and__", "__rand__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001799 if (v->ob_type->tp_as_number != NULL) {
1800 object *x;
1801 object * (*f) FPROTO((object *, object *));
1802 if (coerce(&v, &w) != 0)
1803 return NULL;
1804 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1805 x = (*f)(v, w);
1806 DECREF(v);
1807 DECREF(w);
1808 if (f != NULL)
1809 return x;
1810 }
1811 err_setstr(TypeError, "bad operand type(s) for &");
1812 return NULL;
1813}
1814
1815static object *
1816lshift(v, w)
1817 object *v, *w;
1818{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001819 BINOP("__lshift__", "__rlshift__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001820 if (v->ob_type->tp_as_number != NULL) {
1821 object *x;
1822 object * (*f) FPROTO((object *, object *));
1823 if (coerce(&v, &w) != 0)
1824 return NULL;
1825 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1826 x = (*f)(v, w);
1827 DECREF(v);
1828 DECREF(w);
1829 if (f != NULL)
1830 return x;
1831 }
1832 err_setstr(TypeError, "bad operand type(s) for <<");
1833 return NULL;
1834}
1835
1836static object *
1837rshift(v, w)
1838 object *v, *w;
1839{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001840 BINOP("__rshift__", "__rrshift__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001841 if (v->ob_type->tp_as_number != NULL) {
1842 object *x;
1843 object * (*f) FPROTO((object *, object *));
1844 if (coerce(&v, &w) != 0)
1845 return NULL;
1846 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1847 x = (*f)(v, w);
1848 DECREF(v);
1849 DECREF(w);
1850 if (f != NULL)
1851 return x;
1852 }
1853 err_setstr(TypeError, "bad operand type(s) for >>");
1854 return NULL;
1855}
1856
1857static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001858add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 object *v, *w;
1860{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001861 BINOP("__add__", "__radd__");
Guido van Rossume6eefc21992-08-14 12:06:52 +00001862 if (v->ob_type->tp_as_sequence != NULL)
1863 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1864 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001865 object *x;
1866 if (coerce(&v, &w) != 0)
1867 return NULL;
1868 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1869 DECREF(v);
1870 DECREF(w);
1871 return x;
1872 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001873 err_setstr(TypeError, "bad operand type(s) for +");
1874 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875}
1876
1877static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001878sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 object *v, *w;
1880{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001881 BINOP("__sub__", "__rsub__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001882 if (v->ob_type->tp_as_number != NULL) {
1883 object *x;
1884 if (coerce(&v, &w) != 0)
1885 return NULL;
1886 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1887 DECREF(v);
1888 DECREF(w);
1889 return x;
1890 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001891 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 return NULL;
1893}
1894
1895static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001896mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 object *v, *w;
1898{
1899 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001900 tp = v->ob_type;
Guido van Rossum180d7b41994-09-29 09:45:57 +00001901 BINOP("__mul__", "__rmul__");
Guido van Rossume6eefc21992-08-14 12:06:52 +00001902 if (tp->tp_as_number != NULL &&
1903 w->ob_type->tp_as_sequence != NULL &&
1904 !is_instanceobject(v)) {
1905 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906 object *tmp = v;
1907 v = w;
1908 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001909 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001911 if (tp->tp_as_number != NULL) {
1912 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001913 if (is_instanceobject(v)) {
1914 /* Instances of user-defined classes get their
1915 other argument uncoerced, so they may
1916 implement sequence*number as well as
1917 number*number. */
1918 INCREF(v);
1919 INCREF(w);
1920 }
1921 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001922 return NULL;
1923 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1924 DECREF(v);
1925 DECREF(w);
1926 return x;
1927 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 if (tp->tp_as_sequence != NULL) {
1929 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930 err_setstr(TypeError,
1931 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 return NULL;
1933 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001934 return (*tp->tp_as_sequence->sq_repeat)
1935 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001937 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 return NULL;
1939}
1940
1941static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001942divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 object *v, *w;
1944{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001945 BINOP("__div__", "__rdiv__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001946 if (v->ob_type->tp_as_number != NULL) {
1947 object *x;
1948 if (coerce(&v, &w) != 0)
1949 return NULL;
1950 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1951 DECREF(v);
1952 DECREF(w);
1953 return x;
1954 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 return NULL;
1957}
1958
1959static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001960rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 object *v, *w;
1962{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963 if (is_stringobject(v)) {
1964 return formatstring(v, w);
1965 }
Guido van Rossum180d7b41994-09-29 09:45:57 +00001966 BINOP("__mod__", "__rmod__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001967 if (v->ob_type->tp_as_number != NULL) {
1968 object *x;
1969 if (coerce(&v, &w) != 0)
1970 return NULL;
1971 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1972 DECREF(v);
1973 DECREF(w);
1974 return x;
1975 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001976 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 return NULL;
1978}
1979
1980static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001981neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 object *v;
1983{
1984 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985 return (*v->ob_type->tp_as_number->nb_negative)(v);
1986 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 return NULL;
1988}
1989
1990static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001991pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992 object *v;
1993{
1994 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001995 return (*v->ob_type->tp_as_number->nb_positive)(v);
1996 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 return NULL;
1998}
1999
2000static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002001invert(v)
2002 object *v;
2003{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002004 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002005 if (v->ob_type->tp_as_number != NULL &&
2006 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2007 return (*f)(v);
2008 err_setstr(TypeError, "bad operand type(s) for unary ~");
2009 return NULL;
2010}
2011
2012static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 object *v;
2015{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002017 object *w;
2018 if (outcome < 0)
2019 return NULL;
2020 if (outcome == 0)
2021 w = True;
2022 else
2023 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002024 INCREF(w);
2025 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026}
Guido van Rossum234f9421993-06-17 12:35:49 +00002027
2028
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002029/* External interface to call any callable object. The arg may be NULL. */
2030
2031object *
2032call_object(func, arg)
2033 object *func;
2034 object *arg;
2035{
Guido van Rossume59214e1994-08-30 08:01:59 +00002036 binaryfunc call;
2037 object *result;
2038
2039 if (call = func->ob_type->tp_call) {
2040 int size = gettuplesize(arg);
2041 if (arg) {
2042 size = gettuplesize(arg);
2043 if (size == 1)
2044 arg = gettupleitem(arg, 0);
2045 else if (size == 0)
2046 arg = NULL;
2047 }
2048 result = (*call)(func, arg);
2049 }
2050 else if (is_instancemethodobject(func) || is_funcobject(func))
2051 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002052 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002053 result = call_builtin(func, arg);
2054
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002055 if (result == NULL && !err_occurred())
2056 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002057
2058 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002059}
2060
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002062call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002064 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 if (is_methodobject(func)) {
2067 method meth = getmethod(func);
2068 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002069 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2070 int size = gettuplesize(arg);
2071 if (size == 1)
2072 arg = gettupleitem(arg, 0);
2073 else if (size == 0)
2074 arg = NULL;
2075 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077 }
2078 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002079 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002081 if (is_instanceobject(func)) {
2082 object *res, *call = getattr(func,"__call__");
2083 if (call == NULL) {
2084 err_clear();
2085 err_setstr(AttributeError, "no __call__ method defined");
2086 return NULL;
2087 }
2088 res = call_object(call, arg);
2089 DECREF(call);
2090 return res;
2091 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 return NULL;
2094}
2095
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 object *newarg = NULL;
2102 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002103 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002104 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002105 object *argdefs;
2106 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107
Guido van Rossume8122f11991-05-05 20:03:07 +00002108 if (is_instancemethodobject(func)) {
2109 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002110 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002111 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002112 if (self == NULL) {
2113 /* Unbound methods must be called with an instance of
2114 the class (or a derived class) as first argument */
2115 if (arg != NULL && is_tupleobject(arg) &&
2116 gettuplesize(arg) >= 1) {
2117 self = gettupleitem(arg, 0);
2118 if (self != NULL &&
2119 is_instanceobject(self) &&
2120 issubclass((object *)
2121 (((instanceobject *)self)->in_class),
2122 class))
2123 /* self = self */ ;
2124 else
2125 self = NULL;
2126 }
2127 if (self == NULL) {
2128 err_setstr(TypeError,
2129 "unbound method must be called with class instance argument");
2130 return NULL;
2131 }
2132 }
2133 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002134 if (arg == NULL)
2135 argcount = 0;
2136 else if (is_tupleobject(arg))
2137 argcount = gettuplesize(arg);
2138 else
2139 argcount = 1;
2140 newarg = newtupleobject(argcount + 1);
2141 if (newarg == NULL)
2142 return NULL;
2143 INCREF(self);
2144 settupleitem(newarg, 0, self);
2145 if (arg != NULL && !is_tupleobject(arg)) {
2146 INCREF(arg);
2147 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002148 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002149 else {
2150 int i;
2151 object *v;
2152 for (i = 0; i < argcount; i++) {
2153 v = gettupleitem(arg, i);
2154 XINCREF(v);
2155 settupleitem(newarg, i+1, v);
2156 }
2157 }
2158 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 }
2160 }
2161 else {
2162 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002163 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 return NULL;
2165 }
2166 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002167
2168 argdefs = getfuncargstuff(func, &argcount);
2169 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2170 int actualcount, j;
2171 /* Process default arguments */
2172 if (argcount & 0x4000)
2173 argcount ^= 0x4000;
2174 actualcount = gettuplesize(arg);
2175 j = gettuplesize(argdefs) - (argcount - actualcount);
2176 if (actualcount < argcount && j >= 0) {
2177 int i;
2178 object *v;
2179 if (newarg == NULL)
2180 INCREF(arg);
2181 newarg = newtupleobject(argcount);
2182 if (newarg == NULL) {
2183 DECREF(arg);
2184 return NULL;
2185 }
2186 for (i = 0; i < actualcount; i++) {
2187 v = gettupleitem(arg, i);
2188 XINCREF(v);
2189 settupleitem(newarg, i, v);
2190 }
2191 for (; i < argcount; i++, j++) {
2192 v = gettupleitem(argdefs, j);
2193 XINCREF(v);
2194 settupleitem(newarg, i, v);
2195 }
2196 DECREF(arg);
2197 arg = newarg;
2198 }
2199 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200
Guido van Rossum3f5da241990-12-20 15:06:42 +00002201 co = getfunccode(func);
2202 if (co == NULL) {
2203 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 return NULL;
2205 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002206 if (!is_codeobject(co))
2207 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002208 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002210 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 return NULL;
2212 }
2213
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 newglobals = getfuncglobals(func);
2215 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002216
Guido van Rossum81daa321993-05-20 14:24:46 +00002217 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218
Guido van Rossum3f5da241990-12-20 15:06:42 +00002219 DECREF(newlocals);
2220 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221
Guido van Rossum3f5da241990-12-20 15:06:42 +00002222 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223
2224 return v;
2225}
2226
2227static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002228apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229 object *v, *w;
2230{
2231 typeobject *tp = v->ob_type;
2232 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002233 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 return NULL;
2235 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002236 if (tp->tp_as_mapping != NULL) {
2237 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2238 }
2239 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 int i;
2241 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 return NULL;
2244 }
2245 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002246 if (i < 0) {
2247 int len = (*tp->tp_as_sequence->sq_length)(v);
2248 if (len < 0)
2249 return NULL;
2250 i += len;
2251 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254}
2255
2256static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 object *v, *w;
2259{
2260 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002261 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002263 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 return NULL;
2265 }
2266 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002267 v = (*sq->sq_item)(v, i);
2268 if (v)
2269 return v;
2270 if (err_occurred() == IndexError)
2271 err_clear();
2272 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273}
2274
2275static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002276slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 object *v;
2278 int isize;
2279 int *pi;
2280{
2281 if (v != NULL) {
2282 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002283 err_setstr(TypeError, "slice index must be int");
2284 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 }
2286 *pi = getintvalue(v);
2287 if (*pi < 0)
2288 *pi += isize;
2289 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291}
2292
2293static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 object *u, *v, *w;
2296{
2297 typeobject *tp = u->ob_type;
2298 int ilow, ihigh, isize;
2299 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002300 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 return NULL;
2302 }
2303 ilow = 0;
2304 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002305 if (isize < 0)
2306 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002307 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002311 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313
2314static int
2315assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 object *w;
2317 object *key;
2318 object *v;
2319{
2320 typeobject *tp = w->ob_type;
2321 sequence_methods *sq;
2322 mapping_methods *mp;
2323 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002324 if ((mp = tp->tp_as_mapping) != NULL &&
2325 (func = mp->mp_ass_subscript) != NULL) {
2326 return (*func)(w, key, v);
2327 }
2328 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 (func = sq->sq_ass_item) != NULL) {
2330 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002332 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002335 else {
2336 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002337 if (i < 0) {
2338 int len = (*sq->sq_length)(w);
2339 if (len < 0)
2340 return -1;
2341 i += len;
2342 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002343 return (*func)(w, i, v);
2344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 err_setstr(TypeError,
2348 "can't assign to this subscripted object");
2349 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351}
2352
Guido van Rossum3f5da241990-12-20 15:06:42 +00002353static int
2354assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 object *u, *v, *w, *x;
2356{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 if (sq == NULL) {
2360 err_setstr(TypeError, "assign to slice of non-sequence");
2361 return -1;
2362 }
2363 if (sq == NULL || sq->sq_ass_slice == NULL) {
2364 err_setstr(TypeError, "unassignable slice");
2365 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 }
2367 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002369 if (isize < 0)
2370 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 if (slice_index(v, isize, &ilow) != 0)
2372 return -1;
2373 if (slice_index(w, isize, &ihigh) != 0)
2374 return -1;
2375 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376}
2377
2378static int
2379cmp_exception(err, v)
2380 object *err, *v;
2381{
2382 if (is_tupleobject(v)) {
2383 int i, n;
2384 n = gettuplesize(v);
2385 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002386 /* Test recursively */
2387 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 return 1;
2389 }
2390 return 0;
2391 }
2392 return err == v;
2393}
2394
Guido van Rossum3f5da241990-12-20 15:06:42 +00002395static int
2396cmp_member(v, w)
2397 object *v, *w;
2398{
Guido van Rossume59214e1994-08-30 08:01:59 +00002399 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002400 object *x;
2401 sequence_methods *sq;
2402 /* Special case for char in string */
2403 if (is_stringobject(w)) {
2404 register char *s, *end;
2405 register char c;
2406 if (!is_stringobject(v) || getstringsize(v) != 1) {
2407 err_setstr(TypeError,
2408 "string member test needs char left operand");
2409 return -1;
2410 }
2411 c = getstringvalue(v)[0];
2412 s = getstringvalue(w);
2413 end = s + getstringsize(w);
2414 while (s < end) {
2415 if (c == *s++)
2416 return 1;
2417 }
2418 return 0;
2419 }
2420 sq = w->ob_type->tp_as_sequence;
2421 if (sq == NULL) {
2422 err_setstr(TypeError,
2423 "'in' or 'not in' needs sequence right argument");
2424 return -1;
2425 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002426 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002427 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002428 if (x == NULL) {
2429 if (err_occurred() == IndexError) {
2430 err_clear();
2431 break;
2432 }
2433 return -1;
2434 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002435 cmp = cmpobject(v, x);
2436 XDECREF(x);
2437 if (cmp == 0)
2438 return 1;
2439 }
2440 return 0;
2441}
2442
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002444cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002445 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 register object *v;
2447 register object *w;
2448{
2449 register int cmp;
2450 register int res = 0;
2451 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002452 case IS:
2453 case IS_NOT:
2454 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002455 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002456 res = !res;
2457 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 case IN:
2459 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460 res = cmp_member(v, w);
2461 if (res < 0)
2462 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002463 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002464 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 break;
2466 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002467 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 break;
2469 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002470 cmp = cmpobject(v, w);
2471 switch (op) {
2472 case LT: res = cmp < 0; break;
2473 case LE: res = cmp <= 0; break;
2474 case EQ: res = cmp == 0; break;
2475 case NE: res = cmp != 0; break;
2476 case GT: res = cmp > 0; break;
2477 case GE: res = cmp >= 0; break;
2478 /* XXX no default? (res is initialized to 0 though) */
2479 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480 }
2481 v = res ? True : False;
2482 INCREF(v);
2483 return v;
2484}
2485
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486static int
2487import_from(locals, v, name)
2488 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002489 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002490 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002491{
2492 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002493 if (!is_moduleobject(v)) {
2494 err_setstr(TypeError, "import-from require module object");
2495 return -1;
2496 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002497 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002498 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002499 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002500 object *name, *value;
2501 pos = 0;
2502 while (mappinggetnext(w, &pos, &name, &value)) {
2503 if (!is_stringobject(name) ||
2504 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002505 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002506 if (is_accessobject(value)) {
2507 value = getaccessvalue(value, (object *)NULL);
2508 if (value == NULL) {
2509 err_clear();
2510 continue;
2511 }
2512 }
2513 else
2514 INCREF(value);
2515 err = dict2insert(locals, name, value);
2516 DECREF(value);
2517 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002518 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002519 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002520 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002521 }
2522 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002523 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002525 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002526 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002527 getstringvalue(name));
2528 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529 return -1;
2530 }
2531 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002532 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002533 }
2534}
2535
2536static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002537build_class(methods, bases, name)
2538 object *methods; /* dictionary */
2539 object *bases; /* tuple containing classes */
2540 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002541{
Guido van Rossum25831651993-05-19 14:50:45 +00002542 int i;
2543 if (!is_tupleobject(bases)) {
2544 err_setstr(SystemError, "build_class with non-tuple bases");
2545 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002546 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002547 if (gettuplesize(bases) > 0) {
2548 object *base;
2549 base = gettupleitem(bases, 0);
2550 /* Call the base's *type*, if it is callable.
2551 This code is a hook for Donald Beaudry's type extensions.
2552 In unexended Python it will never be triggered since its
2553 types are not callable. */
2554 if (base->ob_type->ob_type->tp_call) {
2555 object *args;
2556 object *class;
2557 args = mkvalue("(OOO)", name, bases, methods);
2558 class = call_object((object *)base->ob_type, args);
2559 DECREF(args);
2560 return class;
2561 }
2562 }
Guido van Rossum25831651993-05-19 14:50:45 +00002563 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002564 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002565 return NULL;
2566 }
Guido van Rossum25831651993-05-19 14:50:45 +00002567 if (!is_stringobject(name)) {
2568 err_setstr(SystemError, "build_class witn non-string name");
2569 return NULL;
2570 }
2571 for (i = gettuplesize(bases); --i >= 0; ) {
2572 object *base = gettupleitem(bases, i);
2573 if (!is_classobject(base)) {
2574 err_setstr(TypeError,
2575 "base is not a class object");
2576 return NULL;
2577 }
2578 }
2579 return newclassobject(bases, methods, name);
2580}
2581
2582static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002583access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002584 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002585 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002586 frameobject *f;
2587{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002588 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002589 object *value, *ac;
2590 typeobject *type;
2591 int fastind, ret;
2592 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002593 if (f->f_localmap == NULL)
2594 value = dict2lookup(f->f_locals, name);
2595 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002596 object *map = f->f_localmap;
2597 value = NULL;
2598 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2599 object *fname = gettupleitem(map, fastind);
2600 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002601 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002602 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002603 }
2604 }
2605 }
2606 if (value && is_accessobject(value)) {
2607 err_setstr(AccessError, "can't override access");
2608 return -1;
2609 }
2610 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002611 if (value != NULL && value != None)
2612 type = value->ob_type;
2613 else
2614 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002615 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002616 if (ac == NULL)
2617 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002618 if (fastind >= 0)
2619 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002620 else {
2621 ret = dict2insert(f->f_locals, name, ac);
2622 DECREF(ac);
2623 }
2624 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002625}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002626
2627static int
2628exec_statement(prog, globals, locals)
2629 object *prog;
2630 object *globals;
2631 object *locals;
2632{
2633 char *s;
2634 int n;
2635
2636 if (is_tupleobject(prog) && globals == None && locals == None &&
2637 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2638 /* Backward compatibility hack */
2639 globals = gettupleitem(prog, 1);
2640 if (n == 3)
2641 locals = gettupleitem(prog, 2);
2642 prog = gettupleitem(prog, 0);
2643 }
2644 if (globals == None) {
2645 globals = getglobals();
2646 if (locals == None)
2647 locals = getlocals();
2648 }
2649 else if (locals == None)
2650 locals = globals;
2651 if (!is_stringobject(prog) &&
2652 !is_codeobject(prog) &&
2653 !is_fileobject(prog)) {
2654 err_setstr(TypeError,
2655 "exec 1st arg must be string, code or file object");
2656 return -1;
2657 }
2658 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2659 err_setstr(TypeError,
2660 "exec 2nd/3rd args must be dict or None");
2661 return -1;
2662 }
2663 if (is_codeobject(prog)) {
2664 if (eval_code((codeobject *) prog, globals, locals,
2665 (object *)NULL, (object *)NULL) == NULL)
2666 return -1;
2667 return 0;
2668 }
2669 if (is_fileobject(prog)) {
2670 FILE *fp = getfilefile(prog);
2671 char *name = getstringvalue(getfilename(prog));
2672 if (run_file(fp, name, file_input, globals, locals) == NULL)
2673 return -1;
2674 return 0;
2675 }
2676 s = getstringvalue(prog);
2677 if (strlen(s) != getstringsize(prog)) {
2678 err_setstr(ValueError, "embedded '\\0' in exec string");
2679 return -1;
2680 }
2681 if (run_string(s, file_input, globals, locals) == NULL)
2682 return -1;
2683 return 0;
2684}