blob: 2cc5f97d1be2c1d69f089026698db15bbbac4c36 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume59214e1994-08-30 08:01:59 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum34679b71993-01-26 13:33:44 +00003Amsterdam, The 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"
31#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000033#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000035#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000036#include "bltinmodule.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 Rossumacbe8da1993-04-15 15:33:52 +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) */
50/* #define DEBUG 1 /**/
51
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 *));
71static object *rem PROTO((object *, object *));
72static 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{
199 int i, j;
200 /* XXX Begin critical section */
201 /* XXX If you want this to be safe against nested
202 XXX asynchronous calls, you'll have to work harder! */
203 i = pendinglast;
204 j = (i + 1) % NPENDINGCALLS;
205 if (j == pendingfirst)
206 return -1; /* Queue full */
207 pendingcalls[i].func = func;
208 pendingcalls[i].arg = arg;
209 pendinglast = j;
210 /* XXX End critical section */
211 return 0;
212}
213
214static int
215MakePendingCalls()
216{
217#ifdef WITH_THREAD
218 if (get_thread_ident() != main_thread)
219 return 0;
220#endif
221 for (;;) {
222 int i;
223 int (*func) PROTO((ANY *));
224 ANY *arg;
225 i = pendingfirst;
226 if (i == pendinglast)
227 break; /* Queue empty */
228 func = pendingcalls[i].func;
229 arg = pendingcalls[i].arg;
230 pendingfirst = (i + 1) % NPENDINGCALLS;
231 if (func(arg) < 0)
232 return -1;
233 }
234 return 0;
235}
236
237
Guido van Rossum374a9221991-04-04 10:40:29 +0000238/* Status code for main loop (reason for stack unwind) */
239
240enum why_code {
241 WHY_NOT, /* No error */
242 WHY_EXCEPTION, /* Exception occurred */
243 WHY_RERAISE, /* Exception re-raised by 'finally' */
244 WHY_RETURN, /* 'return' statement */
245 WHY_BREAK /* 'break' statement */
246};
247
248
249/* Interpreter main loop */
250
251object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000252eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000253 codeobject *co;
254 object *globals;
255 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000256 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000257 object *arg;
258{
259 register unsigned char *next_instr;
260 register int opcode; /* Current opcode */
261 register int oparg; /* Current opcode argument, if any */
262 register object **stack_pointer;
263 register enum why_code why; /* Reason for block stack unwind */
264 register int err; /* Error status -- nonzero if error */
265 register object *x; /* Result object -- NULL if error */
266 register object *v; /* Temporary objects popped off stack */
267 register object *w;
268 register object *u;
269 register object *t;
270 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000271 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000272 object *retval; /* Return value iff why == WHY_RETURN */
273 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000274 int needmerge = 0; /* Set if need to merge locals back at end */
275 int defmode = 0; /* Default access mode for new variables */
Guido van Rossume59214e1994-08-30 08:01:59 +0000276 int ticker_count = 10; /* Check for intr every Nth instruction */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000277#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000278 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000279#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000280#ifdef DEBUG
281 /* Make it easier to find out where we are with dbx */
282 char *filename = getstringvalue(co->co_filename);
283#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000284
285/* Code access macros */
286
287#define GETCONST(i) Getconst(f, i)
288#define GETNAME(i) Getname(f, i)
289#define GETNAMEV(i) Getnamev(f, i)
290#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
291#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
292#define NEXTOP() (*next_instr++)
293#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
294#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
295#define JUMPBY(x) (next_instr += (x))
296
297/* Stack manipulation macros */
298
299#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
300#define EMPTY() (STACK_LEVEL() == 0)
301#define TOP() (stack_pointer[-1])
302#define BASIC_PUSH(v) (*stack_pointer++ = (v))
303#define BASIC_POP() (*--stack_pointer)
304
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000305#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
306 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
307
Guido van Rossum96a42c81992-01-12 02:29:51 +0000308#ifdef LLTRACE
309#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
310#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000311#else
312#define PUSH(v) BASIC_PUSH(v)
313#define POP() BASIC_POP()
314#endif
315
Guido van Rossum5b722181993-03-30 17:46:03 +0000316 if (globals == NULL) {
317 globals = getglobals();
318 if (locals == NULL) {
319 locals = getlocals();
320 needmerge = 1;
321 }
322 }
323 else {
324 if (locals == NULL)
325 locals = globals;
326 }
327
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000328#ifdef LLTRACE
329 lltrace = dictlookup(globals, "__lltrace__") != NULL;
330#endif
331
Guido van Rossum374a9221991-04-04 10:40:29 +0000332 f = newframeobject(
333 current_frame, /*back*/
334 co, /*code*/
335 globals, /*globals*/
336 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000337 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000338 50, /*nvalues*/
339 20); /*nblocks*/
340 if (f == NULL)
341 return NULL;
342
343 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000344
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000345 if (sys_trace != NULL) {
346 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000347 be called on *every* entry to a code block.
348 Its return value, if not None, is a function that
349 will be called at the start of each executed line
350 of code. (Actually, the function must return
351 itself in order to continue tracing.)
352 The trace functions are called with three arguments:
353 a pointer to the current frame, a string indicating
354 why the function is called, and an argument which
355 depends on the situation. The global trace function
356 (sys.trace) is also called whenever an exception
357 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000358 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000359 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000360 current_frame = f->f_back;
361 DECREF(f);
362 return NULL;
363 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000364 }
365
366 if (sys_profile != NULL) {
367 /* Similar for sys_profile, except it needn't return
368 itself and isn't called for "line" events */
369 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
370 current_frame = f->f_back;
371 DECREF(f);
372 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000373 }
374 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000375
376 x = sysget("check_interval");
377 if (x != NULL && is_intobject(x))
378 ticker_count = getintvalue(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000379
380 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) {
401 if (MakePendingCalls() < 0) {
402 why = WHY_EXCEPTION;
403 goto on_error;
404 }
405 }
406
Guido van Rossum374a9221991-04-04 10:40:29 +0000407 if (--ticker < 0) {
Guido van Rossume59214e1994-08-30 08:01:59 +0000408 ticker = ticker_count;
409 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();
562 x = rem(v, w);
563 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 &&
736 (err = setbuiltin("_", v)) == 0 &&
737 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000739 x = sysget("stdout");
740 softspace(x, 1);
741 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 flushline();
743 }
744 DECREF(v);
745 break;
746
747 case PRINT_ITEM:
748 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000749 w = sysget("stdout");
750 if (softspace(w, 1))
751 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000752 err = writeobject(v, w, PRINT_RAW);
753 if (err == 0 && is_stringobject(v)) {
754 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 char *s = getstringvalue(v);
756 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000757 if (len > 0 && isspace(s[len-1]) &&
758 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000759 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 DECREF(v);
762 break;
763
764 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000765 x = sysget("stdout");
766 if (x == NULL)
767 err_setstr(RuntimeError, "lost sys.stdout");
768 else {
769 writestring("\n", x);
770 softspace(x, 0);
771 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 break;
773
774 case BREAK_LOOP:
775 why = WHY_BREAK;
776 break;
777
778 case RAISE_EXCEPTION:
779 v = POP();
780 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000781 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000782 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000783 u = w;
784 w = gettupleitem(u, 0);
785 DECREF(u);
786 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 if (!is_stringobject(w))
788 err_setstr(TypeError,
789 "exceptions must be strings");
790 else
791 err_setval(w, v);
792 DECREF(v);
793 DECREF(w);
794 why = WHY_EXCEPTION;
795 break;
796
797 case LOAD_LOCALS:
798 v = f->f_locals;
799 INCREF(v);
800 PUSH(v);
801 break;
802
803 case RETURN_VALUE:
804 retval = POP();
805 why = WHY_RETURN;
806 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000807
808 case LOAD_GLOBALS:
809 v = f->f_locals;
810 INCREF(v);
811 PUSH(v);
812 break;
813
814 case EXEC_STMT:
815 w = POP();
816 v = POP();
817 u = POP();
818 err = exec_statement(u, v, w);
819 DECREF(u);
820 DECREF(v);
821 DECREF(w);
822 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000823
Guido van Rossum374a9221991-04-04 10:40:29 +0000824 case BUILD_FUNCTION:
825 v = POP();
826 x = newfuncobject(v, f->f_globals);
827 DECREF(v);
828 PUSH(x);
829 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000830
831 case SET_FUNC_ARGS:
832 v = POP(); /* The function */
833 w = POP(); /* The argument list */
834 err = setfuncargstuff(v, oparg, w);
835 PUSH(v);
836 DECREF(w);
837 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000838
839 case POP_BLOCK:
840 {
841 block *b = pop_block(f);
842 while (STACK_LEVEL() > b->b_level) {
843 v = POP();
844 DECREF(v);
845 }
846 }
847 break;
848
849 case END_FINALLY:
850 v = POP();
851 if (is_intobject(v)) {
852 why = (enum why_code) getintvalue(v);
853 if (why == WHY_RETURN)
854 retval = POP();
855 }
856 else if (is_stringobject(v)) {
857 w = POP();
858 err_setval(v, w);
859 DECREF(w);
860 w = POP();
861 tb_store(w);
862 DECREF(w);
863 why = WHY_RERAISE;
864 }
865 else if (v != None) {
866 err_setstr(SystemError,
867 "'finally' pops bad exception");
868 why = WHY_EXCEPTION;
869 }
870 DECREF(v);
871 break;
872
873 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000874 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000876 w = POP();
877 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000879 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 DECREF(v);
881 DECREF(w);
882 break;
883
884 case STORE_NAME:
885 w = GETNAMEV(oparg);
886 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000887 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000888 if (u == NULL) {
889 if (defmode != 0) {
890 if (v != None)
891 u = (object *)v->ob_type;
892 else
893 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000894 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000895 (typeobject *)u,
896 defmode);
897 DECREF(v);
898 if (x == NULL)
899 break;
900 v = x;
901 }
902 }
903 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000904 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000905 DECREF(v);
906 break;
907 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 err = dict2insert(f->f_locals, w, v);
909 DECREF(v);
910 break;
911
912 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000913 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000914 u = dict2lookup(f->f_locals, w);
915 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000916 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000917 (object *)NULL);
918 break;
919 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000920 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000921 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000923
924#ifdef CASE_TOO_BIG
925 default: switch (opcode) {
926#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000927
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000928 case UNPACK_VARARG:
929 if (EMPTY()) {
930 err_setstr(TypeError,
931 "no argument list");
932 why = WHY_EXCEPTION;
933 break;
934 }
935 v = POP();
936 if (!is_tupleobject(v)) {
937 err_setstr(TypeError,
938 "bad argument list");
939 why = WHY_EXCEPTION;
940 }
941 else if (gettuplesize(v) < oparg) {
942 err_setstr(TypeError,
943 "not enough arguments");
944 why = WHY_EXCEPTION;
945 }
946 else if (oparg == 0) {
947 PUSH(v);
948 break;
949 }
950 else {
951 x = gettupleslice(v, oparg, gettuplesize(v));
952 if (x != NULL) {
953 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000954 if (!CHECK_STACK(oparg)) {
955 x = NULL;
956 break;
957 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000958 for (; --oparg >= 0; ) {
959 w = gettupleitem(v, oparg);
960 INCREF(w);
961 PUSH(w);
962 }
963 }
964 }
965 DECREF(v);
966 break;
967
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000968 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000969 {
970 int n;
971 if (EMPTY()) {
972 err_setstr(TypeError,
973 "no argument list");
974 why = WHY_EXCEPTION;
975 break;
976 }
977 v = POP();
978 if (!is_tupleobject(v)) {
979 err_setstr(TypeError,
980 "bad argument list");
981 why = WHY_EXCEPTION;
982 break;
983 }
984 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000985#ifdef COMPAT_HACKS
986/* Implement various compatibility hacks (for 0.9.4 or earlier):
987 (a) f(a,b,...) accepts f((1,2,...))
988 (b) f((a,b,...)) accepts f(1,2,...)
989 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
990*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000991 if (n == 1 && oparg != 1) {
992 /* Rule (a) */
993 w = gettupleitem(v, 0);
994 if (is_tupleobject(w)) {
995 INCREF(w);
996 DECREF(v);
997 v = w;
998 n = gettuplesize(v);
999 }
1000 }
1001 else if (n != 1 && oparg == 1) {
1002 /* Rule (b) */
1003 PUSH(v);
1004 break;
1005 /* Don't fall through */
1006 }
1007 else if (n > 2 && oparg == 2) {
1008 /* Rule (c) */
1009 int i;
1010 w = newtupleobject(n-1);
1011 u = newtupleobject(2);
1012 if (u == NULL || w == NULL) {
1013 XDECREF(w);
1014 XDECREF(u);
1015 DECREF(v);
1016 why = WHY_EXCEPTION;
1017 break;
1018 }
1019 t = gettupleitem(v, 0);
1020 INCREF(t);
1021 settupleitem(u, 0, t);
1022 for (i = 1; i < n; i++) {
1023 t = gettupleitem(v, i);
1024 INCREF(t);
1025 settupleitem(w, i-1, t);
1026 }
1027 settupleitem(u, 1, w);
1028 DECREF(v);
1029 v = u;
1030 n = 2;
1031 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001032#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001033 if (n != oparg) {
1034 err_setstr(TypeError,
1035 "arg count mismatch");
1036 why = WHY_EXCEPTION;
1037 DECREF(v);
1038 break;
1039 }
1040 PUSH(v);
1041 }
1042 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 case UNPACK_TUPLE:
1044 v = POP();
1045 if (!is_tupleobject(v)) {
1046 err_setstr(TypeError, "unpack non-tuple");
1047 why = WHY_EXCEPTION;
1048 }
1049 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001050 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 "unpack tuple of wrong size");
1052 why = WHY_EXCEPTION;
1053 }
1054 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001055 if (!CHECK_STACK(oparg)) {
1056 x = NULL;
1057 break;
1058 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001059 for (; --oparg >= 0; ) {
1060 w = gettupleitem(v, oparg);
1061 INCREF(w);
1062 PUSH(w);
1063 }
1064 }
1065 DECREF(v);
1066 break;
1067
1068 case UNPACK_LIST:
1069 v = POP();
1070 if (!is_listobject(v)) {
1071 err_setstr(TypeError, "unpack non-list");
1072 why = WHY_EXCEPTION;
1073 }
1074 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001075 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 "unpack list of wrong size");
1077 why = WHY_EXCEPTION;
1078 }
1079 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001080 if (!CHECK_STACK(oparg)) {
1081 x = NULL;
1082 break;
1083 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001084 for (; --oparg >= 0; ) {
1085 w = getlistitem(v, oparg);
1086 INCREF(w);
1087 PUSH(w);
1088 }
1089 }
1090 DECREF(v);
1091 break;
1092
1093 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001094 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 v = POP();
1096 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001097 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 DECREF(v);
1099 DECREF(u);
1100 break;
1101
1102 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001103 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001104 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001105 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 DECREF(v);
1107 break;
1108
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001109 case STORE_GLOBAL:
1110 w = GETNAMEV(oparg);
1111 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001112 u = dict2lookup(f->f_locals, w);
1113 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001114 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001115 DECREF(v);
1116 break;
1117 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001118 err = dict2insert(f->f_globals, w, v);
1119 DECREF(v);
1120 break;
1121
1122 case DELETE_GLOBAL:
1123 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001124 u = dict2lookup(f->f_locals, w);
1125 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001126 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001127 (object *)NULL);
1128 break;
1129 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001130 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001131 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001132 break;
1133
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 case LOAD_CONST:
1135 x = GETCONST(oparg);
1136 INCREF(x);
1137 PUSH(x);
1138 break;
1139
1140 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001141 w = GETNAMEV(oparg);
1142 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001144 err_clear();
1145 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001147 err_clear();
1148 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001150 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 break;
1152 }
1153 }
1154 }
Guido van Rossum25831651993-05-19 14:50:45 +00001155 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001156 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001157 if (x == NULL)
1158 break;
1159 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001160 else
1161 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 PUSH(x);
1163 break;
1164
1165 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001166 w = GETNAMEV(oparg);
1167 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001169 err_clear();
1170 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001172 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 break;
1174 }
1175 }
Guido van Rossum25831651993-05-19 14:50:45 +00001176 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001177 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001178 if (x == NULL)
1179 break;
1180 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001181 else
1182 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 PUSH(x);
1184 break;
1185
1186 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001187 w = GETNAMEV(oparg);
1188 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001190 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 break;
1192 }
Guido van Rossum25831651993-05-19 14:50:45 +00001193 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001194 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001195 if (x == NULL)
1196 break;
1197 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001198 else
1199 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 PUSH(x);
1201 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001202
1203 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001204 x = GETCONST(oparg);
1205 if (x == None)
1206 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001207 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001208 err_setstr(SystemError, "bad RESERVE_FAST");
1209 x = NULL;
1210 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001211 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001212 XDECREF(f->f_fastlocals);
1213 XDECREF(f->f_localmap);
1214 INCREF(x);
1215 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001216 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001217 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001218 break;
1219
1220 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001221 x = GETLISTITEM(fastlocals, oparg);
1222 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001223 err_setval(NameError,
1224 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001225 break;
1226 }
Guido van Rossum25831651993-05-19 14:50:45 +00001227 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001228 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001229 if (x == NULL)
1230 break;
1231 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001232 else
1233 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001234 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001235 break;
1236
1237 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001238 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001239 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001240 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001241 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001242 DECREF(v);
1243 break;
1244 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001245 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001246 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001247 break;
1248
1249 case DELETE_FAST:
1250 x = GETLISTITEM(fastlocals, oparg);
1251 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001252 err_setval(NameError,
1253 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001254 break;
1255 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001256 if (x != NULL && is_accessobject(x)) {
1257 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001258 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001259 break;
1260 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001261 DECREF(x);
1262 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001263 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264
1265 case BUILD_TUPLE:
1266 x = newtupleobject(oparg);
1267 if (x != NULL) {
1268 for (; --oparg >= 0;) {
1269 w = POP();
1270 err = settupleitem(x, oparg, w);
1271 if (err != 0)
1272 break;
1273 }
1274 PUSH(x);
1275 }
1276 break;
1277
1278 case BUILD_LIST:
1279 x = newlistobject(oparg);
1280 if (x != NULL) {
1281 for (; --oparg >= 0;) {
1282 w = POP();
1283 err = setlistitem(x, oparg, w);
1284 if (err != 0)
1285 break;
1286 }
1287 PUSH(x);
1288 }
1289 break;
1290
1291 case BUILD_MAP:
1292 x = newdictobject();
1293 PUSH(x);
1294 break;
1295
1296 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001297 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001299 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 DECREF(v);
1301 PUSH(x);
1302 break;
1303
1304 case COMPARE_OP:
1305 w = POP();
1306 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001307 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 DECREF(v);
1309 DECREF(w);
1310 PUSH(x);
1311 break;
1312
1313 case IMPORT_NAME:
1314 name = GETNAME(oparg);
1315 x = import_module(name);
1316 XINCREF(x);
1317 PUSH(x);
1318 break;
1319
1320 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001321 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001323 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001324 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001326
1327 case ACCESS_MODE:
1328 v = POP();
1329 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001330 if (getstringvalue(w)[0] == '*')
1331 defmode = getintvalue(v);
1332 else
1333 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001334 DECREF(v);
1335 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001336
1337 case JUMP_FORWARD:
1338 JUMPBY(oparg);
1339 break;
1340
1341 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001342 err = testbool(TOP());
1343 if (err > 0)
1344 err = 0;
1345 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001346 JUMPBY(oparg);
1347 break;
1348
1349 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001350 err = testbool(TOP());
1351 if (err > 0) {
1352 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001354 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 break;
1356
1357 case JUMP_ABSOLUTE:
1358 JUMPTO(oparg);
1359 break;
1360
1361 case FOR_LOOP:
1362 /* for v in s: ...
1363 On entry: stack contains s, i.
1364 On exit: stack contains s, i+1, s[i];
1365 but if loop exhausted:
1366 s, i are popped, and we jump */
1367 w = POP(); /* Loop index */
1368 v = POP(); /* Sequence object */
1369 u = loop_subscript(v, w);
1370 if (u != NULL) {
1371 PUSH(v);
1372 x = newintobject(getintvalue(w)+1);
1373 PUSH(x);
1374 DECREF(w);
1375 PUSH(u);
1376 }
1377 else {
1378 DECREF(v);
1379 DECREF(w);
1380 /* A NULL can mean "s exhausted"
1381 but also an error: */
1382 if (err_occurred())
1383 why = WHY_EXCEPTION;
1384 else
1385 JUMPBY(oparg);
1386 }
1387 break;
1388
1389 case SETUP_LOOP:
1390 case SETUP_EXCEPT:
1391 case SETUP_FINALLY:
1392 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1393 STACK_LEVEL());
1394 break;
1395
1396 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001397#ifdef LLTRACE
1398 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 printf("--- Line %d ---\n", oparg);
1400#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001401 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001402 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001403 /* Trace each line of code reached */
1404 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001405 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001406 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001407 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001408 break;
1409
1410 default:
1411 fprintf(stderr,
1412 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001413 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 err_setstr(SystemError, "eval_code: unknown opcode");
1415 why = WHY_EXCEPTION;
1416 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001417
1418#ifdef CASE_TOO_BIG
1419 }
1420#endif
1421
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 } /* switch */
1423
1424 on_error:
1425
1426 /* Quickly continue if no error occurred */
1427
1428 if (why == WHY_NOT) {
1429 if (err == 0 && x != NULL)
1430 continue; /* Normal, fast path */
1431 why = WHY_EXCEPTION;
1432 x = None;
1433 err = 0;
1434 }
1435
Guido van Rossum801dcae1992-04-08 11:32:32 +00001436#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 /* Double-check exception status */
1438
1439 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1440 if (!err_occurred()) {
1441 fprintf(stderr, "XXX ghost error\n");
1442 err_setstr(SystemError, "ghost error");
1443 why = WHY_EXCEPTION;
1444 }
1445 }
1446 else {
1447 if (err_occurred()) {
1448 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001449 abort();
1450 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 why = WHY_EXCEPTION;
1452 }
1453 }
1454#endif
1455
1456 /* Log traceback info if this is a real exception */
1457
1458 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001459 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001461 f->f_lasti -= 2;
1462 tb_here(f);
1463
Guido van Rossume59214e1994-08-30 08:01:59 +00001464 if (f->f_trace)
1465 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001466 if (sys_profile)
1467 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 }
1469
1470 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1471
1472 if (why == WHY_RERAISE)
1473 why = WHY_EXCEPTION;
1474
1475 /* Unwind stacks if a (pseudo) exception occurred */
1476
1477 while (why != WHY_NOT && f->f_iblock > 0) {
1478 block *b = pop_block(f);
1479 while (STACK_LEVEL() > b->b_level) {
1480 v = POP();
1481 XDECREF(v);
1482 }
1483 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1484 why = WHY_NOT;
1485 JUMPTO(b->b_handler);
1486 break;
1487 }
1488 if (b->b_type == SETUP_FINALLY ||
1489 b->b_type == SETUP_EXCEPT &&
1490 why == WHY_EXCEPTION) {
1491 if (why == WHY_EXCEPTION) {
1492 object *exc, *val;
1493 err_get(&exc, &val);
1494 if (val == NULL) {
1495 val = None;
1496 INCREF(val);
1497 }
1498 v = tb_fetch();
1499 /* Make the raw exception data
1500 available to the handler,
1501 so a program can emulate the
1502 Python main loop. Don't do
1503 this for 'finally'. */
1504 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 sysset("exc_value", val);
1507 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 }
1509 PUSH(v);
1510 PUSH(val);
1511 PUSH(exc);
1512 }
1513 else {
1514 if (why == WHY_RETURN)
1515 PUSH(retval);
1516 v = newintobject((long)why);
1517 PUSH(v);
1518 }
1519 why = WHY_NOT;
1520 JUMPTO(b->b_handler);
1521 break;
1522 }
1523 } /* unwind stack */
1524
1525 /* End the loop if we still have an error (or return) */
1526
1527 if (why != WHY_NOT)
1528 break;
1529
1530 } /* main loop */
1531
1532 /* Pop remaining stack entries */
1533
1534 while (!EMPTY()) {
1535 v = POP();
1536 XDECREF(v);
1537 }
1538
Guido van Rossum96a42c81992-01-12 02:29:51 +00001539 if (why != WHY_RETURN)
1540 retval = NULL;
1541
Guido van Rossume59214e1994-08-30 08:01:59 +00001542 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001543 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001544 if (call_trace(&f->f_trace, &f->f_trace, f,
1545 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001546 XDECREF(retval);
1547 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001548 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001549 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001550 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001551 }
1552
1553 if (sys_profile && why == WHY_RETURN) {
1554 if (call_trace(&sys_profile, (object**)0,
1555 f, "return", retval)) {
1556 XDECREF(retval);
1557 retval = NULL;
1558 why = WHY_EXCEPTION;
1559 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001560 }
1561
Guido van Rossum374a9221991-04-04 10:40:29 +00001562 /* Restore previous frame and release the current one */
1563
1564 current_frame = f->f_back;
1565 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001566
1567 if (needmerge)
1568 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569
Guido van Rossum96a42c81992-01-12 02:29:51 +00001570 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001571}
1572
Guido van Rossum96a42c81992-01-12 02:29:51 +00001573#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001574static int
1575prtrace(v, str)
1576 object *v;
1577 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001579 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001580 if (printobject(v, stdout, 0) != 0)
1581 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001582 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001584#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001586static void
1587call_exc_trace(p_trace, p_newtrace, f)
1588 object **p_trace, **p_newtrace;
1589 frameobject *f;
1590{
1591 object *type, *value, *traceback, *arg;
1592 int err;
1593 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001594 if (value == NULL) {
1595 value = None;
1596 INCREF(value);
1597 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001598 traceback = tb_fetch();
1599 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001600 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001601 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001602 settupleitem(arg, 0, type);
1603 settupleitem(arg, 1, value);
1604 settupleitem(arg, 2, traceback);
1605 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001606 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001607 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001608 /* Restore original exception */
1609 err_setval(type, value);
1610 tb_store(traceback);
1611 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001612 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001613}
1614
1615static int
1616call_trace(p_trace, p_newtrace, f, msg, arg)
1617 object **p_trace; /* in/out; may not be NULL;
1618 may not point to NULL variable initially */
1619 object **p_newtrace; /* in/out; may be NULL;
1620 may point to NULL variable;
1621 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001622 frameobject *f;
1623 char *msg;
1624 object *arg;
1625{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001626 object *arglist, *what;
1627 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001628 static int tracing = 0;
1629
1630 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001631 /* Don't do recursive traces */
1632 if (p_newtrace) {
1633 XDECREF(*p_newtrace);
1634 *p_newtrace = NULL;
1635 }
1636 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001637 }
1638
1639 arglist = newtupleobject(3);
1640 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001641 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001642 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001643 if (what == NULL)
1644 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001645 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001646 settupleitem(arglist, 0, (object *)f);
1647 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001648 if (arg == NULL)
1649 arg = None;
1650 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001651 settupleitem(arglist, 2, arg);
1652 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001653 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001654 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001655 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001656 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001657 cleanup:
1658 XDECREF(arglist);
1659 if (res == NULL) {
1660 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001661 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001662 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001663 *p_trace = NULL;
1664 if (p_newtrace) {
1665 XDECREF(*p_newtrace);
1666 *p_newtrace = NULL;
1667 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001668 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001669 }
1670 else {
1671 if (p_newtrace) {
1672 XDECREF(*p_newtrace);
1673 if (res == None)
1674 *p_newtrace = NULL;
1675 else {
1676 INCREF(res);
1677 *p_newtrace = res;
1678 }
1679 }
1680 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001681 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001682 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001683}
1684
Guido van Rossum3f5da241990-12-20 15:06:42 +00001685object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001686getlocals()
1687{
1688 if (current_frame == NULL)
1689 return NULL;
1690 fast_2_locals(current_frame);
1691 return current_frame->f_locals;
1692}
1693
1694object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001695getglobals()
1696{
1697 if (current_frame == NULL)
1698 return NULL;
1699 else
1700 return current_frame->f_globals;
1701}
1702
Guido van Rossum81daa321993-05-20 14:24:46 +00001703object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001704getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001705{
1706 if (current_frame == NULL)
1707 return NULL;
1708 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001709 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001710}
1711
Guido van Rossume59214e1994-08-30 08:01:59 +00001712object *
1713getframe()
1714{
1715 return (object *)current_frame;
1716}
1717
Guido van Rossum3f5da241990-12-20 15:06:42 +00001718void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001719printtraceback(f)
1720 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001721{
1722 object *v = tb_fetch();
1723 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001724 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001725 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727}
1728
1729
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730void
1731flushline()
1732{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001733 object *f = sysget("stdout");
1734 if (softspace(f, 0))
1735 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736}
1737
Guido van Rossum3f5da241990-12-20 15:06:42 +00001738
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001740or(v, w)
1741 object *v, *w;
1742{
1743 if (v->ob_type->tp_as_number != NULL) {
1744 object *x;
1745 object * (*f) FPROTO((object *, object *));
1746 if (coerce(&v, &w) != 0)
1747 return NULL;
1748 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1749 x = (*f)(v, w);
1750 DECREF(v);
1751 DECREF(w);
1752 if (f != NULL)
1753 return x;
1754 }
1755 err_setstr(TypeError, "bad operand type(s) for |");
1756 return NULL;
1757}
1758
1759static object *
1760xor(v, w)
1761 object *v, *w;
1762{
1763 if (v->ob_type->tp_as_number != NULL) {
1764 object *x;
1765 object * (*f) FPROTO((object *, object *));
1766 if (coerce(&v, &w) != 0)
1767 return NULL;
1768 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1769 x = (*f)(v, w);
1770 DECREF(v);
1771 DECREF(w);
1772 if (f != NULL)
1773 return x;
1774 }
1775 err_setstr(TypeError, "bad operand type(s) for ^");
1776 return NULL;
1777}
1778
1779static object *
1780and(v, w)
1781 object *v, *w;
1782{
1783 if (v->ob_type->tp_as_number != NULL) {
1784 object *x;
1785 object * (*f) FPROTO((object *, object *));
1786 if (coerce(&v, &w) != 0)
1787 return NULL;
1788 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1789 x = (*f)(v, w);
1790 DECREF(v);
1791 DECREF(w);
1792 if (f != NULL)
1793 return x;
1794 }
1795 err_setstr(TypeError, "bad operand type(s) for &");
1796 return NULL;
1797}
1798
1799static object *
1800lshift(v, w)
1801 object *v, *w;
1802{
1803 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_lshift) != 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 *
1820rshift(v, w)
1821 object *v, *w;
1822{
1823 if (v->ob_type->tp_as_number != NULL) {
1824 object *x;
1825 object * (*f) FPROTO((object *, object *));
1826 if (coerce(&v, &w) != 0)
1827 return NULL;
1828 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1829 x = (*f)(v, w);
1830 DECREF(v);
1831 DECREF(w);
1832 if (f != NULL)
1833 return x;
1834 }
1835 err_setstr(TypeError, "bad operand type(s) for >>");
1836 return NULL;
1837}
1838
1839static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001840add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841 object *v, *w;
1842{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001843 if (v->ob_type->tp_as_sequence != NULL)
1844 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1845 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001846 object *x;
1847 if (coerce(&v, &w) != 0)
1848 return NULL;
1849 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1850 DECREF(v);
1851 DECREF(w);
1852 return x;
1853 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001854 err_setstr(TypeError, "bad operand type(s) for +");
1855 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856}
1857
1858static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001859sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 object *v, *w;
1861{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001862 if (v->ob_type->tp_as_number != NULL) {
1863 object *x;
1864 if (coerce(&v, &w) != 0)
1865 return NULL;
1866 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1867 DECREF(v);
1868 DECREF(w);
1869 return x;
1870 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001871 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872 return NULL;
1873}
1874
1875static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 object *v, *w;
1878{
1879 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001880 tp = v->ob_type;
1881 if (tp->tp_as_number != NULL &&
1882 w->ob_type->tp_as_sequence != NULL &&
1883 !is_instanceobject(v)) {
1884 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 object *tmp = v;
1886 v = w;
1887 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001888 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001890 if (tp->tp_as_number != NULL) {
1891 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001892 if (is_instanceobject(v)) {
1893 /* Instances of user-defined classes get their
1894 other argument uncoerced, so they may
1895 implement sequence*number as well as
1896 number*number. */
1897 INCREF(v);
1898 INCREF(w);
1899 }
1900 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001901 return NULL;
1902 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1903 DECREF(v);
1904 DECREF(w);
1905 return x;
1906 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 if (tp->tp_as_sequence != NULL) {
1908 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909 err_setstr(TypeError,
1910 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911 return NULL;
1912 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913 return (*tp->tp_as_sequence->sq_repeat)
1914 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001916 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 return NULL;
1918}
1919
1920static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001921divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 object *v, *w;
1923{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001924 if (v->ob_type->tp_as_number != NULL) {
1925 object *x;
1926 if (coerce(&v, &w) != 0)
1927 return NULL;
1928 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1929 DECREF(v);
1930 DECREF(w);
1931 return x;
1932 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 return NULL;
1935}
1936
1937static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001938rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 object *v, *w;
1940{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001941 if (v->ob_type->tp_as_number != NULL) {
1942 object *x;
1943 if (coerce(&v, &w) != 0)
1944 return NULL;
1945 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1946 DECREF(v);
1947 DECREF(w);
1948 return x;
1949 }
Guido van Rossume5372401993-03-16 12:15:04 +00001950 if (is_stringobject(v)) {
1951 return formatstring(v, w);
1952 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 return NULL;
1955}
1956
1957static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 object *v;
1960{
1961 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962 return (*v->ob_type->tp_as_number->nb_negative)(v);
1963 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 return NULL;
1965}
1966
1967static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 object *v;
1970{
1971 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001972 return (*v->ob_type->tp_as_number->nb_positive)(v);
1973 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 return NULL;
1975}
1976
1977static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001978invert(v)
1979 object *v;
1980{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001981 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001982 if (v->ob_type->tp_as_number != NULL &&
1983 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1984 return (*f)(v);
1985 err_setstr(TypeError, "bad operand type(s) for unary ~");
1986 return NULL;
1987}
1988
1989static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 object *v;
1992{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001994 object *w;
1995 if (outcome < 0)
1996 return NULL;
1997 if (outcome == 0)
1998 w = True;
1999 else
2000 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002001 INCREF(w);
2002 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003}
Guido van Rossum234f9421993-06-17 12:35:49 +00002004
2005
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002006/* External interface to call any callable object. The arg may be NULL. */
2007
2008object *
2009call_object(func, arg)
2010 object *func;
2011 object *arg;
2012{
Guido van Rossume59214e1994-08-30 08:01:59 +00002013 binaryfunc call;
2014 object *result;
2015
2016 if (call = func->ob_type->tp_call) {
2017 int size = gettuplesize(arg);
2018 if (arg) {
2019 size = gettuplesize(arg);
2020 if (size == 1)
2021 arg = gettupleitem(arg, 0);
2022 else if (size == 0)
2023 arg = NULL;
2024 }
2025 result = (*call)(func, arg);
2026 }
2027 else if (is_instancemethodobject(func) || is_funcobject(func))
2028 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002029 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002030 result = call_builtin(func, arg);
2031
2032 if (result == NULL && !err_occurred()) {
2033 fprintf(stderr, "null result without error in call_object\n");
2034 abort();
2035 }
2036
2037 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002038}
2039
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002041call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002042 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002043 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 if (is_methodobject(func)) {
2046 method meth = getmethod(func);
2047 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002048 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2049 int size = gettuplesize(arg);
2050 if (size == 1)
2051 arg = gettupleitem(arg, 0);
2052 else if (size == 0)
2053 arg = NULL;
2054 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002055 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 }
2057 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002058 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002060 if (is_instanceobject(func)) {
2061 object *res, *call = getattr(func,"__call__");
2062 if (call == NULL) {
2063 err_clear();
2064 err_setstr(AttributeError, "no __call__ method defined");
2065 return NULL;
2066 }
2067 res = call_object(call, arg);
2068 DECREF(call);
2069 return res;
2070 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002072 return NULL;
2073}
2074
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002078 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080 object *newarg = NULL;
2081 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002082 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002084 object *argdefs;
2085 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086
Guido van Rossume8122f11991-05-05 20:03:07 +00002087 if (is_instancemethodobject(func)) {
2088 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002089 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002090 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002091 if (self == NULL) {
2092 /* Unbound methods must be called with an instance of
2093 the class (or a derived class) as first argument */
2094 if (arg != NULL && is_tupleobject(arg) &&
2095 gettuplesize(arg) >= 1) {
2096 self = gettupleitem(arg, 0);
2097 if (self != NULL &&
2098 is_instanceobject(self) &&
2099 issubclass((object *)
2100 (((instanceobject *)self)->in_class),
2101 class))
2102 /* self = self */ ;
2103 else
2104 self = NULL;
2105 }
2106 if (self == NULL) {
2107 err_setstr(TypeError,
2108 "unbound method must be called with class instance argument");
2109 return NULL;
2110 }
2111 }
2112 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002113 if (arg == NULL)
2114 argcount = 0;
2115 else if (is_tupleobject(arg))
2116 argcount = gettuplesize(arg);
2117 else
2118 argcount = 1;
2119 newarg = newtupleobject(argcount + 1);
2120 if (newarg == NULL)
2121 return NULL;
2122 INCREF(self);
2123 settupleitem(newarg, 0, self);
2124 if (arg != NULL && !is_tupleobject(arg)) {
2125 INCREF(arg);
2126 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002127 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002128 else {
2129 int i;
2130 object *v;
2131 for (i = 0; i < argcount; i++) {
2132 v = gettupleitem(arg, i);
2133 XINCREF(v);
2134 settupleitem(newarg, i+1, v);
2135 }
2136 }
2137 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002138 }
2139 }
2140 else {
2141 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002142 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 return NULL;
2144 }
2145 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002146
2147 argdefs = getfuncargstuff(func, &argcount);
2148 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2149 int actualcount, j;
2150 /* Process default arguments */
2151 if (argcount & 0x4000)
2152 argcount ^= 0x4000;
2153 actualcount = gettuplesize(arg);
2154 j = gettuplesize(argdefs) - (argcount - actualcount);
2155 if (actualcount < argcount && j >= 0) {
2156 int i;
2157 object *v;
2158 if (newarg == NULL)
2159 INCREF(arg);
2160 newarg = newtupleobject(argcount);
2161 if (newarg == NULL) {
2162 DECREF(arg);
2163 return NULL;
2164 }
2165 for (i = 0; i < actualcount; i++) {
2166 v = gettupleitem(arg, i);
2167 XINCREF(v);
2168 settupleitem(newarg, i, v);
2169 }
2170 for (; i < argcount; i++, j++) {
2171 v = gettupleitem(argdefs, j);
2172 XINCREF(v);
2173 settupleitem(newarg, i, v);
2174 }
2175 DECREF(arg);
2176 arg = newarg;
2177 }
2178 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179
Guido van Rossum3f5da241990-12-20 15:06:42 +00002180 co = getfunccode(func);
2181 if (co == NULL) {
2182 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 return NULL;
2184 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002185 if (!is_codeobject(co)) {
2186 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187 abort();
2188 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002189 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 return NULL;
2193 }
2194
Guido van Rossum3f5da241990-12-20 15:06:42 +00002195 newglobals = getfuncglobals(func);
2196 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197
Guido van Rossum81daa321993-05-20 14:24:46 +00002198 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 DECREF(newlocals);
2201 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204
2205 return v;
2206}
2207
2208static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210 object *v, *w;
2211{
2212 typeobject *tp = v->ob_type;
2213 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 return NULL;
2216 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002217 if (tp->tp_as_mapping != NULL) {
2218 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2219 }
2220 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 int i;
2222 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002223 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 return NULL;
2225 }
2226 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002227 if (i < 0) {
2228 int len = (*tp->tp_as_sequence->sq_length)(v);
2229 if (len < 0)
2230 return NULL;
2231 i += len;
2232 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002233 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235}
2236
2237static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 object *v, *w;
2240{
2241 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002242 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245 return NULL;
2246 }
2247 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002248 v = (*sq->sq_item)(v, i);
2249 if (v)
2250 return v;
2251 if (err_occurred() == IndexError)
2252 err_clear();
2253 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254}
2255
2256static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 object *v;
2259 int isize;
2260 int *pi;
2261{
2262 if (v != NULL) {
2263 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002264 err_setstr(TypeError, "slice index must be int");
2265 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 }
2267 *pi = getintvalue(v);
2268 if (*pi < 0)
2269 *pi += isize;
2270 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272}
2273
2274static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 object *u, *v, *w;
2277{
2278 typeobject *tp = u->ob_type;
2279 int ilow, ihigh, isize;
2280 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282 return NULL;
2283 }
2284 ilow = 0;
2285 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002286 if (isize < 0)
2287 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002288 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294
2295static int
2296assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 object *w;
2298 object *key;
2299 object *v;
2300{
2301 typeobject *tp = w->ob_type;
2302 sequence_methods *sq;
2303 mapping_methods *mp;
2304 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002305 if ((mp = tp->tp_as_mapping) != NULL &&
2306 (func = mp->mp_ass_subscript) != NULL) {
2307 return (*func)(w, key, v);
2308 }
2309 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 (func = sq->sq_ass_item) != NULL) {
2311 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002313 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002314 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002316 else {
2317 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002318 if (i < 0) {
2319 int len = (*sq->sq_length)(w);
2320 if (len < 0)
2321 return -1;
2322 i += len;
2323 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002324 return (*func)(w, i, v);
2325 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002328 err_setstr(TypeError,
2329 "can't assign to this subscripted object");
2330 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332}
2333
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334static int
2335assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 object *u, *v, *w, *x;
2337{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002338 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002340 if (sq == NULL) {
2341 err_setstr(TypeError, "assign to slice of non-sequence");
2342 return -1;
2343 }
2344 if (sq == NULL || sq->sq_ass_slice == NULL) {
2345 err_setstr(TypeError, "unassignable slice");
2346 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 }
2348 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002350 if (isize < 0)
2351 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352 if (slice_index(v, isize, &ilow) != 0)
2353 return -1;
2354 if (slice_index(w, isize, &ihigh) != 0)
2355 return -1;
2356 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357}
2358
2359static int
2360cmp_exception(err, v)
2361 object *err, *v;
2362{
2363 if (is_tupleobject(v)) {
2364 int i, n;
2365 n = gettuplesize(v);
2366 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002367 /* Test recursively */
2368 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 return 1;
2370 }
2371 return 0;
2372 }
2373 return err == v;
2374}
2375
Guido van Rossum3f5da241990-12-20 15:06:42 +00002376static int
2377cmp_member(v, w)
2378 object *v, *w;
2379{
Guido van Rossume59214e1994-08-30 08:01:59 +00002380 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 object *x;
2382 sequence_methods *sq;
2383 /* Special case for char in string */
2384 if (is_stringobject(w)) {
2385 register char *s, *end;
2386 register char c;
2387 if (!is_stringobject(v) || getstringsize(v) != 1) {
2388 err_setstr(TypeError,
2389 "string member test needs char left operand");
2390 return -1;
2391 }
2392 c = getstringvalue(v)[0];
2393 s = getstringvalue(w);
2394 end = s + getstringsize(w);
2395 while (s < end) {
2396 if (c == *s++)
2397 return 1;
2398 }
2399 return 0;
2400 }
2401 sq = w->ob_type->tp_as_sequence;
2402 if (sq == NULL) {
2403 err_setstr(TypeError,
2404 "'in' or 'not in' needs sequence right argument");
2405 return -1;
2406 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002407 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002409 if (x == NULL) {
2410 if (err_occurred() == IndexError) {
2411 err_clear();
2412 break;
2413 }
2414 return -1;
2415 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002416 cmp = cmpobject(v, x);
2417 XDECREF(x);
2418 if (cmp == 0)
2419 return 1;
2420 }
2421 return 0;
2422}
2423
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002426 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 register object *v;
2428 register object *w;
2429{
2430 register int cmp;
2431 register int res = 0;
2432 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002433 case IS:
2434 case IS_NOT:
2435 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002436 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 res = !res;
2438 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 case IN:
2440 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002441 res = cmp_member(v, w);
2442 if (res < 0)
2443 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002444 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 break;
2447 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 break;
2450 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002451 cmp = cmpobject(v, w);
2452 switch (op) {
2453 case LT: res = cmp < 0; break;
2454 case LE: res = cmp <= 0; break;
2455 case EQ: res = cmp == 0; break;
2456 case NE: res = cmp != 0; break;
2457 case GT: res = cmp > 0; break;
2458 case GE: res = cmp >= 0; break;
2459 /* XXX no default? (res is initialized to 0 though) */
2460 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 }
2462 v = res ? True : False;
2463 INCREF(v);
2464 return v;
2465}
2466
Guido van Rossum3f5da241990-12-20 15:06:42 +00002467static int
2468import_from(locals, v, name)
2469 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002470 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002471 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002472{
2473 object *w, *x;
2474 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002475 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002476 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002477 object *name, *value;
2478 pos = 0;
2479 while (mappinggetnext(w, &pos, &name, &value)) {
2480 if (!is_stringobject(name) ||
2481 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002482 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002483 if (is_accessobject(value)) {
2484 value = getaccessvalue(value, (object *)NULL);
2485 if (value == NULL) {
2486 err_clear();
2487 continue;
2488 }
2489 }
2490 else
2491 INCREF(value);
2492 err = dict2insert(locals, name, value);
2493 DECREF(value);
2494 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002495 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002496 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002498 }
2499 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002500 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002501 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002502 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002503 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002504 getstringvalue(name));
2505 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 return -1;
2507 }
2508 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002509 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002510 }
2511}
2512
2513static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002514build_class(methods, bases, name)
2515 object *methods; /* dictionary */
2516 object *bases; /* tuple containing classes */
2517 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002518{
Guido van Rossum25831651993-05-19 14:50:45 +00002519 int i;
2520 if (!is_tupleobject(bases)) {
2521 err_setstr(SystemError, "build_class with non-tuple bases");
2522 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002523 }
Guido van Rossum25831651993-05-19 14:50:45 +00002524 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002525 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002526 return NULL;
2527 }
Guido van Rossum25831651993-05-19 14:50:45 +00002528 if (!is_stringobject(name)) {
2529 err_setstr(SystemError, "build_class witn non-string name");
2530 return NULL;
2531 }
2532 for (i = gettuplesize(bases); --i >= 0; ) {
2533 object *base = gettupleitem(bases, i);
2534 if (!is_classobject(base)) {
2535 err_setstr(TypeError,
2536 "base is not a class object");
2537 return NULL;
2538 }
2539 }
2540 return newclassobject(bases, methods, name);
2541}
2542
2543static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002544access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002545 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002546 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002547 frameobject *f;
2548{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002549 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002550 object *value, *ac;
2551 typeobject *type;
2552 int fastind, ret;
2553 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002554 if (f->f_localmap == NULL)
2555 value = dict2lookup(f->f_locals, name);
2556 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002557 object *map = f->f_localmap;
2558 value = NULL;
2559 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2560 object *fname = gettupleitem(map, fastind);
2561 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002562 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002563 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002564 }
2565 }
2566 }
2567 if (value && is_accessobject(value)) {
2568 err_setstr(AccessError, "can't override access");
2569 return -1;
2570 }
2571 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002572 if (value != NULL && value != None)
2573 type = value->ob_type;
2574 else
2575 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002576 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002577 if (ac == NULL)
2578 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002579 if (fastind >= 0)
2580 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002581 else {
2582 ret = dict2insert(f->f_locals, name, ac);
2583 DECREF(ac);
2584 }
2585 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002586}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002587
2588static int
2589exec_statement(prog, globals, locals)
2590 object *prog;
2591 object *globals;
2592 object *locals;
2593{
2594 char *s;
2595 int n;
2596
2597 if (is_tupleobject(prog) && globals == None && locals == None &&
2598 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2599 /* Backward compatibility hack */
2600 globals = gettupleitem(prog, 1);
2601 if (n == 3)
2602 locals = gettupleitem(prog, 2);
2603 prog = gettupleitem(prog, 0);
2604 }
2605 if (globals == None) {
2606 globals = getglobals();
2607 if (locals == None)
2608 locals = getlocals();
2609 }
2610 else if (locals == None)
2611 locals = globals;
2612 if (!is_stringobject(prog) &&
2613 !is_codeobject(prog) &&
2614 !is_fileobject(prog)) {
2615 err_setstr(TypeError,
2616 "exec 1st arg must be string, code or file object");
2617 return -1;
2618 }
2619 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2620 err_setstr(TypeError,
2621 "exec 2nd/3rd args must be dict or None");
2622 return -1;
2623 }
2624 if (is_codeobject(prog)) {
2625 if (eval_code((codeobject *) prog, globals, locals,
2626 (object *)NULL, (object *)NULL) == NULL)
2627 return -1;
2628 return 0;
2629 }
2630 if (is_fileobject(prog)) {
2631 FILE *fp = getfilefile(prog);
2632 char *name = getstringvalue(getfilename(prog));
2633 if (run_file(fp, name, file_input, globals, locals) == NULL)
2634 return -1;
2635 return 0;
2636 }
2637 s = getstringvalue(prog);
2638 if (strlen(s) != getstringsize(prog)) {
2639 err_setstr(ValueError, "embedded '\\0' in exec string");
2640 return -1;
2641 }
2642 if (run_string(s, file_input, globals, locals) == NULL)
2643 return -1;
2644 return 0;
2645}