blob: 48fce5b6138369f03c54e7cc3d0abdbe56ac4b32 [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 */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000285 int needmerge = 0; /* Set if need to merge locals back at end */
286 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000287#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000288 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000289#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000290#ifdef DEBUG
291 /* Make it easier to find out where we are with dbx */
292 char *filename = getstringvalue(co->co_filename);
293#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000294
295/* Code access macros */
296
297#define GETCONST(i) Getconst(f, i)
298#define GETNAME(i) Getname(f, i)
299#define GETNAMEV(i) Getnamev(f, i)
300#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
301#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
302#define NEXTOP() (*next_instr++)
303#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
304#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
305#define JUMPBY(x) (next_instr += (x))
306
307/* Stack manipulation macros */
308
309#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
310#define EMPTY() (STACK_LEVEL() == 0)
311#define TOP() (stack_pointer[-1])
312#define BASIC_PUSH(v) (*stack_pointer++ = (v))
313#define BASIC_POP() (*--stack_pointer)
314
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000315#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
316 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
317
Guido van Rossum96a42c81992-01-12 02:29:51 +0000318#ifdef LLTRACE
319#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
320#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000321#else
322#define PUSH(v) BASIC_PUSH(v)
323#define POP() BASIC_POP()
324#endif
325
Guido van Rossum6135a871995-01-09 17:53:26 +0000326 if (globals == NULL || locals == NULL) {
327 err_setstr(SystemError, "eval_code: NULL globals or locals");
328 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000329 }
330
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000331#ifdef LLTRACE
332 lltrace = dictlookup(globals, "__lltrace__") != NULL;
333#endif
334
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 f = newframeobject(
336 current_frame, /*back*/
337 co, /*code*/
338 globals, /*globals*/
339 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000340 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000341 50, /*nvalues*/
342 20); /*nblocks*/
343 if (f == NULL)
344 return NULL;
345
346 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000347
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000348 if (sys_trace != NULL) {
349 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000350 be called on *every* entry to a code block.
351 Its return value, if not None, is a function that
352 will be called at the start of each executed line
353 of code. (Actually, the function must return
354 itself in order to continue tracing.)
355 The trace functions are called with three arguments:
356 a pointer to the current frame, a string indicating
357 why the function is called, and an argument which
358 depends on the situation. The global trace function
359 (sys.trace) is also called whenever an exception
360 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000361 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000362 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000363 current_frame = f->f_back;
364 DECREF(f);
365 return NULL;
366 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000367 }
368
369 if (sys_profile != NULL) {
370 /* Similar for sys_profile, except it needn't return
371 itself and isn't called for "line" events */
372 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
373 current_frame = f->f_back;
374 DECREF(f);
375 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000376 }
377 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000378
Guido van Rossum374a9221991-04-04 10:40:29 +0000379 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000380 stack_pointer = f->f_valuestack;
381
382 if (arg != NULL) {
383 INCREF(arg);
384 PUSH(arg);
385 }
386
387 why = WHY_NOT;
388 err = 0;
389 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000390
391 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000392 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000393
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394 /* Do periodic things.
395 Doing this every time through the loop would add
396 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000397 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000398
Guido van Rossuma9672091994-09-14 13:31:22 +0000399 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000400 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000401 why = WHY_EXCEPTION;
402 goto on_error;
403 }
404 }
405
Guido van Rossum374a9221991-04-04 10:40:29 +0000406 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000407 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000408 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000409 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 goto on_error;
411 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412
Guido van Rossume59214e1994-08-30 08:01:59 +0000413#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000414 if (interpreter_lock) {
415 /* Give another thread a chance */
416
417 current_frame = NULL;
418 release_lock(interpreter_lock);
419
420 /* Other threads may run now */
421
422 acquire_lock(interpreter_lock, 1);
423 current_frame = f;
424 }
425#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000426 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427
Guido van Rossum374a9221991-04-04 10:40:29 +0000428 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000429
430#ifdef DEBUG
431 f->f_lasti = INSTR_OFFSET();
432#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000433
434 opcode = NEXTOP();
435 if (HAS_ARG(opcode))
436 oparg = NEXTARG();
437
Guido van Rossum96a42c81992-01-12 02:29:51 +0000438#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000439 /* Instruction tracing */
440
Guido van Rossum96a42c81992-01-12 02:29:51 +0000441 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000442 if (HAS_ARG(opcode)) {
443 printf("%d: %d, %d\n",
444 (int) (INSTR_OFFSET() - 3),
445 opcode, oparg);
446 }
447 else {
448 printf("%d: %d\n",
449 (int) (INSTR_OFFSET() - 1), opcode);
450 }
451 }
452#endif
453
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000454 if (!CHECK_STACK(3)) {
455 x = NULL;
456 break;
457 }
458
Guido van Rossum374a9221991-04-04 10:40:29 +0000459 /* Main switch on opcode */
460
461 switch (opcode) {
462
463 /* BEWARE!
464 It is essential that any operation that fails sets either
465 x to NULL, err to nonzero, or why to anything but WHY_NOT,
466 and that no operation that succeeds does this! */
467
468 /* case STOP_CODE: this is an error! */
469
470 case POP_TOP:
471 v = POP();
472 DECREF(v);
473 break;
474
475 case ROT_TWO:
476 v = POP();
477 w = POP();
478 PUSH(v);
479 PUSH(w);
480 break;
481
482 case ROT_THREE:
483 v = POP();
484 w = POP();
485 x = POP();
486 PUSH(v);
487 PUSH(x);
488 PUSH(w);
489 break;
490
491 case DUP_TOP:
492 v = TOP();
493 INCREF(v);
494 PUSH(v);
495 break;
496
497 case UNARY_POSITIVE:
498 v = POP();
499 x = pos(v);
500 DECREF(v);
501 PUSH(x);
502 break;
503
504 case UNARY_NEGATIVE:
505 v = POP();
506 x = neg(v);
507 DECREF(v);
508 PUSH(x);
509 break;
510
511 case UNARY_NOT:
512 v = POP();
513 x = not(v);
514 DECREF(v);
515 PUSH(x);
516 break;
517
518 case UNARY_CONVERT:
519 v = POP();
520 x = reprobject(v);
521 DECREF(v);
522 PUSH(x);
523 break;
524
525 case UNARY_CALL:
526 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000528 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000529 DECREF(v);
530 PUSH(x);
531 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000532
533 case UNARY_INVERT:
534 v = POP();
535 x = invert(v);
536 DECREF(v);
537 PUSH(x);
538 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000539
540 case BINARY_MULTIPLY:
541 w = POP();
542 v = POP();
543 x = mul(v, w);
544 DECREF(v);
545 DECREF(w);
546 PUSH(x);
547 break;
548
549 case BINARY_DIVIDE:
550 w = POP();
551 v = POP();
552 x = divide(v, w);
553 DECREF(v);
554 DECREF(w);
555 PUSH(x);
556 break;
557
558 case BINARY_MODULO:
559 w = POP();
560 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000561 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000562 DECREF(v);
563 DECREF(w);
564 PUSH(x);
565 break;
566
567 case BINARY_ADD:
568 w = POP();
569 v = POP();
570 x = add(v, w);
571 DECREF(v);
572 DECREF(w);
573 PUSH(x);
574 break;
575
576 case BINARY_SUBTRACT:
577 w = POP();
578 v = POP();
579 x = sub(v, w);
580 DECREF(v);
581 DECREF(w);
582 PUSH(x);
583 break;
584
585 case BINARY_SUBSCR:
586 w = POP();
587 v = POP();
588 x = apply_subscript(v, w);
589 DECREF(v);
590 DECREF(w);
591 PUSH(x);
592 break;
593
594 case BINARY_CALL:
595 w = POP();
596 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000597 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000598 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000599 DECREF(v);
600 DECREF(w);
601 PUSH(x);
602 break;
603
Guido van Rossum7928cd71991-10-24 14:59:31 +0000604 case BINARY_LSHIFT:
605 w = POP();
606 v = POP();
607 x = lshift(v, w);
608 DECREF(v);
609 DECREF(w);
610 PUSH(x);
611 break;
612
613 case BINARY_RSHIFT:
614 w = POP();
615 v = POP();
616 x = rshift(v, w);
617 DECREF(v);
618 DECREF(w);
619 PUSH(x);
620 break;
621
622 case BINARY_AND:
623 w = POP();
624 v = POP();
625 x = and(v, w);
626 DECREF(v);
627 DECREF(w);
628 PUSH(x);
629 break;
630
631 case BINARY_XOR:
632 w = POP();
633 v = POP();
634 x = xor(v, w);
635 DECREF(v);
636 DECREF(w);
637 PUSH(x);
638 break;
639
640 case BINARY_OR:
641 w = POP();
642 v = POP();
643 x = or(v, w);
644 DECREF(v);
645 DECREF(w);
646 PUSH(x);
647 break;
648
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 case SLICE+0:
650 case SLICE+1:
651 case SLICE+2:
652 case SLICE+3:
653 if ((opcode-SLICE) & 2)
654 w = POP();
655 else
656 w = NULL;
657 if ((opcode-SLICE) & 1)
658 v = POP();
659 else
660 v = NULL;
661 u = POP();
662 x = apply_slice(u, v, w);
663 DECREF(u);
664 XDECREF(v);
665 XDECREF(w);
666 PUSH(x);
667 break;
668
669 case STORE_SLICE+0:
670 case STORE_SLICE+1:
671 case STORE_SLICE+2:
672 case STORE_SLICE+3:
673 if ((opcode-STORE_SLICE) & 2)
674 w = POP();
675 else
676 w = NULL;
677 if ((opcode-STORE_SLICE) & 1)
678 v = POP();
679 else
680 v = NULL;
681 u = POP();
682 t = POP();
683 err = assign_slice(u, v, w, t); /* u[v:w] = t */
684 DECREF(t);
685 DECREF(u);
686 XDECREF(v);
687 XDECREF(w);
688 break;
689
690 case DELETE_SLICE+0:
691 case DELETE_SLICE+1:
692 case DELETE_SLICE+2:
693 case DELETE_SLICE+3:
694 if ((opcode-DELETE_SLICE) & 2)
695 w = POP();
696 else
697 w = NULL;
698 if ((opcode-DELETE_SLICE) & 1)
699 v = POP();
700 else
701 v = NULL;
702 u = POP();
703 err = assign_slice(u, v, w, (object *)NULL);
704 /* del u[v:w] */
705 DECREF(u);
706 XDECREF(v);
707 XDECREF(w);
708 break;
709
710 case STORE_SUBSCR:
711 w = POP();
712 v = POP();
713 u = POP();
714 /* v[w] = u */
715 err = assign_subscript(v, w, u);
716 DECREF(u);
717 DECREF(v);
718 DECREF(w);
719 break;
720
721 case DELETE_SUBSCR:
722 w = POP();
723 v = POP();
724 /* del v[w] */
725 err = assign_subscript(v, w, (object *)NULL);
726 DECREF(v);
727 DECREF(w);
728 break;
729
730 case PRINT_EXPR:
731 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000733 /* Before printing, also assign to '_' */
734 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000735 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000736 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000738 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000739 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000740 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000741 flushline();
742 }
743 DECREF(v);
744 break;
745
746 case PRINT_ITEM:
747 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000748 w = sysget("stdout");
749 if (softspace(w, 1))
750 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000751 err = writeobject(v, w, PRINT_RAW);
752 if (err == 0 && is_stringobject(v)) {
753 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 char *s = getstringvalue(v);
755 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000756 if (len > 0 && isspace(s[len-1]) &&
757 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000758 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 DECREF(v);
761 break;
762
763 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000764 x = sysget("stdout");
765 if (x == NULL)
766 err_setstr(RuntimeError, "lost sys.stdout");
767 else {
768 writestring("\n", x);
769 softspace(x, 0);
770 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 break;
772
773 case BREAK_LOOP:
774 why = WHY_BREAK;
775 break;
776
777 case RAISE_EXCEPTION:
778 v = POP();
779 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000780 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000781 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000782 u = w;
783 w = gettupleitem(u, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000784 INCREF(w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000785 DECREF(u);
786 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000787 if (is_stringobject(w)) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 err_setval(w, v);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000789 } else if (is_classobject(w)) {
790 if (!is_instanceobject(v)
791 || !issubclass((object*)((instanceobject*)v)->in_class,
792 w))
793 err_setstr(TypeError,
794 "a class exception must have a value that is an instance of the class");
795 else
796 err_setval(w,v);
797 } else if (is_instanceobject(w)) {
798 if (v != None)
799 err_setstr(TypeError,
800 "an instance exception may not have a separate value");
801 else {
802 DECREF(v);
803 v = w;
804 w = (object*) ((instanceobject*)w)->in_class;
805 INCREF(w);
806 err_setval(w, v);
807 }
808 } else
809 err_setstr(TypeError,
810 "exceptions must be strings, classes, or instances");
Guido van Rossum374a9221991-04-04 10:40:29 +0000811 DECREF(v);
812 DECREF(w);
813 why = WHY_EXCEPTION;
814 break;
815
816 case LOAD_LOCALS:
817 v = f->f_locals;
818 INCREF(v);
819 PUSH(v);
820 break;
821
822 case RETURN_VALUE:
823 retval = POP();
824 why = WHY_RETURN;
825 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000826
827 case LOAD_GLOBALS:
828 v = f->f_locals;
829 INCREF(v);
830 PUSH(v);
831 break;
832
833 case EXEC_STMT:
834 w = POP();
835 v = POP();
836 u = POP();
837 err = exec_statement(u, v, w);
838 DECREF(u);
839 DECREF(v);
840 DECREF(w);
841 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000842
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 case BUILD_FUNCTION:
844 v = POP();
845 x = newfuncobject(v, f->f_globals);
846 DECREF(v);
847 PUSH(x);
848 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000849
850 case SET_FUNC_ARGS:
851 v = POP(); /* The function */
852 w = POP(); /* The argument list */
853 err = setfuncargstuff(v, oparg, w);
854 PUSH(v);
855 DECREF(w);
856 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000857
858 case POP_BLOCK:
859 {
860 block *b = pop_block(f);
861 while (STACK_LEVEL() > b->b_level) {
862 v = POP();
863 DECREF(v);
864 }
865 }
866 break;
867
868 case END_FINALLY:
869 v = POP();
870 if (is_intobject(v)) {
871 why = (enum why_code) getintvalue(v);
872 if (why == WHY_RETURN)
873 retval = POP();
874 }
875 else if (is_stringobject(v)) {
876 w = POP();
877 err_setval(v, w);
878 DECREF(w);
879 w = POP();
880 tb_store(w);
881 DECREF(w);
882 why = WHY_RERAISE;
883 }
884 else if (v != None) {
885 err_setstr(SystemError,
886 "'finally' pops bad exception");
887 why = WHY_EXCEPTION;
888 }
889 DECREF(v);
890 break;
891
892 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000893 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000895 w = POP();
896 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000898 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 DECREF(v);
900 DECREF(w);
901 break;
902
903 case STORE_NAME:
904 w = GETNAMEV(oparg);
905 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000906 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000907 if (u == NULL) {
908 if (defmode != 0) {
909 if (v != None)
910 u = (object *)v->ob_type;
911 else
912 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000913 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000914 (typeobject *)u,
915 defmode);
916 DECREF(v);
917 if (x == NULL)
918 break;
919 v = x;
920 }
921 }
922 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000923 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000924 DECREF(v);
925 break;
926 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 err = dict2insert(f->f_locals, w, v);
928 DECREF(v);
929 break;
930
931 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000932 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000933 u = dict2lookup(f->f_locals, w);
934 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000935 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000936 (object *)NULL);
937 break;
938 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000939 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000940 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000942
943#ifdef CASE_TOO_BIG
944 default: switch (opcode) {
945#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000946
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000947 case UNPACK_VARARG:
948 if (EMPTY()) {
949 err_setstr(TypeError,
950 "no argument list");
951 why = WHY_EXCEPTION;
952 break;
953 }
954 v = POP();
955 if (!is_tupleobject(v)) {
956 err_setstr(TypeError,
957 "bad argument list");
958 why = WHY_EXCEPTION;
959 }
960 else if (gettuplesize(v) < oparg) {
961 err_setstr(TypeError,
962 "not enough arguments");
963 why = WHY_EXCEPTION;
964 }
965 else if (oparg == 0) {
966 PUSH(v);
967 break;
968 }
969 else {
970 x = gettupleslice(v, oparg, gettuplesize(v));
971 if (x != NULL) {
972 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000973 if (!CHECK_STACK(oparg)) {
974 x = NULL;
975 break;
976 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000977 for (; --oparg >= 0; ) {
978 w = gettupleitem(v, oparg);
979 INCREF(w);
980 PUSH(w);
981 }
982 }
983 }
984 DECREF(v);
985 break;
986
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000987 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000988 {
989 int n;
990 if (EMPTY()) {
991 err_setstr(TypeError,
992 "no argument list");
993 why = WHY_EXCEPTION;
994 break;
995 }
996 v = POP();
997 if (!is_tupleobject(v)) {
998 err_setstr(TypeError,
999 "bad argument list");
1000 why = WHY_EXCEPTION;
1001 break;
1002 }
1003 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001004#ifdef COMPAT_HACKS
1005/* Implement various compatibility hacks (for 0.9.4 or earlier):
1006 (a) f(a,b,...) accepts f((1,2,...))
1007 (b) f((a,b,...)) accepts f(1,2,...)
1008 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
1009*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001010 if (n == 1 && oparg != 1) {
1011 /* Rule (a) */
1012 w = gettupleitem(v, 0);
1013 if (is_tupleobject(w)) {
1014 INCREF(w);
1015 DECREF(v);
1016 v = w;
1017 n = gettuplesize(v);
1018 }
1019 }
1020 else if (n != 1 && oparg == 1) {
1021 /* Rule (b) */
1022 PUSH(v);
1023 break;
1024 /* Don't fall through */
1025 }
1026 else if (n > 2 && oparg == 2) {
1027 /* Rule (c) */
1028 int i;
1029 w = newtupleobject(n-1);
1030 u = newtupleobject(2);
1031 if (u == NULL || w == NULL) {
1032 XDECREF(w);
1033 XDECREF(u);
1034 DECREF(v);
1035 why = WHY_EXCEPTION;
1036 break;
1037 }
1038 t = gettupleitem(v, 0);
1039 INCREF(t);
1040 settupleitem(u, 0, t);
1041 for (i = 1; i < n; i++) {
1042 t = gettupleitem(v, i);
1043 INCREF(t);
1044 settupleitem(w, i-1, t);
1045 }
1046 settupleitem(u, 1, w);
1047 DECREF(v);
1048 v = u;
1049 n = 2;
1050 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001051#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001052 if (n != oparg) {
1053 err_setstr(TypeError,
1054 "arg count mismatch");
1055 why = WHY_EXCEPTION;
1056 DECREF(v);
1057 break;
1058 }
1059 PUSH(v);
1060 }
1061 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 case UNPACK_TUPLE:
1063 v = POP();
1064 if (!is_tupleobject(v)) {
1065 err_setstr(TypeError, "unpack non-tuple");
1066 why = WHY_EXCEPTION;
1067 }
1068 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001069 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001070 "unpack tuple of wrong size");
1071 why = WHY_EXCEPTION;
1072 }
1073 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001074 if (!CHECK_STACK(oparg)) {
1075 x = NULL;
1076 break;
1077 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001078 for (; --oparg >= 0; ) {
1079 w = gettupleitem(v, oparg);
1080 INCREF(w);
1081 PUSH(w);
1082 }
1083 }
1084 DECREF(v);
1085 break;
1086
1087 case UNPACK_LIST:
1088 v = POP();
1089 if (!is_listobject(v)) {
1090 err_setstr(TypeError, "unpack non-list");
1091 why = WHY_EXCEPTION;
1092 }
1093 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001094 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 "unpack list of wrong size");
1096 why = WHY_EXCEPTION;
1097 }
1098 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001099 if (!CHECK_STACK(oparg)) {
1100 x = NULL;
1101 break;
1102 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 for (; --oparg >= 0; ) {
1104 w = getlistitem(v, oparg);
1105 INCREF(w);
1106 PUSH(w);
1107 }
1108 }
1109 DECREF(v);
1110 break;
1111
1112 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001113 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001114 v = POP();
1115 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001116 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 DECREF(v);
1118 DECREF(u);
1119 break;
1120
1121 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001122 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001124 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 DECREF(v);
1126 break;
1127
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001128 case STORE_GLOBAL:
1129 w = GETNAMEV(oparg);
1130 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001131 u = dict2lookup(f->f_locals, w);
1132 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001133 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001134 DECREF(v);
1135 break;
1136 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001137 err = dict2insert(f->f_globals, w, v);
1138 DECREF(v);
1139 break;
1140
1141 case DELETE_GLOBAL:
1142 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001143 u = dict2lookup(f->f_locals, w);
1144 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001145 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001146 (object *)NULL);
1147 break;
1148 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001149 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001150 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001151 break;
1152
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 case LOAD_CONST:
1154 x = GETCONST(oparg);
1155 INCREF(x);
1156 PUSH(x);
1157 break;
1158
1159 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001160 w = GETNAMEV(oparg);
1161 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001163 err_clear();
1164 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001166 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001167 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001169 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 break;
1171 }
1172 }
1173 }
Guido van Rossum25831651993-05-19 14:50:45 +00001174 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001175 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001176 if (x == NULL)
1177 break;
1178 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001179 else
1180 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 PUSH(x);
1182 break;
1183
1184 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001185 w = GETNAMEV(oparg);
1186 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001188 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001189 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001191 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 break;
1193 }
1194 }
Guido van Rossum25831651993-05-19 14:50:45 +00001195 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001196 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001197 if (x == NULL)
1198 break;
1199 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001200 else
1201 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001202 PUSH(x);
1203 break;
1204
1205 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001206 w = GETNAMEV(oparg);
1207 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001208 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001209 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 break;
1211 }
Guido van Rossum25831651993-05-19 14:50:45 +00001212 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001213 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001214 if (x == NULL)
1215 break;
1216 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001217 else
1218 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001219 PUSH(x);
1220 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001221
1222 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001223 x = GETCONST(oparg);
1224 if (x == None)
1225 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001226 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001227 err_setstr(SystemError, "bad RESERVE_FAST");
1228 x = NULL;
1229 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001230 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001231 XDECREF(f->f_fastlocals);
1232 XDECREF(f->f_localmap);
1233 INCREF(x);
1234 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001235 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001236 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001237 break;
1238
1239 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001240 x = GETLISTITEM(fastlocals, oparg);
1241 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001242 err_setval(NameError,
1243 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001244 break;
1245 }
Guido van Rossum25831651993-05-19 14:50:45 +00001246 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001247 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001248 if (x == NULL)
1249 break;
1250 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001251 else
1252 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001253 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001254 break;
1255
1256 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001257 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001258 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001259 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001260 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001261 DECREF(v);
1262 break;
1263 }
Guido van Rossum25831651993-05-19 14:50:45 +00001264 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001265 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001266 break;
1267
1268 case DELETE_FAST:
1269 x = GETLISTITEM(fastlocals, oparg);
1270 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001271 err_setval(NameError,
1272 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001273 break;
1274 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001275 if (x != NULL && is_accessobject(x)) {
1276 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001277 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001278 break;
1279 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001280 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001281 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001282 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001283
1284 case BUILD_TUPLE:
1285 x = newtupleobject(oparg);
1286 if (x != NULL) {
1287 for (; --oparg >= 0;) {
1288 w = POP();
1289 err = settupleitem(x, oparg, w);
1290 if (err != 0)
1291 break;
1292 }
1293 PUSH(x);
1294 }
1295 break;
1296
1297 case BUILD_LIST:
1298 x = newlistobject(oparg);
1299 if (x != NULL) {
1300 for (; --oparg >= 0;) {
1301 w = POP();
1302 err = setlistitem(x, oparg, w);
1303 if (err != 0)
1304 break;
1305 }
1306 PUSH(x);
1307 }
1308 break;
1309
1310 case BUILD_MAP:
1311 x = newdictobject();
1312 PUSH(x);
1313 break;
1314
1315 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001316 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001318 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 DECREF(v);
1320 PUSH(x);
1321 break;
1322
1323 case COMPARE_OP:
1324 w = POP();
1325 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001326 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001327 DECREF(v);
1328 DECREF(w);
1329 PUSH(x);
1330 break;
1331
1332 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001334 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335 if (x == NULL) {
1336 err_setstr(ImportError,
1337 "__import__ not found");
1338 break;
1339 }
1340 w = mkvalue("(O)", w);
1341 if (w == NULL) {
1342 x = NULL;
1343 break;
1344 }
1345 x = call_object(x, w);
1346 DECREF(w);
1347 if (x)
1348 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 break;
1350
1351 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001352 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001354 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001355 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001357
1358 case ACCESS_MODE:
1359 v = POP();
1360 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001361 if (getstringvalue(w)[0] == '*')
1362 defmode = getintvalue(v);
1363 else
1364 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001365 DECREF(v);
1366 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001367
1368 case JUMP_FORWARD:
1369 JUMPBY(oparg);
1370 break;
1371
1372 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001373 err = testbool(TOP());
1374 if (err > 0)
1375 err = 0;
1376 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 JUMPBY(oparg);
1378 break;
1379
1380 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001381 err = testbool(TOP());
1382 if (err > 0) {
1383 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001385 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 break;
1387
1388 case JUMP_ABSOLUTE:
1389 JUMPTO(oparg);
1390 break;
1391
1392 case FOR_LOOP:
1393 /* for v in s: ...
1394 On entry: stack contains s, i.
1395 On exit: stack contains s, i+1, s[i];
1396 but if loop exhausted:
1397 s, i are popped, and we jump */
1398 w = POP(); /* Loop index */
1399 v = POP(); /* Sequence object */
1400 u = loop_subscript(v, w);
1401 if (u != NULL) {
1402 PUSH(v);
1403 x = newintobject(getintvalue(w)+1);
1404 PUSH(x);
1405 DECREF(w);
1406 PUSH(u);
1407 }
1408 else {
1409 DECREF(v);
1410 DECREF(w);
1411 /* A NULL can mean "s exhausted"
1412 but also an error: */
1413 if (err_occurred())
1414 why = WHY_EXCEPTION;
1415 else
1416 JUMPBY(oparg);
1417 }
1418 break;
1419
1420 case SETUP_LOOP:
1421 case SETUP_EXCEPT:
1422 case SETUP_FINALLY:
1423 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1424 STACK_LEVEL());
1425 break;
1426
1427 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001428#ifdef LLTRACE
1429 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001430 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001431#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001432 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001433 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001434 /* Trace each line of code reached */
1435 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001436 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001437 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001438 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 break;
1440
1441 default:
1442 fprintf(stderr,
1443 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001444 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 err_setstr(SystemError, "eval_code: unknown opcode");
1446 why = WHY_EXCEPTION;
1447 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001448
1449#ifdef CASE_TOO_BIG
1450 }
1451#endif
1452
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 } /* switch */
1454
1455 on_error:
1456
1457 /* Quickly continue if no error occurred */
1458
1459 if (why == WHY_NOT) {
1460 if (err == 0 && x != NULL)
1461 continue; /* Normal, fast path */
1462 why = WHY_EXCEPTION;
1463 x = None;
1464 err = 0;
1465 }
1466
Guido van Rossum801dcae1992-04-08 11:32:32 +00001467#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 /* Double-check exception status */
1469
1470 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1471 if (!err_occurred()) {
1472 fprintf(stderr, "XXX ghost error\n");
1473 err_setstr(SystemError, "ghost error");
1474 why = WHY_EXCEPTION;
1475 }
1476 }
1477 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001478 if (err_occurred())
1479 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 }
1481#endif
1482
1483 /* Log traceback info if this is a real exception */
1484
1485 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001486 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001488 f->f_lasti -= 2;
1489 tb_here(f);
1490
Guido van Rossume59214e1994-08-30 08:01:59 +00001491 if (f->f_trace)
1492 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001493 if (sys_profile)
1494 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 }
1496
1497 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1498
1499 if (why == WHY_RERAISE)
1500 why = WHY_EXCEPTION;
1501
1502 /* Unwind stacks if a (pseudo) exception occurred */
1503
1504 while (why != WHY_NOT && f->f_iblock > 0) {
1505 block *b = pop_block(f);
1506 while (STACK_LEVEL() > b->b_level) {
1507 v = POP();
1508 XDECREF(v);
1509 }
1510 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1511 why = WHY_NOT;
1512 JUMPTO(b->b_handler);
1513 break;
1514 }
1515 if (b->b_type == SETUP_FINALLY ||
1516 b->b_type == SETUP_EXCEPT &&
1517 why == WHY_EXCEPTION) {
1518 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001519 object *exc, *val, *tb;
1520 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 if (val == NULL) {
1522 val = None;
1523 INCREF(val);
1524 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 /* Make the raw exception data
1526 available to the handler,
1527 so a program can emulate the
1528 Python main loop. Don't do
1529 this for 'finally'. */
1530 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001531 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 sysset("exc_value", val);
1533 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001535 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 PUSH(val);
1537 PUSH(exc);
1538 }
1539 else {
1540 if (why == WHY_RETURN)
1541 PUSH(retval);
1542 v = newintobject((long)why);
1543 PUSH(v);
1544 }
1545 why = WHY_NOT;
1546 JUMPTO(b->b_handler);
1547 break;
1548 }
1549 } /* unwind stack */
1550
1551 /* End the loop if we still have an error (or return) */
1552
1553 if (why != WHY_NOT)
1554 break;
1555
1556 } /* main loop */
1557
1558 /* Pop remaining stack entries */
1559
1560 while (!EMPTY()) {
1561 v = POP();
1562 XDECREF(v);
1563 }
1564
Guido van Rossum96a42c81992-01-12 02:29:51 +00001565 if (why != WHY_RETURN)
1566 retval = NULL;
1567
Guido van Rossume59214e1994-08-30 08:01:59 +00001568 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001569 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001570 if (call_trace(&f->f_trace, &f->f_trace, f,
1571 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001572 XDECREF(retval);
1573 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001574 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001575 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001576 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001577 }
1578
1579 if (sys_profile && why == WHY_RETURN) {
1580 if (call_trace(&sys_profile, (object**)0,
1581 f, "return", retval)) {
1582 XDECREF(retval);
1583 retval = NULL;
1584 why = WHY_EXCEPTION;
1585 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001586 }
1587
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 /* Restore previous frame and release the current one */
1589
1590 current_frame = f->f_back;
1591 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001592
1593 if (needmerge)
1594 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001595
Guido van Rossum96a42c81992-01-12 02:29:51 +00001596 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001597}
1598
Guido van Rossum96a42c81992-01-12 02:29:51 +00001599#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600static int
1601prtrace(v, str)
1602 object *v;
1603 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001606 if (printobject(v, stdout, 0) != 0)
1607 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001608 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001612static void
1613call_exc_trace(p_trace, p_newtrace, f)
1614 object **p_trace, **p_newtrace;
1615 frameobject *f;
1616{
1617 object *type, *value, *traceback, *arg;
1618 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001619 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001620 if (value == NULL) {
1621 value = None;
1622 INCREF(value);
1623 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001624 arg = mkvalue("(OOO)", type, value, traceback);
1625 if (arg == NULL) {
1626 err_restore(type, value, traceback);
1627 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001628 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001629 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1630 DECREF(arg);
1631 if (err == 0)
1632 err_restore(type, value, traceback);
1633 else {
1634 XDECREF(type);
1635 XDECREF(value);
1636 XDECREF(traceback);
1637 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001638}
1639
1640static int
1641call_trace(p_trace, p_newtrace, f, msg, arg)
1642 object **p_trace; /* in/out; may not be NULL;
1643 may not point to NULL variable initially */
1644 object **p_newtrace; /* in/out; may be NULL;
1645 may point to NULL variable;
1646 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001647 frameobject *f;
1648 char *msg;
1649 object *arg;
1650{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001651 object *arglist, *what;
1652 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001653 static int tracing = 0;
1654
1655 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001656 /* Don't do recursive traces */
1657 if (p_newtrace) {
1658 XDECREF(*p_newtrace);
1659 *p_newtrace = NULL;
1660 }
1661 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001662 }
1663
1664 arglist = newtupleobject(3);
1665 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001666 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001667 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001668 if (what == NULL)
1669 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001670 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001671 settupleitem(arglist, 0, (object *)f);
1672 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001673 if (arg == NULL)
1674 arg = None;
1675 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001676 settupleitem(arglist, 2, arg);
1677 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001678 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001679 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001680 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001681 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001682 cleanup:
1683 XDECREF(arglist);
1684 if (res == NULL) {
1685 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001686 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001687 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001688 *p_trace = NULL;
1689 if (p_newtrace) {
1690 XDECREF(*p_newtrace);
1691 *p_newtrace = NULL;
1692 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001693 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001694 }
1695 else {
1696 if (p_newtrace) {
1697 XDECREF(*p_newtrace);
1698 if (res == None)
1699 *p_newtrace = NULL;
1700 else {
1701 INCREF(res);
1702 *p_newtrace = res;
1703 }
1704 }
1705 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001706 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001707 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001708}
1709
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001711getbuiltins()
1712{
1713 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001714 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001715 else
1716 return current_frame->f_builtins;
1717}
1718
1719object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001720getlocals()
1721{
1722 if (current_frame == NULL)
1723 return NULL;
1724 fast_2_locals(current_frame);
1725 return current_frame->f_locals;
1726}
1727
1728object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729getglobals()
1730{
1731 if (current_frame == NULL)
1732 return NULL;
1733 else
1734 return current_frame->f_globals;
1735}
1736
Guido van Rossum81daa321993-05-20 14:24:46 +00001737object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001738getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001739{
1740 if (current_frame == NULL)
1741 return NULL;
1742 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001743 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001744}
1745
Guido van Rossume59214e1994-08-30 08:01:59 +00001746object *
1747getframe()
1748{
1749 return (object *)current_frame;
1750}
1751
Guido van Rossum6135a871995-01-09 17:53:26 +00001752int
1753getrestricted()
1754{
1755 return current_frame == NULL ? 0 : current_frame->f_restricted;
1756}
1757
Guido van Rossum3f5da241990-12-20 15:06:42 +00001758void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759flushline()
1760{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001761 object *f = sysget("stdout");
1762 if (softspace(f, 0))
1763 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764}
1765
Guido van Rossum3f5da241990-12-20 15:06:42 +00001766
Guido van Rossum06186511995-01-07 12:40:10 +00001767#define BINOP(opname, ropname, thisfunc) \
1768 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1769 ; \
1770 else \
1771 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001772
1773
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001775or(v, w)
1776 object *v, *w;
1777{
Guido van Rossum06186511995-01-07 12:40:10 +00001778 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001779 if (v->ob_type->tp_as_number != NULL) {
1780 object *x;
1781 object * (*f) FPROTO((object *, object *));
1782 if (coerce(&v, &w) != 0)
1783 return NULL;
1784 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1785 x = (*f)(v, w);
1786 DECREF(v);
1787 DECREF(w);
1788 if (f != NULL)
1789 return x;
1790 }
1791 err_setstr(TypeError, "bad operand type(s) for |");
1792 return NULL;
1793}
1794
1795static object *
1796xor(v, w)
1797 object *v, *w;
1798{
Guido van Rossum06186511995-01-07 12:40:10 +00001799 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001800 if (v->ob_type->tp_as_number != NULL) {
1801 object *x;
1802 object * (*f) FPROTO((object *, object *));
1803 if (coerce(&v, &w) != 0)
1804 return NULL;
1805 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1806 x = (*f)(v, w);
1807 DECREF(v);
1808 DECREF(w);
1809 if (f != NULL)
1810 return x;
1811 }
1812 err_setstr(TypeError, "bad operand type(s) for ^");
1813 return NULL;
1814}
1815
1816static object *
1817and(v, w)
1818 object *v, *w;
1819{
Guido van Rossum06186511995-01-07 12:40:10 +00001820 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001821 if (v->ob_type->tp_as_number != NULL) {
1822 object *x;
1823 object * (*f) FPROTO((object *, object *));
1824 if (coerce(&v, &w) != 0)
1825 return NULL;
1826 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1827 x = (*f)(v, w);
1828 DECREF(v);
1829 DECREF(w);
1830 if (f != NULL)
1831 return x;
1832 }
1833 err_setstr(TypeError, "bad operand type(s) for &");
1834 return NULL;
1835}
1836
1837static object *
1838lshift(v, w)
1839 object *v, *w;
1840{
Guido van Rossum06186511995-01-07 12:40:10 +00001841 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001842 if (v->ob_type->tp_as_number != NULL) {
1843 object *x;
1844 object * (*f) FPROTO((object *, object *));
1845 if (coerce(&v, &w) != 0)
1846 return NULL;
1847 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1848 x = (*f)(v, w);
1849 DECREF(v);
1850 DECREF(w);
1851 if (f != NULL)
1852 return x;
1853 }
1854 err_setstr(TypeError, "bad operand type(s) for <<");
1855 return NULL;
1856}
1857
1858static object *
1859rshift(v, w)
1860 object *v, *w;
1861{
Guido van Rossum06186511995-01-07 12:40:10 +00001862 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001863 if (v->ob_type->tp_as_number != NULL) {
1864 object *x;
1865 object * (*f) FPROTO((object *, object *));
1866 if (coerce(&v, &w) != 0)
1867 return NULL;
1868 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1869 x = (*f)(v, w);
1870 DECREF(v);
1871 DECREF(w);
1872 if (f != NULL)
1873 return x;
1874 }
1875 err_setstr(TypeError, "bad operand type(s) for >>");
1876 return NULL;
1877}
1878
1879static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 object *v, *w;
1882{
Guido van Rossum06186511995-01-07 12:40:10 +00001883 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001884 if (v->ob_type->tp_as_sequence != NULL)
1885 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1886 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001887 object *x;
1888 if (coerce(&v, &w) != 0)
1889 return NULL;
1890 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1891 DECREF(v);
1892 DECREF(w);
1893 return x;
1894 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001895 err_setstr(TypeError, "bad operand type(s) for +");
1896 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897}
1898
1899static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001900sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 object *v, *w;
1902{
Guido van Rossum06186511995-01-07 12:40:10 +00001903 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001904 if (v->ob_type->tp_as_number != NULL) {
1905 object *x;
1906 if (coerce(&v, &w) != 0)
1907 return NULL;
1908 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1909 DECREF(v);
1910 DECREF(w);
1911 return x;
1912 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 return NULL;
1915}
1916
1917static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001918mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 object *v, *w;
1920{
1921 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001922 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001923 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001924 if (tp->tp_as_number != NULL &&
1925 w->ob_type->tp_as_sequence != NULL &&
1926 !is_instanceobject(v)) {
1927 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 object *tmp = v;
1929 v = w;
1930 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001931 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001933 if (tp->tp_as_number != NULL) {
1934 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001935 if (is_instanceobject(v)) {
1936 /* Instances of user-defined classes get their
1937 other argument uncoerced, so they may
1938 implement sequence*number as well as
1939 number*number. */
1940 INCREF(v);
1941 INCREF(w);
1942 }
1943 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001944 return NULL;
1945 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1946 DECREF(v);
1947 DECREF(w);
1948 return x;
1949 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 if (tp->tp_as_sequence != NULL) {
1951 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952 err_setstr(TypeError,
1953 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 return NULL;
1955 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956 return (*tp->tp_as_sequence->sq_repeat)
1957 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001958 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001959 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 return NULL;
1961}
1962
1963static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001964divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 object *v, *w;
1966{
Guido van Rossum06186511995-01-07 12:40:10 +00001967 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001968 if (v->ob_type->tp_as_number != NULL) {
1969 object *x;
1970 if (coerce(&v, &w) != 0)
1971 return NULL;
1972 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1973 DECREF(v);
1974 DECREF(w);
1975 return x;
1976 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 return NULL;
1979}
1980
1981static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001982mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 object *v, *w;
1984{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985 if (is_stringobject(v)) {
1986 return formatstring(v, w);
1987 }
Guido van Rossum06186511995-01-07 12:40:10 +00001988 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001989 if (v->ob_type->tp_as_number != NULL) {
1990 object *x;
1991 if (coerce(&v, &w) != 0)
1992 return NULL;
1993 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1994 DECREF(v);
1995 DECREF(w);
1996 return x;
1997 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001998 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 return NULL;
2000}
2001
2002static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002003neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004 object *v;
2005{
2006 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002007 return (*v->ob_type->tp_as_number->nb_negative)(v);
2008 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 return NULL;
2010}
2011
2012static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 object *v;
2015{
2016 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002017 return (*v->ob_type->tp_as_number->nb_positive)(v);
2018 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 return NULL;
2020}
2021
2022static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002023invert(v)
2024 object *v;
2025{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002026 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002027 if (v->ob_type->tp_as_number != NULL &&
2028 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2029 return (*f)(v);
2030 err_setstr(TypeError, "bad operand type(s) for unary ~");
2031 return NULL;
2032}
2033
2034static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002035not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 object *v;
2037{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002038 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002039 object *w;
2040 if (outcome < 0)
2041 return NULL;
2042 if (outcome == 0)
2043 w = True;
2044 else
2045 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002046 INCREF(w);
2047 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048}
Guido van Rossum234f9421993-06-17 12:35:49 +00002049
2050
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002051/* External interface to call any callable object. The arg may be NULL. */
2052
2053object *
2054call_object(func, arg)
2055 object *func;
2056 object *arg;
2057{
Guido van Rossume59214e1994-08-30 08:01:59 +00002058 binaryfunc call;
2059 object *result;
2060
2061 if (call = func->ob_type->tp_call) {
2062 int size = gettuplesize(arg);
2063 if (arg) {
2064 size = gettuplesize(arg);
2065 if (size == 1)
2066 arg = gettupleitem(arg, 0);
2067 else if (size == 0)
2068 arg = NULL;
2069 }
2070 result = (*call)(func, arg);
2071 }
2072 else if (is_instancemethodobject(func) || is_funcobject(func))
2073 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002074 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002075 result = call_builtin(func, arg);
2076
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002077 if (result == NULL && !err_occurred())
2078 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002079
2080 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002081}
2082
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 if (is_methodobject(func)) {
2089 method meth = getmethod(func);
2090 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002091 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2092 int size = gettuplesize(arg);
2093 if (size == 1)
2094 arg = gettupleitem(arg, 0);
2095 else if (size == 0)
2096 arg = NULL;
2097 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002098 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 }
2100 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002101 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002103 if (is_instanceobject(func)) {
2104 object *res, *call = getattr(func,"__call__");
2105 if (call == NULL) {
2106 err_clear();
2107 err_setstr(AttributeError, "no __call__ method defined");
2108 return NULL;
2109 }
2110 res = call_object(call, arg);
2111 DECREF(call);
2112 return res;
2113 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 return NULL;
2116}
2117
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002121 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002123 object *newarg = NULL;
2124 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002125 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002126 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002127 object *argdefs;
2128 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129
Guido van Rossume8122f11991-05-05 20:03:07 +00002130 if (is_instancemethodobject(func)) {
2131 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002132 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002133 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002134 if (self == NULL) {
2135 /* Unbound methods must be called with an instance of
2136 the class (or a derived class) as first argument */
2137 if (arg != NULL && is_tupleobject(arg) &&
2138 gettuplesize(arg) >= 1) {
2139 self = gettupleitem(arg, 0);
2140 if (self != NULL &&
2141 is_instanceobject(self) &&
2142 issubclass((object *)
2143 (((instanceobject *)self)->in_class),
2144 class))
2145 /* self = self */ ;
2146 else
2147 self = NULL;
2148 }
2149 if (self == NULL) {
2150 err_setstr(TypeError,
2151 "unbound method must be called with class instance argument");
2152 return NULL;
2153 }
2154 }
2155 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002156 if (arg == NULL)
2157 argcount = 0;
2158 else if (is_tupleobject(arg))
2159 argcount = gettuplesize(arg);
2160 else
2161 argcount = 1;
2162 newarg = newtupleobject(argcount + 1);
2163 if (newarg == NULL)
2164 return NULL;
2165 INCREF(self);
2166 settupleitem(newarg, 0, self);
2167 if (arg != NULL && !is_tupleobject(arg)) {
2168 INCREF(arg);
2169 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002170 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002171 else {
2172 int i;
2173 object *v;
2174 for (i = 0; i < argcount; i++) {
2175 v = gettupleitem(arg, i);
2176 XINCREF(v);
2177 settupleitem(newarg, i+1, v);
2178 }
2179 }
2180 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 }
2182 }
2183 else {
2184 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002185 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 return NULL;
2187 }
2188 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002189
2190 argdefs = getfuncargstuff(func, &argcount);
2191 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2192 int actualcount, j;
2193 /* Process default arguments */
2194 if (argcount & 0x4000)
2195 argcount ^= 0x4000;
2196 actualcount = gettuplesize(arg);
2197 j = gettuplesize(argdefs) - (argcount - actualcount);
2198 if (actualcount < argcount && j >= 0) {
2199 int i;
2200 object *v;
2201 if (newarg == NULL)
2202 INCREF(arg);
2203 newarg = newtupleobject(argcount);
2204 if (newarg == NULL) {
2205 DECREF(arg);
2206 return NULL;
2207 }
2208 for (i = 0; i < actualcount; i++) {
2209 v = gettupleitem(arg, i);
2210 XINCREF(v);
2211 settupleitem(newarg, i, v);
2212 }
2213 for (; i < argcount; i++, j++) {
2214 v = gettupleitem(argdefs, j);
2215 XINCREF(v);
2216 settupleitem(newarg, i, v);
2217 }
2218 DECREF(arg);
2219 arg = newarg;
2220 }
2221 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222
Guido van Rossum3f5da241990-12-20 15:06:42 +00002223 co = getfunccode(func);
2224 if (co == NULL) {
2225 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 return NULL;
2227 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002228 if (!is_codeobject(co))
2229 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002230 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 return NULL;
2234 }
2235
Guido van Rossum3f5da241990-12-20 15:06:42 +00002236 newglobals = getfuncglobals(func);
2237 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238
Guido van Rossum81daa321993-05-20 14:24:46 +00002239 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240
Guido van Rossum3f5da241990-12-20 15:06:42 +00002241 DECREF(newlocals);
2242 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245
2246 return v;
2247}
2248
2249static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002250apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251 object *v, *w;
2252{
2253 typeobject *tp = v->ob_type;
2254 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002255 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002256 return NULL;
2257 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002258 if (tp->tp_as_mapping != NULL) {
2259 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2260 }
2261 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262 int i;
2263 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002264 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 return NULL;
2266 }
2267 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002268 if (i < 0) {
2269 int len = (*tp->tp_as_sequence->sq_length)(v);
2270 if (len < 0)
2271 return NULL;
2272 i += len;
2273 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276}
2277
2278static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002279loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 object *v, *w;
2281{
2282 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002283 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002285 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 return NULL;
2287 }
2288 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002289 v = (*sq->sq_item)(v, i);
2290 if (v)
2291 return v;
2292 if (err_occurred() == IndexError)
2293 err_clear();
2294 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295}
2296
2297static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002298slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 object *v;
2300 int isize;
2301 int *pi;
2302{
2303 if (v != NULL) {
2304 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002305 err_setstr(TypeError, "slice index must be int");
2306 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 }
2308 *pi = getintvalue(v);
2309 if (*pi < 0)
2310 *pi += isize;
2311 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313}
2314
2315static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 object *u, *v, *w;
2318{
2319 typeobject *tp = u->ob_type;
2320 int ilow, ihigh, isize;
2321 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002322 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 return NULL;
2324 }
2325 ilow = 0;
2326 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002327 if (isize < 0)
2328 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002329 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335
2336static int
2337assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 object *w;
2339 object *key;
2340 object *v;
2341{
2342 typeobject *tp = w->ob_type;
2343 sequence_methods *sq;
2344 mapping_methods *mp;
2345 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002346 if ((mp = tp->tp_as_mapping) != NULL &&
2347 (func = mp->mp_ass_subscript) != NULL) {
2348 return (*func)(w, key, v);
2349 }
2350 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 (func = sq->sq_ass_item) != NULL) {
2352 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002353 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002354 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002357 else {
2358 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002359 if (i < 0) {
2360 int len = (*sq->sq_length)(w);
2361 if (len < 0)
2362 return -1;
2363 i += len;
2364 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002365 return (*func)(w, i, v);
2366 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002369 err_setstr(TypeError,
2370 "can't assign to this subscripted object");
2371 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373}
2374
Guido van Rossum3f5da241990-12-20 15:06:42 +00002375static int
2376assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 object *u, *v, *w, *x;
2378{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002379 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 if (sq == NULL) {
2382 err_setstr(TypeError, "assign to slice of non-sequence");
2383 return -1;
2384 }
2385 if (sq == NULL || sq->sq_ass_slice == NULL) {
2386 err_setstr(TypeError, "unassignable slice");
2387 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 }
2389 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002391 if (isize < 0)
2392 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002393 if (slice_index(v, isize, &ilow) != 0)
2394 return -1;
2395 if (slice_index(w, isize, &ihigh) != 0)
2396 return -1;
2397 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398}
2399
2400static int
2401cmp_exception(err, v)
2402 object *err, *v;
2403{
2404 if (is_tupleobject(v)) {
2405 int i, n;
2406 n = gettuplesize(v);
2407 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002408 /* Test recursively */
2409 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 return 1;
2411 }
2412 return 0;
2413 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002414 if (is_classobject(v) && is_classobject(err))
2415 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 return err == v;
2417}
2418
Guido van Rossum3f5da241990-12-20 15:06:42 +00002419static int
2420cmp_member(v, w)
2421 object *v, *w;
2422{
Guido van Rossume59214e1994-08-30 08:01:59 +00002423 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002424 object *x;
2425 sequence_methods *sq;
2426 /* Special case for char in string */
2427 if (is_stringobject(w)) {
2428 register char *s, *end;
2429 register char c;
2430 if (!is_stringobject(v) || getstringsize(v) != 1) {
2431 err_setstr(TypeError,
2432 "string member test needs char left operand");
2433 return -1;
2434 }
2435 c = getstringvalue(v)[0];
2436 s = getstringvalue(w);
2437 end = s + getstringsize(w);
2438 while (s < end) {
2439 if (c == *s++)
2440 return 1;
2441 }
2442 return 0;
2443 }
2444 sq = w->ob_type->tp_as_sequence;
2445 if (sq == NULL) {
2446 err_setstr(TypeError,
2447 "'in' or 'not in' needs sequence right argument");
2448 return -1;
2449 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002450 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002451 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002452 if (x == NULL) {
2453 if (err_occurred() == IndexError) {
2454 err_clear();
2455 break;
2456 }
2457 return -1;
2458 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459 cmp = cmpobject(v, x);
2460 XDECREF(x);
2461 if (cmp == 0)
2462 return 1;
2463 }
2464 return 0;
2465}
2466
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002468cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002469 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 register object *v;
2471 register object *w;
2472{
2473 register int cmp;
2474 register int res = 0;
2475 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002476 case IS:
2477 case IS_NOT:
2478 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002479 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002480 res = !res;
2481 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 case IN:
2483 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002484 res = cmp_member(v, w);
2485 if (res < 0)
2486 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002487 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002488 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489 break;
2490 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492 break;
2493 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002494 cmp = cmpobject(v, w);
2495 switch (op) {
2496 case LT: res = cmp < 0; break;
2497 case LE: res = cmp <= 0; break;
2498 case EQ: res = cmp == 0; break;
2499 case NE: res = cmp != 0; break;
2500 case GT: res = cmp > 0; break;
2501 case GE: res = cmp >= 0; break;
2502 /* XXX no default? (res is initialized to 0 though) */
2503 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 }
2505 v = res ? True : False;
2506 INCREF(v);
2507 return v;
2508}
2509
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510static int
2511import_from(locals, v, name)
2512 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002513 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002514 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002515{
2516 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002517 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002518 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002519 return -1;
2520 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002521 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002522 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002523 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002524 object *name, *value;
2525 pos = 0;
2526 while (mappinggetnext(w, &pos, &name, &value)) {
2527 if (!is_stringobject(name) ||
2528 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002529 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002530 if (is_accessobject(value)) {
2531 value = getaccessvalue(value, (object *)NULL);
2532 if (value == NULL) {
2533 err_clear();
2534 continue;
2535 }
2536 }
2537 else
2538 INCREF(value);
2539 err = dict2insert(locals, name, value);
2540 DECREF(value);
2541 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002542 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002543 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002545 }
2546 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002547 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002548 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002549 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002550 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002551 getstringvalue(name));
2552 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002553 return -1;
2554 }
2555 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002556 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002557 }
2558}
2559
2560static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002561build_class(methods, bases, name)
2562 object *methods; /* dictionary */
2563 object *bases; /* tuple containing classes */
2564 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002565{
Guido van Rossum25831651993-05-19 14:50:45 +00002566 int i;
2567 if (!is_tupleobject(bases)) {
2568 err_setstr(SystemError, "build_class with non-tuple bases");
2569 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002570 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002571 if (gettuplesize(bases) > 0) {
2572 object *base;
2573 base = gettupleitem(bases, 0);
2574 /* Call the base's *type*, if it is callable.
2575 This code is a hook for Donald Beaudry's type extensions.
2576 In unexended Python it will never be triggered since its
2577 types are not callable. */
2578 if (base->ob_type->ob_type->tp_call) {
2579 object *args;
2580 object *class;
2581 args = mkvalue("(OOO)", name, bases, methods);
2582 class = call_object((object *)base->ob_type, args);
2583 DECREF(args);
2584 return class;
2585 }
2586 }
Guido van Rossum25831651993-05-19 14:50:45 +00002587 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002589 return NULL;
2590 }
Guido van Rossum25831651993-05-19 14:50:45 +00002591 if (!is_stringobject(name)) {
2592 err_setstr(SystemError, "build_class witn non-string name");
2593 return NULL;
2594 }
2595 for (i = gettuplesize(bases); --i >= 0; ) {
2596 object *base = gettupleitem(bases, i);
2597 if (!is_classobject(base)) {
2598 err_setstr(TypeError,
2599 "base is not a class object");
2600 return NULL;
2601 }
2602 }
2603 return newclassobject(bases, methods, name);
2604}
2605
2606static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002607access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002608 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002609 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002610 frameobject *f;
2611{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002612 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002613 object *value, *ac;
2614 typeobject *type;
2615 int fastind, ret;
2616 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002617 if (f->f_localmap == NULL)
2618 value = dict2lookup(f->f_locals, name);
2619 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002620 object *map = f->f_localmap;
2621 value = NULL;
2622 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2623 object *fname = gettupleitem(map, fastind);
2624 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002625 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002626 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002627 }
2628 }
2629 }
2630 if (value && is_accessobject(value)) {
2631 err_setstr(AccessError, "can't override access");
2632 return -1;
2633 }
2634 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002635 if (value != NULL && value != None)
2636 type = value->ob_type;
2637 else
2638 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002639 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002640 if (ac == NULL)
2641 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002642 if (fastind >= 0)
2643 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002644 else {
2645 ret = dict2insert(f->f_locals, name, ac);
2646 DECREF(ac);
2647 }
2648 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002649}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002650
2651static int
2652exec_statement(prog, globals, locals)
2653 object *prog;
2654 object *globals;
2655 object *locals;
2656{
2657 char *s;
2658 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002659 object *v;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002660
2661 if (is_tupleobject(prog) && globals == None && locals == None &&
2662 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2663 /* Backward compatibility hack */
2664 globals = gettupleitem(prog, 1);
2665 if (n == 3)
2666 locals = gettupleitem(prog, 2);
2667 prog = gettupleitem(prog, 0);
2668 }
2669 if (globals == None) {
2670 globals = getglobals();
2671 if (locals == None)
2672 locals = getlocals();
2673 }
2674 else if (locals == None)
2675 locals = globals;
2676 if (!is_stringobject(prog) &&
2677 !is_codeobject(prog) &&
2678 !is_fileobject(prog)) {
2679 err_setstr(TypeError,
2680 "exec 1st arg must be string, code or file object");
2681 return -1;
2682 }
2683 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2684 err_setstr(TypeError,
2685 "exec 2nd/3rd args must be dict or None");
2686 return -1;
2687 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002688 if (dictlookup(globals, "__builtins__") == NULL)
2689 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002690 if (is_codeobject(prog)) {
2691 if (eval_code((codeobject *) prog, globals, locals,
2692 (object *)NULL, (object *)NULL) == NULL)
2693 return -1;
2694 return 0;
2695 }
2696 if (is_fileobject(prog)) {
2697 FILE *fp = getfilefile(prog);
2698 char *name = getstringvalue(getfilename(prog));
2699 if (run_file(fp, name, file_input, globals, locals) == NULL)
2700 return -1;
2701 return 0;
2702 }
2703 s = getstringvalue(prog);
2704 if (strlen(s) != getstringsize(prog)) {
2705 err_setstr(ValueError, "embedded '\\0' in exec string");
2706 return -1;
2707 }
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002708 if ((v = run_string(s, file_input, globals, locals)) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002709 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002710 DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002711 return 0;
2712}