blob: c7fa69724186b5f482896df043e2f73b3de54d49 [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 Rossum32c6cdf1991-12-10 13:52:46 +0000786 DECREF(u);
787 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 if (!is_stringobject(w))
789 err_setstr(TypeError,
790 "exceptions must be strings");
791 else
792 err_setval(w, v);
793 DECREF(v);
794 DECREF(w);
795 why = WHY_EXCEPTION;
796 break;
797
798 case LOAD_LOCALS:
799 v = f->f_locals;
800 INCREF(v);
801 PUSH(v);
802 break;
803
804 case RETURN_VALUE:
805 retval = POP();
806 why = WHY_RETURN;
807 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000808
809 case LOAD_GLOBALS:
810 v = f->f_locals;
811 INCREF(v);
812 PUSH(v);
813 break;
814
815 case EXEC_STMT:
816 w = POP();
817 v = POP();
818 u = POP();
819 err = exec_statement(u, v, w);
820 DECREF(u);
821 DECREF(v);
822 DECREF(w);
823 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000824
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 case BUILD_FUNCTION:
826 v = POP();
827 x = newfuncobject(v, f->f_globals);
828 DECREF(v);
829 PUSH(x);
830 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000831
832 case SET_FUNC_ARGS:
833 v = POP(); /* The function */
834 w = POP(); /* The argument list */
835 err = setfuncargstuff(v, oparg, w);
836 PUSH(v);
837 DECREF(w);
838 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000839
840 case POP_BLOCK:
841 {
842 block *b = pop_block(f);
843 while (STACK_LEVEL() > b->b_level) {
844 v = POP();
845 DECREF(v);
846 }
847 }
848 break;
849
850 case END_FINALLY:
851 v = POP();
852 if (is_intobject(v)) {
853 why = (enum why_code) getintvalue(v);
854 if (why == WHY_RETURN)
855 retval = POP();
856 }
857 else if (is_stringobject(v)) {
858 w = POP();
859 err_setval(v, w);
860 DECREF(w);
861 w = POP();
862 tb_store(w);
863 DECREF(w);
864 why = WHY_RERAISE;
865 }
866 else if (v != None) {
867 err_setstr(SystemError,
868 "'finally' pops bad exception");
869 why = WHY_EXCEPTION;
870 }
871 DECREF(v);
872 break;
873
874 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000875 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000877 w = POP();
878 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000880 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 DECREF(v);
882 DECREF(w);
883 break;
884
885 case STORE_NAME:
886 w = GETNAMEV(oparg);
887 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000888 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000889 if (u == NULL) {
890 if (defmode != 0) {
891 if (v != None)
892 u = (object *)v->ob_type;
893 else
894 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000895 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000896 (typeobject *)u,
897 defmode);
898 DECREF(v);
899 if (x == NULL)
900 break;
901 v = x;
902 }
903 }
904 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000905 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000906 DECREF(v);
907 break;
908 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 err = dict2insert(f->f_locals, w, v);
910 DECREF(v);
911 break;
912
913 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000914 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000915 u = dict2lookup(f->f_locals, w);
916 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000917 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000918 (object *)NULL);
919 break;
920 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000921 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000922 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000924
925#ifdef CASE_TOO_BIG
926 default: switch (opcode) {
927#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000928
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000929 case UNPACK_VARARG:
930 if (EMPTY()) {
931 err_setstr(TypeError,
932 "no argument list");
933 why = WHY_EXCEPTION;
934 break;
935 }
936 v = POP();
937 if (!is_tupleobject(v)) {
938 err_setstr(TypeError,
939 "bad argument list");
940 why = WHY_EXCEPTION;
941 }
942 else if (gettuplesize(v) < oparg) {
943 err_setstr(TypeError,
944 "not enough arguments");
945 why = WHY_EXCEPTION;
946 }
947 else if (oparg == 0) {
948 PUSH(v);
949 break;
950 }
951 else {
952 x = gettupleslice(v, oparg, gettuplesize(v));
953 if (x != NULL) {
954 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000955 if (!CHECK_STACK(oparg)) {
956 x = NULL;
957 break;
958 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000959 for (; --oparg >= 0; ) {
960 w = gettupleitem(v, oparg);
961 INCREF(w);
962 PUSH(w);
963 }
964 }
965 }
966 DECREF(v);
967 break;
968
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000969 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000970 {
971 int n;
972 if (EMPTY()) {
973 err_setstr(TypeError,
974 "no argument list");
975 why = WHY_EXCEPTION;
976 break;
977 }
978 v = POP();
979 if (!is_tupleobject(v)) {
980 err_setstr(TypeError,
981 "bad argument list");
982 why = WHY_EXCEPTION;
983 break;
984 }
985 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000986#ifdef COMPAT_HACKS
987/* Implement various compatibility hacks (for 0.9.4 or earlier):
988 (a) f(a,b,...) accepts f((1,2,...))
989 (b) f((a,b,...)) accepts f(1,2,...)
990 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
991*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000992 if (n == 1 && oparg != 1) {
993 /* Rule (a) */
994 w = gettupleitem(v, 0);
995 if (is_tupleobject(w)) {
996 INCREF(w);
997 DECREF(v);
998 v = w;
999 n = gettuplesize(v);
1000 }
1001 }
1002 else if (n != 1 && oparg == 1) {
1003 /* Rule (b) */
1004 PUSH(v);
1005 break;
1006 /* Don't fall through */
1007 }
1008 else if (n > 2 && oparg == 2) {
1009 /* Rule (c) */
1010 int i;
1011 w = newtupleobject(n-1);
1012 u = newtupleobject(2);
1013 if (u == NULL || w == NULL) {
1014 XDECREF(w);
1015 XDECREF(u);
1016 DECREF(v);
1017 why = WHY_EXCEPTION;
1018 break;
1019 }
1020 t = gettupleitem(v, 0);
1021 INCREF(t);
1022 settupleitem(u, 0, t);
1023 for (i = 1; i < n; i++) {
1024 t = gettupleitem(v, i);
1025 INCREF(t);
1026 settupleitem(w, i-1, t);
1027 }
1028 settupleitem(u, 1, w);
1029 DECREF(v);
1030 v = u;
1031 n = 2;
1032 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001033#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001034 if (n != oparg) {
1035 err_setstr(TypeError,
1036 "arg count mismatch");
1037 why = WHY_EXCEPTION;
1038 DECREF(v);
1039 break;
1040 }
1041 PUSH(v);
1042 }
1043 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 case UNPACK_TUPLE:
1045 v = POP();
1046 if (!is_tupleobject(v)) {
1047 err_setstr(TypeError, "unpack non-tuple");
1048 why = WHY_EXCEPTION;
1049 }
1050 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001051 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 "unpack tuple of wrong size");
1053 why = WHY_EXCEPTION;
1054 }
1055 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001056 if (!CHECK_STACK(oparg)) {
1057 x = NULL;
1058 break;
1059 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 for (; --oparg >= 0; ) {
1061 w = gettupleitem(v, oparg);
1062 INCREF(w);
1063 PUSH(w);
1064 }
1065 }
1066 DECREF(v);
1067 break;
1068
1069 case UNPACK_LIST:
1070 v = POP();
1071 if (!is_listobject(v)) {
1072 err_setstr(TypeError, "unpack non-list");
1073 why = WHY_EXCEPTION;
1074 }
1075 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001076 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 "unpack list of wrong size");
1078 why = WHY_EXCEPTION;
1079 }
1080 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001081 if (!CHECK_STACK(oparg)) {
1082 x = NULL;
1083 break;
1084 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001085 for (; --oparg >= 0; ) {
1086 w = getlistitem(v, oparg);
1087 INCREF(w);
1088 PUSH(w);
1089 }
1090 }
1091 DECREF(v);
1092 break;
1093
1094 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001095 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 v = POP();
1097 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001098 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 DECREF(v);
1100 DECREF(u);
1101 break;
1102
1103 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001104 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001106 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 DECREF(v);
1108 break;
1109
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001110 case STORE_GLOBAL:
1111 w = GETNAMEV(oparg);
1112 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001113 u = dict2lookup(f->f_locals, w);
1114 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001115 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001116 DECREF(v);
1117 break;
1118 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001119 err = dict2insert(f->f_globals, w, v);
1120 DECREF(v);
1121 break;
1122
1123 case DELETE_GLOBAL:
1124 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001125 u = dict2lookup(f->f_locals, w);
1126 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001127 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001128 (object *)NULL);
1129 break;
1130 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001131 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001132 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001133 break;
1134
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 case LOAD_CONST:
1136 x = GETCONST(oparg);
1137 INCREF(x);
1138 PUSH(x);
1139 break;
1140
1141 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001142 w = GETNAMEV(oparg);
1143 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001145 err_clear();
1146 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001148 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001149 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001151 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 break;
1153 }
1154 }
1155 }
Guido van Rossum25831651993-05-19 14:50:45 +00001156 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001157 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001158 if (x == NULL)
1159 break;
1160 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001161 else
1162 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 PUSH(x);
1164 break;
1165
1166 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001167 w = GETNAMEV(oparg);
1168 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001170 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001171 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001173 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 break;
1175 }
1176 }
Guido van Rossum25831651993-05-19 14:50:45 +00001177 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001178 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001179 if (x == NULL)
1180 break;
1181 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001182 else
1183 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 PUSH(x);
1185 break;
1186
1187 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001188 w = GETNAMEV(oparg);
1189 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001191 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 break;
1193 }
Guido van Rossum25831651993-05-19 14:50:45 +00001194 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001195 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001196 if (x == NULL)
1197 break;
1198 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001199 else
1200 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 PUSH(x);
1202 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001203
1204 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001205 x = GETCONST(oparg);
1206 if (x == None)
1207 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001208 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001209 err_setstr(SystemError, "bad RESERVE_FAST");
1210 x = NULL;
1211 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001212 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001213 XDECREF(f->f_fastlocals);
1214 XDECREF(f->f_localmap);
1215 INCREF(x);
1216 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001217 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001218 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001219 break;
1220
1221 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001222 x = GETLISTITEM(fastlocals, oparg);
1223 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001224 err_setval(NameError,
1225 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001226 break;
1227 }
Guido van Rossum25831651993-05-19 14:50:45 +00001228 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001229 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001230 if (x == NULL)
1231 break;
1232 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001233 else
1234 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001235 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001236 break;
1237
1238 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001239 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001240 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001241 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001242 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001243 DECREF(v);
1244 break;
1245 }
Guido van Rossum25831651993-05-19 14:50:45 +00001246 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001248 break;
1249
1250 case DELETE_FAST:
1251 x = GETLISTITEM(fastlocals, oparg);
1252 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001253 err_setval(NameError,
1254 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001255 break;
1256 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001257 if (x != NULL && is_accessobject(x)) {
1258 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001259 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001260 break;
1261 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001262 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001263 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001264 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265
1266 case BUILD_TUPLE:
1267 x = newtupleobject(oparg);
1268 if (x != NULL) {
1269 for (; --oparg >= 0;) {
1270 w = POP();
1271 err = settupleitem(x, oparg, w);
1272 if (err != 0)
1273 break;
1274 }
1275 PUSH(x);
1276 }
1277 break;
1278
1279 case BUILD_LIST:
1280 x = newlistobject(oparg);
1281 if (x != NULL) {
1282 for (; --oparg >= 0;) {
1283 w = POP();
1284 err = setlistitem(x, oparg, w);
1285 if (err != 0)
1286 break;
1287 }
1288 PUSH(x);
1289 }
1290 break;
1291
1292 case BUILD_MAP:
1293 x = newdictobject();
1294 PUSH(x);
1295 break;
1296
1297 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001298 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001300 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 DECREF(v);
1302 PUSH(x);
1303 break;
1304
1305 case COMPARE_OP:
1306 w = POP();
1307 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001308 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 DECREF(v);
1310 DECREF(w);
1311 PUSH(x);
1312 break;
1313
1314 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001316 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001317 if (x == NULL) {
1318 err_setstr(ImportError,
1319 "__import__ not found");
1320 break;
1321 }
1322 w = mkvalue("(O)", w);
1323 if (w == NULL) {
1324 x = NULL;
1325 break;
1326 }
1327 x = call_object(x, w);
1328 DECREF(w);
1329 if (x)
1330 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
1332
1333 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001334 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001336 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001337 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001339
1340 case ACCESS_MODE:
1341 v = POP();
1342 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001343 if (getstringvalue(w)[0] == '*')
1344 defmode = getintvalue(v);
1345 else
1346 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001347 DECREF(v);
1348 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349
1350 case JUMP_FORWARD:
1351 JUMPBY(oparg);
1352 break;
1353
1354 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001355 err = testbool(TOP());
1356 if (err > 0)
1357 err = 0;
1358 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 JUMPBY(oparg);
1360 break;
1361
1362 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001363 err = testbool(TOP());
1364 if (err > 0) {
1365 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001367 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 break;
1369
1370 case JUMP_ABSOLUTE:
1371 JUMPTO(oparg);
1372 break;
1373
1374 case FOR_LOOP:
1375 /* for v in s: ...
1376 On entry: stack contains s, i.
1377 On exit: stack contains s, i+1, s[i];
1378 but if loop exhausted:
1379 s, i are popped, and we jump */
1380 w = POP(); /* Loop index */
1381 v = POP(); /* Sequence object */
1382 u = loop_subscript(v, w);
1383 if (u != NULL) {
1384 PUSH(v);
1385 x = newintobject(getintvalue(w)+1);
1386 PUSH(x);
1387 DECREF(w);
1388 PUSH(u);
1389 }
1390 else {
1391 DECREF(v);
1392 DECREF(w);
1393 /* A NULL can mean "s exhausted"
1394 but also an error: */
1395 if (err_occurred())
1396 why = WHY_EXCEPTION;
1397 else
1398 JUMPBY(oparg);
1399 }
1400 break;
1401
1402 case SETUP_LOOP:
1403 case SETUP_EXCEPT:
1404 case SETUP_FINALLY:
1405 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1406 STACK_LEVEL());
1407 break;
1408
1409 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001410#ifdef LLTRACE
1411 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001412 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001413#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001414 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001415 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001416 /* Trace each line of code reached */
1417 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001418 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001419 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001420 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 break;
1422
1423 default:
1424 fprintf(stderr,
1425 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001426 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001427 err_setstr(SystemError, "eval_code: unknown opcode");
1428 why = WHY_EXCEPTION;
1429 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001430
1431#ifdef CASE_TOO_BIG
1432 }
1433#endif
1434
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 } /* switch */
1436
1437 on_error:
1438
1439 /* Quickly continue if no error occurred */
1440
1441 if (why == WHY_NOT) {
1442 if (err == 0 && x != NULL)
1443 continue; /* Normal, fast path */
1444 why = WHY_EXCEPTION;
1445 x = None;
1446 err = 0;
1447 }
1448
Guido van Rossum801dcae1992-04-08 11:32:32 +00001449#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 /* Double-check exception status */
1451
1452 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1453 if (!err_occurred()) {
1454 fprintf(stderr, "XXX ghost error\n");
1455 err_setstr(SystemError, "ghost error");
1456 why = WHY_EXCEPTION;
1457 }
1458 }
1459 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001460 if (err_occurred())
1461 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 }
1463#endif
1464
1465 /* Log traceback info if this is a real exception */
1466
1467 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001468 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001470 f->f_lasti -= 2;
1471 tb_here(f);
1472
Guido van Rossume59214e1994-08-30 08:01:59 +00001473 if (f->f_trace)
1474 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001475 if (sys_profile)
1476 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 }
1478
1479 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1480
1481 if (why == WHY_RERAISE)
1482 why = WHY_EXCEPTION;
1483
1484 /* Unwind stacks if a (pseudo) exception occurred */
1485
1486 while (why != WHY_NOT && f->f_iblock > 0) {
1487 block *b = pop_block(f);
1488 while (STACK_LEVEL() > b->b_level) {
1489 v = POP();
1490 XDECREF(v);
1491 }
1492 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1493 why = WHY_NOT;
1494 JUMPTO(b->b_handler);
1495 break;
1496 }
1497 if (b->b_type == SETUP_FINALLY ||
1498 b->b_type == SETUP_EXCEPT &&
1499 why == WHY_EXCEPTION) {
1500 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001501 object *exc, *val, *tb;
1502 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 if (val == NULL) {
1504 val = None;
1505 INCREF(val);
1506 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 /* Make the raw exception data
1508 available to the handler,
1509 so a program can emulate the
1510 Python main loop. Don't do
1511 this for 'finally'. */
1512 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001513 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 sysset("exc_value", val);
1515 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001517 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 PUSH(val);
1519 PUSH(exc);
1520 }
1521 else {
1522 if (why == WHY_RETURN)
1523 PUSH(retval);
1524 v = newintobject((long)why);
1525 PUSH(v);
1526 }
1527 why = WHY_NOT;
1528 JUMPTO(b->b_handler);
1529 break;
1530 }
1531 } /* unwind stack */
1532
1533 /* End the loop if we still have an error (or return) */
1534
1535 if (why != WHY_NOT)
1536 break;
1537
1538 } /* main loop */
1539
1540 /* Pop remaining stack entries */
1541
1542 while (!EMPTY()) {
1543 v = POP();
1544 XDECREF(v);
1545 }
1546
Guido van Rossum96a42c81992-01-12 02:29:51 +00001547 if (why != WHY_RETURN)
1548 retval = NULL;
1549
Guido van Rossume59214e1994-08-30 08:01:59 +00001550 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001551 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001552 if (call_trace(&f->f_trace, &f->f_trace, f,
1553 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001554 XDECREF(retval);
1555 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001556 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001557 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001558 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001559 }
1560
1561 if (sys_profile && why == WHY_RETURN) {
1562 if (call_trace(&sys_profile, (object**)0,
1563 f, "return", retval)) {
1564 XDECREF(retval);
1565 retval = NULL;
1566 why = WHY_EXCEPTION;
1567 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001568 }
1569
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 /* Restore previous frame and release the current one */
1571
1572 current_frame = f->f_back;
1573 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001574
1575 if (needmerge)
1576 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577
Guido van Rossum96a42c81992-01-12 02:29:51 +00001578 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001579}
1580
Guido van Rossum96a42c81992-01-12 02:29:51 +00001581#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001582static int
1583prtrace(v, str)
1584 object *v;
1585 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001587 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001588 if (printobject(v, stdout, 0) != 0)
1589 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001592#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001594static void
1595call_exc_trace(p_trace, p_newtrace, f)
1596 object **p_trace, **p_newtrace;
1597 frameobject *f;
1598{
1599 object *type, *value, *traceback, *arg;
1600 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001601 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001602 if (value == NULL) {
1603 value = None;
1604 INCREF(value);
1605 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001606 arg = mkvalue("(OOO)", type, value, traceback);
1607 if (arg == NULL) {
1608 err_restore(type, value, traceback);
1609 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001610 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001611 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1612 DECREF(arg);
1613 if (err == 0)
1614 err_restore(type, value, traceback);
1615 else {
1616 XDECREF(type);
1617 XDECREF(value);
1618 XDECREF(traceback);
1619 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001620}
1621
1622static int
1623call_trace(p_trace, p_newtrace, f, msg, arg)
1624 object **p_trace; /* in/out; may not be NULL;
1625 may not point to NULL variable initially */
1626 object **p_newtrace; /* in/out; may be NULL;
1627 may point to NULL variable;
1628 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001629 frameobject *f;
1630 char *msg;
1631 object *arg;
1632{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001633 object *arglist, *what;
1634 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001635 static int tracing = 0;
1636
1637 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001638 /* Don't do recursive traces */
1639 if (p_newtrace) {
1640 XDECREF(*p_newtrace);
1641 *p_newtrace = NULL;
1642 }
1643 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001644 }
1645
1646 arglist = newtupleobject(3);
1647 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001648 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001649 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001650 if (what == NULL)
1651 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001652 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001653 settupleitem(arglist, 0, (object *)f);
1654 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001655 if (arg == NULL)
1656 arg = None;
1657 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001658 settupleitem(arglist, 2, arg);
1659 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001660 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001661 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001662 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001663 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001664 cleanup:
1665 XDECREF(arglist);
1666 if (res == NULL) {
1667 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001668 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001669 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001670 *p_trace = NULL;
1671 if (p_newtrace) {
1672 XDECREF(*p_newtrace);
1673 *p_newtrace = NULL;
1674 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001675 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001676 }
1677 else {
1678 if (p_newtrace) {
1679 XDECREF(*p_newtrace);
1680 if (res == None)
1681 *p_newtrace = NULL;
1682 else {
1683 INCREF(res);
1684 *p_newtrace = res;
1685 }
1686 }
1687 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001688 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001689 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001690}
1691
Guido van Rossum3f5da241990-12-20 15:06:42 +00001692object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001693getbuiltins()
1694{
1695 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001696 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001697 else
1698 return current_frame->f_builtins;
1699}
1700
1701object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001702getlocals()
1703{
1704 if (current_frame == NULL)
1705 return NULL;
1706 fast_2_locals(current_frame);
1707 return current_frame->f_locals;
1708}
1709
1710object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711getglobals()
1712{
1713 if (current_frame == NULL)
1714 return NULL;
1715 else
1716 return current_frame->f_globals;
1717}
1718
Guido van Rossum81daa321993-05-20 14:24:46 +00001719object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001720getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001721{
1722 if (current_frame == NULL)
1723 return NULL;
1724 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001725 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001726}
1727
Guido van Rossume59214e1994-08-30 08:01:59 +00001728object *
1729getframe()
1730{
1731 return (object *)current_frame;
1732}
1733
Guido van Rossum6135a871995-01-09 17:53:26 +00001734int
1735getrestricted()
1736{
1737 return current_frame == NULL ? 0 : current_frame->f_restricted;
1738}
1739
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741flushline()
1742{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001743 object *f = sysget("stdout");
1744 if (softspace(f, 0))
1745 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746}
1747
Guido van Rossum3f5da241990-12-20 15:06:42 +00001748
Guido van Rossum06186511995-01-07 12:40:10 +00001749#define BINOP(opname, ropname, thisfunc) \
1750 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1751 ; \
1752 else \
1753 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001754
1755
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001757or(v, w)
1758 object *v, *w;
1759{
Guido van Rossum06186511995-01-07 12:40:10 +00001760 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001761 if (v->ob_type->tp_as_number != NULL) {
1762 object *x;
1763 object * (*f) FPROTO((object *, object *));
1764 if (coerce(&v, &w) != 0)
1765 return NULL;
1766 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1767 x = (*f)(v, w);
1768 DECREF(v);
1769 DECREF(w);
1770 if (f != NULL)
1771 return x;
1772 }
1773 err_setstr(TypeError, "bad operand type(s) for |");
1774 return NULL;
1775}
1776
1777static object *
1778xor(v, w)
1779 object *v, *w;
1780{
Guido van Rossum06186511995-01-07 12:40:10 +00001781 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001782 if (v->ob_type->tp_as_number != NULL) {
1783 object *x;
1784 object * (*f) FPROTO((object *, object *));
1785 if (coerce(&v, &w) != 0)
1786 return NULL;
1787 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1788 x = (*f)(v, w);
1789 DECREF(v);
1790 DECREF(w);
1791 if (f != NULL)
1792 return x;
1793 }
1794 err_setstr(TypeError, "bad operand type(s) for ^");
1795 return NULL;
1796}
1797
1798static object *
1799and(v, w)
1800 object *v, *w;
1801{
Guido van Rossum06186511995-01-07 12:40:10 +00001802 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001803 if (v->ob_type->tp_as_number != NULL) {
1804 object *x;
1805 object * (*f) FPROTO((object *, object *));
1806 if (coerce(&v, &w) != 0)
1807 return NULL;
1808 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1809 x = (*f)(v, w);
1810 DECREF(v);
1811 DECREF(w);
1812 if (f != NULL)
1813 return x;
1814 }
1815 err_setstr(TypeError, "bad operand type(s) for &");
1816 return NULL;
1817}
1818
1819static object *
1820lshift(v, w)
1821 object *v, *w;
1822{
Guido van Rossum06186511995-01-07 12:40:10 +00001823 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001824 if (v->ob_type->tp_as_number != NULL) {
1825 object *x;
1826 object * (*f) FPROTO((object *, object *));
1827 if (coerce(&v, &w) != 0)
1828 return NULL;
1829 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1830 x = (*f)(v, w);
1831 DECREF(v);
1832 DECREF(w);
1833 if (f != NULL)
1834 return x;
1835 }
1836 err_setstr(TypeError, "bad operand type(s) for <<");
1837 return NULL;
1838}
1839
1840static object *
1841rshift(v, w)
1842 object *v, *w;
1843{
Guido van Rossum06186511995-01-07 12:40:10 +00001844 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001845 if (v->ob_type->tp_as_number != NULL) {
1846 object *x;
1847 object * (*f) FPROTO((object *, object *));
1848 if (coerce(&v, &w) != 0)
1849 return NULL;
1850 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1851 x = (*f)(v, w);
1852 DECREF(v);
1853 DECREF(w);
1854 if (f != NULL)
1855 return x;
1856 }
1857 err_setstr(TypeError, "bad operand type(s) for >>");
1858 return NULL;
1859}
1860
1861static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001862add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 object *v, *w;
1864{
Guido van Rossum06186511995-01-07 12:40:10 +00001865 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001866 if (v->ob_type->tp_as_sequence != NULL)
1867 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1868 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001869 object *x;
1870 if (coerce(&v, &w) != 0)
1871 return NULL;
1872 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1873 DECREF(v);
1874 DECREF(w);
1875 return x;
1876 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001877 err_setstr(TypeError, "bad operand type(s) for +");
1878 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879}
1880
1881static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001882sub(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("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001886 if (v->ob_type->tp_as_number != NULL) {
1887 object *x;
1888 if (coerce(&v, &w) != 0)
1889 return NULL;
1890 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1891 DECREF(v);
1892 DECREF(w);
1893 return x;
1894 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001895 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 return NULL;
1897}
1898
1899static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001900mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 object *v, *w;
1902{
1903 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001904 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001905 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001906 if (tp->tp_as_number != NULL &&
1907 w->ob_type->tp_as_sequence != NULL &&
1908 !is_instanceobject(v)) {
1909 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 object *tmp = v;
1911 v = w;
1912 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001913 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001915 if (tp->tp_as_number != NULL) {
1916 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001917 if (is_instanceobject(v)) {
1918 /* Instances of user-defined classes get their
1919 other argument uncoerced, so they may
1920 implement sequence*number as well as
1921 number*number. */
1922 INCREF(v);
1923 INCREF(w);
1924 }
1925 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001926 return NULL;
1927 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1928 DECREF(v);
1929 DECREF(w);
1930 return x;
1931 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 if (tp->tp_as_sequence != NULL) {
1933 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001934 err_setstr(TypeError,
1935 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 return NULL;
1937 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001938 return (*tp->tp_as_sequence->sq_repeat)
1939 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001941 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 return NULL;
1943}
1944
1945static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001946divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 object *v, *w;
1948{
Guido van Rossum06186511995-01-07 12:40:10 +00001949 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001950 if (v->ob_type->tp_as_number != NULL) {
1951 object *x;
1952 if (coerce(&v, &w) != 0)
1953 return NULL;
1954 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1955 DECREF(v);
1956 DECREF(w);
1957 return x;
1958 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001959 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 return NULL;
1961}
1962
1963static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001964mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 object *v, *w;
1966{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001967 if (is_stringobject(v)) {
1968 return formatstring(v, w);
1969 }
Guido van Rossum06186511995-01-07 12:40:10 +00001970 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001971 if (v->ob_type->tp_as_number != NULL) {
1972 object *x;
1973 if (coerce(&v, &w) != 0)
1974 return NULL;
1975 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1976 DECREF(v);
1977 DECREF(w);
1978 return x;
1979 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 return NULL;
1982}
1983
1984static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 object *v;
1987{
1988 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001989 return (*v->ob_type->tp_as_number->nb_negative)(v);
1990 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 return NULL;
1992}
1993
1994static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001995pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 object *v;
1997{
1998 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001999 return (*v->ob_type->tp_as_number->nb_positive)(v);
2000 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 return NULL;
2002}
2003
2004static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002005invert(v)
2006 object *v;
2007{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002008 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002009 if (v->ob_type->tp_as_number != NULL &&
2010 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2011 return (*f)(v);
2012 err_setstr(TypeError, "bad operand type(s) for unary ~");
2013 return NULL;
2014}
2015
2016static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002017not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018 object *v;
2019{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002020 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002021 object *w;
2022 if (outcome < 0)
2023 return NULL;
2024 if (outcome == 0)
2025 w = True;
2026 else
2027 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002028 INCREF(w);
2029 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030}
Guido van Rossum234f9421993-06-17 12:35:49 +00002031
2032
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002033/* External interface to call any callable object. The arg may be NULL. */
2034
2035object *
2036call_object(func, arg)
2037 object *func;
2038 object *arg;
2039{
Guido van Rossume59214e1994-08-30 08:01:59 +00002040 binaryfunc call;
2041 object *result;
2042
2043 if (call = func->ob_type->tp_call) {
2044 int size = gettuplesize(arg);
2045 if (arg) {
2046 size = gettuplesize(arg);
2047 if (size == 1)
2048 arg = gettupleitem(arg, 0);
2049 else if (size == 0)
2050 arg = NULL;
2051 }
2052 result = (*call)(func, arg);
2053 }
2054 else if (is_instancemethodobject(func) || is_funcobject(func))
2055 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002056 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002057 result = call_builtin(func, arg);
2058
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002059 if (result == NULL && !err_occurred())
2060 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002061
2062 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002063}
2064
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 if (is_methodobject(func)) {
2071 method meth = getmethod(func);
2072 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002073 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2074 int size = gettuplesize(arg);
2075 if (size == 1)
2076 arg = gettupleitem(arg, 0);
2077 else if (size == 0)
2078 arg = NULL;
2079 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 }
2082 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002083 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002085 if (is_instanceobject(func)) {
2086 object *res, *call = getattr(func,"__call__");
2087 if (call == NULL) {
2088 err_clear();
2089 err_setstr(AttributeError, "no __call__ method defined");
2090 return NULL;
2091 }
2092 res = call_object(call, arg);
2093 DECREF(call);
2094 return res;
2095 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002096 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 return NULL;
2098}
2099
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105 object *newarg = NULL;
2106 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002107 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002108 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002109 object *argdefs;
2110 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111
Guido van Rossume8122f11991-05-05 20:03:07 +00002112 if (is_instancemethodobject(func)) {
2113 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002114 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002115 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002116 if (self == NULL) {
2117 /* Unbound methods must be called with an instance of
2118 the class (or a derived class) as first argument */
2119 if (arg != NULL && is_tupleobject(arg) &&
2120 gettuplesize(arg) >= 1) {
2121 self = gettupleitem(arg, 0);
2122 if (self != NULL &&
2123 is_instanceobject(self) &&
2124 issubclass((object *)
2125 (((instanceobject *)self)->in_class),
2126 class))
2127 /* self = self */ ;
2128 else
2129 self = NULL;
2130 }
2131 if (self == NULL) {
2132 err_setstr(TypeError,
2133 "unbound method must be called with class instance argument");
2134 return NULL;
2135 }
2136 }
2137 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002138 if (arg == NULL)
2139 argcount = 0;
2140 else if (is_tupleobject(arg))
2141 argcount = gettuplesize(arg);
2142 else
2143 argcount = 1;
2144 newarg = newtupleobject(argcount + 1);
2145 if (newarg == NULL)
2146 return NULL;
2147 INCREF(self);
2148 settupleitem(newarg, 0, self);
2149 if (arg != NULL && !is_tupleobject(arg)) {
2150 INCREF(arg);
2151 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002152 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002153 else {
2154 int i;
2155 object *v;
2156 for (i = 0; i < argcount; i++) {
2157 v = gettupleitem(arg, i);
2158 XINCREF(v);
2159 settupleitem(newarg, i+1, v);
2160 }
2161 }
2162 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 }
2164 }
2165 else {
2166 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002167 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 return NULL;
2169 }
2170 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002171
2172 argdefs = getfuncargstuff(func, &argcount);
2173 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2174 int actualcount, j;
2175 /* Process default arguments */
2176 if (argcount & 0x4000)
2177 argcount ^= 0x4000;
2178 actualcount = gettuplesize(arg);
2179 j = gettuplesize(argdefs) - (argcount - actualcount);
2180 if (actualcount < argcount && j >= 0) {
2181 int i;
2182 object *v;
2183 if (newarg == NULL)
2184 INCREF(arg);
2185 newarg = newtupleobject(argcount);
2186 if (newarg == NULL) {
2187 DECREF(arg);
2188 return NULL;
2189 }
2190 for (i = 0; i < actualcount; i++) {
2191 v = gettupleitem(arg, i);
2192 XINCREF(v);
2193 settupleitem(newarg, i, v);
2194 }
2195 for (; i < argcount; i++, j++) {
2196 v = gettupleitem(argdefs, j);
2197 XINCREF(v);
2198 settupleitem(newarg, i, v);
2199 }
2200 DECREF(arg);
2201 arg = newarg;
2202 }
2203 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204
Guido van Rossum3f5da241990-12-20 15:06:42 +00002205 co = getfunccode(func);
2206 if (co == NULL) {
2207 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208 return NULL;
2209 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002210 if (!is_codeobject(co))
2211 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002212 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 return NULL;
2216 }
2217
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218 newglobals = getfuncglobals(func);
2219 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220
Guido van Rossum81daa321993-05-20 14:24:46 +00002221 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222
Guido van Rossum3f5da241990-12-20 15:06:42 +00002223 DECREF(newlocals);
2224 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225
Guido van Rossum3f5da241990-12-20 15:06:42 +00002226 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227
2228 return v;
2229}
2230
2231static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 object *v, *w;
2234{
2235 typeobject *tp = v->ob_type;
2236 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002237 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 return NULL;
2239 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002240 if (tp->tp_as_mapping != NULL) {
2241 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2242 }
2243 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 int i;
2245 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 return NULL;
2248 }
2249 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002250 if (i < 0) {
2251 int len = (*tp->tp_as_sequence->sq_length)(v);
2252 if (len < 0)
2253 return NULL;
2254 i += len;
2255 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258}
2259
2260static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002261loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262 object *v, *w;
2263{
2264 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002265 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002267 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 return NULL;
2269 }
2270 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002271 v = (*sq->sq_item)(v, i);
2272 if (v)
2273 return v;
2274 if (err_occurred() == IndexError)
2275 err_clear();
2276 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277}
2278
2279static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002280slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 object *v;
2282 int isize;
2283 int *pi;
2284{
2285 if (v != NULL) {
2286 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002287 err_setstr(TypeError, "slice index must be int");
2288 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 }
2290 *pi = getintvalue(v);
2291 if (*pi < 0)
2292 *pi += isize;
2293 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295}
2296
2297static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002298apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 object *u, *v, *w;
2300{
2301 typeobject *tp = u->ob_type;
2302 int ilow, ihigh, isize;
2303 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 return NULL;
2306 }
2307 ilow = 0;
2308 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002309 if (isize < 0)
2310 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002311 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002317
2318static int
2319assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 object *w;
2321 object *key;
2322 object *v;
2323{
2324 typeobject *tp = w->ob_type;
2325 sequence_methods *sq;
2326 mapping_methods *mp;
2327 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002328 if ((mp = tp->tp_as_mapping) != NULL &&
2329 (func = mp->mp_ass_subscript) != NULL) {
2330 return (*func)(w, key, v);
2331 }
2332 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 (func = sq->sq_ass_item) != NULL) {
2334 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002336 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002337 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002339 else {
2340 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002341 if (i < 0) {
2342 int len = (*sq->sq_length)(w);
2343 if (len < 0)
2344 return -1;
2345 i += len;
2346 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002347 return (*func)(w, i, v);
2348 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 err_setstr(TypeError,
2352 "can't assign to this subscripted object");
2353 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355}
2356
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357static int
2358assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 object *u, *v, *w, *x;
2360{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002361 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002363 if (sq == NULL) {
2364 err_setstr(TypeError, "assign to slice of non-sequence");
2365 return -1;
2366 }
2367 if (sq == NULL || sq->sq_ass_slice == NULL) {
2368 err_setstr(TypeError, "unassignable slice");
2369 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 }
2371 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002373 if (isize < 0)
2374 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002375 if (slice_index(v, isize, &ilow) != 0)
2376 return -1;
2377 if (slice_index(w, isize, &ihigh) != 0)
2378 return -1;
2379 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380}
2381
2382static int
2383cmp_exception(err, v)
2384 object *err, *v;
2385{
2386 if (is_tupleobject(v)) {
2387 int i, n;
2388 n = gettuplesize(v);
2389 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002390 /* Test recursively */
2391 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 return 1;
2393 }
2394 return 0;
2395 }
2396 return err == v;
2397}
2398
Guido van Rossum3f5da241990-12-20 15:06:42 +00002399static int
2400cmp_member(v, w)
2401 object *v, *w;
2402{
Guido van Rossume59214e1994-08-30 08:01:59 +00002403 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404 object *x;
2405 sequence_methods *sq;
2406 /* Special case for char in string */
2407 if (is_stringobject(w)) {
2408 register char *s, *end;
2409 register char c;
2410 if (!is_stringobject(v) || getstringsize(v) != 1) {
2411 err_setstr(TypeError,
2412 "string member test needs char left operand");
2413 return -1;
2414 }
2415 c = getstringvalue(v)[0];
2416 s = getstringvalue(w);
2417 end = s + getstringsize(w);
2418 while (s < end) {
2419 if (c == *s++)
2420 return 1;
2421 }
2422 return 0;
2423 }
2424 sq = w->ob_type->tp_as_sequence;
2425 if (sq == NULL) {
2426 err_setstr(TypeError,
2427 "'in' or 'not in' needs sequence right argument");
2428 return -1;
2429 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002430 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002431 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002432 if (x == NULL) {
2433 if (err_occurred() == IndexError) {
2434 err_clear();
2435 break;
2436 }
2437 return -1;
2438 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002439 cmp = cmpobject(v, x);
2440 XDECREF(x);
2441 if (cmp == 0)
2442 return 1;
2443 }
2444 return 0;
2445}
2446
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002449 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 register object *v;
2451 register object *w;
2452{
2453 register int cmp;
2454 register int res = 0;
2455 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002456 case IS:
2457 case IS_NOT:
2458 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002459 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460 res = !res;
2461 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 case IN:
2463 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002464 res = cmp_member(v, w);
2465 if (res < 0)
2466 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002467 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002468 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 break;
2470 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002471 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 break;
2473 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002474 cmp = cmpobject(v, w);
2475 switch (op) {
2476 case LT: res = cmp < 0; break;
2477 case LE: res = cmp <= 0; break;
2478 case EQ: res = cmp == 0; break;
2479 case NE: res = cmp != 0; break;
2480 case GT: res = cmp > 0; break;
2481 case GE: res = cmp >= 0; break;
2482 /* XXX no default? (res is initialized to 0 though) */
2483 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 }
2485 v = res ? True : False;
2486 INCREF(v);
2487 return v;
2488}
2489
Guido van Rossum3f5da241990-12-20 15:06:42 +00002490static int
2491import_from(locals, v, name)
2492 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002493 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002494 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002495{
2496 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002497 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002498 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002499 return -1;
2500 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002501 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002502 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002503 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002504 object *name, *value;
2505 pos = 0;
2506 while (mappinggetnext(w, &pos, &name, &value)) {
2507 if (!is_stringobject(name) ||
2508 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002509 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002510 if (is_accessobject(value)) {
2511 value = getaccessvalue(value, (object *)NULL);
2512 if (value == NULL) {
2513 err_clear();
2514 continue;
2515 }
2516 }
2517 else
2518 INCREF(value);
2519 err = dict2insert(locals, name, value);
2520 DECREF(value);
2521 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002522 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002523 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002525 }
2526 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002527 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002528 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002529 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002530 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002531 getstringvalue(name));
2532 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002533 return -1;
2534 }
2535 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002536 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002537 }
2538}
2539
2540static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002541build_class(methods, bases, name)
2542 object *methods; /* dictionary */
2543 object *bases; /* tuple containing classes */
2544 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002545{
Guido van Rossum25831651993-05-19 14:50:45 +00002546 int i;
2547 if (!is_tupleobject(bases)) {
2548 err_setstr(SystemError, "build_class with non-tuple bases");
2549 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002550 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002551 if (gettuplesize(bases) > 0) {
2552 object *base;
2553 base = gettupleitem(bases, 0);
2554 /* Call the base's *type*, if it is callable.
2555 This code is a hook for Donald Beaudry's type extensions.
2556 In unexended Python it will never be triggered since its
2557 types are not callable. */
2558 if (base->ob_type->ob_type->tp_call) {
2559 object *args;
2560 object *class;
2561 args = mkvalue("(OOO)", name, bases, methods);
2562 class = call_object((object *)base->ob_type, args);
2563 DECREF(args);
2564 return class;
2565 }
2566 }
Guido van Rossum25831651993-05-19 14:50:45 +00002567 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002569 return NULL;
2570 }
Guido van Rossum25831651993-05-19 14:50:45 +00002571 if (!is_stringobject(name)) {
2572 err_setstr(SystemError, "build_class witn non-string name");
2573 return NULL;
2574 }
2575 for (i = gettuplesize(bases); --i >= 0; ) {
2576 object *base = gettupleitem(bases, i);
2577 if (!is_classobject(base)) {
2578 err_setstr(TypeError,
2579 "base is not a class object");
2580 return NULL;
2581 }
2582 }
2583 return newclassobject(bases, methods, name);
2584}
2585
2586static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002587access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002588 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002589 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002590 frameobject *f;
2591{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002592 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002593 object *value, *ac;
2594 typeobject *type;
2595 int fastind, ret;
2596 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002597 if (f->f_localmap == NULL)
2598 value = dict2lookup(f->f_locals, name);
2599 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002600 object *map = f->f_localmap;
2601 value = NULL;
2602 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2603 object *fname = gettupleitem(map, fastind);
2604 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002605 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002606 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002607 }
2608 }
2609 }
2610 if (value && is_accessobject(value)) {
2611 err_setstr(AccessError, "can't override access");
2612 return -1;
2613 }
2614 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002615 if (value != NULL && value != None)
2616 type = value->ob_type;
2617 else
2618 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002619 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002620 if (ac == NULL)
2621 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002622 if (fastind >= 0)
2623 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002624 else {
2625 ret = dict2insert(f->f_locals, name, ac);
2626 DECREF(ac);
2627 }
2628 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002629}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002630
2631static int
2632exec_statement(prog, globals, locals)
2633 object *prog;
2634 object *globals;
2635 object *locals;
2636{
2637 char *s;
2638 int n;
2639
2640 if (is_tupleobject(prog) && globals == None && locals == None &&
2641 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2642 /* Backward compatibility hack */
2643 globals = gettupleitem(prog, 1);
2644 if (n == 3)
2645 locals = gettupleitem(prog, 2);
2646 prog = gettupleitem(prog, 0);
2647 }
2648 if (globals == None) {
2649 globals = getglobals();
2650 if (locals == None)
2651 locals = getlocals();
2652 }
2653 else if (locals == None)
2654 locals = globals;
2655 if (!is_stringobject(prog) &&
2656 !is_codeobject(prog) &&
2657 !is_fileobject(prog)) {
2658 err_setstr(TypeError,
2659 "exec 1st arg must be string, code or file object");
2660 return -1;
2661 }
2662 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2663 err_setstr(TypeError,
2664 "exec 2nd/3rd args must be dict or None");
2665 return -1;
2666 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002667 if (dictlookup(globals, "__builtins__") == NULL)
2668 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002669 if (is_codeobject(prog)) {
2670 if (eval_code((codeobject *) prog, globals, locals,
2671 (object *)NULL, (object *)NULL) == NULL)
2672 return -1;
2673 return 0;
2674 }
2675 if (is_fileobject(prog)) {
2676 FILE *fp = getfilefile(prog);
2677 char *name = getstringvalue(getfilename(prog));
2678 if (run_file(fp, name, file_input, globals, locals) == NULL)
2679 return -1;
2680 return 0;
2681 }
2682 s = getstringvalue(prog);
2683 if (strlen(s) != getstringsize(prog)) {
2684 err_setstr(ValueError, "embedded '\\0' in exec string");
2685 return -1;
2686 }
2687 if (run_string(s, file_input, globals, locals) == NULL)
2688 return -1;
2689 return 0;
2690}