blob: 79874ef4d3ade35fd7d116112d244d2ed8389cc4 [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 Rossum3f5da241990-12-20 15:06:42 +000036#include "traceback.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000037#include "graminit.h"
38#include "pythonrun.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000039
Guido van Rossumc6004111993-11-05 10:22:19 +000040#include <ctype.h>
41
Guido van Rossume59214e1994-08-30 08:01:59 +000042extern int suppress_print; /* Declared in pythonrun.c, set in pythonmain.c */
43
Guido van Rossum04691fc1992-08-12 15:35:34 +000044/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000046
Guido van Rossumacbe8da1993-04-15 15:33:52 +000047/* Turn this on if you want to debug the interpreter: */
48/* (This can be on even if NDEBUG is defined) */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000049/* #define DEBUG 1 */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000050
51#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000052/* For debugging the interpreter: */
53#define LLTRACE 1 /* Low-level trace feature */
54#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000055#endif
56
Guido van Rossum5b722181993-03-30 17:46:03 +000057
Guido van Rossum374a9221991-04-04 10:40:29 +000058/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000059
Guido van Rossum0a066c01992-03-27 17:29:15 +000060#ifdef LLTRACE
61static int prtrace PROTO((object *, char *));
62#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000063static void call_exc_trace PROTO((object **, object**, frameobject *));
64static int call_trace
65 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000066static object *add PROTO((object *, object *));
67static object *sub PROTO((object *, object *));
68static object *mul PROTO((object *, object *));
69static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000070static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000071static object *neg PROTO((object *));
72static object *pos PROTO((object *));
73static object *not PROTO((object *));
74static object *invert PROTO((object *));
75static object *lshift PROTO((object *, object *));
76static object *rshift PROTO((object *, object *));
77static object *and PROTO((object *, object *));
78static object *xor PROTO((object *, object *));
79static object *or PROTO((object *, object *));
80static object *call_builtin PROTO((object *, object *));
81static object *call_function PROTO((object *, object *));
82static object *apply_subscript PROTO((object *, object *));
83static object *loop_subscript PROTO((object *, object *));
84static int slice_index PROTO((object *, int, int *));
85static object *apply_slice PROTO((object *, object *, object *));
86static int assign_subscript PROTO((object *, object *, object *));
87static int assign_slice PROTO((object *, object *, object *, object *));
88static int cmp_exception PROTO((object *, object *));
89static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000090static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000091static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000092static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000093static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000094static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000095
96
Guido van Rossum0a066c01992-03-27 17:29:15 +000097/* Pointer to current frame, used to link new frames to */
98
Guido van Rossum374a9221991-04-04 10:40:29 +000099static frameobject *current_frame;
100
Guido van Rossume59214e1994-08-30 08:01:59 +0000101#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000102
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103#include <errno.h>
104#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000105
Guido van Rossuma9672091994-09-14 13:31:22 +0000106static type_lock interpreter_lock = 0;
107static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108
109void
110init_save_thread()
111{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000113 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114 interpreter_lock = allocate_lock();
115 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000116 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000117}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000118
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119#endif
120
Guido van Rossumff4949e1992-08-05 19:58:53 +0000121/* Functions save_thread and restore_thread are always defined so
122 dynamically loaded modules needn't be compiled separately for use
123 with and without threads: */
124
Guido van Rossum04691fc1992-08-12 15:35:34 +0000125object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126save_thread()
127{
Guido van Rossume59214e1994-08-30 08:01:59 +0000128#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000130 object *res;
131 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132 current_frame = NULL;
133 release_lock(interpreter_lock);
134 return res;
135 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000136#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000137 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138}
139
140void
141restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000142 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000143{
Guido van Rossume59214e1994-08-30 08:01:59 +0000144#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145 if (interpreter_lock) {
146 int err;
147 err = errno;
148 acquire_lock(interpreter_lock, 1);
149 errno = err;
150 current_frame = (frameobject *)x;
151 }
152#endif
153}
154
155
Guido van Rossuma9672091994-09-14 13:31:22 +0000156/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
157 signal handlers or Mac I/O completion routines) can schedule calls
158 to a function to be called synchronously.
159 The synchronous function is called with one void* argument.
160 It should return 0 for success or -1 for failure -- failure should
161 be accompanied by an exception.
162
163 If registry succeeds, the registry function returns 0; if it fails
164 (e.g. due to too many pending calls) it returns -1 (without setting
165 an exception condition).
166
167 Note that because registry may occur from within signal handlers,
168 or other asynchronous events, calling malloc() is unsafe!
169
170#ifdef WITH_THREAD
171 Any thread can schedule pending calls, but only the main thread
172 will execute them.
173#endif
174
175 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
176 There are two possible race conditions:
177 (1) nested asynchronous registry calls;
178 (2) registry calls made while pending calls are being processed.
179 While (1) is very unlikely, (2) is a real possibility.
180 The current code is safe against (2), but not against (1).
181 The safety against (2) is derived from the fact that only one
182 thread (the main thread) ever takes things out of the queue.
183*/
184
185#define NPENDINGCALLS 32
186static struct {
187 int (*func) PROTO((ANY *));
188 ANY *arg;
189} pendingcalls[NPENDINGCALLS];
190static volatile int pendingfirst = 0;
191static volatile int pendinglast = 0;
192
193int
194Py_AddPendingCall(func, arg)
195 int (*func) PROTO((ANY *));
196 ANY *arg;
197{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000198 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000199 int i, j;
200 /* XXX Begin critical section */
201 /* XXX If you want this to be safe against nested
202 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000203 if (busy)
204 return -1;
205 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000206 i = pendinglast;
207 j = (i + 1) % NPENDINGCALLS;
208 if (j == pendingfirst)
209 return -1; /* Queue full */
210 pendingcalls[i].func = func;
211 pendingcalls[i].arg = arg;
212 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000213 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000214 /* XXX End critical section */
215 return 0;
216}
217
Guido van Rossum180d7b41994-09-29 09:45:57 +0000218int
219Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000220{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000221 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000222#ifdef WITH_THREAD
223 if (get_thread_ident() != main_thread)
224 return 0;
225#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000226 if (busy)
227 return 0;
228 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000229 for (;;) {
230 int i;
231 int (*func) PROTO((ANY *));
232 ANY *arg;
233 i = pendingfirst;
234 if (i == pendinglast)
235 break; /* Queue empty */
236 func = pendingcalls[i].func;
237 arg = pendingcalls[i].arg;
238 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000239 if (func(arg) < 0) {
240 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000241 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000242 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000243 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000245 return 0;
246}
247
248
Guido van Rossum374a9221991-04-04 10:40:29 +0000249/* Status code for main loop (reason for stack unwind) */
250
251enum why_code {
252 WHY_NOT, /* No error */
253 WHY_EXCEPTION, /* Exception occurred */
254 WHY_RERAISE, /* Exception re-raised by 'finally' */
255 WHY_RETURN, /* 'return' statement */
256 WHY_BREAK /* 'break' statement */
257};
258
259
260/* Interpreter main loop */
261
262object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000263eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000264 codeobject *co;
265 object *globals;
266 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000267 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000268 object *arg;
269{
270 register unsigned char *next_instr;
271 register int opcode; /* Current opcode */
272 register int oparg; /* Current opcode argument, if any */
273 register object **stack_pointer;
274 register enum why_code why; /* Reason for block stack unwind */
275 register int err; /* Error status -- nonzero if error */
276 register object *x; /* Result object -- NULL if error */
277 register object *v; /* Temporary objects popped off stack */
278 register object *w;
279 register object *u;
280 register object *t;
281 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000282 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000283 object *retval; /* Return value iff why == WHY_RETURN */
284 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000285 int needmerge = 0; /* Set if need to merge locals back at end */
286 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000287#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000288 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000289#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000290#ifdef DEBUG
291 /* Make it easier to find out where we are with dbx */
292 char *filename = getstringvalue(co->co_filename);
293#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000294
295/* Code access macros */
296
297#define GETCONST(i) Getconst(f, i)
298#define GETNAME(i) Getname(f, i)
299#define GETNAMEV(i) Getnamev(f, i)
300#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
301#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
302#define NEXTOP() (*next_instr++)
303#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
304#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
305#define JUMPBY(x) (next_instr += (x))
306
307/* Stack manipulation macros */
308
309#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
310#define EMPTY() (STACK_LEVEL() == 0)
311#define TOP() (stack_pointer[-1])
312#define BASIC_PUSH(v) (*stack_pointer++ = (v))
313#define BASIC_POP() (*--stack_pointer)
314
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000315#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
316 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
317
Guido van Rossum96a42c81992-01-12 02:29:51 +0000318#ifdef LLTRACE
319#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
320#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000321#else
322#define PUSH(v) BASIC_PUSH(v)
323#define POP() BASIC_POP()
324#endif
325
Guido van Rossum6135a871995-01-09 17:53:26 +0000326 if (globals == NULL || locals == NULL) {
327 err_setstr(SystemError, "eval_code: NULL globals or locals");
328 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000329 }
330
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000331#ifdef LLTRACE
332 lltrace = dictlookup(globals, "__lltrace__") != NULL;
333#endif
334
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 f = newframeobject(
336 current_frame, /*back*/
337 co, /*code*/
338 globals, /*globals*/
339 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000340 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000341 50, /*nvalues*/
342 20); /*nblocks*/
343 if (f == NULL)
344 return NULL;
345
346 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000347
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000348 if (sys_trace != NULL) {
349 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000350 be called on *every* entry to a code block.
351 Its return value, if not None, is a function that
352 will be called at the start of each executed line
353 of code. (Actually, the function must return
354 itself in order to continue tracing.)
355 The trace functions are called with three arguments:
356 a pointer to the current frame, a string indicating
357 why the function is called, and an argument which
358 depends on the situation. The global trace function
359 (sys.trace) is also called whenever an exception
360 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000361 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000362 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000363 current_frame = f->f_back;
364 DECREF(f);
365 return NULL;
366 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000367 }
368
369 if (sys_profile != NULL) {
370 /* Similar for sys_profile, except it needn't return
371 itself and isn't called for "line" events */
372 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
373 current_frame = f->f_back;
374 DECREF(f);
375 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000376 }
377 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000378
Guido van Rossum374a9221991-04-04 10:40:29 +0000379 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000380 stack_pointer = f->f_valuestack;
381
382 if (arg != NULL) {
383 INCREF(arg);
384 PUSH(arg);
385 }
386
387 why = WHY_NOT;
388 err = 0;
389 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000390
391 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000392 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000393
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394 /* Do periodic things.
395 Doing this every time through the loop would add
396 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000397 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000398
Guido van Rossuma9672091994-09-14 13:31:22 +0000399 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000400 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 why = WHY_EXCEPTION;
402 goto on_error;
403 }
404 }
405
Guido van Rossum374a9221991-04-04 10:40:29 +0000406 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000407 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000408 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000409 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 goto on_error;
411 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412
Guido van Rossume59214e1994-08-30 08:01:59 +0000413#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000414 if (interpreter_lock) {
415 /* Give another thread a chance */
416
417 current_frame = NULL;
418 release_lock(interpreter_lock);
419
420 /* Other threads may run now */
421
422 acquire_lock(interpreter_lock, 1);
423 current_frame = f;
424 }
425#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000426 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427
Guido van Rossum374a9221991-04-04 10:40:29 +0000428 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000429
430#ifdef DEBUG
431 f->f_lasti = INSTR_OFFSET();
432#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000433
434 opcode = NEXTOP();
435 if (HAS_ARG(opcode))
436 oparg = NEXTARG();
437
Guido van Rossum96a42c81992-01-12 02:29:51 +0000438#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000439 /* Instruction tracing */
440
Guido van Rossum96a42c81992-01-12 02:29:51 +0000441 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000442 if (HAS_ARG(opcode)) {
443 printf("%d: %d, %d\n",
444 (int) (INSTR_OFFSET() - 3),
445 opcode, oparg);
446 }
447 else {
448 printf("%d: %d\n",
449 (int) (INSTR_OFFSET() - 1), opcode);
450 }
451 }
452#endif
453
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000454 if (!CHECK_STACK(3)) {
455 x = NULL;
456 break;
457 }
458
Guido van Rossum374a9221991-04-04 10:40:29 +0000459 /* Main switch on opcode */
460
461 switch (opcode) {
462
463 /* BEWARE!
464 It is essential that any operation that fails sets either
465 x to NULL, err to nonzero, or why to anything but WHY_NOT,
466 and that no operation that succeeds does this! */
467
468 /* case STOP_CODE: this is an error! */
469
470 case POP_TOP:
471 v = POP();
472 DECREF(v);
473 break;
474
475 case ROT_TWO:
476 v = POP();
477 w = POP();
478 PUSH(v);
479 PUSH(w);
480 break;
481
482 case ROT_THREE:
483 v = POP();
484 w = POP();
485 x = POP();
486 PUSH(v);
487 PUSH(x);
488 PUSH(w);
489 break;
490
491 case DUP_TOP:
492 v = TOP();
493 INCREF(v);
494 PUSH(v);
495 break;
496
497 case UNARY_POSITIVE:
498 v = POP();
499 x = pos(v);
500 DECREF(v);
501 PUSH(x);
502 break;
503
504 case UNARY_NEGATIVE:
505 v = POP();
506 x = neg(v);
507 DECREF(v);
508 PUSH(x);
509 break;
510
511 case UNARY_NOT:
512 v = POP();
513 x = not(v);
514 DECREF(v);
515 PUSH(x);
516 break;
517
518 case UNARY_CONVERT:
519 v = POP();
520 x = reprobject(v);
521 DECREF(v);
522 PUSH(x);
523 break;
524
525 case UNARY_CALL:
526 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000528 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000529 DECREF(v);
530 PUSH(x);
531 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000532
533 case UNARY_INVERT:
534 v = POP();
535 x = invert(v);
536 DECREF(v);
537 PUSH(x);
538 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000539
540 case BINARY_MULTIPLY:
541 w = POP();
542 v = POP();
543 x = mul(v, w);
544 DECREF(v);
545 DECREF(w);
546 PUSH(x);
547 break;
548
549 case BINARY_DIVIDE:
550 w = POP();
551 v = POP();
552 x = divide(v, w);
553 DECREF(v);
554 DECREF(w);
555 PUSH(x);
556 break;
557
558 case BINARY_MODULO:
559 w = POP();
560 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000561 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000562 DECREF(v);
563 DECREF(w);
564 PUSH(x);
565 break;
566
567 case BINARY_ADD:
568 w = POP();
569 v = POP();
570 x = add(v, w);
571 DECREF(v);
572 DECREF(w);
573 PUSH(x);
574 break;
575
576 case BINARY_SUBTRACT:
577 w = POP();
578 v = POP();
579 x = sub(v, w);
580 DECREF(v);
581 DECREF(w);
582 PUSH(x);
583 break;
584
585 case BINARY_SUBSCR:
586 w = POP();
587 v = POP();
588 x = apply_subscript(v, w);
589 DECREF(v);
590 DECREF(w);
591 PUSH(x);
592 break;
593
594 case BINARY_CALL:
595 w = POP();
596 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000597 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000598 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000599 DECREF(v);
600 DECREF(w);
601 PUSH(x);
602 break;
603
Guido van Rossum7928cd71991-10-24 14:59:31 +0000604 case BINARY_LSHIFT:
605 w = POP();
606 v = POP();
607 x = lshift(v, w);
608 DECREF(v);
609 DECREF(w);
610 PUSH(x);
611 break;
612
613 case BINARY_RSHIFT:
614 w = POP();
615 v = POP();
616 x = rshift(v, w);
617 DECREF(v);
618 DECREF(w);
619 PUSH(x);
620 break;
621
622 case BINARY_AND:
623 w = POP();
624 v = POP();
625 x = and(v, w);
626 DECREF(v);
627 DECREF(w);
628 PUSH(x);
629 break;
630
631 case BINARY_XOR:
632 w = POP();
633 v = POP();
634 x = xor(v, w);
635 DECREF(v);
636 DECREF(w);
637 PUSH(x);
638 break;
639
640 case BINARY_OR:
641 w = POP();
642 v = POP();
643 x = or(v, w);
644 DECREF(v);
645 DECREF(w);
646 PUSH(x);
647 break;
648
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 case SLICE+0:
650 case SLICE+1:
651 case SLICE+2:
652 case SLICE+3:
653 if ((opcode-SLICE) & 2)
654 w = POP();
655 else
656 w = NULL;
657 if ((opcode-SLICE) & 1)
658 v = POP();
659 else
660 v = NULL;
661 u = POP();
662 x = apply_slice(u, v, w);
663 DECREF(u);
664 XDECREF(v);
665 XDECREF(w);
666 PUSH(x);
667 break;
668
669 case STORE_SLICE+0:
670 case STORE_SLICE+1:
671 case STORE_SLICE+2:
672 case STORE_SLICE+3:
673 if ((opcode-STORE_SLICE) & 2)
674 w = POP();
675 else
676 w = NULL;
677 if ((opcode-STORE_SLICE) & 1)
678 v = POP();
679 else
680 v = NULL;
681 u = POP();
682 t = POP();
683 err = assign_slice(u, v, w, t); /* u[v:w] = t */
684 DECREF(t);
685 DECREF(u);
686 XDECREF(v);
687 XDECREF(w);
688 break;
689
690 case DELETE_SLICE+0:
691 case DELETE_SLICE+1:
692 case DELETE_SLICE+2:
693 case DELETE_SLICE+3:
694 if ((opcode-DELETE_SLICE) & 2)
695 w = POP();
696 else
697 w = NULL;
698 if ((opcode-DELETE_SLICE) & 1)
699 v = POP();
700 else
701 v = NULL;
702 u = POP();
703 err = assign_slice(u, v, w, (object *)NULL);
704 /* del u[v:w] */
705 DECREF(u);
706 XDECREF(v);
707 XDECREF(w);
708 break;
709
710 case STORE_SUBSCR:
711 w = POP();
712 v = POP();
713 u = POP();
714 /* v[w] = u */
715 err = assign_subscript(v, w, u);
716 DECREF(u);
717 DECREF(v);
718 DECREF(w);
719 break;
720
721 case DELETE_SUBSCR:
722 w = POP();
723 v = POP();
724 /* del v[w] */
725 err = assign_subscript(v, w, (object *)NULL);
726 DECREF(v);
727 DECREF(w);
728 break;
729
730 case PRINT_EXPR:
731 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000733 /* Before printing, also assign to '_' */
734 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000735 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000736 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000738 x = sysget("stdout");
739 softspace(x, 1);
740 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000741 flushline();
742 }
743 DECREF(v);
744 break;
745
746 case PRINT_ITEM:
747 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000748 w = sysget("stdout");
749 if (softspace(w, 1))
750 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000751 err = writeobject(v, w, PRINT_RAW);
752 if (err == 0 && is_stringobject(v)) {
753 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 char *s = getstringvalue(v);
755 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000756 if (len > 0 && isspace(s[len-1]) &&
757 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000758 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 DECREF(v);
761 break;
762
763 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000764 x = sysget("stdout");
765 if (x == NULL)
766 err_setstr(RuntimeError, "lost sys.stdout");
767 else {
768 writestring("\n", x);
769 softspace(x, 0);
770 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 break;
772
773 case BREAK_LOOP:
774 why = WHY_BREAK;
775 break;
776
777 case RAISE_EXCEPTION:
778 v = POP();
779 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000780 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000781 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000782 u = w;
783 w = gettupleitem(u, 0);
784 DECREF(u);
785 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000786 if (!is_stringobject(w))
787 err_setstr(TypeError,
788 "exceptions must be strings");
789 else
790 err_setval(w, v);
791 DECREF(v);
792 DECREF(w);
793 why = WHY_EXCEPTION;
794 break;
795
796 case LOAD_LOCALS:
797 v = f->f_locals;
798 INCREF(v);
799 PUSH(v);
800 break;
801
802 case RETURN_VALUE:
803 retval = POP();
804 why = WHY_RETURN;
805 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000806
807 case LOAD_GLOBALS:
808 v = f->f_locals;
809 INCREF(v);
810 PUSH(v);
811 break;
812
813 case EXEC_STMT:
814 w = POP();
815 v = POP();
816 u = POP();
817 err = exec_statement(u, v, w);
818 DECREF(u);
819 DECREF(v);
820 DECREF(w);
821 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000822
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 case BUILD_FUNCTION:
824 v = POP();
825 x = newfuncobject(v, f->f_globals);
826 DECREF(v);
827 PUSH(x);
828 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000829
830 case SET_FUNC_ARGS:
831 v = POP(); /* The function */
832 w = POP(); /* The argument list */
833 err = setfuncargstuff(v, oparg, w);
834 PUSH(v);
835 DECREF(w);
836 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000837
838 case POP_BLOCK:
839 {
840 block *b = pop_block(f);
841 while (STACK_LEVEL() > b->b_level) {
842 v = POP();
843 DECREF(v);
844 }
845 }
846 break;
847
848 case END_FINALLY:
849 v = POP();
850 if (is_intobject(v)) {
851 why = (enum why_code) getintvalue(v);
852 if (why == WHY_RETURN)
853 retval = POP();
854 }
855 else if (is_stringobject(v)) {
856 w = POP();
857 err_setval(v, w);
858 DECREF(w);
859 w = POP();
860 tb_store(w);
861 DECREF(w);
862 why = WHY_RERAISE;
863 }
864 else if (v != None) {
865 err_setstr(SystemError,
866 "'finally' pops bad exception");
867 why = WHY_EXCEPTION;
868 }
869 DECREF(v);
870 break;
871
872 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000873 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000875 w = POP();
876 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000878 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 DECREF(v);
880 DECREF(w);
881 break;
882
883 case STORE_NAME:
884 w = GETNAMEV(oparg);
885 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000886 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000887 if (u == NULL) {
888 if (defmode != 0) {
889 if (v != None)
890 u = (object *)v->ob_type;
891 else
892 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000893 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000894 (typeobject *)u,
895 defmode);
896 DECREF(v);
897 if (x == NULL)
898 break;
899 v = x;
900 }
901 }
902 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000903 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000904 DECREF(v);
905 break;
906 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 err = dict2insert(f->f_locals, w, v);
908 DECREF(v);
909 break;
910
911 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000912 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000913 u = dict2lookup(f->f_locals, w);
914 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000915 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000916 (object *)NULL);
917 break;
918 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000919 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000920 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000922
923#ifdef CASE_TOO_BIG
924 default: switch (opcode) {
925#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000926
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000927 case UNPACK_VARARG:
928 if (EMPTY()) {
929 err_setstr(TypeError,
930 "no argument list");
931 why = WHY_EXCEPTION;
932 break;
933 }
934 v = POP();
935 if (!is_tupleobject(v)) {
936 err_setstr(TypeError,
937 "bad argument list");
938 why = WHY_EXCEPTION;
939 }
940 else if (gettuplesize(v) < oparg) {
941 err_setstr(TypeError,
942 "not enough arguments");
943 why = WHY_EXCEPTION;
944 }
945 else if (oparg == 0) {
946 PUSH(v);
947 break;
948 }
949 else {
950 x = gettupleslice(v, oparg, gettuplesize(v));
951 if (x != NULL) {
952 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000953 if (!CHECK_STACK(oparg)) {
954 x = NULL;
955 break;
956 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000957 for (; --oparg >= 0; ) {
958 w = gettupleitem(v, oparg);
959 INCREF(w);
960 PUSH(w);
961 }
962 }
963 }
964 DECREF(v);
965 break;
966
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000967 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000968 {
969 int n;
970 if (EMPTY()) {
971 err_setstr(TypeError,
972 "no argument list");
973 why = WHY_EXCEPTION;
974 break;
975 }
976 v = POP();
977 if (!is_tupleobject(v)) {
978 err_setstr(TypeError,
979 "bad argument list");
980 why = WHY_EXCEPTION;
981 break;
982 }
983 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000984#ifdef COMPAT_HACKS
985/* Implement various compatibility hacks (for 0.9.4 or earlier):
986 (a) f(a,b,...) accepts f((1,2,...))
987 (b) f((a,b,...)) accepts f(1,2,...)
988 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
989*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000990 if (n == 1 && oparg != 1) {
991 /* Rule (a) */
992 w = gettupleitem(v, 0);
993 if (is_tupleobject(w)) {
994 INCREF(w);
995 DECREF(v);
996 v = w;
997 n = gettuplesize(v);
998 }
999 }
1000 else if (n != 1 && oparg == 1) {
1001 /* Rule (b) */
1002 PUSH(v);
1003 break;
1004 /* Don't fall through */
1005 }
1006 else if (n > 2 && oparg == 2) {
1007 /* Rule (c) */
1008 int i;
1009 w = newtupleobject(n-1);
1010 u = newtupleobject(2);
1011 if (u == NULL || w == NULL) {
1012 XDECREF(w);
1013 XDECREF(u);
1014 DECREF(v);
1015 why = WHY_EXCEPTION;
1016 break;
1017 }
1018 t = gettupleitem(v, 0);
1019 INCREF(t);
1020 settupleitem(u, 0, t);
1021 for (i = 1; i < n; i++) {
1022 t = gettupleitem(v, i);
1023 INCREF(t);
1024 settupleitem(w, i-1, t);
1025 }
1026 settupleitem(u, 1, w);
1027 DECREF(v);
1028 v = u;
1029 n = 2;
1030 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001031#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001032 if (n != oparg) {
1033 err_setstr(TypeError,
1034 "arg count mismatch");
1035 why = WHY_EXCEPTION;
1036 DECREF(v);
1037 break;
1038 }
1039 PUSH(v);
1040 }
1041 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001042 case UNPACK_TUPLE:
1043 v = POP();
1044 if (!is_tupleobject(v)) {
1045 err_setstr(TypeError, "unpack non-tuple");
1046 why = WHY_EXCEPTION;
1047 }
1048 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001049 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 "unpack tuple of wrong size");
1051 why = WHY_EXCEPTION;
1052 }
1053 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001054 if (!CHECK_STACK(oparg)) {
1055 x = NULL;
1056 break;
1057 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001058 for (; --oparg >= 0; ) {
1059 w = gettupleitem(v, oparg);
1060 INCREF(w);
1061 PUSH(w);
1062 }
1063 }
1064 DECREF(v);
1065 break;
1066
1067 case UNPACK_LIST:
1068 v = POP();
1069 if (!is_listobject(v)) {
1070 err_setstr(TypeError, "unpack non-list");
1071 why = WHY_EXCEPTION;
1072 }
1073 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001074 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 "unpack list of wrong size");
1076 why = WHY_EXCEPTION;
1077 }
1078 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001079 if (!CHECK_STACK(oparg)) {
1080 x = NULL;
1081 break;
1082 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 for (; --oparg >= 0; ) {
1084 w = getlistitem(v, oparg);
1085 INCREF(w);
1086 PUSH(w);
1087 }
1088 }
1089 DECREF(v);
1090 break;
1091
1092 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001093 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001094 v = POP();
1095 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001096 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 DECREF(v);
1098 DECREF(u);
1099 break;
1100
1101 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001102 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001104 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 DECREF(v);
1106 break;
1107
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001108 case STORE_GLOBAL:
1109 w = GETNAMEV(oparg);
1110 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001111 u = dict2lookup(f->f_locals, w);
1112 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001113 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001114 DECREF(v);
1115 break;
1116 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001117 err = dict2insert(f->f_globals, w, v);
1118 DECREF(v);
1119 break;
1120
1121 case DELETE_GLOBAL:
1122 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001123 u = dict2lookup(f->f_locals, w);
1124 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001125 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001126 (object *)NULL);
1127 break;
1128 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001129 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001130 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001131 break;
1132
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 case LOAD_CONST:
1134 x = GETCONST(oparg);
1135 INCREF(x);
1136 PUSH(x);
1137 break;
1138
1139 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001140 w = GETNAMEV(oparg);
1141 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001143 err_clear();
1144 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001146 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001147 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001149 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 break;
1151 }
1152 }
1153 }
Guido van Rossum25831651993-05-19 14:50:45 +00001154 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001155 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001156 if (x == NULL)
1157 break;
1158 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001159 else
1160 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 PUSH(x);
1162 break;
1163
1164 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001165 w = GETNAMEV(oparg);
1166 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001168 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001169 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001171 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 break;
1173 }
1174 }
Guido van Rossum25831651993-05-19 14:50:45 +00001175 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001176 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001177 if (x == NULL)
1178 break;
1179 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001180 else
1181 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 PUSH(x);
1183 break;
1184
1185 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001186 w = GETNAMEV(oparg);
1187 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001189 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 break;
1191 }
Guido van Rossum25831651993-05-19 14:50:45 +00001192 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001193 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001194 if (x == NULL)
1195 break;
1196 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001197 else
1198 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 PUSH(x);
1200 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001201
1202 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001203 x = GETCONST(oparg);
1204 if (x == None)
1205 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001206 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001207 err_setstr(SystemError, "bad RESERVE_FAST");
1208 x = NULL;
1209 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001210 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001211 XDECREF(f->f_fastlocals);
1212 XDECREF(f->f_localmap);
1213 INCREF(x);
1214 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001215 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001216 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001217 break;
1218
1219 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001220 x = GETLISTITEM(fastlocals, oparg);
1221 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001222 err_setval(NameError,
1223 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001224 break;
1225 }
Guido van Rossum25831651993-05-19 14:50:45 +00001226 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001227 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001228 if (x == NULL)
1229 break;
1230 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001231 else
1232 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001233 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001234 break;
1235
1236 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001237 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001238 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001239 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001240 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001241 DECREF(v);
1242 break;
1243 }
Guido van Rossum25831651993-05-19 14:50:45 +00001244 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001246 break;
1247
1248 case DELETE_FAST:
1249 x = GETLISTITEM(fastlocals, oparg);
1250 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001251 err_setval(NameError,
1252 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001253 break;
1254 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001255 if (x != NULL && is_accessobject(x)) {
1256 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001257 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001258 break;
1259 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001260 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001261 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001262 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001263
1264 case BUILD_TUPLE:
1265 x = newtupleobject(oparg);
1266 if (x != NULL) {
1267 for (; --oparg >= 0;) {
1268 w = POP();
1269 err = settupleitem(x, oparg, w);
1270 if (err != 0)
1271 break;
1272 }
1273 PUSH(x);
1274 }
1275 break;
1276
1277 case BUILD_LIST:
1278 x = newlistobject(oparg);
1279 if (x != NULL) {
1280 for (; --oparg >= 0;) {
1281 w = POP();
1282 err = setlistitem(x, oparg, w);
1283 if (err != 0)
1284 break;
1285 }
1286 PUSH(x);
1287 }
1288 break;
1289
1290 case BUILD_MAP:
1291 x = newdictobject();
1292 PUSH(x);
1293 break;
1294
1295 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001296 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001298 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 DECREF(v);
1300 PUSH(x);
1301 break;
1302
1303 case COMPARE_OP:
1304 w = POP();
1305 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001306 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 DECREF(v);
1308 DECREF(w);
1309 PUSH(x);
1310 break;
1311
1312 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001313 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001314 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315 if (x == NULL) {
1316 err_setstr(ImportError,
1317 "__import__ not found");
1318 break;
1319 }
1320 w = mkvalue("(O)", w);
1321 if (w == NULL) {
1322 x = NULL;
1323 break;
1324 }
1325 x = call_object(x, w);
1326 DECREF(w);
1327 if (x)
1328 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 break;
1330
1331 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001332 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001334 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001335 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001337
1338 case ACCESS_MODE:
1339 v = POP();
1340 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001341 if (getstringvalue(w)[0] == '*')
1342 defmode = getintvalue(v);
1343 else
1344 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001345 DECREF(v);
1346 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001347
1348 case JUMP_FORWARD:
1349 JUMPBY(oparg);
1350 break;
1351
1352 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001353 err = testbool(TOP());
1354 if (err > 0)
1355 err = 0;
1356 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 JUMPBY(oparg);
1358 break;
1359
1360 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001361 err = testbool(TOP());
1362 if (err > 0) {
1363 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001365 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 break;
1367
1368 case JUMP_ABSOLUTE:
1369 JUMPTO(oparg);
1370 break;
1371
1372 case FOR_LOOP:
1373 /* for v in s: ...
1374 On entry: stack contains s, i.
1375 On exit: stack contains s, i+1, s[i];
1376 but if loop exhausted:
1377 s, i are popped, and we jump */
1378 w = POP(); /* Loop index */
1379 v = POP(); /* Sequence object */
1380 u = loop_subscript(v, w);
1381 if (u != NULL) {
1382 PUSH(v);
1383 x = newintobject(getintvalue(w)+1);
1384 PUSH(x);
1385 DECREF(w);
1386 PUSH(u);
1387 }
1388 else {
1389 DECREF(v);
1390 DECREF(w);
1391 /* A NULL can mean "s exhausted"
1392 but also an error: */
1393 if (err_occurred())
1394 why = WHY_EXCEPTION;
1395 else
1396 JUMPBY(oparg);
1397 }
1398 break;
1399
1400 case SETUP_LOOP:
1401 case SETUP_EXCEPT:
1402 case SETUP_FINALLY:
1403 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1404 STACK_LEVEL());
1405 break;
1406
1407 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001408#ifdef LLTRACE
1409 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001410 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001411#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001412 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001413 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001414 /* Trace each line of code reached */
1415 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001416 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001417 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001418 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001419 break;
1420
1421 default:
1422 fprintf(stderr,
1423 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001424 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 err_setstr(SystemError, "eval_code: unknown opcode");
1426 why = WHY_EXCEPTION;
1427 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001428
1429#ifdef CASE_TOO_BIG
1430 }
1431#endif
1432
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 } /* switch */
1434
1435 on_error:
1436
1437 /* Quickly continue if no error occurred */
1438
1439 if (why == WHY_NOT) {
1440 if (err == 0 && x != NULL)
1441 continue; /* Normal, fast path */
1442 why = WHY_EXCEPTION;
1443 x = None;
1444 err = 0;
1445 }
1446
Guido van Rossum801dcae1992-04-08 11:32:32 +00001447#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 /* Double-check exception status */
1449
1450 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1451 if (!err_occurred()) {
1452 fprintf(stderr, "XXX ghost error\n");
1453 err_setstr(SystemError, "ghost error");
1454 why = WHY_EXCEPTION;
1455 }
1456 }
1457 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001458 if (err_occurred())
1459 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 }
1461#endif
1462
1463 /* Log traceback info if this is a real exception */
1464
1465 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001466 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001467 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001468 f->f_lasti -= 2;
1469 tb_here(f);
1470
Guido van Rossume59214e1994-08-30 08:01:59 +00001471 if (f->f_trace)
1472 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001473 if (sys_profile)
1474 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 }
1476
1477 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1478
1479 if (why == WHY_RERAISE)
1480 why = WHY_EXCEPTION;
1481
1482 /* Unwind stacks if a (pseudo) exception occurred */
1483
1484 while (why != WHY_NOT && f->f_iblock > 0) {
1485 block *b = pop_block(f);
1486 while (STACK_LEVEL() > b->b_level) {
1487 v = POP();
1488 XDECREF(v);
1489 }
1490 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1491 why = WHY_NOT;
1492 JUMPTO(b->b_handler);
1493 break;
1494 }
1495 if (b->b_type == SETUP_FINALLY ||
1496 b->b_type == SETUP_EXCEPT &&
1497 why == WHY_EXCEPTION) {
1498 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001499 object *exc, *val, *tb;
1500 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 if (val == NULL) {
1502 val = None;
1503 INCREF(val);
1504 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 /* Make the raw exception data
1506 available to the handler,
1507 so a program can emulate the
1508 Python main loop. Don't do
1509 this for 'finally'. */
1510 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001511 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 sysset("exc_value", val);
1513 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001515 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 PUSH(val);
1517 PUSH(exc);
1518 }
1519 else {
1520 if (why == WHY_RETURN)
1521 PUSH(retval);
1522 v = newintobject((long)why);
1523 PUSH(v);
1524 }
1525 why = WHY_NOT;
1526 JUMPTO(b->b_handler);
1527 break;
1528 }
1529 } /* unwind stack */
1530
1531 /* End the loop if we still have an error (or return) */
1532
1533 if (why != WHY_NOT)
1534 break;
1535
1536 } /* main loop */
1537
1538 /* Pop remaining stack entries */
1539
1540 while (!EMPTY()) {
1541 v = POP();
1542 XDECREF(v);
1543 }
1544
Guido van Rossum96a42c81992-01-12 02:29:51 +00001545 if (why != WHY_RETURN)
1546 retval = NULL;
1547
Guido van Rossume59214e1994-08-30 08:01:59 +00001548 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001549 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001550 if (call_trace(&f->f_trace, &f->f_trace, f,
1551 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001552 XDECREF(retval);
1553 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001554 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001555 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001556 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001557 }
1558
1559 if (sys_profile && why == WHY_RETURN) {
1560 if (call_trace(&sys_profile, (object**)0,
1561 f, "return", retval)) {
1562 XDECREF(retval);
1563 retval = NULL;
1564 why = WHY_EXCEPTION;
1565 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001566 }
1567
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 /* Restore previous frame and release the current one */
1569
1570 current_frame = f->f_back;
1571 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001572
1573 if (needmerge)
1574 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575
Guido van Rossum96a42c81992-01-12 02:29:51 +00001576 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001577}
1578
Guido van Rossum96a42c81992-01-12 02:29:51 +00001579#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001580static int
1581prtrace(v, str)
1582 object *v;
1583 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001585 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001586 if (printobject(v, stdout, 0) != 0)
1587 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001588 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001592static void
1593call_exc_trace(p_trace, p_newtrace, f)
1594 object **p_trace, **p_newtrace;
1595 frameobject *f;
1596{
1597 object *type, *value, *traceback, *arg;
1598 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001599 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001600 if (value == NULL) {
1601 value = None;
1602 INCREF(value);
1603 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001604 arg = mkvalue("(OOO)", type, value, traceback);
1605 if (arg == NULL) {
1606 err_restore(type, value, traceback);
1607 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001608 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001609 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1610 DECREF(arg);
1611 if (err == 0)
1612 err_restore(type, value, traceback);
1613 else {
1614 XDECREF(type);
1615 XDECREF(value);
1616 XDECREF(traceback);
1617 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001618}
1619
1620static int
1621call_trace(p_trace, p_newtrace, f, msg, arg)
1622 object **p_trace; /* in/out; may not be NULL;
1623 may not point to NULL variable initially */
1624 object **p_newtrace; /* in/out; may be NULL;
1625 may point to NULL variable;
1626 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001627 frameobject *f;
1628 char *msg;
1629 object *arg;
1630{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001631 object *arglist, *what;
1632 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001633 static int tracing = 0;
1634
1635 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001636 /* Don't do recursive traces */
1637 if (p_newtrace) {
1638 XDECREF(*p_newtrace);
1639 *p_newtrace = NULL;
1640 }
1641 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001642 }
1643
1644 arglist = newtupleobject(3);
1645 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001646 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001647 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001648 if (what == NULL)
1649 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001650 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001651 settupleitem(arglist, 0, (object *)f);
1652 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001653 if (arg == NULL)
1654 arg = None;
1655 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001656 settupleitem(arglist, 2, arg);
1657 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001658 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001659 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001660 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001661 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001662 cleanup:
1663 XDECREF(arglist);
1664 if (res == NULL) {
1665 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001666 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001667 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001668 *p_trace = NULL;
1669 if (p_newtrace) {
1670 XDECREF(*p_newtrace);
1671 *p_newtrace = NULL;
1672 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001673 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001674 }
1675 else {
1676 if (p_newtrace) {
1677 XDECREF(*p_newtrace);
1678 if (res == None)
1679 *p_newtrace = NULL;
1680 else {
1681 INCREF(res);
1682 *p_newtrace = res;
1683 }
1684 }
1685 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001686 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001687 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001688}
1689
Guido van Rossum3f5da241990-12-20 15:06:42 +00001690object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001691getbuiltins()
1692{
1693 if (current_frame == NULL)
1694 return NULL;
1695 else
1696 return current_frame->f_builtins;
1697}
1698
1699object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001700getlocals()
1701{
1702 if (current_frame == NULL)
1703 return NULL;
1704 fast_2_locals(current_frame);
1705 return current_frame->f_locals;
1706}
1707
1708object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709getglobals()
1710{
1711 if (current_frame == NULL)
1712 return NULL;
1713 else
1714 return current_frame->f_globals;
1715}
1716
Guido van Rossum81daa321993-05-20 14:24:46 +00001717object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001718getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001719{
1720 if (current_frame == NULL)
1721 return NULL;
1722 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001723 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001724}
1725
Guido van Rossume59214e1994-08-30 08:01:59 +00001726object *
1727getframe()
1728{
1729 return (object *)current_frame;
1730}
1731
Guido van Rossum6135a871995-01-09 17:53:26 +00001732int
1733getrestricted()
1734{
1735 return current_frame == NULL ? 0 : current_frame->f_restricted;
1736}
1737
Guido van Rossum3f5da241990-12-20 15:06:42 +00001738void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739flushline()
1740{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001741 object *f = sysget("stdout");
1742 if (softspace(f, 0))
1743 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744}
1745
Guido van Rossum3f5da241990-12-20 15:06:42 +00001746
Guido van Rossum06186511995-01-07 12:40:10 +00001747#define BINOP(opname, ropname, thisfunc) \
1748 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1749 ; \
1750 else \
1751 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001752
1753
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001755or(v, w)
1756 object *v, *w;
1757{
Guido van Rossum06186511995-01-07 12:40:10 +00001758 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001759 if (v->ob_type->tp_as_number != NULL) {
1760 object *x;
1761 object * (*f) FPROTO((object *, object *));
1762 if (coerce(&v, &w) != 0)
1763 return NULL;
1764 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1765 x = (*f)(v, w);
1766 DECREF(v);
1767 DECREF(w);
1768 if (f != NULL)
1769 return x;
1770 }
1771 err_setstr(TypeError, "bad operand type(s) for |");
1772 return NULL;
1773}
1774
1775static object *
1776xor(v, w)
1777 object *v, *w;
1778{
Guido van Rossum06186511995-01-07 12:40:10 +00001779 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001780 if (v->ob_type->tp_as_number != NULL) {
1781 object *x;
1782 object * (*f) FPROTO((object *, object *));
1783 if (coerce(&v, &w) != 0)
1784 return NULL;
1785 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1786 x = (*f)(v, w);
1787 DECREF(v);
1788 DECREF(w);
1789 if (f != NULL)
1790 return x;
1791 }
1792 err_setstr(TypeError, "bad operand type(s) for ^");
1793 return NULL;
1794}
1795
1796static object *
1797and(v, w)
1798 object *v, *w;
1799{
Guido van Rossum06186511995-01-07 12:40:10 +00001800 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001801 if (v->ob_type->tp_as_number != NULL) {
1802 object *x;
1803 object * (*f) FPROTO((object *, object *));
1804 if (coerce(&v, &w) != 0)
1805 return NULL;
1806 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1807 x = (*f)(v, w);
1808 DECREF(v);
1809 DECREF(w);
1810 if (f != NULL)
1811 return x;
1812 }
1813 err_setstr(TypeError, "bad operand type(s) for &");
1814 return NULL;
1815}
1816
1817static object *
1818lshift(v, w)
1819 object *v, *w;
1820{
Guido van Rossum06186511995-01-07 12:40:10 +00001821 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001822 if (v->ob_type->tp_as_number != NULL) {
1823 object *x;
1824 object * (*f) FPROTO((object *, object *));
1825 if (coerce(&v, &w) != 0)
1826 return NULL;
1827 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1828 x = (*f)(v, w);
1829 DECREF(v);
1830 DECREF(w);
1831 if (f != NULL)
1832 return x;
1833 }
1834 err_setstr(TypeError, "bad operand type(s) for <<");
1835 return NULL;
1836}
1837
1838static object *
1839rshift(v, w)
1840 object *v, *w;
1841{
Guido van Rossum06186511995-01-07 12:40:10 +00001842 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001843 if (v->ob_type->tp_as_number != NULL) {
1844 object *x;
1845 object * (*f) FPROTO((object *, object *));
1846 if (coerce(&v, &w) != 0)
1847 return NULL;
1848 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1849 x = (*f)(v, w);
1850 DECREF(v);
1851 DECREF(w);
1852 if (f != NULL)
1853 return x;
1854 }
1855 err_setstr(TypeError, "bad operand type(s) for >>");
1856 return NULL;
1857}
1858
1859static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001860add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861 object *v, *w;
1862{
Guido van Rossum06186511995-01-07 12:40:10 +00001863 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001864 if (v->ob_type->tp_as_sequence != NULL)
1865 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1866 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001867 object *x;
1868 if (coerce(&v, &w) != 0)
1869 return NULL;
1870 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1871 DECREF(v);
1872 DECREF(w);
1873 return x;
1874 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001875 err_setstr(TypeError, "bad operand type(s) for +");
1876 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877}
1878
1879static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 object *v, *w;
1882{
Guido van Rossum06186511995-01-07 12:40:10 +00001883 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001884 if (v->ob_type->tp_as_number != NULL) {
1885 object *x;
1886 if (coerce(&v, &w) != 0)
1887 return NULL;
1888 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1889 DECREF(v);
1890 DECREF(w);
1891 return x;
1892 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001893 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 return NULL;
1895}
1896
1897static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001898mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 object *v, *w;
1900{
1901 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001902 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001903 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001904 if (tp->tp_as_number != NULL &&
1905 w->ob_type->tp_as_sequence != NULL &&
1906 !is_instanceobject(v)) {
1907 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 object *tmp = v;
1909 v = w;
1910 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001911 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001913 if (tp->tp_as_number != NULL) {
1914 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001915 if (is_instanceobject(v)) {
1916 /* Instances of user-defined classes get their
1917 other argument uncoerced, so they may
1918 implement sequence*number as well as
1919 number*number. */
1920 INCREF(v);
1921 INCREF(w);
1922 }
1923 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001924 return NULL;
1925 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1926 DECREF(v);
1927 DECREF(w);
1928 return x;
1929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 if (tp->tp_as_sequence != NULL) {
1931 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001932 err_setstr(TypeError,
1933 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 return NULL;
1935 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936 return (*tp->tp_as_sequence->sq_repeat)
1937 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001939 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 return NULL;
1941}
1942
1943static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001944divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 object *v, *w;
1946{
Guido van Rossum06186511995-01-07 12:40:10 +00001947 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001948 if (v->ob_type->tp_as_number != NULL) {
1949 object *x;
1950 if (coerce(&v, &w) != 0)
1951 return NULL;
1952 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1953 DECREF(v);
1954 DECREF(w);
1955 return x;
1956 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001957 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 return NULL;
1959}
1960
1961static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001962mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 object *v, *w;
1964{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001965 if (is_stringobject(v)) {
1966 return formatstring(v, w);
1967 }
Guido van Rossum06186511995-01-07 12:40:10 +00001968 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001969 if (v->ob_type->tp_as_number != NULL) {
1970 object *x;
1971 if (coerce(&v, &w) != 0)
1972 return NULL;
1973 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1974 DECREF(v);
1975 DECREF(w);
1976 return x;
1977 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 return NULL;
1980}
1981
1982static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001983neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 object *v;
1985{
1986 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001987 return (*v->ob_type->tp_as_number->nb_negative)(v);
1988 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 return NULL;
1990}
1991
1992static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 object *v;
1995{
1996 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001997 return (*v->ob_type->tp_as_number->nb_positive)(v);
1998 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 return NULL;
2000}
2001
2002static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002003invert(v)
2004 object *v;
2005{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002006 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002007 if (v->ob_type->tp_as_number != NULL &&
2008 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2009 return (*f)(v);
2010 err_setstr(TypeError, "bad operand type(s) for unary ~");
2011 return NULL;
2012}
2013
2014static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002015not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 object *v;
2017{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002018 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002019 object *w;
2020 if (outcome < 0)
2021 return NULL;
2022 if (outcome == 0)
2023 w = True;
2024 else
2025 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002026 INCREF(w);
2027 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028}
Guido van Rossum234f9421993-06-17 12:35:49 +00002029
2030
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002031/* External interface to call any callable object. The arg may be NULL. */
2032
2033object *
2034call_object(func, arg)
2035 object *func;
2036 object *arg;
2037{
Guido van Rossume59214e1994-08-30 08:01:59 +00002038 binaryfunc call;
2039 object *result;
2040
2041 if (call = func->ob_type->tp_call) {
2042 int size = gettuplesize(arg);
2043 if (arg) {
2044 size = gettuplesize(arg);
2045 if (size == 1)
2046 arg = gettupleitem(arg, 0);
2047 else if (size == 0)
2048 arg = NULL;
2049 }
2050 result = (*call)(func, arg);
2051 }
2052 else if (is_instancemethodobject(func) || is_funcobject(func))
2053 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002054 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002055 result = call_builtin(func, arg);
2056
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002057 if (result == NULL && !err_occurred())
2058 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002059
2060 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002061}
2062
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002064call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068 if (is_methodobject(func)) {
2069 method meth = getmethod(func);
2070 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002071 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2072 int size = gettuplesize(arg);
2073 if (size == 1)
2074 arg = gettupleitem(arg, 0);
2075 else if (size == 0)
2076 arg = NULL;
2077 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002078 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 }
2080 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002081 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002083 if (is_instanceobject(func)) {
2084 object *res, *call = getattr(func,"__call__");
2085 if (call == NULL) {
2086 err_clear();
2087 err_setstr(AttributeError, "no __call__ method defined");
2088 return NULL;
2089 }
2090 res = call_object(call, arg);
2091 DECREF(call);
2092 return res;
2093 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 return NULL;
2096}
2097
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103 object *newarg = NULL;
2104 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002105 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002106 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002107 object *argdefs;
2108 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109
Guido van Rossume8122f11991-05-05 20:03:07 +00002110 if (is_instancemethodobject(func)) {
2111 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002112 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002113 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002114 if (self == NULL) {
2115 /* Unbound methods must be called with an instance of
2116 the class (or a derived class) as first argument */
2117 if (arg != NULL && is_tupleobject(arg) &&
2118 gettuplesize(arg) >= 1) {
2119 self = gettupleitem(arg, 0);
2120 if (self != NULL &&
2121 is_instanceobject(self) &&
2122 issubclass((object *)
2123 (((instanceobject *)self)->in_class),
2124 class))
2125 /* self = self */ ;
2126 else
2127 self = NULL;
2128 }
2129 if (self == NULL) {
2130 err_setstr(TypeError,
2131 "unbound method must be called with class instance argument");
2132 return NULL;
2133 }
2134 }
2135 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002136 if (arg == NULL)
2137 argcount = 0;
2138 else if (is_tupleobject(arg))
2139 argcount = gettuplesize(arg);
2140 else
2141 argcount = 1;
2142 newarg = newtupleobject(argcount + 1);
2143 if (newarg == NULL)
2144 return NULL;
2145 INCREF(self);
2146 settupleitem(newarg, 0, self);
2147 if (arg != NULL && !is_tupleobject(arg)) {
2148 INCREF(arg);
2149 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002150 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002151 else {
2152 int i;
2153 object *v;
2154 for (i = 0; i < argcount; i++) {
2155 v = gettupleitem(arg, i);
2156 XINCREF(v);
2157 settupleitem(newarg, i+1, v);
2158 }
2159 }
2160 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 }
2162 }
2163 else {
2164 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002165 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 return NULL;
2167 }
2168 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002169
2170 argdefs = getfuncargstuff(func, &argcount);
2171 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2172 int actualcount, j;
2173 /* Process default arguments */
2174 if (argcount & 0x4000)
2175 argcount ^= 0x4000;
2176 actualcount = gettuplesize(arg);
2177 j = gettuplesize(argdefs) - (argcount - actualcount);
2178 if (actualcount < argcount && j >= 0) {
2179 int i;
2180 object *v;
2181 if (newarg == NULL)
2182 INCREF(arg);
2183 newarg = newtupleobject(argcount);
2184 if (newarg == NULL) {
2185 DECREF(arg);
2186 return NULL;
2187 }
2188 for (i = 0; i < actualcount; i++) {
2189 v = gettupleitem(arg, i);
2190 XINCREF(v);
2191 settupleitem(newarg, i, v);
2192 }
2193 for (; i < argcount; i++, j++) {
2194 v = gettupleitem(argdefs, j);
2195 XINCREF(v);
2196 settupleitem(newarg, i, v);
2197 }
2198 DECREF(arg);
2199 arg = newarg;
2200 }
2201 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 co = getfunccode(func);
2204 if (co == NULL) {
2205 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 return NULL;
2207 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002208 if (!is_codeobject(co))
2209 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002210 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002212 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 return NULL;
2214 }
2215
Guido van Rossum3f5da241990-12-20 15:06:42 +00002216 newglobals = getfuncglobals(func);
2217 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218
Guido van Rossum81daa321993-05-20 14:24:46 +00002219 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220
Guido van Rossum3f5da241990-12-20 15:06:42 +00002221 DECREF(newlocals);
2222 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223
Guido van Rossum3f5da241990-12-20 15:06:42 +00002224 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225
2226 return v;
2227}
2228
2229static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002230apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 object *v, *w;
2232{
2233 typeobject *tp = v->ob_type;
2234 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002235 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 return NULL;
2237 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002238 if (tp->tp_as_mapping != NULL) {
2239 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2240 }
2241 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242 int i;
2243 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 return NULL;
2246 }
2247 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002248 if (i < 0) {
2249 int len = (*tp->tp_as_sequence->sq_length)(v);
2250 if (len < 0)
2251 return NULL;
2252 i += len;
2253 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002254 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256}
2257
2258static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002259loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 object *v, *w;
2261{
2262 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002263 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002265 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 return NULL;
2267 }
2268 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002269 v = (*sq->sq_item)(v, i);
2270 if (v)
2271 return v;
2272 if (err_occurred() == IndexError)
2273 err_clear();
2274 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275}
2276
2277static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002278slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 object *v;
2280 int isize;
2281 int *pi;
2282{
2283 if (v != NULL) {
2284 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002285 err_setstr(TypeError, "slice index must be int");
2286 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 }
2288 *pi = getintvalue(v);
2289 if (*pi < 0)
2290 *pi += isize;
2291 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293}
2294
2295static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002296apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 object *u, *v, *w;
2298{
2299 typeobject *tp = u->ob_type;
2300 int ilow, ihigh, isize;
2301 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002302 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 return NULL;
2304 }
2305 ilow = 0;
2306 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002307 if (isize < 0)
2308 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002311 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315
2316static int
2317assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 object *w;
2319 object *key;
2320 object *v;
2321{
2322 typeobject *tp = w->ob_type;
2323 sequence_methods *sq;
2324 mapping_methods *mp;
2325 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002326 if ((mp = tp->tp_as_mapping) != NULL &&
2327 (func = mp->mp_ass_subscript) != NULL) {
2328 return (*func)(w, key, v);
2329 }
2330 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 (func = sq->sq_ass_item) != NULL) {
2332 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002334 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002337 else {
2338 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002339 if (i < 0) {
2340 int len = (*sq->sq_length)(w);
2341 if (len < 0)
2342 return -1;
2343 i += len;
2344 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002345 return (*func)(w, i, v);
2346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 err_setstr(TypeError,
2350 "can't assign to this subscripted object");
2351 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353}
2354
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355static int
2356assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 object *u, *v, *w, *x;
2358{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002361 if (sq == NULL) {
2362 err_setstr(TypeError, "assign to slice of non-sequence");
2363 return -1;
2364 }
2365 if (sq == NULL || sq->sq_ass_slice == NULL) {
2366 err_setstr(TypeError, "unassignable slice");
2367 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 }
2369 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002371 if (isize < 0)
2372 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002373 if (slice_index(v, isize, &ilow) != 0)
2374 return -1;
2375 if (slice_index(w, isize, &ihigh) != 0)
2376 return -1;
2377 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378}
2379
2380static int
2381cmp_exception(err, v)
2382 object *err, *v;
2383{
2384 if (is_tupleobject(v)) {
2385 int i, n;
2386 n = gettuplesize(v);
2387 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002388 /* Test recursively */
2389 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 return 1;
2391 }
2392 return 0;
2393 }
2394 return err == v;
2395}
2396
Guido van Rossum3f5da241990-12-20 15:06:42 +00002397static int
2398cmp_member(v, w)
2399 object *v, *w;
2400{
Guido van Rossume59214e1994-08-30 08:01:59 +00002401 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002402 object *x;
2403 sequence_methods *sq;
2404 /* Special case for char in string */
2405 if (is_stringobject(w)) {
2406 register char *s, *end;
2407 register char c;
2408 if (!is_stringobject(v) || getstringsize(v) != 1) {
2409 err_setstr(TypeError,
2410 "string member test needs char left operand");
2411 return -1;
2412 }
2413 c = getstringvalue(v)[0];
2414 s = getstringvalue(w);
2415 end = s + getstringsize(w);
2416 while (s < end) {
2417 if (c == *s++)
2418 return 1;
2419 }
2420 return 0;
2421 }
2422 sq = w->ob_type->tp_as_sequence;
2423 if (sq == NULL) {
2424 err_setstr(TypeError,
2425 "'in' or 'not in' needs sequence right argument");
2426 return -1;
2427 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002428 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002429 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002430 if (x == NULL) {
2431 if (err_occurred() == IndexError) {
2432 err_clear();
2433 break;
2434 }
2435 return -1;
2436 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 cmp = cmpobject(v, x);
2438 XDECREF(x);
2439 if (cmp == 0)
2440 return 1;
2441 }
2442 return 0;
2443}
2444
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002446cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002447 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 register object *v;
2449 register object *w;
2450{
2451 register int cmp;
2452 register int res = 0;
2453 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002454 case IS:
2455 case IS_NOT:
2456 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002457 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002458 res = !res;
2459 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 case IN:
2461 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 res = cmp_member(v, w);
2463 if (res < 0)
2464 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002465 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 break;
2468 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 break;
2471 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 cmp = cmpobject(v, w);
2473 switch (op) {
2474 case LT: res = cmp < 0; break;
2475 case LE: res = cmp <= 0; break;
2476 case EQ: res = cmp == 0; break;
2477 case NE: res = cmp != 0; break;
2478 case GT: res = cmp > 0; break;
2479 case GE: res = cmp >= 0; break;
2480 /* XXX no default? (res is initialized to 0 though) */
2481 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 }
2483 v = res ? True : False;
2484 INCREF(v);
2485 return v;
2486}
2487
Guido van Rossum3f5da241990-12-20 15:06:42 +00002488static int
2489import_from(locals, v, name)
2490 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002491 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002492 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002493{
2494 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002495 if (!is_moduleobject(v)) {
2496 err_setstr(TypeError, "import-from require module object");
2497 return -1;
2498 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002499 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002500 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002501 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002502 object *name, *value;
2503 pos = 0;
2504 while (mappinggetnext(w, &pos, &name, &value)) {
2505 if (!is_stringobject(name) ||
2506 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002507 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002508 if (is_accessobject(value)) {
2509 value = getaccessvalue(value, (object *)NULL);
2510 if (value == NULL) {
2511 err_clear();
2512 continue;
2513 }
2514 }
2515 else
2516 INCREF(value);
2517 err = dict2insert(locals, name, value);
2518 DECREF(value);
2519 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002520 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002521 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002522 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002523 }
2524 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002525 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002526 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002527 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002528 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002529 getstringvalue(name));
2530 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002531 return -1;
2532 }
2533 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002534 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002535 }
2536}
2537
2538static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002539build_class(methods, bases, name)
2540 object *methods; /* dictionary */
2541 object *bases; /* tuple containing classes */
2542 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002543{
Guido van Rossum25831651993-05-19 14:50:45 +00002544 int i;
2545 if (!is_tupleobject(bases)) {
2546 err_setstr(SystemError, "build_class with non-tuple bases");
2547 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002548 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002549 if (gettuplesize(bases) > 0) {
2550 object *base;
2551 base = gettupleitem(bases, 0);
2552 /* Call the base's *type*, if it is callable.
2553 This code is a hook for Donald Beaudry's type extensions.
2554 In unexended Python it will never be triggered since its
2555 types are not callable. */
2556 if (base->ob_type->ob_type->tp_call) {
2557 object *args;
2558 object *class;
2559 args = mkvalue("(OOO)", name, bases, methods);
2560 class = call_object((object *)base->ob_type, args);
2561 DECREF(args);
2562 return class;
2563 }
2564 }
Guido van Rossum25831651993-05-19 14:50:45 +00002565 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002566 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002567 return NULL;
2568 }
Guido van Rossum25831651993-05-19 14:50:45 +00002569 if (!is_stringobject(name)) {
2570 err_setstr(SystemError, "build_class witn non-string name");
2571 return NULL;
2572 }
2573 for (i = gettuplesize(bases); --i >= 0; ) {
2574 object *base = gettupleitem(bases, i);
2575 if (!is_classobject(base)) {
2576 err_setstr(TypeError,
2577 "base is not a class object");
2578 return NULL;
2579 }
2580 }
2581 return newclassobject(bases, methods, name);
2582}
2583
2584static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002585access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002586 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002587 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002588 frameobject *f;
2589{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002590 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002591 object *value, *ac;
2592 typeobject *type;
2593 int fastind, ret;
2594 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002595 if (f->f_localmap == NULL)
2596 value = dict2lookup(f->f_locals, name);
2597 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002598 object *map = f->f_localmap;
2599 value = NULL;
2600 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2601 object *fname = gettupleitem(map, fastind);
2602 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002603 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002604 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002605 }
2606 }
2607 }
2608 if (value && is_accessobject(value)) {
2609 err_setstr(AccessError, "can't override access");
2610 return -1;
2611 }
2612 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002613 if (value != NULL && value != None)
2614 type = value->ob_type;
2615 else
2616 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002617 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002618 if (ac == NULL)
2619 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002620 if (fastind >= 0)
2621 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002622 else {
2623 ret = dict2insert(f->f_locals, name, ac);
2624 DECREF(ac);
2625 }
2626 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002627}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002628
2629static int
2630exec_statement(prog, globals, locals)
2631 object *prog;
2632 object *globals;
2633 object *locals;
2634{
2635 char *s;
2636 int n;
2637
2638 if (is_tupleobject(prog) && globals == None && locals == None &&
2639 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2640 /* Backward compatibility hack */
2641 globals = gettupleitem(prog, 1);
2642 if (n == 3)
2643 locals = gettupleitem(prog, 2);
2644 prog = gettupleitem(prog, 0);
2645 }
2646 if (globals == None) {
2647 globals = getglobals();
2648 if (locals == None)
2649 locals = getlocals();
2650 }
2651 else if (locals == None)
2652 locals = globals;
2653 if (!is_stringobject(prog) &&
2654 !is_codeobject(prog) &&
2655 !is_fileobject(prog)) {
2656 err_setstr(TypeError,
2657 "exec 1st arg must be string, code or file object");
2658 return -1;
2659 }
2660 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2661 err_setstr(TypeError,
2662 "exec 2nd/3rd args must be dict or None");
2663 return -1;
2664 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002665 if (dictlookup(globals, "__builtins__") == NULL)
2666 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002667 if (is_codeobject(prog)) {
2668 if (eval_code((codeobject *) prog, globals, locals,
2669 (object *)NULL, (object *)NULL) == NULL)
2670 return -1;
2671 return 0;
2672 }
2673 if (is_fileobject(prog)) {
2674 FILE *fp = getfilefile(prog);
2675 char *name = getstringvalue(getfilename(prog));
2676 if (run_file(fp, name, file_input, globals, locals) == NULL)
2677 return -1;
2678 return 0;
2679 }
2680 s = getstringvalue(prog);
2681 if (strlen(s) != getstringsize(prog)) {
2682 err_setstr(ValueError, "embedded '\\0' in exec string");
2683 return -1;
2684 }
2685 if (run_string(s, file_input, globals, locals) == NULL)
2686 return -1;
2687 return 0;
2688}