blob: 2d16ef8a9e9bb7cc121b9dfcbd1d1a3e2f470f2e [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"
Guido van Rossum94390ec1995-01-12 11:37:57 +000031#include "bltinmodule.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000034#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000036#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "traceback.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000038#include "graminit.h"
39#include "pythonrun.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040
Guido van Rossumc6004111993-11-05 10:22:19 +000041#include <ctype.h>
42
Guido van Rossume59214e1994-08-30 08:01:59 +000043extern int suppress_print; /* Declared in pythonrun.c, set in pythonmain.c */
44
Guido van Rossum04691fc1992-08-12 15:35:34 +000045/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000046/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000047
Guido van Rossumacbe8da1993-04-15 15:33:52 +000048/* Turn this on if you want to debug the interpreter: */
49/* (This can be on even if NDEBUG is defined) */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050/* #define DEBUG 1 */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000051
52#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000053/* For debugging the interpreter: */
54#define LLTRACE 1 /* Low-level trace feature */
55#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000056#endif
57
Guido van Rossum5b722181993-03-30 17:46:03 +000058
Guido van Rossum374a9221991-04-04 10:40:29 +000059/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000060
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
62static int prtrace PROTO((object *, char *));
63#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000064static void call_exc_trace PROTO((object **, object**, frameobject *));
65static int call_trace
66 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000067static object *add PROTO((object *, object *));
68static object *sub PROTO((object *, object *));
69static object *mul PROTO((object *, object *));
70static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000071static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000072static object *neg PROTO((object *));
73static object *pos PROTO((object *));
74static object *not PROTO((object *));
75static object *invert PROTO((object *));
76static object *lshift PROTO((object *, object *));
77static object *rshift PROTO((object *, object *));
78static object *and PROTO((object *, object *));
79static object *xor PROTO((object *, object *));
80static object *or PROTO((object *, object *));
81static object *call_builtin PROTO((object *, object *));
82static object *call_function PROTO((object *, object *));
83static object *apply_subscript PROTO((object *, object *));
84static object *loop_subscript PROTO((object *, object *));
85static int slice_index PROTO((object *, int, int *));
86static object *apply_slice PROTO((object *, object *, object *));
87static int assign_subscript PROTO((object *, object *, object *));
88static int assign_slice PROTO((object *, object *, object *, object *));
89static int cmp_exception PROTO((object *, object *));
90static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000091static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000092static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000093static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000094static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000095static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum0a066c01992-03-27 17:29:15 +000098/* Pointer to current frame, used to link new frames to */
99
Guido van Rossum374a9221991-04-04 10:40:29 +0000100static frameobject *current_frame;
101
Guido van Rossume59214e1994-08-30 08:01:59 +0000102#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000103
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104#include <errno.h>
105#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
Guido van Rossuma9672091994-09-14 13:31:22 +0000107static type_lock interpreter_lock = 0;
108static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109
110void
111init_save_thread()
112{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000114 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115 interpreter_lock = allocate_lock();
116 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000117 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000119
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120#endif
121
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122/* Functions save_thread and restore_thread are always defined so
123 dynamically loaded modules needn't be compiled separately for use
124 with and without threads: */
125
Guido van Rossum04691fc1992-08-12 15:35:34 +0000126object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127save_thread()
128{
Guido van Rossume59214e1994-08-30 08:01:59 +0000129#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000131 object *res;
132 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133 current_frame = NULL;
134 release_lock(interpreter_lock);
135 return res;
136 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000138 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139}
140
141void
142restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000143 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144{
Guido van Rossume59214e1994-08-30 08:01:59 +0000145#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 if (interpreter_lock) {
147 int err;
148 err = errno;
149 acquire_lock(interpreter_lock, 1);
150 errno = err;
151 current_frame = (frameobject *)x;
152 }
153#endif
154}
155
156
Guido van Rossuma9672091994-09-14 13:31:22 +0000157/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
158 signal handlers or Mac I/O completion routines) can schedule calls
159 to a function to be called synchronously.
160 The synchronous function is called with one void* argument.
161 It should return 0 for success or -1 for failure -- failure should
162 be accompanied by an exception.
163
164 If registry succeeds, the registry function returns 0; if it fails
165 (e.g. due to too many pending calls) it returns -1 (without setting
166 an exception condition).
167
168 Note that because registry may occur from within signal handlers,
169 or other asynchronous events, calling malloc() is unsafe!
170
171#ifdef WITH_THREAD
172 Any thread can schedule pending calls, but only the main thread
173 will execute them.
174#endif
175
176 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
177 There are two possible race conditions:
178 (1) nested asynchronous registry calls;
179 (2) registry calls made while pending calls are being processed.
180 While (1) is very unlikely, (2) is a real possibility.
181 The current code is safe against (2), but not against (1).
182 The safety against (2) is derived from the fact that only one
183 thread (the main thread) ever takes things out of the queue.
184*/
185
186#define NPENDINGCALLS 32
187static struct {
188 int (*func) PROTO((ANY *));
189 ANY *arg;
190} pendingcalls[NPENDINGCALLS];
191static volatile int pendingfirst = 0;
192static volatile int pendinglast = 0;
193
194int
195Py_AddPendingCall(func, arg)
196 int (*func) PROTO((ANY *));
197 ANY *arg;
198{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000199 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000200 int i, j;
201 /* XXX Begin critical section */
202 /* XXX If you want this to be safe against nested
203 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000204 if (busy)
205 return -1;
206 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000207 i = pendinglast;
208 j = (i + 1) % NPENDINGCALLS;
209 if (j == pendingfirst)
210 return -1; /* Queue full */
211 pendingcalls[i].func = func;
212 pendingcalls[i].arg = arg;
213 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000215 /* XXX End critical section */
216 return 0;
217}
218
Guido van Rossum180d7b41994-09-29 09:45:57 +0000219int
220Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000221{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000222 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000223#ifdef WITH_THREAD
224 if (get_thread_ident() != main_thread)
225 return 0;
226#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000227 if (busy)
228 return 0;
229 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000230 for (;;) {
231 int i;
232 int (*func) PROTO((ANY *));
233 ANY *arg;
234 i = pendingfirst;
235 if (i == pendinglast)
236 break; /* Queue empty */
237 func = pendingcalls[i].func;
238 arg = pendingcalls[i].arg;
239 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000240 if (func(arg) < 0) {
241 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000242 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000243 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 return 0;
247}
248
249
Guido van Rossum374a9221991-04-04 10:40:29 +0000250/* Status code for main loop (reason for stack unwind) */
251
252enum why_code {
253 WHY_NOT, /* No error */
254 WHY_EXCEPTION, /* Exception occurred */
255 WHY_RERAISE, /* Exception re-raised by 'finally' */
256 WHY_RETURN, /* 'return' statement */
257 WHY_BREAK /* 'break' statement */
258};
259
260
261/* Interpreter main loop */
262
263object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000264eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000265 codeobject *co;
266 object *globals;
267 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000268 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000269 object *arg;
270{
271 register unsigned char *next_instr;
272 register int opcode; /* Current opcode */
273 register int oparg; /* Current opcode argument, if any */
274 register object **stack_pointer;
275 register enum why_code why; /* Reason for block stack unwind */
276 register int err; /* Error status -- nonzero if error */
277 register object *x; /* Result object -- NULL if error */
278 register object *v; /* Temporary objects popped off stack */
279 register object *w;
280 register object *u;
281 register object *t;
282 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000283 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000284 object *retval; /* Return value iff why == WHY_RETURN */
285 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000286 int needmerge = 0; /* Set if need to merge locals back at end */
287 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000288#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000289 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000290#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000291#ifdef DEBUG
292 /* Make it easier to find out where we are with dbx */
293 char *filename = getstringvalue(co->co_filename);
294#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000295
296/* Code access macros */
297
298#define GETCONST(i) Getconst(f, i)
299#define GETNAME(i) Getname(f, i)
300#define GETNAMEV(i) Getnamev(f, i)
301#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
302#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
303#define NEXTOP() (*next_instr++)
304#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
305#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
306#define JUMPBY(x) (next_instr += (x))
307
308/* Stack manipulation macros */
309
310#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
311#define EMPTY() (STACK_LEVEL() == 0)
312#define TOP() (stack_pointer[-1])
313#define BASIC_PUSH(v) (*stack_pointer++ = (v))
314#define BASIC_POP() (*--stack_pointer)
315
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000316#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
317 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
318
Guido van Rossum96a42c81992-01-12 02:29:51 +0000319#ifdef LLTRACE
320#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
321#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000322#else
323#define PUSH(v) BASIC_PUSH(v)
324#define POP() BASIC_POP()
325#endif
326
Guido van Rossum6135a871995-01-09 17:53:26 +0000327 if (globals == NULL || locals == NULL) {
328 err_setstr(SystemError, "eval_code: NULL globals or locals");
329 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000330 }
331
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000332#ifdef LLTRACE
333 lltrace = dictlookup(globals, "__lltrace__") != NULL;
334#endif
335
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 f = newframeobject(
337 current_frame, /*back*/
338 co, /*code*/
339 globals, /*globals*/
340 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000341 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 50, /*nvalues*/
343 20); /*nblocks*/
344 if (f == NULL)
345 return NULL;
346
347 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000348
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000349 if (sys_trace != NULL) {
350 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000351 be called on *every* entry to a code block.
352 Its return value, if not None, is a function that
353 will be called at the start of each executed line
354 of code. (Actually, the function must return
355 itself in order to continue tracing.)
356 The trace functions are called with three arguments:
357 a pointer to the current frame, a string indicating
358 why the function is called, and an argument which
359 depends on the situation. The global trace function
360 (sys.trace) is also called whenever an exception
361 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000362 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000363 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000364 current_frame = f->f_back;
365 DECREF(f);
366 return NULL;
367 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000368 }
369
370 if (sys_profile != NULL) {
371 /* Similar for sys_profile, except it needn't return
372 itself and isn't called for "line" events */
373 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
374 current_frame = f->f_back;
375 DECREF(f);
376 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000377 }
378 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000379
Guido van Rossum374a9221991-04-04 10:40:29 +0000380 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000381 stack_pointer = f->f_valuestack;
382
383 if (arg != NULL) {
384 INCREF(arg);
385 PUSH(arg);
386 }
387
388 why = WHY_NOT;
389 err = 0;
390 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000391
392 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000393 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000394
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000395 /* Do periodic things.
396 Doing this every time through the loop would add
397 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000398 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000399
Guido van Rossuma9672091994-09-14 13:31:22 +0000400 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 why = WHY_EXCEPTION;
403 goto on_error;
404 }
405 }
406
Guido van Rossum374a9221991-04-04 10:40:29 +0000407 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000408 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000409 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000411 goto on_error;
412 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000413
Guido van Rossume59214e1994-08-30 08:01:59 +0000414#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415 if (interpreter_lock) {
416 /* Give another thread a chance */
417
418 current_frame = NULL;
419 release_lock(interpreter_lock);
420
421 /* Other threads may run now */
422
423 acquire_lock(interpreter_lock, 1);
424 current_frame = f;
425 }
426#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000427 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428
Guido van Rossum374a9221991-04-04 10:40:29 +0000429 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000430
431#ifdef DEBUG
432 f->f_lasti = INSTR_OFFSET();
433#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000434
435 opcode = NEXTOP();
436 if (HAS_ARG(opcode))
437 oparg = NEXTARG();
438
Guido van Rossum96a42c81992-01-12 02:29:51 +0000439#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000440 /* Instruction tracing */
441
Guido van Rossum96a42c81992-01-12 02:29:51 +0000442 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000443 if (HAS_ARG(opcode)) {
444 printf("%d: %d, %d\n",
445 (int) (INSTR_OFFSET() - 3),
446 opcode, oparg);
447 }
448 else {
449 printf("%d: %d\n",
450 (int) (INSTR_OFFSET() - 1), opcode);
451 }
452 }
453#endif
454
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000455 if (!CHECK_STACK(3)) {
456 x = NULL;
457 break;
458 }
459
Guido van Rossum374a9221991-04-04 10:40:29 +0000460 /* Main switch on opcode */
461
462 switch (opcode) {
463
464 /* BEWARE!
465 It is essential that any operation that fails sets either
466 x to NULL, err to nonzero, or why to anything but WHY_NOT,
467 and that no operation that succeeds does this! */
468
469 /* case STOP_CODE: this is an error! */
470
471 case POP_TOP:
472 v = POP();
473 DECREF(v);
474 break;
475
476 case ROT_TWO:
477 v = POP();
478 w = POP();
479 PUSH(v);
480 PUSH(w);
481 break;
482
483 case ROT_THREE:
484 v = POP();
485 w = POP();
486 x = POP();
487 PUSH(v);
488 PUSH(x);
489 PUSH(w);
490 break;
491
492 case DUP_TOP:
493 v = TOP();
494 INCREF(v);
495 PUSH(v);
496 break;
497
498 case UNARY_POSITIVE:
499 v = POP();
500 x = pos(v);
501 DECREF(v);
502 PUSH(x);
503 break;
504
505 case UNARY_NEGATIVE:
506 v = POP();
507 x = neg(v);
508 DECREF(v);
509 PUSH(x);
510 break;
511
512 case UNARY_NOT:
513 v = POP();
514 x = not(v);
515 DECREF(v);
516 PUSH(x);
517 break;
518
519 case UNARY_CONVERT:
520 v = POP();
521 x = reprobject(v);
522 DECREF(v);
523 PUSH(x);
524 break;
525
526 case UNARY_CALL:
527 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000528 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000529 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000530 DECREF(v);
531 PUSH(x);
532 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000533
534 case UNARY_INVERT:
535 v = POP();
536 x = invert(v);
537 DECREF(v);
538 PUSH(x);
539 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000540
541 case BINARY_MULTIPLY:
542 w = POP();
543 v = POP();
544 x = mul(v, w);
545 DECREF(v);
546 DECREF(w);
547 PUSH(x);
548 break;
549
550 case BINARY_DIVIDE:
551 w = POP();
552 v = POP();
553 x = divide(v, w);
554 DECREF(v);
555 DECREF(w);
556 PUSH(x);
557 break;
558
559 case BINARY_MODULO:
560 w = POP();
561 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000562 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000563 DECREF(v);
564 DECREF(w);
565 PUSH(x);
566 break;
567
568 case BINARY_ADD:
569 w = POP();
570 v = POP();
571 x = add(v, w);
572 DECREF(v);
573 DECREF(w);
574 PUSH(x);
575 break;
576
577 case BINARY_SUBTRACT:
578 w = POP();
579 v = POP();
580 x = sub(v, w);
581 DECREF(v);
582 DECREF(w);
583 PUSH(x);
584 break;
585
586 case BINARY_SUBSCR:
587 w = POP();
588 v = POP();
589 x = apply_subscript(v, w);
590 DECREF(v);
591 DECREF(w);
592 PUSH(x);
593 break;
594
595 case BINARY_CALL:
596 w = POP();
597 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000598 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000599 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 DECREF(v);
601 DECREF(w);
602 PUSH(x);
603 break;
604
Guido van Rossum7928cd71991-10-24 14:59:31 +0000605 case BINARY_LSHIFT:
606 w = POP();
607 v = POP();
608 x = lshift(v, w);
609 DECREF(v);
610 DECREF(w);
611 PUSH(x);
612 break;
613
614 case BINARY_RSHIFT:
615 w = POP();
616 v = POP();
617 x = rshift(v, w);
618 DECREF(v);
619 DECREF(w);
620 PUSH(x);
621 break;
622
623 case BINARY_AND:
624 w = POP();
625 v = POP();
626 x = and(v, w);
627 DECREF(v);
628 DECREF(w);
629 PUSH(x);
630 break;
631
632 case BINARY_XOR:
633 w = POP();
634 v = POP();
635 x = xor(v, w);
636 DECREF(v);
637 DECREF(w);
638 PUSH(x);
639 break;
640
641 case BINARY_OR:
642 w = POP();
643 v = POP();
644 x = or(v, w);
645 DECREF(v);
646 DECREF(w);
647 PUSH(x);
648 break;
649
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 case SLICE+0:
651 case SLICE+1:
652 case SLICE+2:
653 case SLICE+3:
654 if ((opcode-SLICE) & 2)
655 w = POP();
656 else
657 w = NULL;
658 if ((opcode-SLICE) & 1)
659 v = POP();
660 else
661 v = NULL;
662 u = POP();
663 x = apply_slice(u, v, w);
664 DECREF(u);
665 XDECREF(v);
666 XDECREF(w);
667 PUSH(x);
668 break;
669
670 case STORE_SLICE+0:
671 case STORE_SLICE+1:
672 case STORE_SLICE+2:
673 case STORE_SLICE+3:
674 if ((opcode-STORE_SLICE) & 2)
675 w = POP();
676 else
677 w = NULL;
678 if ((opcode-STORE_SLICE) & 1)
679 v = POP();
680 else
681 v = NULL;
682 u = POP();
683 t = POP();
684 err = assign_slice(u, v, w, t); /* u[v:w] = t */
685 DECREF(t);
686 DECREF(u);
687 XDECREF(v);
688 XDECREF(w);
689 break;
690
691 case DELETE_SLICE+0:
692 case DELETE_SLICE+1:
693 case DELETE_SLICE+2:
694 case DELETE_SLICE+3:
695 if ((opcode-DELETE_SLICE) & 2)
696 w = POP();
697 else
698 w = NULL;
699 if ((opcode-DELETE_SLICE) & 1)
700 v = POP();
701 else
702 v = NULL;
703 u = POP();
704 err = assign_slice(u, v, w, (object *)NULL);
705 /* del u[v:w] */
706 DECREF(u);
707 XDECREF(v);
708 XDECREF(w);
709 break;
710
711 case STORE_SUBSCR:
712 w = POP();
713 v = POP();
714 u = POP();
715 /* v[w] = u */
716 err = assign_subscript(v, w, u);
717 DECREF(u);
718 DECREF(v);
719 DECREF(w);
720 break;
721
722 case DELETE_SUBSCR:
723 w = POP();
724 v = POP();
725 /* del v[w] */
726 err = assign_subscript(v, w, (object *)NULL);
727 DECREF(v);
728 DECREF(w);
729 break;
730
731 case PRINT_EXPR:
732 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000734 /* Before printing, also assign to '_' */
735 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000736 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000737 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000739 x = sysget("stdout");
740 softspace(x, 1);
741 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 flushline();
743 }
744 DECREF(v);
745 break;
746
747 case PRINT_ITEM:
748 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000749 w = sysget("stdout");
750 if (softspace(w, 1))
751 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000752 err = writeobject(v, w, PRINT_RAW);
753 if (err == 0 && is_stringobject(v)) {
754 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 char *s = getstringvalue(v);
756 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000757 if (len > 0 && isspace(s[len-1]) &&
758 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000759 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 DECREF(v);
762 break;
763
764 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000765 x = sysget("stdout");
766 if (x == NULL)
767 err_setstr(RuntimeError, "lost sys.stdout");
768 else {
769 writestring("\n", x);
770 softspace(x, 0);
771 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 break;
773
774 case BREAK_LOOP:
775 why = WHY_BREAK;
776 break;
777
778 case RAISE_EXCEPTION:
779 v = POP();
780 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000781 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000782 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000783 u = w;
784 w = gettupleitem(u, 0);
785 DECREF(u);
786 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 if (!is_stringobject(w))
788 err_setstr(TypeError,
789 "exceptions must be strings");
790 else
791 err_setval(w, v);
792 DECREF(v);
793 DECREF(w);
794 why = WHY_EXCEPTION;
795 break;
796
797 case LOAD_LOCALS:
798 v = f->f_locals;
799 INCREF(v);
800 PUSH(v);
801 break;
802
803 case RETURN_VALUE:
804 retval = POP();
805 why = WHY_RETURN;
806 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000807
808 case LOAD_GLOBALS:
809 v = f->f_locals;
810 INCREF(v);
811 PUSH(v);
812 break;
813
814 case EXEC_STMT:
815 w = POP();
816 v = POP();
817 u = POP();
818 err = exec_statement(u, v, w);
819 DECREF(u);
820 DECREF(v);
821 DECREF(w);
822 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000823
Guido van Rossum374a9221991-04-04 10:40:29 +0000824 case BUILD_FUNCTION:
825 v = POP();
826 x = newfuncobject(v, f->f_globals);
827 DECREF(v);
828 PUSH(x);
829 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000830
831 case SET_FUNC_ARGS:
832 v = POP(); /* The function */
833 w = POP(); /* The argument list */
834 err = setfuncargstuff(v, oparg, w);
835 PUSH(v);
836 DECREF(w);
837 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000838
839 case POP_BLOCK:
840 {
841 block *b = pop_block(f);
842 while (STACK_LEVEL() > b->b_level) {
843 v = POP();
844 DECREF(v);
845 }
846 }
847 break;
848
849 case END_FINALLY:
850 v = POP();
851 if (is_intobject(v)) {
852 why = (enum why_code) getintvalue(v);
853 if (why == WHY_RETURN)
854 retval = POP();
855 }
856 else if (is_stringobject(v)) {
857 w = POP();
858 err_setval(v, w);
859 DECREF(w);
860 w = POP();
861 tb_store(w);
862 DECREF(w);
863 why = WHY_RERAISE;
864 }
865 else if (v != None) {
866 err_setstr(SystemError,
867 "'finally' pops bad exception");
868 why = WHY_EXCEPTION;
869 }
870 DECREF(v);
871 break;
872
873 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000874 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000876 w = POP();
877 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000879 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 DECREF(v);
881 DECREF(w);
882 break;
883
884 case STORE_NAME:
885 w = GETNAMEV(oparg);
886 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000887 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000888 if (u == NULL) {
889 if (defmode != 0) {
890 if (v != None)
891 u = (object *)v->ob_type;
892 else
893 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000894 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000895 (typeobject *)u,
896 defmode);
897 DECREF(v);
898 if (x == NULL)
899 break;
900 v = x;
901 }
902 }
903 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000904 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000905 DECREF(v);
906 break;
907 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 err = dict2insert(f->f_locals, w, v);
909 DECREF(v);
910 break;
911
912 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000913 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000914 u = dict2lookup(f->f_locals, w);
915 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000916 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000917 (object *)NULL);
918 break;
919 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000920 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000921 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923
924#ifdef CASE_TOO_BIG
925 default: switch (opcode) {
926#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000927
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000928 case UNPACK_VARARG:
929 if (EMPTY()) {
930 err_setstr(TypeError,
931 "no argument list");
932 why = WHY_EXCEPTION;
933 break;
934 }
935 v = POP();
936 if (!is_tupleobject(v)) {
937 err_setstr(TypeError,
938 "bad argument list");
939 why = WHY_EXCEPTION;
940 }
941 else if (gettuplesize(v) < oparg) {
942 err_setstr(TypeError,
943 "not enough arguments");
944 why = WHY_EXCEPTION;
945 }
946 else if (oparg == 0) {
947 PUSH(v);
948 break;
949 }
950 else {
951 x = gettupleslice(v, oparg, gettuplesize(v));
952 if (x != NULL) {
953 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000954 if (!CHECK_STACK(oparg)) {
955 x = NULL;
956 break;
957 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000958 for (; --oparg >= 0; ) {
959 w = gettupleitem(v, oparg);
960 INCREF(w);
961 PUSH(w);
962 }
963 }
964 }
965 DECREF(v);
966 break;
967
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000968 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000969 {
970 int n;
971 if (EMPTY()) {
972 err_setstr(TypeError,
973 "no argument list");
974 why = WHY_EXCEPTION;
975 break;
976 }
977 v = POP();
978 if (!is_tupleobject(v)) {
979 err_setstr(TypeError,
980 "bad argument list");
981 why = WHY_EXCEPTION;
982 break;
983 }
984 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000985#ifdef COMPAT_HACKS
986/* Implement various compatibility hacks (for 0.9.4 or earlier):
987 (a) f(a,b,...) accepts f((1,2,...))
988 (b) f((a,b,...)) accepts f(1,2,...)
989 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
990*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000991 if (n == 1 && oparg != 1) {
992 /* Rule (a) */
993 w = gettupleitem(v, 0);
994 if (is_tupleobject(w)) {
995 INCREF(w);
996 DECREF(v);
997 v = w;
998 n = gettuplesize(v);
999 }
1000 }
1001 else if (n != 1 && oparg == 1) {
1002 /* Rule (b) */
1003 PUSH(v);
1004 break;
1005 /* Don't fall through */
1006 }
1007 else if (n > 2 && oparg == 2) {
1008 /* Rule (c) */
1009 int i;
1010 w = newtupleobject(n-1);
1011 u = newtupleobject(2);
1012 if (u == NULL || w == NULL) {
1013 XDECREF(w);
1014 XDECREF(u);
1015 DECREF(v);
1016 why = WHY_EXCEPTION;
1017 break;
1018 }
1019 t = gettupleitem(v, 0);
1020 INCREF(t);
1021 settupleitem(u, 0, t);
1022 for (i = 1; i < n; i++) {
1023 t = gettupleitem(v, i);
1024 INCREF(t);
1025 settupleitem(w, i-1, t);
1026 }
1027 settupleitem(u, 1, w);
1028 DECREF(v);
1029 v = u;
1030 n = 2;
1031 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001032#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001033 if (n != oparg) {
1034 err_setstr(TypeError,
1035 "arg count mismatch");
1036 why = WHY_EXCEPTION;
1037 DECREF(v);
1038 break;
1039 }
1040 PUSH(v);
1041 }
1042 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 case UNPACK_TUPLE:
1044 v = POP();
1045 if (!is_tupleobject(v)) {
1046 err_setstr(TypeError, "unpack non-tuple");
1047 why = WHY_EXCEPTION;
1048 }
1049 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001050 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 "unpack tuple of wrong size");
1052 why = WHY_EXCEPTION;
1053 }
1054 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001055 if (!CHECK_STACK(oparg)) {
1056 x = NULL;
1057 break;
1058 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001059 for (; --oparg >= 0; ) {
1060 w = gettupleitem(v, oparg);
1061 INCREF(w);
1062 PUSH(w);
1063 }
1064 }
1065 DECREF(v);
1066 break;
1067
1068 case UNPACK_LIST:
1069 v = POP();
1070 if (!is_listobject(v)) {
1071 err_setstr(TypeError, "unpack non-list");
1072 why = WHY_EXCEPTION;
1073 }
1074 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001075 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 "unpack list of wrong size");
1077 why = WHY_EXCEPTION;
1078 }
1079 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001080 if (!CHECK_STACK(oparg)) {
1081 x = NULL;
1082 break;
1083 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001084 for (; --oparg >= 0; ) {
1085 w = getlistitem(v, oparg);
1086 INCREF(w);
1087 PUSH(w);
1088 }
1089 }
1090 DECREF(v);
1091 break;
1092
1093 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001094 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 v = POP();
1096 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001097 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 DECREF(v);
1099 DECREF(u);
1100 break;
1101
1102 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001103 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001104 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001105 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 DECREF(v);
1107 break;
1108
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001109 case STORE_GLOBAL:
1110 w = GETNAMEV(oparg);
1111 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001112 u = dict2lookup(f->f_locals, w);
1113 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001114 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001115 DECREF(v);
1116 break;
1117 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001118 err = dict2insert(f->f_globals, w, v);
1119 DECREF(v);
1120 break;
1121
1122 case DELETE_GLOBAL:
1123 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001124 u = dict2lookup(f->f_locals, w);
1125 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001126 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001127 (object *)NULL);
1128 break;
1129 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001130 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001131 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001132 break;
1133
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 case LOAD_CONST:
1135 x = GETCONST(oparg);
1136 INCREF(x);
1137 PUSH(x);
1138 break;
1139
1140 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001141 w = GETNAMEV(oparg);
1142 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001144 err_clear();
1145 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001147 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001148 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001150 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 break;
1152 }
1153 }
1154 }
Guido van Rossum25831651993-05-19 14:50:45 +00001155 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001156 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001157 if (x == NULL)
1158 break;
1159 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001160 else
1161 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 PUSH(x);
1163 break;
1164
1165 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001166 w = GETNAMEV(oparg);
1167 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001169 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001170 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001172 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 break;
1174 }
1175 }
Guido van Rossum25831651993-05-19 14:50:45 +00001176 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001177 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001178 if (x == NULL)
1179 break;
1180 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001181 else
1182 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 PUSH(x);
1184 break;
1185
1186 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001187 w = GETNAMEV(oparg);
1188 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001190 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 break;
1192 }
Guido van Rossum25831651993-05-19 14:50:45 +00001193 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001194 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001195 if (x == NULL)
1196 break;
1197 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001198 else
1199 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 PUSH(x);
1201 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001202
1203 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001204 x = GETCONST(oparg);
1205 if (x == None)
1206 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001207 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001208 err_setstr(SystemError, "bad RESERVE_FAST");
1209 x = NULL;
1210 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001211 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001212 XDECREF(f->f_fastlocals);
1213 XDECREF(f->f_localmap);
1214 INCREF(x);
1215 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001216 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001217 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001218 break;
1219
1220 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001221 x = GETLISTITEM(fastlocals, oparg);
1222 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001223 err_setval(NameError,
1224 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001225 break;
1226 }
Guido van Rossum25831651993-05-19 14:50:45 +00001227 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001228 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001229 if (x == NULL)
1230 break;
1231 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001232 else
1233 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001234 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001235 break;
1236
1237 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001238 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001239 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001240 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001241 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001242 DECREF(v);
1243 break;
1244 }
Guido van Rossum25831651993-05-19 14:50:45 +00001245 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001247 break;
1248
1249 case DELETE_FAST:
1250 x = GETLISTITEM(fastlocals, oparg);
1251 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001252 err_setval(NameError,
1253 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001254 break;
1255 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001256 if (x != NULL && is_accessobject(x)) {
1257 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001258 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001259 break;
1260 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001261 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001263 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264
1265 case BUILD_TUPLE:
1266 x = newtupleobject(oparg);
1267 if (x != NULL) {
1268 for (; --oparg >= 0;) {
1269 w = POP();
1270 err = settupleitem(x, oparg, w);
1271 if (err != 0)
1272 break;
1273 }
1274 PUSH(x);
1275 }
1276 break;
1277
1278 case BUILD_LIST:
1279 x = newlistobject(oparg);
1280 if (x != NULL) {
1281 for (; --oparg >= 0;) {
1282 w = POP();
1283 err = setlistitem(x, oparg, w);
1284 if (err != 0)
1285 break;
1286 }
1287 PUSH(x);
1288 }
1289 break;
1290
1291 case BUILD_MAP:
1292 x = newdictobject();
1293 PUSH(x);
1294 break;
1295
1296 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001297 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001299 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 DECREF(v);
1301 PUSH(x);
1302 break;
1303
1304 case COMPARE_OP:
1305 w = POP();
1306 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001307 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 DECREF(v);
1309 DECREF(w);
1310 PUSH(x);
1311 break;
1312
1313 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001315 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316 if (x == NULL) {
1317 err_setstr(ImportError,
1318 "__import__ not found");
1319 break;
1320 }
1321 w = mkvalue("(O)", w);
1322 if (w == NULL) {
1323 x = NULL;
1324 break;
1325 }
1326 x = call_object(x, w);
1327 DECREF(w);
1328 if (x)
1329 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 break;
1331
1332 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001333 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001335 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001336 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001338
1339 case ACCESS_MODE:
1340 v = POP();
1341 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001342 if (getstringvalue(w)[0] == '*')
1343 defmode = getintvalue(v);
1344 else
1345 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001346 DECREF(v);
1347 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001348
1349 case JUMP_FORWARD:
1350 JUMPBY(oparg);
1351 break;
1352
1353 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001354 err = testbool(TOP());
1355 if (err > 0)
1356 err = 0;
1357 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 JUMPBY(oparg);
1359 break;
1360
1361 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001362 err = testbool(TOP());
1363 if (err > 0) {
1364 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001366 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
1368
1369 case JUMP_ABSOLUTE:
1370 JUMPTO(oparg);
1371 break;
1372
1373 case FOR_LOOP:
1374 /* for v in s: ...
1375 On entry: stack contains s, i.
1376 On exit: stack contains s, i+1, s[i];
1377 but if loop exhausted:
1378 s, i are popped, and we jump */
1379 w = POP(); /* Loop index */
1380 v = POP(); /* Sequence object */
1381 u = loop_subscript(v, w);
1382 if (u != NULL) {
1383 PUSH(v);
1384 x = newintobject(getintvalue(w)+1);
1385 PUSH(x);
1386 DECREF(w);
1387 PUSH(u);
1388 }
1389 else {
1390 DECREF(v);
1391 DECREF(w);
1392 /* A NULL can mean "s exhausted"
1393 but also an error: */
1394 if (err_occurred())
1395 why = WHY_EXCEPTION;
1396 else
1397 JUMPBY(oparg);
1398 }
1399 break;
1400
1401 case SETUP_LOOP:
1402 case SETUP_EXCEPT:
1403 case SETUP_FINALLY:
1404 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1405 STACK_LEVEL());
1406 break;
1407
1408 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001409#ifdef LLTRACE
1410 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001411 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001412#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001413 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001414 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001415 /* Trace each line of code reached */
1416 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001417 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001418 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001419 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 break;
1421
1422 default:
1423 fprintf(stderr,
1424 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001425 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 err_setstr(SystemError, "eval_code: unknown opcode");
1427 why = WHY_EXCEPTION;
1428 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001429
1430#ifdef CASE_TOO_BIG
1431 }
1432#endif
1433
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 } /* switch */
1435
1436 on_error:
1437
1438 /* Quickly continue if no error occurred */
1439
1440 if (why == WHY_NOT) {
1441 if (err == 0 && x != NULL)
1442 continue; /* Normal, fast path */
1443 why = WHY_EXCEPTION;
1444 x = None;
1445 err = 0;
1446 }
1447
Guido van Rossum801dcae1992-04-08 11:32:32 +00001448#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 /* Double-check exception status */
1450
1451 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1452 if (!err_occurred()) {
1453 fprintf(stderr, "XXX ghost error\n");
1454 err_setstr(SystemError, "ghost error");
1455 why = WHY_EXCEPTION;
1456 }
1457 }
1458 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001459 if (err_occurred())
1460 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 }
1462#endif
1463
1464 /* Log traceback info if this is a real exception */
1465
1466 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001467 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001469 f->f_lasti -= 2;
1470 tb_here(f);
1471
Guido van Rossume59214e1994-08-30 08:01:59 +00001472 if (f->f_trace)
1473 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001474 if (sys_profile)
1475 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 }
1477
1478 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1479
1480 if (why == WHY_RERAISE)
1481 why = WHY_EXCEPTION;
1482
1483 /* Unwind stacks if a (pseudo) exception occurred */
1484
1485 while (why != WHY_NOT && f->f_iblock > 0) {
1486 block *b = pop_block(f);
1487 while (STACK_LEVEL() > b->b_level) {
1488 v = POP();
1489 XDECREF(v);
1490 }
1491 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1492 why = WHY_NOT;
1493 JUMPTO(b->b_handler);
1494 break;
1495 }
1496 if (b->b_type == SETUP_FINALLY ||
1497 b->b_type == SETUP_EXCEPT &&
1498 why == WHY_EXCEPTION) {
1499 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001500 object *exc, *val, *tb;
1501 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 if (val == NULL) {
1503 val = None;
1504 INCREF(val);
1505 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 /* Make the raw exception data
1507 available to the handler,
1508 so a program can emulate the
1509 Python main loop. Don't do
1510 this for 'finally'. */
1511 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 sysset("exc_value", val);
1514 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001516 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 PUSH(val);
1518 PUSH(exc);
1519 }
1520 else {
1521 if (why == WHY_RETURN)
1522 PUSH(retval);
1523 v = newintobject((long)why);
1524 PUSH(v);
1525 }
1526 why = WHY_NOT;
1527 JUMPTO(b->b_handler);
1528 break;
1529 }
1530 } /* unwind stack */
1531
1532 /* End the loop if we still have an error (or return) */
1533
1534 if (why != WHY_NOT)
1535 break;
1536
1537 } /* main loop */
1538
1539 /* Pop remaining stack entries */
1540
1541 while (!EMPTY()) {
1542 v = POP();
1543 XDECREF(v);
1544 }
1545
Guido van Rossum96a42c81992-01-12 02:29:51 +00001546 if (why != WHY_RETURN)
1547 retval = NULL;
1548
Guido van Rossume59214e1994-08-30 08:01:59 +00001549 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001550 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001551 if (call_trace(&f->f_trace, &f->f_trace, f,
1552 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001553 XDECREF(retval);
1554 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001555 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001556 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001557 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001558 }
1559
1560 if (sys_profile && why == WHY_RETURN) {
1561 if (call_trace(&sys_profile, (object**)0,
1562 f, "return", retval)) {
1563 XDECREF(retval);
1564 retval = NULL;
1565 why = WHY_EXCEPTION;
1566 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001567 }
1568
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 /* Restore previous frame and release the current one */
1570
1571 current_frame = f->f_back;
1572 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001573
1574 if (needmerge)
1575 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001576
Guido van Rossum96a42c81992-01-12 02:29:51 +00001577 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001578}
1579
Guido van Rossum96a42c81992-01-12 02:29:51 +00001580#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001581static int
1582prtrace(v, str)
1583 object *v;
1584 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001586 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001587 if (printobject(v, stdout, 0) != 0)
1588 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001589 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001591#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001593static void
1594call_exc_trace(p_trace, p_newtrace, f)
1595 object **p_trace, **p_newtrace;
1596 frameobject *f;
1597{
1598 object *type, *value, *traceback, *arg;
1599 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001600 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001601 if (value == NULL) {
1602 value = None;
1603 INCREF(value);
1604 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001605 arg = mkvalue("(OOO)", type, value, traceback);
1606 if (arg == NULL) {
1607 err_restore(type, value, traceback);
1608 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001609 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001610 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1611 DECREF(arg);
1612 if (err == 0)
1613 err_restore(type, value, traceback);
1614 else {
1615 XDECREF(type);
1616 XDECREF(value);
1617 XDECREF(traceback);
1618 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001619}
1620
1621static int
1622call_trace(p_trace, p_newtrace, f, msg, arg)
1623 object **p_trace; /* in/out; may not be NULL;
1624 may not point to NULL variable initially */
1625 object **p_newtrace; /* in/out; may be NULL;
1626 may point to NULL variable;
1627 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001628 frameobject *f;
1629 char *msg;
1630 object *arg;
1631{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001632 object *arglist, *what;
1633 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001634 static int tracing = 0;
1635
1636 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001637 /* Don't do recursive traces */
1638 if (p_newtrace) {
1639 XDECREF(*p_newtrace);
1640 *p_newtrace = NULL;
1641 }
1642 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001643 }
1644
1645 arglist = newtupleobject(3);
1646 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001647 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001648 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001649 if (what == NULL)
1650 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001651 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001652 settupleitem(arglist, 0, (object *)f);
1653 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001654 if (arg == NULL)
1655 arg = None;
1656 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001657 settupleitem(arglist, 2, arg);
1658 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001659 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001660 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001661 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001662 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001663 cleanup:
1664 XDECREF(arglist);
1665 if (res == NULL) {
1666 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001667 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001668 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001669 *p_trace = NULL;
1670 if (p_newtrace) {
1671 XDECREF(*p_newtrace);
1672 *p_newtrace = NULL;
1673 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001674 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001675 }
1676 else {
1677 if (p_newtrace) {
1678 XDECREF(*p_newtrace);
1679 if (res == None)
1680 *p_newtrace = NULL;
1681 else {
1682 INCREF(res);
1683 *p_newtrace = res;
1684 }
1685 }
1686 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001687 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001688 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001689}
1690
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001692getbuiltins()
1693{
1694 if (current_frame == NULL)
Guido van Rossum94390ec1995-01-12 11:37:57 +00001695 return getbuiltindict();
Guido van Rossum6135a871995-01-09 17:53:26 +00001696 else
1697 return current_frame->f_builtins;
1698}
1699
1700object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001701getlocals()
1702{
1703 if (current_frame == NULL)
1704 return NULL;
1705 fast_2_locals(current_frame);
1706 return current_frame->f_locals;
1707}
1708
1709object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710getglobals()
1711{
1712 if (current_frame == NULL)
1713 return NULL;
1714 else
1715 return current_frame->f_globals;
1716}
1717
Guido van Rossum81daa321993-05-20 14:24:46 +00001718object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001719getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001720{
1721 if (current_frame == NULL)
1722 return NULL;
1723 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001724 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001725}
1726
Guido van Rossume59214e1994-08-30 08:01:59 +00001727object *
1728getframe()
1729{
1730 return (object *)current_frame;
1731}
1732
Guido van Rossum6135a871995-01-09 17:53:26 +00001733int
1734getrestricted()
1735{
1736 return current_frame == NULL ? 0 : current_frame->f_restricted;
1737}
1738
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740flushline()
1741{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001742 object *f = sysget("stdout");
1743 if (softspace(f, 0))
1744 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745}
1746
Guido van Rossum3f5da241990-12-20 15:06:42 +00001747
Guido van Rossum06186511995-01-07 12:40:10 +00001748#define BINOP(opname, ropname, thisfunc) \
1749 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1750 ; \
1751 else \
1752 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001753
1754
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001756or(v, w)
1757 object *v, *w;
1758{
Guido van Rossum06186511995-01-07 12:40:10 +00001759 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001760 if (v->ob_type->tp_as_number != NULL) {
1761 object *x;
1762 object * (*f) FPROTO((object *, object *));
1763 if (coerce(&v, &w) != 0)
1764 return NULL;
1765 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1766 x = (*f)(v, w);
1767 DECREF(v);
1768 DECREF(w);
1769 if (f != NULL)
1770 return x;
1771 }
1772 err_setstr(TypeError, "bad operand type(s) for |");
1773 return NULL;
1774}
1775
1776static object *
1777xor(v, w)
1778 object *v, *w;
1779{
Guido van Rossum06186511995-01-07 12:40:10 +00001780 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001781 if (v->ob_type->tp_as_number != NULL) {
1782 object *x;
1783 object * (*f) FPROTO((object *, object *));
1784 if (coerce(&v, &w) != 0)
1785 return NULL;
1786 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1787 x = (*f)(v, w);
1788 DECREF(v);
1789 DECREF(w);
1790 if (f != NULL)
1791 return x;
1792 }
1793 err_setstr(TypeError, "bad operand type(s) for ^");
1794 return NULL;
1795}
1796
1797static object *
1798and(v, w)
1799 object *v, *w;
1800{
Guido van Rossum06186511995-01-07 12:40:10 +00001801 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001802 if (v->ob_type->tp_as_number != NULL) {
1803 object *x;
1804 object * (*f) FPROTO((object *, object *));
1805 if (coerce(&v, &w) != 0)
1806 return NULL;
1807 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1808 x = (*f)(v, w);
1809 DECREF(v);
1810 DECREF(w);
1811 if (f != NULL)
1812 return x;
1813 }
1814 err_setstr(TypeError, "bad operand type(s) for &");
1815 return NULL;
1816}
1817
1818static object *
1819lshift(v, w)
1820 object *v, *w;
1821{
Guido van Rossum06186511995-01-07 12:40:10 +00001822 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001823 if (v->ob_type->tp_as_number != NULL) {
1824 object *x;
1825 object * (*f) FPROTO((object *, object *));
1826 if (coerce(&v, &w) != 0)
1827 return NULL;
1828 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1829 x = (*f)(v, w);
1830 DECREF(v);
1831 DECREF(w);
1832 if (f != NULL)
1833 return x;
1834 }
1835 err_setstr(TypeError, "bad operand type(s) for <<");
1836 return NULL;
1837}
1838
1839static object *
1840rshift(v, w)
1841 object *v, *w;
1842{
Guido van Rossum06186511995-01-07 12:40:10 +00001843 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001844 if (v->ob_type->tp_as_number != NULL) {
1845 object *x;
1846 object * (*f) FPROTO((object *, object *));
1847 if (coerce(&v, &w) != 0)
1848 return NULL;
1849 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1850 x = (*f)(v, w);
1851 DECREF(v);
1852 DECREF(w);
1853 if (f != NULL)
1854 return x;
1855 }
1856 err_setstr(TypeError, "bad operand type(s) for >>");
1857 return NULL;
1858}
1859
1860static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001861add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 object *v, *w;
1863{
Guido van Rossum06186511995-01-07 12:40:10 +00001864 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001865 if (v->ob_type->tp_as_sequence != NULL)
1866 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1867 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001868 object *x;
1869 if (coerce(&v, &w) != 0)
1870 return NULL;
1871 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1872 DECREF(v);
1873 DECREF(w);
1874 return x;
1875 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001876 err_setstr(TypeError, "bad operand type(s) for +");
1877 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878}
1879
1880static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001881sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 object *v, *w;
1883{
Guido van Rossum06186511995-01-07 12:40:10 +00001884 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001885 if (v->ob_type->tp_as_number != NULL) {
1886 object *x;
1887 if (coerce(&v, &w) != 0)
1888 return NULL;
1889 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1890 DECREF(v);
1891 DECREF(w);
1892 return x;
1893 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001894 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 return NULL;
1896}
1897
1898static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001899mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 object *v, *w;
1901{
1902 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001903 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001904 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001905 if (tp->tp_as_number != NULL &&
1906 w->ob_type->tp_as_sequence != NULL &&
1907 !is_instanceobject(v)) {
1908 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 object *tmp = v;
1910 v = w;
1911 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001912 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001914 if (tp->tp_as_number != NULL) {
1915 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001916 if (is_instanceobject(v)) {
1917 /* Instances of user-defined classes get their
1918 other argument uncoerced, so they may
1919 implement sequence*number as well as
1920 number*number. */
1921 INCREF(v);
1922 INCREF(w);
1923 }
1924 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001925 return NULL;
1926 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1927 DECREF(v);
1928 DECREF(w);
1929 return x;
1930 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 if (tp->tp_as_sequence != NULL) {
1932 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933 err_setstr(TypeError,
1934 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 return NULL;
1936 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001937 return (*tp->tp_as_sequence->sq_repeat)
1938 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001940 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 return NULL;
1942}
1943
1944static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001945divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946 object *v, *w;
1947{
Guido van Rossum06186511995-01-07 12:40:10 +00001948 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001949 if (v->ob_type->tp_as_number != NULL) {
1950 object *x;
1951 if (coerce(&v, &w) != 0)
1952 return NULL;
1953 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1954 DECREF(v);
1955 DECREF(w);
1956 return x;
1957 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 return NULL;
1960}
1961
1962static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001963mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 object *v, *w;
1965{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001966 if (is_stringobject(v)) {
1967 return formatstring(v, w);
1968 }
Guido van Rossum06186511995-01-07 12:40:10 +00001969 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001970 if (v->ob_type->tp_as_number != NULL) {
1971 object *x;
1972 if (coerce(&v, &w) != 0)
1973 return NULL;
1974 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1975 DECREF(v);
1976 DECREF(w);
1977 return x;
1978 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001979 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 return NULL;
1981}
1982
1983static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001984neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 object *v;
1986{
1987 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988 return (*v->ob_type->tp_as_number->nb_negative)(v);
1989 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 return NULL;
1991}
1992
1993static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 object *v;
1996{
1997 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001998 return (*v->ob_type->tp_as_number->nb_positive)(v);
1999 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 return NULL;
2001}
2002
2003static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002004invert(v)
2005 object *v;
2006{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002007 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002008 if (v->ob_type->tp_as_number != NULL &&
2009 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2010 return (*f)(v);
2011 err_setstr(TypeError, "bad operand type(s) for unary ~");
2012 return NULL;
2013}
2014
2015static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 object *v;
2018{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002020 object *w;
2021 if (outcome < 0)
2022 return NULL;
2023 if (outcome == 0)
2024 w = True;
2025 else
2026 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002027 INCREF(w);
2028 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029}
Guido van Rossum234f9421993-06-17 12:35:49 +00002030
2031
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002032/* External interface to call any callable object. The arg may be NULL. */
2033
2034object *
2035call_object(func, arg)
2036 object *func;
2037 object *arg;
2038{
Guido van Rossume59214e1994-08-30 08:01:59 +00002039 binaryfunc call;
2040 object *result;
2041
2042 if (call = func->ob_type->tp_call) {
2043 int size = gettuplesize(arg);
2044 if (arg) {
2045 size = gettuplesize(arg);
2046 if (size == 1)
2047 arg = gettupleitem(arg, 0);
2048 else if (size == 0)
2049 arg = NULL;
2050 }
2051 result = (*call)(func, arg);
2052 }
2053 else if (is_instancemethodobject(func) || is_funcobject(func))
2054 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002055 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002056 result = call_builtin(func, arg);
2057
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002058 if (result == NULL && !err_occurred())
2059 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002060
2061 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002062}
2063
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002065call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002067 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 if (is_methodobject(func)) {
2070 method meth = getmethod(func);
2071 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002072 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2073 int size = gettuplesize(arg);
2074 if (size == 1)
2075 arg = gettupleitem(arg, 0);
2076 else if (size == 0)
2077 arg = NULL;
2078 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 }
2081 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002082 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002084 if (is_instanceobject(func)) {
2085 object *res, *call = getattr(func,"__call__");
2086 if (call == NULL) {
2087 err_clear();
2088 err_setstr(AttributeError, "no __call__ method defined");
2089 return NULL;
2090 }
2091 res = call_object(call, arg);
2092 DECREF(call);
2093 return res;
2094 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 return NULL;
2097}
2098
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002102 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002104 object *newarg = NULL;
2105 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002106 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002108 object *argdefs;
2109 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110
Guido van Rossume8122f11991-05-05 20:03:07 +00002111 if (is_instancemethodobject(func)) {
2112 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002113 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002114 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002115 if (self == NULL) {
2116 /* Unbound methods must be called with an instance of
2117 the class (or a derived class) as first argument */
2118 if (arg != NULL && is_tupleobject(arg) &&
2119 gettuplesize(arg) >= 1) {
2120 self = gettupleitem(arg, 0);
2121 if (self != NULL &&
2122 is_instanceobject(self) &&
2123 issubclass((object *)
2124 (((instanceobject *)self)->in_class),
2125 class))
2126 /* self = self */ ;
2127 else
2128 self = NULL;
2129 }
2130 if (self == NULL) {
2131 err_setstr(TypeError,
2132 "unbound method must be called with class instance argument");
2133 return NULL;
2134 }
2135 }
2136 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002137 if (arg == NULL)
2138 argcount = 0;
2139 else if (is_tupleobject(arg))
2140 argcount = gettuplesize(arg);
2141 else
2142 argcount = 1;
2143 newarg = newtupleobject(argcount + 1);
2144 if (newarg == NULL)
2145 return NULL;
2146 INCREF(self);
2147 settupleitem(newarg, 0, self);
2148 if (arg != NULL && !is_tupleobject(arg)) {
2149 INCREF(arg);
2150 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002151 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002152 else {
2153 int i;
2154 object *v;
2155 for (i = 0; i < argcount; i++) {
2156 v = gettupleitem(arg, i);
2157 XINCREF(v);
2158 settupleitem(newarg, i+1, v);
2159 }
2160 }
2161 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 }
2163 }
2164 else {
2165 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002166 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 return NULL;
2168 }
2169 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002170
2171 argdefs = getfuncargstuff(func, &argcount);
2172 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2173 int actualcount, j;
2174 /* Process default arguments */
2175 if (argcount & 0x4000)
2176 argcount ^= 0x4000;
2177 actualcount = gettuplesize(arg);
2178 j = gettuplesize(argdefs) - (argcount - actualcount);
2179 if (actualcount < argcount && j >= 0) {
2180 int i;
2181 object *v;
2182 if (newarg == NULL)
2183 INCREF(arg);
2184 newarg = newtupleobject(argcount);
2185 if (newarg == NULL) {
2186 DECREF(arg);
2187 return NULL;
2188 }
2189 for (i = 0; i < actualcount; i++) {
2190 v = gettupleitem(arg, i);
2191 XINCREF(v);
2192 settupleitem(newarg, i, v);
2193 }
2194 for (; i < argcount; i++, j++) {
2195 v = gettupleitem(argdefs, j);
2196 XINCREF(v);
2197 settupleitem(newarg, i, v);
2198 }
2199 DECREF(arg);
2200 arg = newarg;
2201 }
2202 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203
Guido van Rossum3f5da241990-12-20 15:06:42 +00002204 co = getfunccode(func);
2205 if (co == NULL) {
2206 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 return NULL;
2208 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002209 if (!is_codeobject(co))
2210 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002211 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002213 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 return NULL;
2215 }
2216
Guido van Rossum3f5da241990-12-20 15:06:42 +00002217 newglobals = getfuncglobals(func);
2218 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219
Guido van Rossum81daa321993-05-20 14:24:46 +00002220 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221
Guido van Rossum3f5da241990-12-20 15:06:42 +00002222 DECREF(newlocals);
2223 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224
Guido van Rossum3f5da241990-12-20 15:06:42 +00002225 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226
2227 return v;
2228}
2229
2230static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002231apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 object *v, *w;
2233{
2234 typeobject *tp = v->ob_type;
2235 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002236 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 return NULL;
2238 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002239 if (tp->tp_as_mapping != NULL) {
2240 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2241 }
2242 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 int i;
2244 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002245 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 return NULL;
2247 }
2248 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002249 if (i < 0) {
2250 int len = (*tp->tp_as_sequence->sq_length)(v);
2251 if (len < 0)
2252 return NULL;
2253 i += len;
2254 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002255 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257}
2258
2259static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261 object *v, *w;
2262{
2263 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002264 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002266 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 return NULL;
2268 }
2269 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002270 v = (*sq->sq_item)(v, i);
2271 if (v)
2272 return v;
2273 if (err_occurred() == IndexError)
2274 err_clear();
2275 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276}
2277
2278static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002279slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 object *v;
2281 int isize;
2282 int *pi;
2283{
2284 if (v != NULL) {
2285 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286 err_setstr(TypeError, "slice index must be int");
2287 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 }
2289 *pi = getintvalue(v);
2290 if (*pi < 0)
2291 *pi += isize;
2292 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294}
2295
2296static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002297apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 object *u, *v, *w;
2299{
2300 typeobject *tp = u->ob_type;
2301 int ilow, ihigh, isize;
2302 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002303 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304 return NULL;
2305 }
2306 ilow = 0;
2307 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002308 if (isize < 0)
2309 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002310 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002314 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316
2317static int
2318assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 object *w;
2320 object *key;
2321 object *v;
2322{
2323 typeobject *tp = w->ob_type;
2324 sequence_methods *sq;
2325 mapping_methods *mp;
2326 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002327 if ((mp = tp->tp_as_mapping) != NULL &&
2328 (func = mp->mp_ass_subscript) != NULL) {
2329 return (*func)(w, key, v);
2330 }
2331 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 (func = sq->sq_ass_item) != NULL) {
2333 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002335 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002336 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002338 else {
2339 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002340 if (i < 0) {
2341 int len = (*sq->sq_length)(w);
2342 if (len < 0)
2343 return -1;
2344 i += len;
2345 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002346 return (*func)(w, i, v);
2347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002350 err_setstr(TypeError,
2351 "can't assign to this subscripted object");
2352 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354}
2355
Guido van Rossum3f5da241990-12-20 15:06:42 +00002356static int
2357assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 object *u, *v, *w, *x;
2359{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002360 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002362 if (sq == NULL) {
2363 err_setstr(TypeError, "assign to slice of non-sequence");
2364 return -1;
2365 }
2366 if (sq == NULL || sq->sq_ass_slice == NULL) {
2367 err_setstr(TypeError, "unassignable slice");
2368 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 }
2370 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002372 if (isize < 0)
2373 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002374 if (slice_index(v, isize, &ilow) != 0)
2375 return -1;
2376 if (slice_index(w, isize, &ihigh) != 0)
2377 return -1;
2378 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379}
2380
2381static int
2382cmp_exception(err, v)
2383 object *err, *v;
2384{
2385 if (is_tupleobject(v)) {
2386 int i, n;
2387 n = gettuplesize(v);
2388 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002389 /* Test recursively */
2390 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 return 1;
2392 }
2393 return 0;
2394 }
2395 return err == v;
2396}
2397
Guido van Rossum3f5da241990-12-20 15:06:42 +00002398static int
2399cmp_member(v, w)
2400 object *v, *w;
2401{
Guido van Rossume59214e1994-08-30 08:01:59 +00002402 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002403 object *x;
2404 sequence_methods *sq;
2405 /* Special case for char in string */
2406 if (is_stringobject(w)) {
2407 register char *s, *end;
2408 register char c;
2409 if (!is_stringobject(v) || getstringsize(v) != 1) {
2410 err_setstr(TypeError,
2411 "string member test needs char left operand");
2412 return -1;
2413 }
2414 c = getstringvalue(v)[0];
2415 s = getstringvalue(w);
2416 end = s + getstringsize(w);
2417 while (s < end) {
2418 if (c == *s++)
2419 return 1;
2420 }
2421 return 0;
2422 }
2423 sq = w->ob_type->tp_as_sequence;
2424 if (sq == NULL) {
2425 err_setstr(TypeError,
2426 "'in' or 'not in' needs sequence right argument");
2427 return -1;
2428 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002429 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002430 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002431 if (x == NULL) {
2432 if (err_occurred() == IndexError) {
2433 err_clear();
2434 break;
2435 }
2436 return -1;
2437 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002438 cmp = cmpobject(v, x);
2439 XDECREF(x);
2440 if (cmp == 0)
2441 return 1;
2442 }
2443 return 0;
2444}
2445
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002447cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002448 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 register object *v;
2450 register object *w;
2451{
2452 register int cmp;
2453 register int res = 0;
2454 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455 case IS:
2456 case IS_NOT:
2457 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002458 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459 res = !res;
2460 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 case IN:
2462 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002463 res = cmp_member(v, w);
2464 if (res < 0)
2465 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002466 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002467 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 break;
2469 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002470 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 break;
2472 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002473 cmp = cmpobject(v, w);
2474 switch (op) {
2475 case LT: res = cmp < 0; break;
2476 case LE: res = cmp <= 0; break;
2477 case EQ: res = cmp == 0; break;
2478 case NE: res = cmp != 0; break;
2479 case GT: res = cmp > 0; break;
2480 case GE: res = cmp >= 0; break;
2481 /* XXX no default? (res is initialized to 0 though) */
2482 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 }
2484 v = res ? True : False;
2485 INCREF(v);
2486 return v;
2487}
2488
Guido van Rossum3f5da241990-12-20 15:06:42 +00002489static int
2490import_from(locals, v, name)
2491 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002492 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002493 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002494{
2495 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002496 if (!is_moduleobject(v)) {
2497 err_setstr(TypeError, "import-from require module object");
2498 return -1;
2499 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002500 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002501 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002502 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002503 object *name, *value;
2504 pos = 0;
2505 while (mappinggetnext(w, &pos, &name, &value)) {
2506 if (!is_stringobject(name) ||
2507 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002508 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002509 if (is_accessobject(value)) {
2510 value = getaccessvalue(value, (object *)NULL);
2511 if (value == NULL) {
2512 err_clear();
2513 continue;
2514 }
2515 }
2516 else
2517 INCREF(value);
2518 err = dict2insert(locals, name, value);
2519 DECREF(value);
2520 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002522 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002524 }
2525 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002526 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002528 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002529 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002530 getstringvalue(name));
2531 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002532 return -1;
2533 }
2534 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002535 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002536 }
2537}
2538
2539static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002540build_class(methods, bases, name)
2541 object *methods; /* dictionary */
2542 object *bases; /* tuple containing classes */
2543 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002544{
Guido van Rossum25831651993-05-19 14:50:45 +00002545 int i;
2546 if (!is_tupleobject(bases)) {
2547 err_setstr(SystemError, "build_class with non-tuple bases");
2548 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002549 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002550 if (gettuplesize(bases) > 0) {
2551 object *base;
2552 base = gettupleitem(bases, 0);
2553 /* Call the base's *type*, if it is callable.
2554 This code is a hook for Donald Beaudry's type extensions.
2555 In unexended Python it will never be triggered since its
2556 types are not callable. */
2557 if (base->ob_type->ob_type->tp_call) {
2558 object *args;
2559 object *class;
2560 args = mkvalue("(OOO)", name, bases, methods);
2561 class = call_object((object *)base->ob_type, args);
2562 DECREF(args);
2563 return class;
2564 }
2565 }
Guido van Rossum25831651993-05-19 14:50:45 +00002566 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002567 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002568 return NULL;
2569 }
Guido van Rossum25831651993-05-19 14:50:45 +00002570 if (!is_stringobject(name)) {
2571 err_setstr(SystemError, "build_class witn non-string name");
2572 return NULL;
2573 }
2574 for (i = gettuplesize(bases); --i >= 0; ) {
2575 object *base = gettupleitem(bases, i);
2576 if (!is_classobject(base)) {
2577 err_setstr(TypeError,
2578 "base is not a class object");
2579 return NULL;
2580 }
2581 }
2582 return newclassobject(bases, methods, name);
2583}
2584
2585static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002586access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002587 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002588 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002589 frameobject *f;
2590{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002591 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002592 object *value, *ac;
2593 typeobject *type;
2594 int fastind, ret;
2595 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002596 if (f->f_localmap == NULL)
2597 value = dict2lookup(f->f_locals, name);
2598 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002599 object *map = f->f_localmap;
2600 value = NULL;
2601 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2602 object *fname = gettupleitem(map, fastind);
2603 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002604 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002605 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002606 }
2607 }
2608 }
2609 if (value && is_accessobject(value)) {
2610 err_setstr(AccessError, "can't override access");
2611 return -1;
2612 }
2613 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002614 if (value != NULL && value != None)
2615 type = value->ob_type;
2616 else
2617 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002618 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002619 if (ac == NULL)
2620 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002621 if (fastind >= 0)
2622 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002623 else {
2624 ret = dict2insert(f->f_locals, name, ac);
2625 DECREF(ac);
2626 }
2627 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002628}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002629
2630static int
2631exec_statement(prog, globals, locals)
2632 object *prog;
2633 object *globals;
2634 object *locals;
2635{
2636 char *s;
2637 int n;
2638
2639 if (is_tupleobject(prog) && globals == None && locals == None &&
2640 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2641 /* Backward compatibility hack */
2642 globals = gettupleitem(prog, 1);
2643 if (n == 3)
2644 locals = gettupleitem(prog, 2);
2645 prog = gettupleitem(prog, 0);
2646 }
2647 if (globals == None) {
2648 globals = getglobals();
2649 if (locals == None)
2650 locals = getlocals();
2651 }
2652 else if (locals == None)
2653 locals = globals;
2654 if (!is_stringobject(prog) &&
2655 !is_codeobject(prog) &&
2656 !is_fileobject(prog)) {
2657 err_setstr(TypeError,
2658 "exec 1st arg must be string, code or file object");
2659 return -1;
2660 }
2661 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2662 err_setstr(TypeError,
2663 "exec 2nd/3rd args must be dict or None");
2664 return -1;
2665 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002666 if (dictlookup(globals, "__builtins__") == NULL)
2667 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002668 if (is_codeobject(prog)) {
2669 if (eval_code((codeobject *) prog, globals, locals,
2670 (object *)NULL, (object *)NULL) == NULL)
2671 return -1;
2672 return 0;
2673 }
2674 if (is_fileobject(prog)) {
2675 FILE *fp = getfilefile(prog);
2676 char *name = getstringvalue(getfilename(prog));
2677 if (run_file(fp, name, file_input, globals, locals) == NULL)
2678 return -1;
2679 return 0;
2680 }
2681 s = getstringvalue(prog);
2682 if (strlen(s) != getstringsize(prog)) {
2683 err_setstr(ValueError, "embedded '\\0' in exec string");
2684 return -1;
2685 }
2686 if (run_string(s, file_input, globals, locals) == NULL)
2687 return -1;
2688 return 0;
2689}