blob: ff055e452e1f8812043cec8d8a72288f7635ae23 [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 Rossum8bf7c481995-01-26 00:41:04 +0000785 INCREF(w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000786 DECREF(u);
787 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000788 if (is_stringobject(w)) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 err_setval(w, v);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000790 } else if (is_classobject(w)) {
791 if (!is_instanceobject(v)
792 || !issubclass((object*)((instanceobject*)v)->in_class,
793 w))
794 err_setstr(TypeError,
795 "a class exception must have a value that is an instance of the class");
796 else
797 err_setval(w,v);
798 } else if (is_instanceobject(w)) {
799 if (v != None)
800 err_setstr(TypeError,
801 "an instance exception may not have a separate value");
802 else {
803 DECREF(v);
804 v = w;
805 w = (object*) ((instanceobject*)w)->in_class;
806 INCREF(w);
807 err_setval(w, v);
808 }
809 } else
810 err_setstr(TypeError,
811 "exceptions must be strings, classes, or instances");
Guido van Rossum374a9221991-04-04 10:40:29 +0000812 DECREF(v);
813 DECREF(w);
814 why = WHY_EXCEPTION;
815 break;
816
817 case LOAD_LOCALS:
818 v = f->f_locals;
819 INCREF(v);
820 PUSH(v);
821 break;
822
823 case RETURN_VALUE:
824 retval = POP();
825 why = WHY_RETURN;
826 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000827
828 case LOAD_GLOBALS:
829 v = f->f_locals;
830 INCREF(v);
831 PUSH(v);
832 break;
833
834 case EXEC_STMT:
835 w = POP();
836 v = POP();
837 u = POP();
838 err = exec_statement(u, v, w);
839 DECREF(u);
840 DECREF(v);
841 DECREF(w);
842 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000843
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 case BUILD_FUNCTION:
845 v = POP();
846 x = newfuncobject(v, f->f_globals);
847 DECREF(v);
848 PUSH(x);
849 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000850
851 case SET_FUNC_ARGS:
852 v = POP(); /* The function */
853 w = POP(); /* The argument list */
854 err = setfuncargstuff(v, oparg, w);
855 PUSH(v);
856 DECREF(w);
857 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000858
859 case POP_BLOCK:
860 {
861 block *b = pop_block(f);
862 while (STACK_LEVEL() > b->b_level) {
863 v = POP();
864 DECREF(v);
865 }
866 }
867 break;
868
869 case END_FINALLY:
870 v = POP();
871 if (is_intobject(v)) {
872 why = (enum why_code) getintvalue(v);
873 if (why == WHY_RETURN)
874 retval = POP();
875 }
876 else if (is_stringobject(v)) {
877 w = POP();
878 err_setval(v, w);
879 DECREF(w);
880 w = POP();
881 tb_store(w);
882 DECREF(w);
883 why = WHY_RERAISE;
884 }
885 else if (v != None) {
886 err_setstr(SystemError,
887 "'finally' pops bad exception");
888 why = WHY_EXCEPTION;
889 }
890 DECREF(v);
891 break;
892
893 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000894 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000896 w = POP();
897 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000899 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 DECREF(v);
901 DECREF(w);
902 break;
903
904 case STORE_NAME:
905 w = GETNAMEV(oparg);
906 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000907 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000908 if (u == NULL) {
909 if (defmode != 0) {
910 if (v != None)
911 u = (object *)v->ob_type;
912 else
913 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000914 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000915 (typeobject *)u,
916 defmode);
917 DECREF(v);
918 if (x == NULL)
919 break;
920 v = x;
921 }
922 }
923 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000924 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000925 DECREF(v);
926 break;
927 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 err = dict2insert(f->f_locals, w, v);
929 DECREF(v);
930 break;
931
932 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000933 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000934 u = dict2lookup(f->f_locals, w);
935 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000936 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000937 (object *)NULL);
938 break;
939 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000940 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000941 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000943
944#ifdef CASE_TOO_BIG
945 default: switch (opcode) {
946#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000947
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000948 case UNPACK_VARARG:
949 if (EMPTY()) {
950 err_setstr(TypeError,
951 "no argument list");
952 why = WHY_EXCEPTION;
953 break;
954 }
955 v = POP();
956 if (!is_tupleobject(v)) {
957 err_setstr(TypeError,
958 "bad argument list");
959 why = WHY_EXCEPTION;
960 }
961 else if (gettuplesize(v) < oparg) {
962 err_setstr(TypeError,
963 "not enough arguments");
964 why = WHY_EXCEPTION;
965 }
966 else if (oparg == 0) {
967 PUSH(v);
968 break;
969 }
970 else {
971 x = gettupleslice(v, oparg, gettuplesize(v));
972 if (x != NULL) {
973 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000974 if (!CHECK_STACK(oparg)) {
975 x = NULL;
976 break;
977 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000978 for (; --oparg >= 0; ) {
979 w = gettupleitem(v, oparg);
980 INCREF(w);
981 PUSH(w);
982 }
983 }
984 }
985 DECREF(v);
986 break;
987
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000988 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000989 {
990 int n;
991 if (EMPTY()) {
992 err_setstr(TypeError,
993 "no argument list");
994 why = WHY_EXCEPTION;
995 break;
996 }
997 v = POP();
998 if (!is_tupleobject(v)) {
999 err_setstr(TypeError,
1000 "bad argument list");
1001 why = WHY_EXCEPTION;
1002 break;
1003 }
1004 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001005#ifdef COMPAT_HACKS
1006/* Implement various compatibility hacks (for 0.9.4 or earlier):
1007 (a) f(a,b,...) accepts f((1,2,...))
1008 (b) f((a,b,...)) accepts f(1,2,...)
1009 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
1010*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001011 if (n == 1 && oparg != 1) {
1012 /* Rule (a) */
1013 w = gettupleitem(v, 0);
1014 if (is_tupleobject(w)) {
1015 INCREF(w);
1016 DECREF(v);
1017 v = w;
1018 n = gettuplesize(v);
1019 }
1020 }
1021 else if (n != 1 && oparg == 1) {
1022 /* Rule (b) */
1023 PUSH(v);
1024 break;
1025 /* Don't fall through */
1026 }
1027 else if (n > 2 && oparg == 2) {
1028 /* Rule (c) */
1029 int i;
1030 w = newtupleobject(n-1);
1031 u = newtupleobject(2);
1032 if (u == NULL || w == NULL) {
1033 XDECREF(w);
1034 XDECREF(u);
1035 DECREF(v);
1036 why = WHY_EXCEPTION;
1037 break;
1038 }
1039 t = gettupleitem(v, 0);
1040 INCREF(t);
1041 settupleitem(u, 0, t);
1042 for (i = 1; i < n; i++) {
1043 t = gettupleitem(v, i);
1044 INCREF(t);
1045 settupleitem(w, i-1, t);
1046 }
1047 settupleitem(u, 1, w);
1048 DECREF(v);
1049 v = u;
1050 n = 2;
1051 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001052#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001053 if (n != oparg) {
1054 err_setstr(TypeError,
1055 "arg count mismatch");
1056 why = WHY_EXCEPTION;
1057 DECREF(v);
1058 break;
1059 }
1060 PUSH(v);
1061 }
1062 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 case UNPACK_TUPLE:
1064 v = POP();
1065 if (!is_tupleobject(v)) {
1066 err_setstr(TypeError, "unpack non-tuple");
1067 why = WHY_EXCEPTION;
1068 }
1069 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001070 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 "unpack tuple of wrong size");
1072 why = WHY_EXCEPTION;
1073 }
1074 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001075 if (!CHECK_STACK(oparg)) {
1076 x = NULL;
1077 break;
1078 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001079 for (; --oparg >= 0; ) {
1080 w = gettupleitem(v, oparg);
1081 INCREF(w);
1082 PUSH(w);
1083 }
1084 }
1085 DECREF(v);
1086 break;
1087
1088 case UNPACK_LIST:
1089 v = POP();
1090 if (!is_listobject(v)) {
1091 err_setstr(TypeError, "unpack non-list");
1092 why = WHY_EXCEPTION;
1093 }
1094 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001095 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 "unpack list of wrong size");
1097 why = WHY_EXCEPTION;
1098 }
1099 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001100 if (!CHECK_STACK(oparg)) {
1101 x = NULL;
1102 break;
1103 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001104 for (; --oparg >= 0; ) {
1105 w = getlistitem(v, oparg);
1106 INCREF(w);
1107 PUSH(w);
1108 }
1109 }
1110 DECREF(v);
1111 break;
1112
1113 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001114 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001115 v = POP();
1116 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001117 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 DECREF(v);
1119 DECREF(u);
1120 break;
1121
1122 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001123 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001125 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 DECREF(v);
1127 break;
1128
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001129 case STORE_GLOBAL:
1130 w = GETNAMEV(oparg);
1131 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001132 u = dict2lookup(f->f_locals, w);
1133 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001134 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001135 DECREF(v);
1136 break;
1137 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001138 err = dict2insert(f->f_globals, w, v);
1139 DECREF(v);
1140 break;
1141
1142 case DELETE_GLOBAL:
1143 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001144 u = dict2lookup(f->f_locals, w);
1145 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001146 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001147 (object *)NULL);
1148 break;
1149 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001150 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001151 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001152 break;
1153
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 case LOAD_CONST:
1155 x = GETCONST(oparg);
1156 INCREF(x);
1157 PUSH(x);
1158 break;
1159
1160 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001161 w = GETNAMEV(oparg);
1162 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001164 err_clear();
1165 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001167 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001168 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001170 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 break;
1172 }
1173 }
1174 }
Guido van Rossum25831651993-05-19 14:50:45 +00001175 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001176 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001177 if (x == NULL)
1178 break;
1179 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001180 else
1181 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 PUSH(x);
1183 break;
1184
1185 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001186 w = GETNAMEV(oparg);
1187 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001189 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001190 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001192 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 break;
1194 }
1195 }
Guido van Rossum25831651993-05-19 14:50:45 +00001196 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001197 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001198 if (x == NULL)
1199 break;
1200 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001201 else
1202 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 PUSH(x);
1204 break;
1205
1206 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001207 w = GETNAMEV(oparg);
1208 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001210 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 break;
1212 }
Guido van Rossum25831651993-05-19 14:50:45 +00001213 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001214 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001215 if (x == NULL)
1216 break;
1217 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001218 else
1219 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 PUSH(x);
1221 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001222
1223 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001224 x = GETCONST(oparg);
1225 if (x == None)
1226 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001227 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001228 err_setstr(SystemError, "bad RESERVE_FAST");
1229 x = NULL;
1230 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001231 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001232 XDECREF(f->f_fastlocals);
1233 XDECREF(f->f_localmap);
1234 INCREF(x);
1235 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001236 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001237 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001238 break;
1239
1240 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001241 x = GETLISTITEM(fastlocals, oparg);
1242 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001243 err_setval(NameError,
1244 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001245 break;
1246 }
Guido van Rossum25831651993-05-19 14:50:45 +00001247 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001248 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001249 if (x == NULL)
1250 break;
1251 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001252 else
1253 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001254 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001255 break;
1256
1257 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001258 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001259 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001260 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001261 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001262 DECREF(v);
1263 break;
1264 }
Guido van Rossum25831651993-05-19 14:50:45 +00001265 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001267 break;
1268
1269 case DELETE_FAST:
1270 x = GETLISTITEM(fastlocals, oparg);
1271 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001272 err_setval(NameError,
1273 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001274 break;
1275 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001276 if (x != NULL && is_accessobject(x)) {
1277 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001278 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001279 break;
1280 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001281 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001282 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001283 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001284
1285 case BUILD_TUPLE:
1286 x = newtupleobject(oparg);
1287 if (x != NULL) {
1288 for (; --oparg >= 0;) {
1289 w = POP();
1290 err = settupleitem(x, oparg, w);
1291 if (err != 0)
1292 break;
1293 }
1294 PUSH(x);
1295 }
1296 break;
1297
1298 case BUILD_LIST:
1299 x = newlistobject(oparg);
1300 if (x != NULL) {
1301 for (; --oparg >= 0;) {
1302 w = POP();
1303 err = setlistitem(x, oparg, w);
1304 if (err != 0)
1305 break;
1306 }
1307 PUSH(x);
1308 }
1309 break;
1310
1311 case BUILD_MAP:
1312 x = newdictobject();
1313 PUSH(x);
1314 break;
1315
1316 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001317 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001319 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 DECREF(v);
1321 PUSH(x);
1322 break;
1323
1324 case COMPARE_OP:
1325 w = POP();
1326 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001327 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 DECREF(v);
1329 DECREF(w);
1330 PUSH(x);
1331 break;
1332
1333 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001334 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001335 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001336 if (x == NULL) {
1337 err_setstr(ImportError,
1338 "__import__ not found");
1339 break;
1340 }
1341 w = mkvalue("(O)", w);
1342 if (w == NULL) {
1343 x = NULL;
1344 break;
1345 }
1346 x = call_object(x, w);
1347 DECREF(w);
1348 if (x)
1349 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 break;
1351
1352 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001353 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001355 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001356 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001358
1359 case ACCESS_MODE:
1360 v = POP();
1361 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001362 if (getstringvalue(w)[0] == '*')
1363 defmode = getintvalue(v);
1364 else
1365 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001366 DECREF(v);
1367 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001368
1369 case JUMP_FORWARD:
1370 JUMPBY(oparg);
1371 break;
1372
1373 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001374 err = testbool(TOP());
1375 if (err > 0)
1376 err = 0;
1377 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 JUMPBY(oparg);
1379 break;
1380
1381 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001382 err = testbool(TOP());
1383 if (err > 0) {
1384 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001386 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 break;
1388
1389 case JUMP_ABSOLUTE:
1390 JUMPTO(oparg);
1391 break;
1392
1393 case FOR_LOOP:
1394 /* for v in s: ...
1395 On entry: stack contains s, i.
1396 On exit: stack contains s, i+1, s[i];
1397 but if loop exhausted:
1398 s, i are popped, and we jump */
1399 w = POP(); /* Loop index */
1400 v = POP(); /* Sequence object */
1401 u = loop_subscript(v, w);
1402 if (u != NULL) {
1403 PUSH(v);
1404 x = newintobject(getintvalue(w)+1);
1405 PUSH(x);
1406 DECREF(w);
1407 PUSH(u);
1408 }
1409 else {
1410 DECREF(v);
1411 DECREF(w);
1412 /* A NULL can mean "s exhausted"
1413 but also an error: */
1414 if (err_occurred())
1415 why = WHY_EXCEPTION;
1416 else
1417 JUMPBY(oparg);
1418 }
1419 break;
1420
1421 case SETUP_LOOP:
1422 case SETUP_EXCEPT:
1423 case SETUP_FINALLY:
1424 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1425 STACK_LEVEL());
1426 break;
1427
1428 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001429#ifdef LLTRACE
1430 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001431 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001432#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001433 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001434 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001435 /* Trace each line of code reached */
1436 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001437 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001438 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001439 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 break;
1441
1442 default:
1443 fprintf(stderr,
1444 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001445 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 err_setstr(SystemError, "eval_code: unknown opcode");
1447 why = WHY_EXCEPTION;
1448 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001449
1450#ifdef CASE_TOO_BIG
1451 }
1452#endif
1453
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 } /* switch */
1455
1456 on_error:
1457
1458 /* Quickly continue if no error occurred */
1459
1460 if (why == WHY_NOT) {
1461 if (err == 0 && x != NULL)
1462 continue; /* Normal, fast path */
1463 why = WHY_EXCEPTION;
1464 x = None;
1465 err = 0;
1466 }
1467
Guido van Rossum801dcae1992-04-08 11:32:32 +00001468#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 /* Double-check exception status */
1470
1471 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1472 if (!err_occurred()) {
1473 fprintf(stderr, "XXX ghost error\n");
1474 err_setstr(SystemError, "ghost error");
1475 why = WHY_EXCEPTION;
1476 }
1477 }
1478 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001479 if (err_occurred())
1480 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 }
1482#endif
1483
1484 /* Log traceback info if this is a real exception */
1485
1486 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001487 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001489 f->f_lasti -= 2;
1490 tb_here(f);
1491
Guido van Rossume59214e1994-08-30 08:01:59 +00001492 if (f->f_trace)
1493 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001494 if (sys_profile)
1495 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 }
1497
1498 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1499
1500 if (why == WHY_RERAISE)
1501 why = WHY_EXCEPTION;
1502
1503 /* Unwind stacks if a (pseudo) exception occurred */
1504
1505 while (why != WHY_NOT && f->f_iblock > 0) {
1506 block *b = pop_block(f);
1507 while (STACK_LEVEL() > b->b_level) {
1508 v = POP();
1509 XDECREF(v);
1510 }
1511 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1512 why = WHY_NOT;
1513 JUMPTO(b->b_handler);
1514 break;
1515 }
1516 if (b->b_type == SETUP_FINALLY ||
1517 b->b_type == SETUP_EXCEPT &&
1518 why == WHY_EXCEPTION) {
1519 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001520 object *exc, *val, *tb;
1521 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 if (val == NULL) {
1523 val = None;
1524 INCREF(val);
1525 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 /* Make the raw exception data
1527 available to the handler,
1528 so a program can emulate the
1529 Python main loop. Don't do
1530 this for 'finally'. */
1531 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001532 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 sysset("exc_value", val);
1534 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001536 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 PUSH(val);
1538 PUSH(exc);
1539 }
1540 else {
1541 if (why == WHY_RETURN)
1542 PUSH(retval);
1543 v = newintobject((long)why);
1544 PUSH(v);
1545 }
1546 why = WHY_NOT;
1547 JUMPTO(b->b_handler);
1548 break;
1549 }
1550 } /* unwind stack */
1551
1552 /* End the loop if we still have an error (or return) */
1553
1554 if (why != WHY_NOT)
1555 break;
1556
1557 } /* main loop */
1558
1559 /* Pop remaining stack entries */
1560
1561 while (!EMPTY()) {
1562 v = POP();
1563 XDECREF(v);
1564 }
1565
Guido van Rossum96a42c81992-01-12 02:29:51 +00001566 if (why != WHY_RETURN)
1567 retval = NULL;
1568
Guido van Rossume59214e1994-08-30 08:01:59 +00001569 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001570 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001571 if (call_trace(&f->f_trace, &f->f_trace, f,
1572 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001573 XDECREF(retval);
1574 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001575 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001576 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001577 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001578 }
1579
1580 if (sys_profile && why == WHY_RETURN) {
1581 if (call_trace(&sys_profile, (object**)0,
1582 f, "return", retval)) {
1583 XDECREF(retval);
1584 retval = NULL;
1585 why = WHY_EXCEPTION;
1586 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001587 }
1588
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 /* Restore previous frame and release the current one */
1590
1591 current_frame = f->f_back;
1592 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001593
1594 if (needmerge)
1595 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596
Guido van Rossum96a42c81992-01-12 02:29:51 +00001597 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001598}
1599
Guido van Rossum96a42c81992-01-12 02:29:51 +00001600#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601static int
1602prtrace(v, str)
1603 object *v;
1604 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001606 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001607 if (printobject(v, stdout, 0) != 0)
1608 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001611#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001613static void
1614call_exc_trace(p_trace, p_newtrace, f)
1615 object **p_trace, **p_newtrace;
1616 frameobject *f;
1617{
1618 object *type, *value, *traceback, *arg;
1619 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001620 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001621 if (value == NULL) {
1622 value = None;
1623 INCREF(value);
1624 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001625 arg = mkvalue("(OOO)", type, value, traceback);
1626 if (arg == NULL) {
1627 err_restore(type, value, traceback);
1628 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001629 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001630 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1631 DECREF(arg);
1632 if (err == 0)
1633 err_restore(type, value, traceback);
1634 else {
1635 XDECREF(type);
1636 XDECREF(value);
1637 XDECREF(traceback);
1638 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001639}
1640
1641static int
1642call_trace(p_trace, p_newtrace, f, msg, arg)
1643 object **p_trace; /* in/out; may not be NULL;
1644 may not point to NULL variable initially */
1645 object **p_newtrace; /* in/out; may be NULL;
1646 may point to NULL variable;
1647 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001648 frameobject *f;
1649 char *msg;
1650 object *arg;
1651{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001652 object *arglist, *what;
1653 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001654 static int tracing = 0;
1655
1656 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001657 /* Don't do recursive traces */
1658 if (p_newtrace) {
1659 XDECREF(*p_newtrace);
1660 *p_newtrace = NULL;
1661 }
1662 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001663 }
1664
1665 arglist = newtupleobject(3);
1666 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001667 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001668 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001669 if (what == NULL)
1670 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001671 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001672 settupleitem(arglist, 0, (object *)f);
1673 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001674 if (arg == NULL)
1675 arg = None;
1676 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001677 settupleitem(arglist, 2, arg);
1678 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001679 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001680 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001681 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001682 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001683 cleanup:
1684 XDECREF(arglist);
1685 if (res == NULL) {
1686 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001687 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001688 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001689 *p_trace = NULL;
1690 if (p_newtrace) {
1691 XDECREF(*p_newtrace);
1692 *p_newtrace = NULL;
1693 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001694 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001695 }
1696 else {
1697 if (p_newtrace) {
1698 XDECREF(*p_newtrace);
1699 if (res == None)
1700 *p_newtrace = NULL;
1701 else {
1702 INCREF(res);
1703 *p_newtrace = res;
1704 }
1705 }
1706 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001707 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001708 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001709}
1710
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001712getbuiltins()
1713{
1714 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001715 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001716 else
1717 return current_frame->f_builtins;
1718}
1719
1720object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001721getlocals()
1722{
1723 if (current_frame == NULL)
1724 return NULL;
1725 fast_2_locals(current_frame);
1726 return current_frame->f_locals;
1727}
1728
1729object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001730getglobals()
1731{
1732 if (current_frame == NULL)
1733 return NULL;
1734 else
1735 return current_frame->f_globals;
1736}
1737
Guido van Rossum81daa321993-05-20 14:24:46 +00001738object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001739getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001740{
1741 if (current_frame == NULL)
1742 return NULL;
1743 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001744 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001745}
1746
Guido van Rossume59214e1994-08-30 08:01:59 +00001747object *
1748getframe()
1749{
1750 return (object *)current_frame;
1751}
1752
Guido van Rossum6135a871995-01-09 17:53:26 +00001753int
1754getrestricted()
1755{
1756 return current_frame == NULL ? 0 : current_frame->f_restricted;
1757}
1758
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001760flushline()
1761{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001762 object *f = sysget("stdout");
1763 if (softspace(f, 0))
1764 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765}
1766
Guido van Rossum3f5da241990-12-20 15:06:42 +00001767
Guido van Rossum06186511995-01-07 12:40:10 +00001768#define BINOP(opname, ropname, thisfunc) \
1769 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1770 ; \
1771 else \
1772 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001773
1774
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001776or(v, w)
1777 object *v, *w;
1778{
Guido van Rossum06186511995-01-07 12:40:10 +00001779 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001780 if (v->ob_type->tp_as_number != NULL) {
1781 object *x;
1782 object * (*f) FPROTO((object *, object *));
1783 if (coerce(&v, &w) != 0)
1784 return NULL;
1785 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1786 x = (*f)(v, w);
1787 DECREF(v);
1788 DECREF(w);
1789 if (f != NULL)
1790 return x;
1791 }
1792 err_setstr(TypeError, "bad operand type(s) for |");
1793 return NULL;
1794}
1795
1796static object *
1797xor(v, w)
1798 object *v, *w;
1799{
Guido van Rossum06186511995-01-07 12:40:10 +00001800 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001801 if (v->ob_type->tp_as_number != NULL) {
1802 object *x;
1803 object * (*f) FPROTO((object *, object *));
1804 if (coerce(&v, &w) != 0)
1805 return NULL;
1806 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1807 x = (*f)(v, w);
1808 DECREF(v);
1809 DECREF(w);
1810 if (f != NULL)
1811 return x;
1812 }
1813 err_setstr(TypeError, "bad operand type(s) for ^");
1814 return NULL;
1815}
1816
1817static object *
1818and(v, w)
1819 object *v, *w;
1820{
Guido van Rossum06186511995-01-07 12:40:10 +00001821 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001822 if (v->ob_type->tp_as_number != NULL) {
1823 object *x;
1824 object * (*f) FPROTO((object *, object *));
1825 if (coerce(&v, &w) != 0)
1826 return NULL;
1827 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1828 x = (*f)(v, w);
1829 DECREF(v);
1830 DECREF(w);
1831 if (f != NULL)
1832 return x;
1833 }
1834 err_setstr(TypeError, "bad operand type(s) for &");
1835 return NULL;
1836}
1837
1838static object *
1839lshift(v, w)
1840 object *v, *w;
1841{
Guido van Rossum06186511995-01-07 12:40:10 +00001842 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001843 if (v->ob_type->tp_as_number != NULL) {
1844 object *x;
1845 object * (*f) FPROTO((object *, object *));
1846 if (coerce(&v, &w) != 0)
1847 return NULL;
1848 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1849 x = (*f)(v, w);
1850 DECREF(v);
1851 DECREF(w);
1852 if (f != NULL)
1853 return x;
1854 }
1855 err_setstr(TypeError, "bad operand type(s) for <<");
1856 return NULL;
1857}
1858
1859static object *
1860rshift(v, w)
1861 object *v, *w;
1862{
Guido van Rossum06186511995-01-07 12:40:10 +00001863 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001864 if (v->ob_type->tp_as_number != NULL) {
1865 object *x;
1866 object * (*f) FPROTO((object *, object *));
1867 if (coerce(&v, &w) != 0)
1868 return NULL;
1869 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1870 x = (*f)(v, w);
1871 DECREF(v);
1872 DECREF(w);
1873 if (f != NULL)
1874 return x;
1875 }
1876 err_setstr(TypeError, "bad operand type(s) for >>");
1877 return NULL;
1878}
1879
1880static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001881add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 object *v, *w;
1883{
Guido van Rossum06186511995-01-07 12:40:10 +00001884 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001885 if (v->ob_type->tp_as_sequence != NULL)
1886 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1887 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001888 object *x;
1889 if (coerce(&v, &w) != 0)
1890 return NULL;
1891 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1892 DECREF(v);
1893 DECREF(w);
1894 return x;
1895 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001896 err_setstr(TypeError, "bad operand type(s) for +");
1897 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898}
1899
1900static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001901sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 object *v, *w;
1903{
Guido van Rossum06186511995-01-07 12:40:10 +00001904 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001905 if (v->ob_type->tp_as_number != NULL) {
1906 object *x;
1907 if (coerce(&v, &w) != 0)
1908 return NULL;
1909 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1910 DECREF(v);
1911 DECREF(w);
1912 return x;
1913 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001914 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 return NULL;
1916}
1917
1918static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001919mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 object *v, *w;
1921{
1922 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001923 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001924 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001925 if (tp->tp_as_number != NULL &&
1926 w->ob_type->tp_as_sequence != NULL &&
1927 !is_instanceobject(v)) {
1928 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 object *tmp = v;
1930 v = w;
1931 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001932 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001934 if (tp->tp_as_number != NULL) {
1935 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001936 if (is_instanceobject(v)) {
1937 /* Instances of user-defined classes get their
1938 other argument uncoerced, so they may
1939 implement sequence*number as well as
1940 number*number. */
1941 INCREF(v);
1942 INCREF(w);
1943 }
1944 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001945 return NULL;
1946 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1947 DECREF(v);
1948 DECREF(w);
1949 return x;
1950 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951 if (tp->tp_as_sequence != NULL) {
1952 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 err_setstr(TypeError,
1954 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 return NULL;
1956 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001957 return (*tp->tp_as_sequence->sq_repeat)
1958 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001960 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 return NULL;
1962}
1963
1964static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001965divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 object *v, *w;
1967{
Guido van Rossum06186511995-01-07 12:40:10 +00001968 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001969 if (v->ob_type->tp_as_number != NULL) {
1970 object *x;
1971 if (coerce(&v, &w) != 0)
1972 return NULL;
1973 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1974 DECREF(v);
1975 DECREF(w);
1976 return x;
1977 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 return NULL;
1980}
1981
1982static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001983mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 object *v, *w;
1985{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001986 if (is_stringobject(v)) {
1987 return formatstring(v, w);
1988 }
Guido van Rossum06186511995-01-07 12:40:10 +00001989 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001990 if (v->ob_type->tp_as_number != NULL) {
1991 object *x;
1992 if (coerce(&v, &w) != 0)
1993 return NULL;
1994 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1995 DECREF(v);
1996 DECREF(w);
1997 return x;
1998 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001999 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 return NULL;
2001}
2002
2003static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002004neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 object *v;
2006{
2007 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008 return (*v->ob_type->tp_as_number->nb_negative)(v);
2009 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 return NULL;
2011}
2012
2013static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 object *v;
2016{
2017 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002018 return (*v->ob_type->tp_as_number->nb_positive)(v);
2019 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 return NULL;
2021}
2022
2023static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002024invert(v)
2025 object *v;
2026{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002027 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002028 if (v->ob_type->tp_as_number != NULL &&
2029 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2030 return (*f)(v);
2031 err_setstr(TypeError, "bad operand type(s) for unary ~");
2032 return NULL;
2033}
2034
2035static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002036not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 object *v;
2038{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002039 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002040 object *w;
2041 if (outcome < 0)
2042 return NULL;
2043 if (outcome == 0)
2044 w = True;
2045 else
2046 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002047 INCREF(w);
2048 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049}
Guido van Rossum234f9421993-06-17 12:35:49 +00002050
2051
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002052/* External interface to call any callable object. The arg may be NULL. */
2053
2054object *
2055call_object(func, arg)
2056 object *func;
2057 object *arg;
2058{
Guido van Rossume59214e1994-08-30 08:01:59 +00002059 binaryfunc call;
2060 object *result;
2061
2062 if (call = func->ob_type->tp_call) {
2063 int size = gettuplesize(arg);
2064 if (arg) {
2065 size = gettuplesize(arg);
2066 if (size == 1)
2067 arg = gettupleitem(arg, 0);
2068 else if (size == 0)
2069 arg = NULL;
2070 }
2071 result = (*call)(func, arg);
2072 }
2073 else if (is_instancemethodobject(func) || is_funcobject(func))
2074 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002075 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002076 result = call_builtin(func, arg);
2077
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002078 if (result == NULL && !err_occurred())
2079 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002080
2081 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002082}
2083
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002087 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089 if (is_methodobject(func)) {
2090 method meth = getmethod(func);
2091 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002092 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2093 int size = gettuplesize(arg);
2094 if (size == 1)
2095 arg = gettupleitem(arg, 0);
2096 else if (size == 0)
2097 arg = NULL;
2098 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 }
2101 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002102 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002104 if (is_instanceobject(func)) {
2105 object *res, *call = getattr(func,"__call__");
2106 if (call == NULL) {
2107 err_clear();
2108 err_setstr(AttributeError, "no __call__ method defined");
2109 return NULL;
2110 }
2111 res = call_object(call, arg);
2112 DECREF(call);
2113 return res;
2114 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002115 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 return NULL;
2117}
2118
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002120call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002122 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124 object *newarg = NULL;
2125 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002126 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002127 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002128 object *argdefs;
2129 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130
Guido van Rossume8122f11991-05-05 20:03:07 +00002131 if (is_instancemethodobject(func)) {
2132 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002133 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002134 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002135 if (self == NULL) {
2136 /* Unbound methods must be called with an instance of
2137 the class (or a derived class) as first argument */
2138 if (arg != NULL && is_tupleobject(arg) &&
2139 gettuplesize(arg) >= 1) {
2140 self = gettupleitem(arg, 0);
2141 if (self != NULL &&
2142 is_instanceobject(self) &&
2143 issubclass((object *)
2144 (((instanceobject *)self)->in_class),
2145 class))
2146 /* self = self */ ;
2147 else
2148 self = NULL;
2149 }
2150 if (self == NULL) {
2151 err_setstr(TypeError,
2152 "unbound method must be called with class instance argument");
2153 return NULL;
2154 }
2155 }
2156 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002157 if (arg == NULL)
2158 argcount = 0;
2159 else if (is_tupleobject(arg))
2160 argcount = gettuplesize(arg);
2161 else
2162 argcount = 1;
2163 newarg = newtupleobject(argcount + 1);
2164 if (newarg == NULL)
2165 return NULL;
2166 INCREF(self);
2167 settupleitem(newarg, 0, self);
2168 if (arg != NULL && !is_tupleobject(arg)) {
2169 INCREF(arg);
2170 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002171 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002172 else {
2173 int i;
2174 object *v;
2175 for (i = 0; i < argcount; i++) {
2176 v = gettupleitem(arg, i);
2177 XINCREF(v);
2178 settupleitem(newarg, i+1, v);
2179 }
2180 }
2181 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 }
2183 }
2184 else {
2185 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002186 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187 return NULL;
2188 }
2189 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002190
2191 argdefs = getfuncargstuff(func, &argcount);
2192 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2193 int actualcount, j;
2194 /* Process default arguments */
2195 if (argcount & 0x4000)
2196 argcount ^= 0x4000;
2197 actualcount = gettuplesize(arg);
2198 j = gettuplesize(argdefs) - (argcount - actualcount);
2199 if (actualcount < argcount && j >= 0) {
2200 int i;
2201 object *v;
2202 if (newarg == NULL)
2203 INCREF(arg);
2204 newarg = newtupleobject(argcount);
2205 if (newarg == NULL) {
2206 DECREF(arg);
2207 return NULL;
2208 }
2209 for (i = 0; i < actualcount; i++) {
2210 v = gettupleitem(arg, i);
2211 XINCREF(v);
2212 settupleitem(newarg, i, v);
2213 }
2214 for (; i < argcount; i++, j++) {
2215 v = gettupleitem(argdefs, j);
2216 XINCREF(v);
2217 settupleitem(newarg, i, v);
2218 }
2219 DECREF(arg);
2220 arg = newarg;
2221 }
2222 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223
Guido van Rossum3f5da241990-12-20 15:06:42 +00002224 co = getfunccode(func);
2225 if (co == NULL) {
2226 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227 return NULL;
2228 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002229 if (!is_codeobject(co))
2230 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002231 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002233 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 return NULL;
2235 }
2236
Guido van Rossum3f5da241990-12-20 15:06:42 +00002237 newglobals = getfuncglobals(func);
2238 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239
Guido van Rossum81daa321993-05-20 14:24:46 +00002240 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 DECREF(newlocals);
2243 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244
Guido van Rossum3f5da241990-12-20 15:06:42 +00002245 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246
2247 return v;
2248}
2249
2250static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002251apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 object *v, *w;
2253{
2254 typeobject *tp = v->ob_type;
2255 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 return NULL;
2258 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002259 if (tp->tp_as_mapping != NULL) {
2260 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2261 }
2262 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 int i;
2264 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002265 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 return NULL;
2267 }
2268 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002269 if (i < 0) {
2270 int len = (*tp->tp_as_sequence->sq_length)(v);
2271 if (len < 0)
2272 return NULL;
2273 i += len;
2274 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277}
2278
2279static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002280loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 object *v, *w;
2282{
2283 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002284 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 return NULL;
2288 }
2289 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002290 v = (*sq->sq_item)(v, i);
2291 if (v)
2292 return v;
2293 if (err_occurred() == IndexError)
2294 err_clear();
2295 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296}
2297
2298static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002299slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 object *v;
2301 int isize;
2302 int *pi;
2303{
2304 if (v != NULL) {
2305 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002306 err_setstr(TypeError, "slice index must be int");
2307 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308 }
2309 *pi = getintvalue(v);
2310 if (*pi < 0)
2311 *pi += isize;
2312 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314}
2315
2316static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002317apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 object *u, *v, *w;
2319{
2320 typeobject *tp = u->ob_type;
2321 int ilow, ihigh, isize;
2322 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002323 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 return NULL;
2325 }
2326 ilow = 0;
2327 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002328 if (isize < 0)
2329 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002330 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002332 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002336
2337static int
2338assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 object *w;
2340 object *key;
2341 object *v;
2342{
2343 typeobject *tp = w->ob_type;
2344 sequence_methods *sq;
2345 mapping_methods *mp;
2346 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002347 if ((mp = tp->tp_as_mapping) != NULL &&
2348 (func = mp->mp_ass_subscript) != NULL) {
2349 return (*func)(w, key, v);
2350 }
2351 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 (func = sq->sq_ass_item) != NULL) {
2353 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002355 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002356 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002358 else {
2359 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002360 if (i < 0) {
2361 int len = (*sq->sq_length)(w);
2362 if (len < 0)
2363 return -1;
2364 i += len;
2365 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002366 return (*func)(w, i, v);
2367 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370 err_setstr(TypeError,
2371 "can't assign to this subscripted object");
2372 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374}
2375
Guido van Rossum3f5da241990-12-20 15:06:42 +00002376static int
2377assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 object *u, *v, *w, *x;
2379{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002382 if (sq == NULL) {
2383 err_setstr(TypeError, "assign to slice of non-sequence");
2384 return -1;
2385 }
2386 if (sq == NULL || sq->sq_ass_slice == NULL) {
2387 err_setstr(TypeError, "unassignable slice");
2388 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 }
2390 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002391 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002392 if (isize < 0)
2393 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 if (slice_index(v, isize, &ilow) != 0)
2395 return -1;
2396 if (slice_index(w, isize, &ihigh) != 0)
2397 return -1;
2398 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399}
2400
2401static int
2402cmp_exception(err, v)
2403 object *err, *v;
2404{
2405 if (is_tupleobject(v)) {
2406 int i, n;
2407 n = gettuplesize(v);
2408 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002409 /* Test recursively */
2410 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 return 1;
2412 }
2413 return 0;
2414 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002415 if (is_classobject(v) && is_classobject(err))
2416 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 return err == v;
2418}
2419
Guido van Rossum3f5da241990-12-20 15:06:42 +00002420static int
2421cmp_member(v, w)
2422 object *v, *w;
2423{
Guido van Rossume59214e1994-08-30 08:01:59 +00002424 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425 object *x;
2426 sequence_methods *sq;
2427 /* Special case for char in string */
2428 if (is_stringobject(w)) {
2429 register char *s, *end;
2430 register char c;
2431 if (!is_stringobject(v) || getstringsize(v) != 1) {
2432 err_setstr(TypeError,
2433 "string member test needs char left operand");
2434 return -1;
2435 }
2436 c = getstringvalue(v)[0];
2437 s = getstringvalue(w);
2438 end = s + getstringsize(w);
2439 while (s < end) {
2440 if (c == *s++)
2441 return 1;
2442 }
2443 return 0;
2444 }
2445 sq = w->ob_type->tp_as_sequence;
2446 if (sq == NULL) {
2447 err_setstr(TypeError,
2448 "'in' or 'not in' needs sequence right argument");
2449 return -1;
2450 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002451 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002452 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002453 if (x == NULL) {
2454 if (err_occurred() == IndexError) {
2455 err_clear();
2456 break;
2457 }
2458 return -1;
2459 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460 cmp = cmpobject(v, x);
2461 XDECREF(x);
2462 if (cmp == 0)
2463 return 1;
2464 }
2465 return 0;
2466}
2467
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002470 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 register object *v;
2472 register object *w;
2473{
2474 register int cmp;
2475 register int res = 0;
2476 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002477 case IS:
2478 case IS_NOT:
2479 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002480 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002481 res = !res;
2482 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 case IN:
2484 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002485 res = cmp_member(v, w);
2486 if (res < 0)
2487 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002488 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002489 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 break;
2491 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002492 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 break;
2494 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002495 cmp = cmpobject(v, w);
2496 switch (op) {
2497 case LT: res = cmp < 0; break;
2498 case LE: res = cmp <= 0; break;
2499 case EQ: res = cmp == 0; break;
2500 case NE: res = cmp != 0; break;
2501 case GT: res = cmp > 0; break;
2502 case GE: res = cmp >= 0; break;
2503 /* XXX no default? (res is initialized to 0 though) */
2504 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002505 }
2506 v = res ? True : False;
2507 INCREF(v);
2508 return v;
2509}
2510
Guido van Rossum3f5da241990-12-20 15:06:42 +00002511static int
2512import_from(locals, v, name)
2513 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002514 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002515 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002516{
2517 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002518 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002519 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002520 return -1;
2521 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002522 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002523 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002524 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002525 object *name, *value;
2526 pos = 0;
2527 while (mappinggetnext(w, &pos, &name, &value)) {
2528 if (!is_stringobject(name) ||
2529 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002530 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002531 if (is_accessobject(value)) {
2532 value = getaccessvalue(value, (object *)NULL);
2533 if (value == NULL) {
2534 err_clear();
2535 continue;
2536 }
2537 }
2538 else
2539 INCREF(value);
2540 err = dict2insert(locals, name, value);
2541 DECREF(value);
2542 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002543 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002544 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002545 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002546 }
2547 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002548 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002550 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002551 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002552 getstringvalue(name));
2553 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002554 return -1;
2555 }
2556 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002557 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002558 }
2559}
2560
2561static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002562build_class(methods, bases, name)
2563 object *methods; /* dictionary */
2564 object *bases; /* tuple containing classes */
2565 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002566{
Guido van Rossum25831651993-05-19 14:50:45 +00002567 int i;
2568 if (!is_tupleobject(bases)) {
2569 err_setstr(SystemError, "build_class with non-tuple bases");
2570 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002571 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002572 if (gettuplesize(bases) > 0) {
2573 object *base;
2574 base = gettupleitem(bases, 0);
2575 /* Call the base's *type*, if it is callable.
2576 This code is a hook for Donald Beaudry's type extensions.
2577 In unexended Python it will never be triggered since its
2578 types are not callable. */
2579 if (base->ob_type->ob_type->tp_call) {
2580 object *args;
2581 object *class;
2582 args = mkvalue("(OOO)", name, bases, methods);
2583 class = call_object((object *)base->ob_type, args);
2584 DECREF(args);
2585 return class;
2586 }
2587 }
Guido van Rossum25831651993-05-19 14:50:45 +00002588 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002590 return NULL;
2591 }
Guido van Rossum25831651993-05-19 14:50:45 +00002592 if (!is_stringobject(name)) {
2593 err_setstr(SystemError, "build_class witn non-string name");
2594 return NULL;
2595 }
2596 for (i = gettuplesize(bases); --i >= 0; ) {
2597 object *base = gettupleitem(bases, i);
2598 if (!is_classobject(base)) {
2599 err_setstr(TypeError,
2600 "base is not a class object");
2601 return NULL;
2602 }
2603 }
2604 return newclassobject(bases, methods, name);
2605}
2606
2607static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002608access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002609 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002610 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002611 frameobject *f;
2612{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002613 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002614 object *value, *ac;
2615 typeobject *type;
2616 int fastind, ret;
2617 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002618 if (f->f_localmap == NULL)
2619 value = dict2lookup(f->f_locals, name);
2620 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002621 object *map = f->f_localmap;
2622 value = NULL;
2623 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2624 object *fname = gettupleitem(map, fastind);
2625 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002626 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002627 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002628 }
2629 }
2630 }
2631 if (value && is_accessobject(value)) {
2632 err_setstr(AccessError, "can't override access");
2633 return -1;
2634 }
2635 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002636 if (value != NULL && value != None)
2637 type = value->ob_type;
2638 else
2639 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002640 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002641 if (ac == NULL)
2642 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002643 if (fastind >= 0)
2644 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002645 else {
2646 ret = dict2insert(f->f_locals, name, ac);
2647 DECREF(ac);
2648 }
2649 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002650}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002651
2652static int
2653exec_statement(prog, globals, locals)
2654 object *prog;
2655 object *globals;
2656 object *locals;
2657{
2658 char *s;
2659 int n;
2660
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 }
2708 if (run_string(s, file_input, globals, locals) == NULL)
2709 return -1;
2710 return 0;
2711}