blob: fb1c0e7269ba34300b16a1ce5632c66d6abf0508 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "import.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "sysmodule.h"
Guido van Rossum94390ec1995-01-12 11:37:57 +000031#include "bltinmodule.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000034#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000036#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "traceback.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000038#include "graminit.h"
39#include "pythonrun.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040
Guido van Rossumc6004111993-11-05 10:22:19 +000041#include <ctype.h>
42
Guido van Rossume59214e1994-08-30 08:01:59 +000043extern int suppress_print; /* Declared in pythonrun.c, set in pythonmain.c */
44
Guido van Rossum04691fc1992-08-12 15:35:34 +000045/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000046/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000047
Guido van Rossumacbe8da1993-04-15 15:33:52 +000048/* Turn this on if you want to debug the interpreter: */
49/* (This can be on even if NDEBUG is defined) */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050/* #define DEBUG 1 */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000051
52#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000053/* For debugging the interpreter: */
54#define LLTRACE 1 /* Low-level trace feature */
55#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000056#endif
57
Guido van Rossum5b722181993-03-30 17:46:03 +000058
Guido van Rossum374a9221991-04-04 10:40:29 +000059/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000060
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
62static int prtrace PROTO((object *, char *));
63#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000064static void call_exc_trace PROTO((object **, object**, frameobject *));
65static int call_trace
66 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000067static object *add PROTO((object *, object *));
68static object *sub PROTO((object *, object *));
69static object *mul PROTO((object *, object *));
70static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000071static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000072static object *neg PROTO((object *));
73static object *pos PROTO((object *));
74static object *not PROTO((object *));
75static object *invert PROTO((object *));
76static object *lshift PROTO((object *, object *));
77static object *rshift PROTO((object *, object *));
78static object *and PROTO((object *, object *));
79static object *xor PROTO((object *, object *));
80static object *or PROTO((object *, object *));
81static object *call_builtin PROTO((object *, object *));
82static object *call_function PROTO((object *, object *));
83static object *apply_subscript PROTO((object *, object *));
84static object *loop_subscript PROTO((object *, object *));
85static int slice_index PROTO((object *, int, int *));
86static object *apply_slice PROTO((object *, object *, object *));
87static int assign_subscript PROTO((object *, object *, object *));
88static int assign_slice PROTO((object *, object *, object *, object *));
89static int cmp_exception PROTO((object *, object *));
90static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000091static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000092static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000093static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000094static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000095static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum0a066c01992-03-27 17:29:15 +000098/* Pointer to current frame, used to link new frames to */
99
Guido van Rossum374a9221991-04-04 10:40:29 +0000100static frameobject *current_frame;
101
Guido van Rossume59214e1994-08-30 08:01:59 +0000102#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000103
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104#include <errno.h>
105#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
Guido van Rossuma9672091994-09-14 13:31:22 +0000107static type_lock interpreter_lock = 0;
108static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109
110void
111init_save_thread()
112{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000114 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115 interpreter_lock = allocate_lock();
116 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000117 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000119
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120#endif
121
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122/* Functions save_thread and restore_thread are always defined so
123 dynamically loaded modules needn't be compiled separately for use
124 with and without threads: */
125
Guido van Rossum04691fc1992-08-12 15:35:34 +0000126object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127save_thread()
128{
Guido van Rossume59214e1994-08-30 08:01:59 +0000129#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000131 object *res;
132 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133 current_frame = NULL;
134 release_lock(interpreter_lock);
135 return res;
136 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000138 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139}
140
141void
142restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000143 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144{
Guido van Rossume59214e1994-08-30 08:01:59 +0000145#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 if (interpreter_lock) {
147 int err;
148 err = errno;
149 acquire_lock(interpreter_lock, 1);
150 errno = err;
151 current_frame = (frameobject *)x;
152 }
153#endif
154}
155
156
Guido van Rossuma9672091994-09-14 13:31:22 +0000157/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
158 signal handlers or Mac I/O completion routines) can schedule calls
159 to a function to be called synchronously.
160 The synchronous function is called with one void* argument.
161 It should return 0 for success or -1 for failure -- failure should
162 be accompanied by an exception.
163
164 If registry succeeds, the registry function returns 0; if it fails
165 (e.g. due to too many pending calls) it returns -1 (without setting
166 an exception condition).
167
168 Note that because registry may occur from within signal handlers,
169 or other asynchronous events, calling malloc() is unsafe!
170
171#ifdef WITH_THREAD
172 Any thread can schedule pending calls, but only the main thread
173 will execute them.
174#endif
175
176 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
177 There are two possible race conditions:
178 (1) nested asynchronous registry calls;
179 (2) registry calls made while pending calls are being processed.
180 While (1) is very unlikely, (2) is a real possibility.
181 The current code is safe against (2), but not against (1).
182 The safety against (2) is derived from the fact that only one
183 thread (the main thread) ever takes things out of the queue.
184*/
185
186#define NPENDINGCALLS 32
187static struct {
188 int (*func) PROTO((ANY *));
189 ANY *arg;
190} pendingcalls[NPENDINGCALLS];
191static volatile int pendingfirst = 0;
192static volatile int pendinglast = 0;
193
194int
195Py_AddPendingCall(func, arg)
196 int (*func) PROTO((ANY *));
197 ANY *arg;
198{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000199 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000200 int i, j;
201 /* XXX Begin critical section */
202 /* XXX If you want this to be safe against nested
203 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000204 if (busy)
205 return -1;
206 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000207 i = pendinglast;
208 j = (i + 1) % NPENDINGCALLS;
209 if (j == pendingfirst)
210 return -1; /* Queue full */
211 pendingcalls[i].func = func;
212 pendingcalls[i].arg = arg;
213 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000215 /* XXX End critical section */
216 return 0;
217}
218
Guido van Rossum180d7b41994-09-29 09:45:57 +0000219int
220Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000221{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000222 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000223#ifdef WITH_THREAD
224 if (get_thread_ident() != main_thread)
225 return 0;
226#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000227 if (busy)
228 return 0;
229 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000230 for (;;) {
231 int i;
232 int (*func) PROTO((ANY *));
233 ANY *arg;
234 i = pendingfirst;
235 if (i == pendinglast)
236 break; /* Queue empty */
237 func = pendingcalls[i].func;
238 arg = pendingcalls[i].arg;
239 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000240 if (func(arg) < 0) {
241 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000242 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000243 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 return 0;
247}
248
249
Guido van Rossum374a9221991-04-04 10:40:29 +0000250/* Status code for main loop (reason for stack unwind) */
251
252enum why_code {
253 WHY_NOT, /* No error */
254 WHY_EXCEPTION, /* Exception occurred */
255 WHY_RERAISE, /* Exception re-raised by 'finally' */
256 WHY_RETURN, /* 'return' statement */
257 WHY_BREAK /* 'break' statement */
258};
259
260
261/* Interpreter main loop */
262
263object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000264eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000265 codeobject *co;
266 object *globals;
267 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000268 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000269 object *arg;
270{
271 register unsigned char *next_instr;
272 register int opcode; /* Current opcode */
273 register int oparg; /* Current opcode argument, if any */
274 register object **stack_pointer;
275 register enum why_code why; /* Reason for block stack unwind */
276 register int err; /* Error status -- nonzero if error */
277 register object *x; /* Result object -- NULL if error */
278 register object *v; /* Temporary objects popped off stack */
279 register object *w;
280 register object *u;
281 register object *t;
282 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000283 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000284 object *retval; /* Return value iff why == WHY_RETURN */
285 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000286 int needmerge = 0; /* Set if need to merge locals back at end */
287 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000288#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000289 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000290#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000291#ifdef DEBUG
292 /* Make it easier to find out where we are with dbx */
293 char *filename = getstringvalue(co->co_filename);
294#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000295
296/* Code access macros */
297
298#define GETCONST(i) Getconst(f, i)
299#define GETNAME(i) Getname(f, i)
300#define GETNAMEV(i) Getnamev(f, i)
301#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
302#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
303#define NEXTOP() (*next_instr++)
304#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
305#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
306#define JUMPBY(x) (next_instr += (x))
307
308/* Stack manipulation macros */
309
310#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
311#define EMPTY() (STACK_LEVEL() == 0)
312#define TOP() (stack_pointer[-1])
313#define BASIC_PUSH(v) (*stack_pointer++ = (v))
314#define BASIC_POP() (*--stack_pointer)
315
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000316#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
317 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
318
Guido van Rossum96a42c81992-01-12 02:29:51 +0000319#ifdef LLTRACE
320#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
321#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000322#else
323#define PUSH(v) BASIC_PUSH(v)
324#define POP() BASIC_POP()
325#endif
326
Guido van Rossum6135a871995-01-09 17:53:26 +0000327 if (globals == NULL || locals == NULL) {
328 err_setstr(SystemError, "eval_code: NULL globals or locals");
329 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000330 }
331
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000332#ifdef LLTRACE
333 lltrace = dictlookup(globals, "__lltrace__") != NULL;
334#endif
335
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 f = newframeobject(
337 current_frame, /*back*/
338 co, /*code*/
339 globals, /*globals*/
340 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000341 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 50, /*nvalues*/
343 20); /*nblocks*/
344 if (f == NULL)
345 return NULL;
346
347 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000348
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000349 if (sys_trace != NULL) {
350 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000351 be called on *every* entry to a code block.
352 Its return value, if not None, is a function that
353 will be called at the start of each executed line
354 of code. (Actually, the function must return
355 itself in order to continue tracing.)
356 The trace functions are called with three arguments:
357 a pointer to the current frame, a string indicating
358 why the function is called, and an argument which
359 depends on the situation. The global trace function
360 (sys.trace) is also called whenever an exception
361 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000362 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000363 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000364 current_frame = f->f_back;
365 DECREF(f);
366 return NULL;
367 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000368 }
369
370 if (sys_profile != NULL) {
371 /* Similar for sys_profile, except it needn't return
372 itself and isn't called for "line" events */
373 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
374 current_frame = f->f_back;
375 DECREF(f);
376 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000377 }
378 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000379
Guido van Rossum374a9221991-04-04 10:40:29 +0000380 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000381 stack_pointer = f->f_valuestack;
382
383 if (arg != NULL) {
384 INCREF(arg);
385 PUSH(arg);
386 }
387
388 why = WHY_NOT;
389 err = 0;
390 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000391
392 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000393 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000394
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000395 /* Do periodic things.
396 Doing this every time through the loop would add
397 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000398 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000399
Guido van Rossuma9672091994-09-14 13:31:22 +0000400 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 why = WHY_EXCEPTION;
403 goto on_error;
404 }
405 }
406
Guido van Rossum374a9221991-04-04 10:40:29 +0000407 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000408 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000409 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000411 goto on_error;
412 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000413
Guido van Rossume59214e1994-08-30 08:01:59 +0000414#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415 if (interpreter_lock) {
416 /* Give another thread a chance */
417
418 current_frame = NULL;
419 release_lock(interpreter_lock);
420
421 /* Other threads may run now */
422
423 acquire_lock(interpreter_lock, 1);
424 current_frame = f;
425 }
426#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000427 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428
Guido van Rossum374a9221991-04-04 10:40:29 +0000429 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000430
431#ifdef DEBUG
432 f->f_lasti = INSTR_OFFSET();
433#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000434
435 opcode = NEXTOP();
436 if (HAS_ARG(opcode))
437 oparg = NEXTARG();
438
Guido van Rossum96a42c81992-01-12 02:29:51 +0000439#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000440 /* Instruction tracing */
441
Guido van Rossum96a42c81992-01-12 02:29:51 +0000442 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000443 if (HAS_ARG(opcode)) {
444 printf("%d: %d, %d\n",
445 (int) (INSTR_OFFSET() - 3),
446 opcode, oparg);
447 }
448 else {
449 printf("%d: %d\n",
450 (int) (INSTR_OFFSET() - 1), opcode);
451 }
452 }
453#endif
454
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000455 if (!CHECK_STACK(3)) {
456 x = NULL;
457 break;
458 }
459
Guido van Rossum374a9221991-04-04 10:40:29 +0000460 /* Main switch on opcode */
461
462 switch (opcode) {
463
464 /* BEWARE!
465 It is essential that any operation that fails sets either
466 x to NULL, err to nonzero, or why to anything but WHY_NOT,
467 and that no operation that succeeds does this! */
468
469 /* case STOP_CODE: this is an error! */
470
471 case POP_TOP:
472 v = POP();
473 DECREF(v);
474 break;
475
476 case ROT_TWO:
477 v = POP();
478 w = POP();
479 PUSH(v);
480 PUSH(w);
481 break;
482
483 case ROT_THREE:
484 v = POP();
485 w = POP();
486 x = POP();
487 PUSH(v);
488 PUSH(x);
489 PUSH(w);
490 break;
491
492 case DUP_TOP:
493 v = TOP();
494 INCREF(v);
495 PUSH(v);
496 break;
497
498 case UNARY_POSITIVE:
499 v = POP();
500 x = pos(v);
501 DECREF(v);
502 PUSH(x);
503 break;
504
505 case UNARY_NEGATIVE:
506 v = POP();
507 x = neg(v);
508 DECREF(v);
509 PUSH(x);
510 break;
511
512 case UNARY_NOT:
513 v = POP();
514 x = not(v);
515 DECREF(v);
516 PUSH(x);
517 break;
518
519 case UNARY_CONVERT:
520 v = POP();
521 x = reprobject(v);
522 DECREF(v);
523 PUSH(x);
524 break;
525
526 case UNARY_CALL:
527 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000528 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000529 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000530 DECREF(v);
531 PUSH(x);
532 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000533
534 case UNARY_INVERT:
535 v = POP();
536 x = invert(v);
537 DECREF(v);
538 PUSH(x);
539 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000540
541 case BINARY_MULTIPLY:
542 w = POP();
543 v = POP();
544 x = mul(v, w);
545 DECREF(v);
546 DECREF(w);
547 PUSH(x);
548 break;
549
550 case BINARY_DIVIDE:
551 w = POP();
552 v = POP();
553 x = divide(v, w);
554 DECREF(v);
555 DECREF(w);
556 PUSH(x);
557 break;
558
559 case BINARY_MODULO:
560 w = POP();
561 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000562 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000563 DECREF(v);
564 DECREF(w);
565 PUSH(x);
566 break;
567
568 case BINARY_ADD:
569 w = POP();
570 v = POP();
571 x = add(v, w);
572 DECREF(v);
573 DECREF(w);
574 PUSH(x);
575 break;
576
577 case BINARY_SUBTRACT:
578 w = POP();
579 v = POP();
580 x = sub(v, w);
581 DECREF(v);
582 DECREF(w);
583 PUSH(x);
584 break;
585
586 case BINARY_SUBSCR:
587 w = POP();
588 v = POP();
589 x = apply_subscript(v, w);
590 DECREF(v);
591 DECREF(w);
592 PUSH(x);
593 break;
594
595 case BINARY_CALL:
596 w = POP();
597 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000598 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000599 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 DECREF(v);
601 DECREF(w);
602 PUSH(x);
603 break;
604
Guido van Rossum7928cd71991-10-24 14:59:31 +0000605 case BINARY_LSHIFT:
606 w = POP();
607 v = POP();
608 x = lshift(v, w);
609 DECREF(v);
610 DECREF(w);
611 PUSH(x);
612 break;
613
614 case BINARY_RSHIFT:
615 w = POP();
616 v = POP();
617 x = rshift(v, w);
618 DECREF(v);
619 DECREF(w);
620 PUSH(x);
621 break;
622
623 case BINARY_AND:
624 w = POP();
625 v = POP();
626 x = and(v, w);
627 DECREF(v);
628 DECREF(w);
629 PUSH(x);
630 break;
631
632 case BINARY_XOR:
633 w = POP();
634 v = POP();
635 x = xor(v, w);
636 DECREF(v);
637 DECREF(w);
638 PUSH(x);
639 break;
640
641 case BINARY_OR:
642 w = POP();
643 v = POP();
644 x = or(v, w);
645 DECREF(v);
646 DECREF(w);
647 PUSH(x);
648 break;
649
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 case SLICE+0:
651 case SLICE+1:
652 case SLICE+2:
653 case SLICE+3:
654 if ((opcode-SLICE) & 2)
655 w = POP();
656 else
657 w = NULL;
658 if ((opcode-SLICE) & 1)
659 v = POP();
660 else
661 v = NULL;
662 u = POP();
663 x = apply_slice(u, v, w);
664 DECREF(u);
665 XDECREF(v);
666 XDECREF(w);
667 PUSH(x);
668 break;
669
670 case STORE_SLICE+0:
671 case STORE_SLICE+1:
672 case STORE_SLICE+2:
673 case STORE_SLICE+3:
674 if ((opcode-STORE_SLICE) & 2)
675 w = POP();
676 else
677 w = NULL;
678 if ((opcode-STORE_SLICE) & 1)
679 v = POP();
680 else
681 v = NULL;
682 u = POP();
683 t = POP();
684 err = assign_slice(u, v, w, t); /* u[v:w] = t */
685 DECREF(t);
686 DECREF(u);
687 XDECREF(v);
688 XDECREF(w);
689 break;
690
691 case DELETE_SLICE+0:
692 case DELETE_SLICE+1:
693 case DELETE_SLICE+2:
694 case DELETE_SLICE+3:
695 if ((opcode-DELETE_SLICE) & 2)
696 w = POP();
697 else
698 w = NULL;
699 if ((opcode-DELETE_SLICE) & 1)
700 v = POP();
701 else
702 v = NULL;
703 u = POP();
704 err = assign_slice(u, v, w, (object *)NULL);
705 /* del u[v:w] */
706 DECREF(u);
707 XDECREF(v);
708 XDECREF(w);
709 break;
710
711 case STORE_SUBSCR:
712 w = POP();
713 v = POP();
714 u = POP();
715 /* v[w] = u */
716 err = assign_subscript(v, w, u);
717 DECREF(u);
718 DECREF(v);
719 DECREF(w);
720 break;
721
722 case DELETE_SUBSCR:
723 w = POP();
724 v = POP();
725 /* del v[w] */
726 err = assign_subscript(v, w, (object *)NULL);
727 DECREF(v);
728 DECREF(w);
729 break;
730
731 case PRINT_EXPR:
732 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000734 /* Before printing, also assign to '_' */
735 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000736 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000737 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000739 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000740 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000741 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 flushline();
743 }
744 DECREF(v);
745 break;
746
747 case PRINT_ITEM:
748 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000749 w = sysget("stdout");
750 if (softspace(w, 1))
751 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000752 err = writeobject(v, w, PRINT_RAW);
753 if (err == 0 && is_stringobject(v)) {
754 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 char *s = getstringvalue(v);
756 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000757 if (len > 0 && isspace(s[len-1]) &&
758 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000759 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 DECREF(v);
762 break;
763
764 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000765 x = sysget("stdout");
766 if (x == NULL)
767 err_setstr(RuntimeError, "lost sys.stdout");
768 else {
769 writestring("\n", x);
770 softspace(x, 0);
771 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 break;
773
774 case BREAK_LOOP:
775 why = WHY_BREAK;
776 break;
777
778 case RAISE_EXCEPTION:
779 v = POP();
780 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000781 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000782 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000783 u = w;
784 w = gettupleitem(u, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000785 INCREF(w);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000786 INCREF(w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000787 DECREF(u);
788 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000789 if (is_stringobject(w)) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 err_setval(w, v);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000791 } else if (is_classobject(w)) {
792 if (!is_instanceobject(v)
793 || !issubclass((object*)((instanceobject*)v)->in_class,
794 w))
795 err_setstr(TypeError,
796 "a class exception must have a value that is an instance of the class");
797 else
798 err_setval(w,v);
799 } else if (is_instanceobject(w)) {
800 if (v != None)
801 err_setstr(TypeError,
802 "an instance exception may not have a separate value");
803 else {
804 DECREF(v);
805 v = w;
806 w = (object*) ((instanceobject*)w)->in_class;
807 INCREF(w);
808 err_setval(w, v);
809 }
810 } else
811 err_setstr(TypeError,
812 "exceptions must be strings, classes, or instances");
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 DECREF(v);
814 DECREF(w);
815 why = WHY_EXCEPTION;
816 break;
817
818 case LOAD_LOCALS:
819 v = f->f_locals;
820 INCREF(v);
821 PUSH(v);
822 break;
823
824 case RETURN_VALUE:
825 retval = POP();
826 why = WHY_RETURN;
827 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000828
829 case LOAD_GLOBALS:
830 v = f->f_locals;
831 INCREF(v);
832 PUSH(v);
833 break;
834
835 case EXEC_STMT:
836 w = POP();
837 v = POP();
838 u = POP();
839 err = exec_statement(u, v, w);
840 DECREF(u);
841 DECREF(v);
842 DECREF(w);
843 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 case BUILD_FUNCTION:
846 v = POP();
847 x = newfuncobject(v, f->f_globals);
848 DECREF(v);
849 PUSH(x);
850 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000851
852 case SET_FUNC_ARGS:
853 v = POP(); /* The function */
854 w = POP(); /* The argument list */
855 err = setfuncargstuff(v, oparg, w);
856 PUSH(v);
857 DECREF(w);
858 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000859
860 case POP_BLOCK:
861 {
862 block *b = pop_block(f);
863 while (STACK_LEVEL() > b->b_level) {
864 v = POP();
865 DECREF(v);
866 }
867 }
868 break;
869
870 case END_FINALLY:
871 v = POP();
872 if (is_intobject(v)) {
873 why = (enum why_code) getintvalue(v);
874 if (why == WHY_RETURN)
875 retval = POP();
876 }
877 else if (is_stringobject(v)) {
878 w = POP();
879 err_setval(v, w);
880 DECREF(w);
881 w = POP();
882 tb_store(w);
883 DECREF(w);
884 why = WHY_RERAISE;
885 }
886 else if (v != None) {
887 err_setstr(SystemError,
888 "'finally' pops bad exception");
889 why = WHY_EXCEPTION;
890 }
891 DECREF(v);
892 break;
893
894 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000895 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000897 w = POP();
898 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000900 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 DECREF(v);
902 DECREF(w);
903 break;
904
905 case STORE_NAME:
906 w = GETNAMEV(oparg);
907 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000908 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000909 if (u == NULL) {
910 if (defmode != 0) {
911 if (v != None)
912 u = (object *)v->ob_type;
913 else
914 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000915 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000916 (typeobject *)u,
917 defmode);
918 DECREF(v);
919 if (x == NULL)
920 break;
921 v = x;
922 }
923 }
924 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000925 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000926 DECREF(v);
927 break;
928 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 err = dict2insert(f->f_locals, w, v);
930 DECREF(v);
931 break;
932
933 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000934 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000935 u = dict2lookup(f->f_locals, w);
936 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000937 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000938 (object *)NULL);
939 break;
940 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000941 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000942 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944
945#ifdef CASE_TOO_BIG
946 default: switch (opcode) {
947#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000948
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000949 case UNPACK_VARARG:
950 if (EMPTY()) {
951 err_setstr(TypeError,
952 "no argument list");
953 why = WHY_EXCEPTION;
954 break;
955 }
956 v = POP();
957 if (!is_tupleobject(v)) {
958 err_setstr(TypeError,
959 "bad argument list");
960 why = WHY_EXCEPTION;
961 }
962 else if (gettuplesize(v) < oparg) {
963 err_setstr(TypeError,
964 "not enough arguments");
965 why = WHY_EXCEPTION;
966 }
967 else if (oparg == 0) {
968 PUSH(v);
969 break;
970 }
971 else {
972 x = gettupleslice(v, oparg, gettuplesize(v));
973 if (x != NULL) {
974 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000975 if (!CHECK_STACK(oparg)) {
976 x = NULL;
977 break;
978 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000979 for (; --oparg >= 0; ) {
980 w = gettupleitem(v, oparg);
981 INCREF(w);
982 PUSH(w);
983 }
984 }
985 }
986 DECREF(v);
987 break;
988
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000989 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000990 {
991 int n;
992 if (EMPTY()) {
993 err_setstr(TypeError,
994 "no argument list");
995 why = WHY_EXCEPTION;
996 break;
997 }
998 v = POP();
999 if (!is_tupleobject(v)) {
1000 err_setstr(TypeError,
1001 "bad argument list");
1002 why = WHY_EXCEPTION;
1003 break;
1004 }
1005 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +00001006#ifdef COMPAT_HACKS
1007/* Implement various compatibility hacks (for 0.9.4 or earlier):
1008 (a) f(a,b,...) accepts f((1,2,...))
1009 (b) f((a,b,...)) accepts f(1,2,...)
1010 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
1011*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001012 if (n == 1 && oparg != 1) {
1013 /* Rule (a) */
1014 w = gettupleitem(v, 0);
1015 if (is_tupleobject(w)) {
1016 INCREF(w);
1017 DECREF(v);
1018 v = w;
1019 n = gettuplesize(v);
1020 }
1021 }
1022 else if (n != 1 && oparg == 1) {
1023 /* Rule (b) */
1024 PUSH(v);
1025 break;
1026 /* Don't fall through */
1027 }
1028 else if (n > 2 && oparg == 2) {
1029 /* Rule (c) */
1030 int i;
1031 w = newtupleobject(n-1);
1032 u = newtupleobject(2);
1033 if (u == NULL || w == NULL) {
1034 XDECREF(w);
1035 XDECREF(u);
1036 DECREF(v);
1037 why = WHY_EXCEPTION;
1038 break;
1039 }
1040 t = gettupleitem(v, 0);
1041 INCREF(t);
1042 settupleitem(u, 0, t);
1043 for (i = 1; i < n; i++) {
1044 t = gettupleitem(v, i);
1045 INCREF(t);
1046 settupleitem(w, i-1, t);
1047 }
1048 settupleitem(u, 1, w);
1049 DECREF(v);
1050 v = u;
1051 n = 2;
1052 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001053#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001054 if (n != oparg) {
1055 err_setstr(TypeError,
1056 "arg count mismatch");
1057 why = WHY_EXCEPTION;
1058 DECREF(v);
1059 break;
1060 }
1061 PUSH(v);
1062 }
1063 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 case UNPACK_TUPLE:
1065 v = POP();
1066 if (!is_tupleobject(v)) {
1067 err_setstr(TypeError, "unpack non-tuple");
1068 why = WHY_EXCEPTION;
1069 }
1070 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001071 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 "unpack tuple of wrong size");
1073 why = WHY_EXCEPTION;
1074 }
1075 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001076 if (!CHECK_STACK(oparg)) {
1077 x = NULL;
1078 break;
1079 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001080 for (; --oparg >= 0; ) {
1081 w = gettupleitem(v, oparg);
1082 INCREF(w);
1083 PUSH(w);
1084 }
1085 }
1086 DECREF(v);
1087 break;
1088
1089 case UNPACK_LIST:
1090 v = POP();
1091 if (!is_listobject(v)) {
1092 err_setstr(TypeError, "unpack non-list");
1093 why = WHY_EXCEPTION;
1094 }
1095 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001096 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 "unpack list of wrong size");
1098 why = WHY_EXCEPTION;
1099 }
1100 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001101 if (!CHECK_STACK(oparg)) {
1102 x = NULL;
1103 break;
1104 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 for (; --oparg >= 0; ) {
1106 w = getlistitem(v, oparg);
1107 INCREF(w);
1108 PUSH(w);
1109 }
1110 }
1111 DECREF(v);
1112 break;
1113
1114 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 v = POP();
1117 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001118 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 DECREF(v);
1120 DECREF(u);
1121 break;
1122
1123 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001124 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001126 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001127 DECREF(v);
1128 break;
1129
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001130 case STORE_GLOBAL:
1131 w = GETNAMEV(oparg);
1132 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001133 u = dict2lookup(f->f_locals, w);
1134 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001135 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001136 DECREF(v);
1137 break;
1138 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001139 err = dict2insert(f->f_globals, w, v);
1140 DECREF(v);
1141 break;
1142
1143 case DELETE_GLOBAL:
1144 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001145 u = dict2lookup(f->f_locals, w);
1146 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001147 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001148 (object *)NULL);
1149 break;
1150 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001151 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001152 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001153 break;
1154
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 case LOAD_CONST:
1156 x = GETCONST(oparg);
1157 INCREF(x);
1158 PUSH(x);
1159 break;
1160
1161 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001162 w = GETNAMEV(oparg);
1163 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001165 err_clear();
1166 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001168 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001169 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001171 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 break;
1173 }
1174 }
1175 }
Guido van Rossum25831651993-05-19 14:50:45 +00001176 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001177 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001178 if (x == NULL)
1179 break;
1180 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001181 else
1182 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 PUSH(x);
1184 break;
1185
1186 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001187 w = GETNAMEV(oparg);
1188 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001190 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001191 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001193 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 break;
1195 }
1196 }
Guido van Rossum25831651993-05-19 14:50:45 +00001197 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001198 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001199 if (x == NULL)
1200 break;
1201 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001202 else
1203 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 PUSH(x);
1205 break;
1206
1207 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001208 w = GETNAMEV(oparg);
1209 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001211 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 break;
1213 }
Guido van Rossum25831651993-05-19 14:50:45 +00001214 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001215 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001216 if (x == NULL)
1217 break;
1218 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001219 else
1220 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 PUSH(x);
1222 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001223
1224 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001225 x = GETCONST(oparg);
1226 if (x == None)
1227 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001228 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001229 err_setstr(SystemError, "bad RESERVE_FAST");
1230 x = NULL;
1231 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001232 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001233 XDECREF(f->f_fastlocals);
1234 XDECREF(f->f_localmap);
1235 INCREF(x);
1236 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001237 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001238 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001239 break;
1240
1241 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001242 x = GETLISTITEM(fastlocals, oparg);
1243 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001244 err_setval(NameError,
1245 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001246 break;
1247 }
Guido van Rossum25831651993-05-19 14:50:45 +00001248 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001249 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001250 if (x == NULL)
1251 break;
1252 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001253 else
1254 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001255 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001256 break;
1257
1258 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001259 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001260 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001261 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001262 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001263 DECREF(v);
1264 break;
1265 }
Guido van Rossum25831651993-05-19 14:50:45 +00001266 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001267 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001268 break;
1269
1270 case DELETE_FAST:
1271 x = GETLISTITEM(fastlocals, oparg);
1272 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001273 err_setval(NameError,
1274 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001275 break;
1276 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001277 if (x != NULL && is_accessobject(x)) {
1278 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001279 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001280 break;
1281 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001282 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001284 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001285
1286 case BUILD_TUPLE:
1287 x = newtupleobject(oparg);
1288 if (x != NULL) {
1289 for (; --oparg >= 0;) {
1290 w = POP();
1291 err = settupleitem(x, oparg, w);
1292 if (err != 0)
1293 break;
1294 }
1295 PUSH(x);
1296 }
1297 break;
1298
1299 case BUILD_LIST:
1300 x = newlistobject(oparg);
1301 if (x != NULL) {
1302 for (; --oparg >= 0;) {
1303 w = POP();
1304 err = setlistitem(x, oparg, w);
1305 if (err != 0)
1306 break;
1307 }
1308 PUSH(x);
1309 }
1310 break;
1311
1312 case BUILD_MAP:
1313 x = newdictobject();
1314 PUSH(x);
1315 break;
1316
1317 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001318 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001320 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 DECREF(v);
1322 PUSH(x);
1323 break;
1324
1325 case COMPARE_OP:
1326 w = POP();
1327 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001328 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 DECREF(v);
1330 DECREF(w);
1331 PUSH(x);
1332 break;
1333
1334 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001336 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001337 if (x == NULL) {
1338 err_setstr(ImportError,
1339 "__import__ not found");
1340 break;
1341 }
1342 w = mkvalue("(O)", w);
1343 if (w == NULL) {
1344 x = NULL;
1345 break;
1346 }
1347 x = call_object(x, w);
1348 DECREF(w);
1349 if (x)
1350 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 break;
1352
1353 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001354 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001356 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001357 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001359
1360 case ACCESS_MODE:
1361 v = POP();
1362 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001363 if (getstringvalue(w)[0] == '*')
1364 defmode = getintvalue(v);
1365 else
1366 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001367 DECREF(v);
1368 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001369
1370 case JUMP_FORWARD:
1371 JUMPBY(oparg);
1372 break;
1373
1374 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001375 err = testbool(TOP());
1376 if (err > 0)
1377 err = 0;
1378 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 JUMPBY(oparg);
1380 break;
1381
1382 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001383 err = testbool(TOP());
1384 if (err > 0) {
1385 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001387 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 break;
1389
1390 case JUMP_ABSOLUTE:
1391 JUMPTO(oparg);
1392 break;
1393
1394 case FOR_LOOP:
1395 /* for v in s: ...
1396 On entry: stack contains s, i.
1397 On exit: stack contains s, i+1, s[i];
1398 but if loop exhausted:
1399 s, i are popped, and we jump */
1400 w = POP(); /* Loop index */
1401 v = POP(); /* Sequence object */
1402 u = loop_subscript(v, w);
1403 if (u != NULL) {
1404 PUSH(v);
1405 x = newintobject(getintvalue(w)+1);
1406 PUSH(x);
1407 DECREF(w);
1408 PUSH(u);
1409 }
1410 else {
1411 DECREF(v);
1412 DECREF(w);
1413 /* A NULL can mean "s exhausted"
1414 but also an error: */
1415 if (err_occurred())
1416 why = WHY_EXCEPTION;
1417 else
1418 JUMPBY(oparg);
1419 }
1420 break;
1421
1422 case SETUP_LOOP:
1423 case SETUP_EXCEPT:
1424 case SETUP_FINALLY:
1425 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1426 STACK_LEVEL());
1427 break;
1428
1429 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001430#ifdef LLTRACE
1431 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001432 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001434 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001435 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001436 /* Trace each line of code reached */
1437 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001438 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001439 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001440 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 break;
1442
1443 default:
1444 fprintf(stderr,
1445 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001446 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 err_setstr(SystemError, "eval_code: unknown opcode");
1448 why = WHY_EXCEPTION;
1449 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001450
1451#ifdef CASE_TOO_BIG
1452 }
1453#endif
1454
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 } /* switch */
1456
1457 on_error:
1458
1459 /* Quickly continue if no error occurred */
1460
1461 if (why == WHY_NOT) {
1462 if (err == 0 && x != NULL)
1463 continue; /* Normal, fast path */
1464 why = WHY_EXCEPTION;
1465 x = None;
1466 err = 0;
1467 }
1468
Guido van Rossum801dcae1992-04-08 11:32:32 +00001469#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 /* Double-check exception status */
1471
1472 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1473 if (!err_occurred()) {
1474 fprintf(stderr, "XXX ghost error\n");
1475 err_setstr(SystemError, "ghost error");
1476 why = WHY_EXCEPTION;
1477 }
1478 }
1479 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001480 if (err_occurred())
1481 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 }
1483#endif
1484
1485 /* Log traceback info if this is a real exception */
1486
1487 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001488 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001490 f->f_lasti -= 2;
1491 tb_here(f);
1492
Guido van Rossume59214e1994-08-30 08:01:59 +00001493 if (f->f_trace)
1494 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001495 if (sys_profile)
1496 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 }
1498
1499 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1500
1501 if (why == WHY_RERAISE)
1502 why = WHY_EXCEPTION;
1503
1504 /* Unwind stacks if a (pseudo) exception occurred */
1505
1506 while (why != WHY_NOT && f->f_iblock > 0) {
1507 block *b = pop_block(f);
1508 while (STACK_LEVEL() > b->b_level) {
1509 v = POP();
1510 XDECREF(v);
1511 }
1512 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1513 why = WHY_NOT;
1514 JUMPTO(b->b_handler);
1515 break;
1516 }
1517 if (b->b_type == SETUP_FINALLY ||
1518 b->b_type == SETUP_EXCEPT &&
1519 why == WHY_EXCEPTION) {
1520 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001521 object *exc, *val, *tb;
1522 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 if (val == NULL) {
1524 val = None;
1525 INCREF(val);
1526 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 /* Make the raw exception data
1528 available to the handler,
1529 so a program can emulate the
1530 Python main loop. Don't do
1531 this for 'finally'. */
1532 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001533 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 sysset("exc_value", val);
1535 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001537 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 PUSH(val);
1539 PUSH(exc);
1540 }
1541 else {
1542 if (why == WHY_RETURN)
1543 PUSH(retval);
1544 v = newintobject((long)why);
1545 PUSH(v);
1546 }
1547 why = WHY_NOT;
1548 JUMPTO(b->b_handler);
1549 break;
1550 }
1551 } /* unwind stack */
1552
1553 /* End the loop if we still have an error (or return) */
1554
1555 if (why != WHY_NOT)
1556 break;
1557
1558 } /* main loop */
1559
1560 /* Pop remaining stack entries */
1561
1562 while (!EMPTY()) {
1563 v = POP();
1564 XDECREF(v);
1565 }
1566
Guido van Rossum96a42c81992-01-12 02:29:51 +00001567 if (why != WHY_RETURN)
1568 retval = NULL;
1569
Guido van Rossume59214e1994-08-30 08:01:59 +00001570 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001571 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001572 if (call_trace(&f->f_trace, &f->f_trace, f,
1573 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001574 XDECREF(retval);
1575 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001576 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001577 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001578 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001579 }
1580
1581 if (sys_profile && why == WHY_RETURN) {
1582 if (call_trace(&sys_profile, (object**)0,
1583 f, "return", retval)) {
1584 XDECREF(retval);
1585 retval = NULL;
1586 why = WHY_EXCEPTION;
1587 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001588 }
1589
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 /* Restore previous frame and release the current one */
1591
1592 current_frame = f->f_back;
1593 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001594
1595 if (needmerge)
1596 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597
Guido van Rossum96a42c81992-01-12 02:29:51 +00001598 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001599}
1600
Guido van Rossum96a42c81992-01-12 02:29:51 +00001601#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001602static int
1603prtrace(v, str)
1604 object *v;
1605 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001607 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001608 if (printobject(v, stdout, 0) != 0)
1609 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001612#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001614static void
1615call_exc_trace(p_trace, p_newtrace, f)
1616 object **p_trace, **p_newtrace;
1617 frameobject *f;
1618{
1619 object *type, *value, *traceback, *arg;
1620 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001621 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001622 if (value == NULL) {
1623 value = None;
1624 INCREF(value);
1625 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001626 arg = mkvalue("(OOO)", type, value, traceback);
1627 if (arg == NULL) {
1628 err_restore(type, value, traceback);
1629 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001630 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001631 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1632 DECREF(arg);
1633 if (err == 0)
1634 err_restore(type, value, traceback);
1635 else {
1636 XDECREF(type);
1637 XDECREF(value);
1638 XDECREF(traceback);
1639 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001640}
1641
1642static int
1643call_trace(p_trace, p_newtrace, f, msg, arg)
1644 object **p_trace; /* in/out; may not be NULL;
1645 may not point to NULL variable initially */
1646 object **p_newtrace; /* in/out; may be NULL;
1647 may point to NULL variable;
1648 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001649 frameobject *f;
1650 char *msg;
1651 object *arg;
1652{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001653 object *arglist, *what;
1654 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001655 static int tracing = 0;
1656
1657 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001658 /* Don't do recursive traces */
1659 if (p_newtrace) {
1660 XDECREF(*p_newtrace);
1661 *p_newtrace = NULL;
1662 }
1663 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001664 }
1665
1666 arglist = newtupleobject(3);
1667 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001668 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001669 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001670 if (what == NULL)
1671 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001672 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001673 settupleitem(arglist, 0, (object *)f);
1674 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001675 if (arg == NULL)
1676 arg = None;
1677 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001678 settupleitem(arglist, 2, arg);
1679 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001680 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001681 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001682 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001683 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001684 cleanup:
1685 XDECREF(arglist);
1686 if (res == NULL) {
1687 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001688 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001689 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001690 *p_trace = NULL;
1691 if (p_newtrace) {
1692 XDECREF(*p_newtrace);
1693 *p_newtrace = NULL;
1694 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001695 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001696 }
1697 else {
1698 if (p_newtrace) {
1699 XDECREF(*p_newtrace);
1700 if (res == None)
1701 *p_newtrace = NULL;
1702 else {
1703 INCREF(res);
1704 *p_newtrace = res;
1705 }
1706 }
1707 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001708 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001709 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001710}
1711
Guido van Rossum3f5da241990-12-20 15:06:42 +00001712object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001713getbuiltins()
1714{
1715 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001716 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001717 else
1718 return current_frame->f_builtins;
1719}
1720
1721object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001722getlocals()
1723{
1724 if (current_frame == NULL)
1725 return NULL;
1726 fast_2_locals(current_frame);
1727 return current_frame->f_locals;
1728}
1729
1730object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001731getglobals()
1732{
1733 if (current_frame == NULL)
1734 return NULL;
1735 else
1736 return current_frame->f_globals;
1737}
1738
Guido van Rossum81daa321993-05-20 14:24:46 +00001739object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001740getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001741{
1742 if (current_frame == NULL)
1743 return NULL;
1744 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001745 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001746}
1747
Guido van Rossume59214e1994-08-30 08:01:59 +00001748object *
1749getframe()
1750{
1751 return (object *)current_frame;
1752}
1753
Guido van Rossum6135a871995-01-09 17:53:26 +00001754int
1755getrestricted()
1756{
1757 return current_frame == NULL ? 0 : current_frame->f_restricted;
1758}
1759
Guido van Rossum3f5da241990-12-20 15:06:42 +00001760void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761flushline()
1762{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001763 object *f = sysget("stdout");
1764 if (softspace(f, 0))
1765 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766}
1767
Guido van Rossum3f5da241990-12-20 15:06:42 +00001768
Guido van Rossum06186511995-01-07 12:40:10 +00001769#define BINOP(opname, ropname, thisfunc) \
1770 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1771 ; \
1772 else \
1773 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001774
1775
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001777or(v, w)
1778 object *v, *w;
1779{
Guido van Rossum06186511995-01-07 12:40:10 +00001780 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001781 if (v->ob_type->tp_as_number != NULL) {
1782 object *x;
1783 object * (*f) FPROTO((object *, object *));
1784 if (coerce(&v, &w) != 0)
1785 return NULL;
1786 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1787 x = (*f)(v, w);
1788 DECREF(v);
1789 DECREF(w);
1790 if (f != NULL)
1791 return x;
1792 }
1793 err_setstr(TypeError, "bad operand type(s) for |");
1794 return NULL;
1795}
1796
1797static object *
1798xor(v, w)
1799 object *v, *w;
1800{
Guido van Rossum06186511995-01-07 12:40:10 +00001801 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001802 if (v->ob_type->tp_as_number != NULL) {
1803 object *x;
1804 object * (*f) FPROTO((object *, object *));
1805 if (coerce(&v, &w) != 0)
1806 return NULL;
1807 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1808 x = (*f)(v, w);
1809 DECREF(v);
1810 DECREF(w);
1811 if (f != NULL)
1812 return x;
1813 }
1814 err_setstr(TypeError, "bad operand type(s) for ^");
1815 return NULL;
1816}
1817
1818static object *
1819and(v, w)
1820 object *v, *w;
1821{
Guido van Rossum06186511995-01-07 12:40:10 +00001822 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001823 if (v->ob_type->tp_as_number != NULL) {
1824 object *x;
1825 object * (*f) FPROTO((object *, object *));
1826 if (coerce(&v, &w) != 0)
1827 return NULL;
1828 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1829 x = (*f)(v, w);
1830 DECREF(v);
1831 DECREF(w);
1832 if (f != NULL)
1833 return x;
1834 }
1835 err_setstr(TypeError, "bad operand type(s) for &");
1836 return NULL;
1837}
1838
1839static object *
1840lshift(v, w)
1841 object *v, *w;
1842{
Guido van Rossum06186511995-01-07 12:40:10 +00001843 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001844 if (v->ob_type->tp_as_number != NULL) {
1845 object *x;
1846 object * (*f) FPROTO((object *, object *));
1847 if (coerce(&v, &w) != 0)
1848 return NULL;
1849 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1850 x = (*f)(v, w);
1851 DECREF(v);
1852 DECREF(w);
1853 if (f != NULL)
1854 return x;
1855 }
1856 err_setstr(TypeError, "bad operand type(s) for <<");
1857 return NULL;
1858}
1859
1860static object *
1861rshift(v, w)
1862 object *v, *w;
1863{
Guido van Rossum06186511995-01-07 12:40:10 +00001864 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001865 if (v->ob_type->tp_as_number != NULL) {
1866 object *x;
1867 object * (*f) FPROTO((object *, object *));
1868 if (coerce(&v, &w) != 0)
1869 return NULL;
1870 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1871 x = (*f)(v, w);
1872 DECREF(v);
1873 DECREF(w);
1874 if (f != NULL)
1875 return x;
1876 }
1877 err_setstr(TypeError, "bad operand type(s) for >>");
1878 return NULL;
1879}
1880
1881static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001882add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 object *v, *w;
1884{
Guido van Rossum06186511995-01-07 12:40:10 +00001885 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001886 if (v->ob_type->tp_as_sequence != NULL)
1887 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1888 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001889 object *x;
1890 if (coerce(&v, &w) != 0)
1891 return NULL;
1892 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1893 DECREF(v);
1894 DECREF(w);
1895 return x;
1896 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001897 err_setstr(TypeError, "bad operand type(s) for +");
1898 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899}
1900
1901static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001902sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 object *v, *w;
1904{
Guido van Rossum06186511995-01-07 12:40:10 +00001905 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001906 if (v->ob_type->tp_as_number != NULL) {
1907 object *x;
1908 if (coerce(&v, &w) != 0)
1909 return NULL;
1910 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1911 DECREF(v);
1912 DECREF(w);
1913 return x;
1914 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 return NULL;
1917}
1918
1919static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 object *v, *w;
1922{
1923 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001924 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001925 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001926 if (tp->tp_as_number != NULL &&
1927 w->ob_type->tp_as_sequence != NULL &&
1928 !is_instanceobject(v)) {
1929 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 object *tmp = v;
1931 v = w;
1932 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001933 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001935 if (tp->tp_as_number != NULL) {
1936 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001937 if (is_instanceobject(v)) {
1938 /* Instances of user-defined classes get their
1939 other argument uncoerced, so they may
1940 implement sequence*number as well as
1941 number*number. */
1942 INCREF(v);
1943 INCREF(w);
1944 }
1945 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001946 return NULL;
1947 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1948 DECREF(v);
1949 DECREF(w);
1950 return x;
1951 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 if (tp->tp_as_sequence != NULL) {
1953 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001954 err_setstr(TypeError,
1955 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 return NULL;
1957 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958 return (*tp->tp_as_sequence->sq_repeat)
1959 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 return NULL;
1963}
1964
1965static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001966divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 object *v, *w;
1968{
Guido van Rossum06186511995-01-07 12:40:10 +00001969 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001970 if (v->ob_type->tp_as_number != NULL) {
1971 object *x;
1972 if (coerce(&v, &w) != 0)
1973 return NULL;
1974 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1975 DECREF(v);
1976 DECREF(w);
1977 return x;
1978 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001979 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 return NULL;
1981}
1982
1983static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001984mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 object *v, *w;
1986{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001987 if (is_stringobject(v)) {
1988 return formatstring(v, w);
1989 }
Guido van Rossum06186511995-01-07 12:40:10 +00001990 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001991 if (v->ob_type->tp_as_number != NULL) {
1992 object *x;
1993 if (coerce(&v, &w) != 0)
1994 return NULL;
1995 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1996 DECREF(v);
1997 DECREF(w);
1998 return x;
1999 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 return NULL;
2002}
2003
2004static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 object *v;
2007{
2008 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002009 return (*v->ob_type->tp_as_number->nb_negative)(v);
2010 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011 return NULL;
2012}
2013
2014static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002015pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 object *v;
2017{
2018 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019 return (*v->ob_type->tp_as_number->nb_positive)(v);
2020 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002021 return NULL;
2022}
2023
2024static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002025invert(v)
2026 object *v;
2027{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002028 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002029 if (v->ob_type->tp_as_number != NULL &&
2030 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2031 return (*f)(v);
2032 err_setstr(TypeError, "bad operand type(s) for unary ~");
2033 return NULL;
2034}
2035
2036static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002037not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038 object *v;
2039{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002040 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002041 object *w;
2042 if (outcome < 0)
2043 return NULL;
2044 if (outcome == 0)
2045 w = True;
2046 else
2047 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002048 INCREF(w);
2049 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050}
Guido van Rossum234f9421993-06-17 12:35:49 +00002051
2052
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002053/* External interface to call any callable object. The arg may be NULL. */
2054
2055object *
2056call_object(func, arg)
2057 object *func;
2058 object *arg;
2059{
Guido van Rossume59214e1994-08-30 08:01:59 +00002060 binaryfunc call;
2061 object *result;
2062
2063 if (call = func->ob_type->tp_call) {
2064 int size = gettuplesize(arg);
2065 if (arg) {
2066 size = gettuplesize(arg);
2067 if (size == 1)
2068 arg = gettupleitem(arg, 0);
2069 else if (size == 0)
2070 arg = NULL;
2071 }
2072 result = (*call)(func, arg);
2073 }
2074 else if (is_instancemethodobject(func) || is_funcobject(func))
2075 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002076 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002077 result = call_builtin(func, arg);
2078
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002079 if (result == NULL && !err_occurred())
2080 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002081
2082 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002083}
2084
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 if (is_methodobject(func)) {
2091 method meth = getmethod(func);
2092 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002093 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2094 int size = gettuplesize(arg);
2095 if (size == 1)
2096 arg = gettupleitem(arg, 0);
2097 else if (size == 0)
2098 arg = NULL;
2099 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 }
2102 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002103 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002105 if (is_instanceobject(func)) {
2106 object *res, *call = getattr(func,"__call__");
2107 if (call == NULL) {
2108 err_clear();
2109 err_setstr(AttributeError, "no __call__ method defined");
2110 return NULL;
2111 }
2112 res = call_object(call, arg);
2113 DECREF(call);
2114 return res;
2115 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002116 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 return NULL;
2118}
2119
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002121call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002123 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002125 object *newarg = NULL;
2126 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002127 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002129 object *argdefs;
2130 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131
Guido van Rossume8122f11991-05-05 20:03:07 +00002132 if (is_instancemethodobject(func)) {
2133 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002134 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002135 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002136 if (self == NULL) {
2137 /* Unbound methods must be called with an instance of
2138 the class (or a derived class) as first argument */
2139 if (arg != NULL && is_tupleobject(arg) &&
2140 gettuplesize(arg) >= 1) {
2141 self = gettupleitem(arg, 0);
2142 if (self != NULL &&
2143 is_instanceobject(self) &&
2144 issubclass((object *)
2145 (((instanceobject *)self)->in_class),
2146 class))
2147 /* self = self */ ;
2148 else
2149 self = NULL;
2150 }
2151 if (self == NULL) {
2152 err_setstr(TypeError,
2153 "unbound method must be called with class instance argument");
2154 return NULL;
2155 }
2156 }
2157 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002158 if (arg == NULL)
2159 argcount = 0;
2160 else if (is_tupleobject(arg))
2161 argcount = gettuplesize(arg);
2162 else
2163 argcount = 1;
2164 newarg = newtupleobject(argcount + 1);
2165 if (newarg == NULL)
2166 return NULL;
2167 INCREF(self);
2168 settupleitem(newarg, 0, self);
2169 if (arg != NULL && !is_tupleobject(arg)) {
2170 INCREF(arg);
2171 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002172 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002173 else {
2174 int i;
2175 object *v;
2176 for (i = 0; i < argcount; i++) {
2177 v = gettupleitem(arg, i);
2178 XINCREF(v);
2179 settupleitem(newarg, i+1, v);
2180 }
2181 }
2182 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 }
2184 }
2185 else {
2186 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002187 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 return NULL;
2189 }
2190 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002191
2192 argdefs = getfuncargstuff(func, &argcount);
2193 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2194 int actualcount, j;
2195 /* Process default arguments */
2196 if (argcount & 0x4000)
2197 argcount ^= 0x4000;
2198 actualcount = gettuplesize(arg);
2199 j = gettuplesize(argdefs) - (argcount - actualcount);
2200 if (actualcount < argcount && j >= 0) {
2201 int i;
2202 object *v;
2203 if (newarg == NULL)
2204 INCREF(arg);
2205 newarg = newtupleobject(argcount);
2206 if (newarg == NULL) {
2207 DECREF(arg);
2208 return NULL;
2209 }
2210 for (i = 0; i < actualcount; i++) {
2211 v = gettupleitem(arg, i);
2212 XINCREF(v);
2213 settupleitem(newarg, i, v);
2214 }
2215 for (; i < argcount; i++, j++) {
2216 v = gettupleitem(argdefs, j);
2217 XINCREF(v);
2218 settupleitem(newarg, i, v);
2219 }
2220 DECREF(arg);
2221 arg = newarg;
2222 }
2223 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224
Guido van Rossum3f5da241990-12-20 15:06:42 +00002225 co = getfunccode(func);
2226 if (co == NULL) {
2227 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 return NULL;
2229 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002230 if (!is_codeobject(co))
2231 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002234 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 return NULL;
2236 }
2237
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238 newglobals = getfuncglobals(func);
2239 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240
Guido van Rossum81daa321993-05-20 14:24:46 +00002241 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242
Guido van Rossum3f5da241990-12-20 15:06:42 +00002243 DECREF(newlocals);
2244 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247
2248 return v;
2249}
2250
2251static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 object *v, *w;
2254{
2255 typeobject *tp = v->ob_type;
2256 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 return NULL;
2259 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002260 if (tp->tp_as_mapping != NULL) {
2261 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2262 }
2263 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 int i;
2265 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002266 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 return NULL;
2268 }
2269 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002270 if (i < 0) {
2271 int len = (*tp->tp_as_sequence->sq_length)(v);
2272 if (len < 0)
2273 return NULL;
2274 i += len;
2275 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002276 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278}
2279
2280static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282 object *v, *w;
2283{
2284 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002285 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002287 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 return NULL;
2289 }
2290 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002291 v = (*sq->sq_item)(v, i);
2292 if (v)
2293 return v;
2294 if (err_occurred() == IndexError)
2295 err_clear();
2296 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297}
2298
2299static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002300slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 object *v;
2302 int isize;
2303 int *pi;
2304{
2305 if (v != NULL) {
2306 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002307 err_setstr(TypeError, "slice index must be int");
2308 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 }
2310 *pi = getintvalue(v);
2311 if (*pi < 0)
2312 *pi += isize;
2313 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002314 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315}
2316
2317static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002318apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 object *u, *v, *w;
2320{
2321 typeobject *tp = u->ob_type;
2322 int ilow, ihigh, isize;
2323 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002324 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 return NULL;
2326 }
2327 ilow = 0;
2328 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002329 if (isize < 0)
2330 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002337
2338static int
2339assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 object *w;
2341 object *key;
2342 object *v;
2343{
2344 typeobject *tp = w->ob_type;
2345 sequence_methods *sq;
2346 mapping_methods *mp;
2347 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002348 if ((mp = tp->tp_as_mapping) != NULL &&
2349 (func = mp->mp_ass_subscript) != NULL) {
2350 return (*func)(w, key, v);
2351 }
2352 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 (func = sq->sq_ass_item) != NULL) {
2354 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002356 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002359 else {
2360 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002361 if (i < 0) {
2362 int len = (*sq->sq_length)(w);
2363 if (len < 0)
2364 return -1;
2365 i += len;
2366 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002367 return (*func)(w, i, v);
2368 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 err_setstr(TypeError,
2372 "can't assign to this subscripted object");
2373 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375}
2376
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377static int
2378assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 object *u, *v, *w, *x;
2380{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 if (sq == NULL) {
2384 err_setstr(TypeError, "assign to slice of non-sequence");
2385 return -1;
2386 }
2387 if (sq == NULL || sq->sq_ass_slice == NULL) {
2388 err_setstr(TypeError, "unassignable slice");
2389 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 }
2391 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002393 if (isize < 0)
2394 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002395 if (slice_index(v, isize, &ilow) != 0)
2396 return -1;
2397 if (slice_index(w, isize, &ihigh) != 0)
2398 return -1;
2399 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400}
2401
2402static int
2403cmp_exception(err, v)
2404 object *err, *v;
2405{
2406 if (is_tupleobject(v)) {
2407 int i, n;
2408 n = gettuplesize(v);
2409 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002410 /* Test recursively */
2411 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 return 1;
2413 }
2414 return 0;
2415 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002416 if (is_classobject(v) && is_classobject(err))
2417 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 return err == v;
2419}
2420
Guido van Rossum3f5da241990-12-20 15:06:42 +00002421static int
2422cmp_member(v, w)
2423 object *v, *w;
2424{
Guido van Rossume59214e1994-08-30 08:01:59 +00002425 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002426 object *x;
2427 sequence_methods *sq;
2428 /* Special case for char in string */
2429 if (is_stringobject(w)) {
2430 register char *s, *end;
2431 register char c;
2432 if (!is_stringobject(v) || getstringsize(v) != 1) {
2433 err_setstr(TypeError,
2434 "string member test needs char left operand");
2435 return -1;
2436 }
2437 c = getstringvalue(v)[0];
2438 s = getstringvalue(w);
2439 end = s + getstringsize(w);
2440 while (s < end) {
2441 if (c == *s++)
2442 return 1;
2443 }
2444 return 0;
2445 }
2446 sq = w->ob_type->tp_as_sequence;
2447 if (sq == NULL) {
2448 err_setstr(TypeError,
2449 "'in' or 'not in' needs sequence right argument");
2450 return -1;
2451 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002452 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002454 if (x == NULL) {
2455 if (err_occurred() == IndexError) {
2456 err_clear();
2457 break;
2458 }
2459 return -1;
2460 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002461 cmp = cmpobject(v, x);
2462 XDECREF(x);
2463 if (cmp == 0)
2464 return 1;
2465 }
2466 return 0;
2467}
2468
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002470cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002471 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 register object *v;
2473 register object *w;
2474{
2475 register int cmp;
2476 register int res = 0;
2477 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002478 case IS:
2479 case IS_NOT:
2480 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002481 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002482 res = !res;
2483 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 case IN:
2485 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486 res = cmp_member(v, w);
2487 if (res < 0)
2488 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002489 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002490 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 break;
2492 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002493 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 break;
2495 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496 cmp = cmpobject(v, w);
2497 switch (op) {
2498 case LT: res = cmp < 0; break;
2499 case LE: res = cmp <= 0; break;
2500 case EQ: res = cmp == 0; break;
2501 case NE: res = cmp != 0; break;
2502 case GT: res = cmp > 0; break;
2503 case GE: res = cmp >= 0; break;
2504 /* XXX no default? (res is initialized to 0 though) */
2505 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506 }
2507 v = res ? True : False;
2508 INCREF(v);
2509 return v;
2510}
2511
Guido van Rossum3f5da241990-12-20 15:06:42 +00002512static int
2513import_from(locals, v, name)
2514 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002515 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002516 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002517{
2518 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002519 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002520 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002521 return -1;
2522 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002523 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002524 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002525 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002526 object *name, *value;
2527 pos = 0;
2528 while (mappinggetnext(w, &pos, &name, &value)) {
2529 if (!is_stringobject(name) ||
2530 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002531 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002532 if (is_accessobject(value)) {
2533 value = getaccessvalue(value, (object *)NULL);
2534 if (value == NULL) {
2535 err_clear();
2536 continue;
2537 }
2538 }
2539 else
2540 INCREF(value);
2541 err = dict2insert(locals, name, value);
2542 DECREF(value);
2543 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002545 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002546 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002547 }
2548 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002549 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002550 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002551 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002552 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002553 getstringvalue(name));
2554 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002555 return -1;
2556 }
2557 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002558 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002559 }
2560}
2561
2562static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002563build_class(methods, bases, name)
2564 object *methods; /* dictionary */
2565 object *bases; /* tuple containing classes */
2566 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002567{
Guido van Rossum25831651993-05-19 14:50:45 +00002568 int i;
2569 if (!is_tupleobject(bases)) {
2570 err_setstr(SystemError, "build_class with non-tuple bases");
2571 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002572 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002573 if (gettuplesize(bases) > 0) {
2574 object *base;
2575 base = gettupleitem(bases, 0);
2576 /* Call the base's *type*, if it is callable.
2577 This code is a hook for Donald Beaudry's type extensions.
2578 In unexended Python it will never be triggered since its
2579 types are not callable. */
2580 if (base->ob_type->ob_type->tp_call) {
2581 object *args;
2582 object *class;
2583 args = mkvalue("(OOO)", name, bases, methods);
2584 class = call_object((object *)base->ob_type, args);
2585 DECREF(args);
2586 return class;
2587 }
2588 }
Guido van Rossum25831651993-05-19 14:50:45 +00002589 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002590 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002591 return NULL;
2592 }
Guido van Rossum25831651993-05-19 14:50:45 +00002593 if (!is_stringobject(name)) {
2594 err_setstr(SystemError, "build_class witn non-string name");
2595 return NULL;
2596 }
2597 for (i = gettuplesize(bases); --i >= 0; ) {
2598 object *base = gettupleitem(bases, i);
2599 if (!is_classobject(base)) {
2600 err_setstr(TypeError,
2601 "base is not a class object");
2602 return NULL;
2603 }
2604 }
2605 return newclassobject(bases, methods, name);
2606}
2607
2608static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002609access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002610 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002611 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002612 frameobject *f;
2613{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002614 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002615 object *value, *ac;
2616 typeobject *type;
2617 int fastind, ret;
2618 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002619 if (f->f_localmap == NULL)
2620 value = dict2lookup(f->f_locals, name);
2621 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002622 object *map = f->f_localmap;
2623 value = NULL;
2624 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2625 object *fname = gettupleitem(map, fastind);
2626 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002627 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002628 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002629 }
2630 }
2631 }
2632 if (value && is_accessobject(value)) {
2633 err_setstr(AccessError, "can't override access");
2634 return -1;
2635 }
2636 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002637 if (value != NULL && value != None)
2638 type = value->ob_type;
2639 else
2640 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002641 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002642 if (ac == NULL)
2643 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002644 if (fastind >= 0)
2645 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002646 else {
2647 ret = dict2insert(f->f_locals, name, ac);
2648 DECREF(ac);
2649 }
2650 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002651}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002652
2653static int
2654exec_statement(prog, globals, locals)
2655 object *prog;
2656 object *globals;
2657 object *locals;
2658{
2659 char *s;
2660 int n;
2661
2662 if (is_tupleobject(prog) && globals == None && locals == None &&
2663 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2664 /* Backward compatibility hack */
2665 globals = gettupleitem(prog, 1);
2666 if (n == 3)
2667 locals = gettupleitem(prog, 2);
2668 prog = gettupleitem(prog, 0);
2669 }
2670 if (globals == None) {
2671 globals = getglobals();
2672 if (locals == None)
2673 locals = getlocals();
2674 }
2675 else if (locals == None)
2676 locals = globals;
2677 if (!is_stringobject(prog) &&
2678 !is_codeobject(prog) &&
2679 !is_fileobject(prog)) {
2680 err_setstr(TypeError,
2681 "exec 1st arg must be string, code or file object");
2682 return -1;
2683 }
2684 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2685 err_setstr(TypeError,
2686 "exec 2nd/3rd args must be dict or None");
2687 return -1;
2688 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002689 if (dictlookup(globals, "__builtins__") == NULL)
2690 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002691 if (is_codeobject(prog)) {
2692 if (eval_code((codeobject *) prog, globals, locals,
2693 (object *)NULL, (object *)NULL) == NULL)
2694 return -1;
2695 return 0;
2696 }
2697 if (is_fileobject(prog)) {
2698 FILE *fp = getfilefile(prog);
2699 char *name = getstringvalue(getfilename(prog));
2700 if (run_file(fp, name, file_input, globals, locals) == NULL)
2701 return -1;
2702 return 0;
2703 }
2704 s = getstringvalue(prog);
2705 if (strlen(s) != getstringsize(prog)) {
2706 err_setstr(ValueError, "embedded '\\0' in exec string");
2707 return -1;
2708 }
2709 if (run_string(s, file_input, globals, locals) == NULL)
2710 return -1;
2711 return 0;
2712}