blob: b8d6de26f77f1c2d26401a0fc7bd8e1eed47708c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum34679b71993-01-26 13:33:44 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, 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 Rossum10dc2e81990-11-18 17:27:39 +000038
Guido van Rossum04691fc1992-08-12 15:35:34 +000039/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000040/* #define CASE_TOO_BIG 1 /**/
Guido van Rossum04691fc1992-08-12 15:35:34 +000041
Guido van Rossumacbe8da1993-04-15 15:33:52 +000042/* Turn this on if you want to debug the interpreter: */
43/* (This can be on even if NDEBUG is defined) */
44/* #define DEBUG 1 /**/
45
46#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000047/* For debugging the interpreter: */
48#define LLTRACE 1 /* Low-level trace feature */
49#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000050#endif
51
Guido van Rossum9e90a671993-06-24 11:10:19 +000052/* Global option, may be set by main() */
53int killprint;
54
Guido van Rossum5b722181993-03-30 17:46:03 +000055
Guido van Rossum374a9221991-04-04 10:40:29 +000056/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000057
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#ifdef LLTRACE
59static int prtrace PROTO((object *, char *));
60#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000061static void call_exc_trace PROTO((object **, object**, frameobject *));
62static int call_trace
63 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000064static object *add PROTO((object *, object *));
65static object *sub PROTO((object *, object *));
66static object *mul PROTO((object *, object *));
67static object *divide PROTO((object *, object *));
68static object *rem PROTO((object *, object *));
69static object *neg PROTO((object *));
70static object *pos PROTO((object *));
71static object *not PROTO((object *));
72static object *invert PROTO((object *));
73static object *lshift PROTO((object *, object *));
74static object *rshift PROTO((object *, object *));
75static object *and PROTO((object *, object *));
76static object *xor PROTO((object *, object *));
77static object *or PROTO((object *, object *));
78static object *call_builtin PROTO((object *, object *));
79static object *call_function PROTO((object *, object *));
80static object *apply_subscript PROTO((object *, object *));
81static object *loop_subscript PROTO((object *, object *));
82static int slice_index PROTO((object *, int, int *));
83static object *apply_slice PROTO((object *, object *, object *));
84static int assign_subscript PROTO((object *, object *, object *));
85static int assign_slice PROTO((object *, object *, object *, object *));
86static int cmp_exception PROTO((object *, object *));
87static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000088static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000089static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000090static object *build_class PROTO((object *, object *, object *));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000091static void locals_2_fast PROTO((frameobject *, int));
Guido van Rossum5b722181993-03-30 17:46:03 +000092static void fast_2_locals PROTO((frameobject *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000093static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossum374a9221991-04-04 10:40:29 +000094
95
Guido van Rossum0a066c01992-03-27 17:29:15 +000096/* Pointer to current frame, used to link new frames to */
97
Guido van Rossum374a9221991-04-04 10:40:29 +000098static frameobject *current_frame;
99
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102#include <errno.h>
103#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000104
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105static type_lock interpreter_lock;
106
107void
108init_save_thread()
109{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000111 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112 interpreter_lock = allocate_lock();
113 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000116#endif
117
Guido van Rossumff4949e1992-08-05 19:58:53 +0000118/* Functions save_thread and restore_thread are always defined so
119 dynamically loaded modules needn't be compiled separately for use
120 with and without threads: */
121
Guido van Rossum04691fc1992-08-12 15:35:34 +0000122object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123save_thread()
124{
125#ifdef USE_THREAD
126 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000127 object *res;
128 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129 current_frame = NULL;
130 release_lock(interpreter_lock);
131 return res;
132 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000134 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135}
136
137void
138restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000139 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000140{
141#ifdef USE_THREAD
142 if (interpreter_lock) {
143 int err;
144 err = errno;
145 acquire_lock(interpreter_lock, 1);
146 errno = err;
147 current_frame = (frameobject *)x;
148 }
149#endif
150}
151
152
Guido van Rossum374a9221991-04-04 10:40:29 +0000153/* Status code for main loop (reason for stack unwind) */
154
155enum why_code {
156 WHY_NOT, /* No error */
157 WHY_EXCEPTION, /* Exception occurred */
158 WHY_RERAISE, /* Exception re-raised by 'finally' */
159 WHY_RETURN, /* 'return' statement */
160 WHY_BREAK /* 'break' statement */
161};
162
163
164/* Interpreter main loop */
165
166object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000167eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000168 codeobject *co;
169 object *globals;
170 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000171 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000172 object *arg;
173{
174 register unsigned char *next_instr;
175 register int opcode; /* Current opcode */
176 register int oparg; /* Current opcode argument, if any */
177 register object **stack_pointer;
178 register enum why_code why; /* Reason for block stack unwind */
179 register int err; /* Error status -- nonzero if error */
180 register object *x; /* Result object -- NULL if error */
181 register object *v; /* Temporary objects popped off stack */
182 register object *w;
183 register object *u;
184 register object *t;
185 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000186 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000187 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000188 object *retval; /* Return value iff why == WHY_RETURN */
189 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000190 int needmerge = 0; /* Set if need to merge locals back at end */
191 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000192#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000193 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000194#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000195#ifdef DEBUG
196 /* Make it easier to find out where we are with dbx */
197 char *filename = getstringvalue(co->co_filename);
198#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000199
200/* Code access macros */
201
202#define GETCONST(i) Getconst(f, i)
203#define GETNAME(i) Getname(f, i)
204#define GETNAMEV(i) Getnamev(f, i)
205#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
206#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
207#define NEXTOP() (*next_instr++)
208#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
209#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
210#define JUMPBY(x) (next_instr += (x))
211
212/* Stack manipulation macros */
213
214#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
215#define EMPTY() (STACK_LEVEL() == 0)
216#define TOP() (stack_pointer[-1])
217#define BASIC_PUSH(v) (*stack_pointer++ = (v))
218#define BASIC_POP() (*--stack_pointer)
219
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000220#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
221 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
222
Guido van Rossum96a42c81992-01-12 02:29:51 +0000223#ifdef LLTRACE
224#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
225#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000226#else
227#define PUSH(v) BASIC_PUSH(v)
228#define POP() BASIC_POP()
229#endif
230
Guido van Rossum5b722181993-03-30 17:46:03 +0000231 if (globals == NULL) {
232 globals = getglobals();
233 if (locals == NULL) {
234 locals = getlocals();
235 needmerge = 1;
236 }
237 }
238 else {
239 if (locals == NULL)
240 locals = globals;
241 }
242
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000243#ifdef LLTRACE
244 lltrace = dictlookup(globals, "__lltrace__") != NULL;
245#endif
246
Guido van Rossum374a9221991-04-04 10:40:29 +0000247 f = newframeobject(
248 current_frame, /*back*/
249 co, /*code*/
250 globals, /*globals*/
251 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000252 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000253 50, /*nvalues*/
254 20); /*nblocks*/
255 if (f == NULL)
256 return NULL;
257
258 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000259
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000260 if (sys_trace != NULL) {
261 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000262 be called on *every* entry to a code block.
263 Its return value, if not None, is a function that
264 will be called at the start of each executed line
265 of code. (Actually, the function must return
266 itself in order to continue tracing.)
267 The trace functions are called with three arguments:
268 a pointer to the current frame, a string indicating
269 why the function is called, and an argument which
270 depends on the situation. The global trace function
271 (sys.trace) is also called whenever an exception
272 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000273 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000274 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000275 current_frame = f->f_back;
276 DECREF(f);
277 return NULL;
278 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000279 }
280
281 if (sys_profile != NULL) {
282 /* Similar for sys_profile, except it needn't return
283 itself and isn't called for "line" events */
284 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
285 current_frame = f->f_back;
286 DECREF(f);
287 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000288 }
289 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000290
291 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000292 stack_pointer = f->f_valuestack;
293
294 if (arg != NULL) {
295 INCREF(arg);
296 PUSH(arg);
297 }
298
299 why = WHY_NOT;
300 err = 0;
301 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000302
303 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000304 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000305
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000306 /* Do periodic things.
307 Doing this every time through the loop would add
308 too much overhead (a function call per instruction).
309 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000310
311 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000312 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000313 if (intrcheck()) {
314 err_set(KeyboardInterrupt);
315 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000316 goto on_error;
317 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000318
319#ifdef USE_THREAD
320 if (interpreter_lock) {
321 /* Give another thread a chance */
322
323 current_frame = NULL;
324 release_lock(interpreter_lock);
325
326 /* Other threads may run now */
327
328 acquire_lock(interpreter_lock, 1);
329 current_frame = f;
330 }
331#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000332 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000333
Guido van Rossum374a9221991-04-04 10:40:29 +0000334 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000335
336#ifdef DEBUG
337 f->f_lasti = INSTR_OFFSET();
338#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000339
340 opcode = NEXTOP();
341 if (HAS_ARG(opcode))
342 oparg = NEXTARG();
343
Guido van Rossum96a42c81992-01-12 02:29:51 +0000344#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000345 /* Instruction tracing */
346
Guido van Rossum96a42c81992-01-12 02:29:51 +0000347 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000348 if (HAS_ARG(opcode)) {
349 printf("%d: %d, %d\n",
350 (int) (INSTR_OFFSET() - 3),
351 opcode, oparg);
352 }
353 else {
354 printf("%d: %d\n",
355 (int) (INSTR_OFFSET() - 1), opcode);
356 }
357 }
358#endif
359
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000360 if (!CHECK_STACK(3)) {
361 x = NULL;
362 break;
363 }
364
Guido van Rossum374a9221991-04-04 10:40:29 +0000365 /* Main switch on opcode */
366
367 switch (opcode) {
368
369 /* BEWARE!
370 It is essential that any operation that fails sets either
371 x to NULL, err to nonzero, or why to anything but WHY_NOT,
372 and that no operation that succeeds does this! */
373
374 /* case STOP_CODE: this is an error! */
375
376 case POP_TOP:
377 v = POP();
378 DECREF(v);
379 break;
380
381 case ROT_TWO:
382 v = POP();
383 w = POP();
384 PUSH(v);
385 PUSH(w);
386 break;
387
388 case ROT_THREE:
389 v = POP();
390 w = POP();
391 x = POP();
392 PUSH(v);
393 PUSH(x);
394 PUSH(w);
395 break;
396
397 case DUP_TOP:
398 v = TOP();
399 INCREF(v);
400 PUSH(v);
401 break;
402
403 case UNARY_POSITIVE:
404 v = POP();
405 x = pos(v);
406 DECREF(v);
407 PUSH(x);
408 break;
409
410 case UNARY_NEGATIVE:
411 v = POP();
412 x = neg(v);
413 DECREF(v);
414 PUSH(x);
415 break;
416
417 case UNARY_NOT:
418 v = POP();
419 x = not(v);
420 DECREF(v);
421 PUSH(x);
422 break;
423
424 case UNARY_CONVERT:
425 v = POP();
426 x = reprobject(v);
427 DECREF(v);
428 PUSH(x);
429 break;
430
431 case UNARY_CALL:
432 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000433 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000434 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000435 DECREF(v);
436 PUSH(x);
437 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000438
439 case UNARY_INVERT:
440 v = POP();
441 x = invert(v);
442 DECREF(v);
443 PUSH(x);
444 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000445
446 case BINARY_MULTIPLY:
447 w = POP();
448 v = POP();
449 x = mul(v, w);
450 DECREF(v);
451 DECREF(w);
452 PUSH(x);
453 break;
454
455 case BINARY_DIVIDE:
456 w = POP();
457 v = POP();
458 x = divide(v, w);
459 DECREF(v);
460 DECREF(w);
461 PUSH(x);
462 break;
463
464 case BINARY_MODULO:
465 w = POP();
466 v = POP();
467 x = rem(v, w);
468 DECREF(v);
469 DECREF(w);
470 PUSH(x);
471 break;
472
473 case BINARY_ADD:
474 w = POP();
475 v = POP();
476 x = add(v, w);
477 DECREF(v);
478 DECREF(w);
479 PUSH(x);
480 break;
481
482 case BINARY_SUBTRACT:
483 w = POP();
484 v = POP();
485 x = sub(v, w);
486 DECREF(v);
487 DECREF(w);
488 PUSH(x);
489 break;
490
491 case BINARY_SUBSCR:
492 w = POP();
493 v = POP();
494 x = apply_subscript(v, w);
495 DECREF(v);
496 DECREF(w);
497 PUSH(x);
498 break;
499
500 case BINARY_CALL:
501 w = POP();
502 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000503 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000504 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000505 DECREF(v);
506 DECREF(w);
507 PUSH(x);
508 break;
509
Guido van Rossum7928cd71991-10-24 14:59:31 +0000510 case BINARY_LSHIFT:
511 w = POP();
512 v = POP();
513 x = lshift(v, w);
514 DECREF(v);
515 DECREF(w);
516 PUSH(x);
517 break;
518
519 case BINARY_RSHIFT:
520 w = POP();
521 v = POP();
522 x = rshift(v, w);
523 DECREF(v);
524 DECREF(w);
525 PUSH(x);
526 break;
527
528 case BINARY_AND:
529 w = POP();
530 v = POP();
531 x = and(v, w);
532 DECREF(v);
533 DECREF(w);
534 PUSH(x);
535 break;
536
537 case BINARY_XOR:
538 w = POP();
539 v = POP();
540 x = xor(v, w);
541 DECREF(v);
542 DECREF(w);
543 PUSH(x);
544 break;
545
546 case BINARY_OR:
547 w = POP();
548 v = POP();
549 x = or(v, w);
550 DECREF(v);
551 DECREF(w);
552 PUSH(x);
553 break;
554
Guido van Rossum374a9221991-04-04 10:40:29 +0000555 case SLICE+0:
556 case SLICE+1:
557 case SLICE+2:
558 case SLICE+3:
559 if ((opcode-SLICE) & 2)
560 w = POP();
561 else
562 w = NULL;
563 if ((opcode-SLICE) & 1)
564 v = POP();
565 else
566 v = NULL;
567 u = POP();
568 x = apply_slice(u, v, w);
569 DECREF(u);
570 XDECREF(v);
571 XDECREF(w);
572 PUSH(x);
573 break;
574
575 case STORE_SLICE+0:
576 case STORE_SLICE+1:
577 case STORE_SLICE+2:
578 case STORE_SLICE+3:
579 if ((opcode-STORE_SLICE) & 2)
580 w = POP();
581 else
582 w = NULL;
583 if ((opcode-STORE_SLICE) & 1)
584 v = POP();
585 else
586 v = NULL;
587 u = POP();
588 t = POP();
589 err = assign_slice(u, v, w, t); /* u[v:w] = t */
590 DECREF(t);
591 DECREF(u);
592 XDECREF(v);
593 XDECREF(w);
594 break;
595
596 case DELETE_SLICE+0:
597 case DELETE_SLICE+1:
598 case DELETE_SLICE+2:
599 case DELETE_SLICE+3:
600 if ((opcode-DELETE_SLICE) & 2)
601 w = POP();
602 else
603 w = NULL;
604 if ((opcode-DELETE_SLICE) & 1)
605 v = POP();
606 else
607 v = NULL;
608 u = POP();
609 err = assign_slice(u, v, w, (object *)NULL);
610 /* del u[v:w] */
611 DECREF(u);
612 XDECREF(v);
613 XDECREF(w);
614 break;
615
616 case STORE_SUBSCR:
617 w = POP();
618 v = POP();
619 u = POP();
620 /* v[w] = u */
621 err = assign_subscript(v, w, u);
622 DECREF(u);
623 DECREF(v);
624 DECREF(w);
625 break;
626
627 case DELETE_SUBSCR:
628 w = POP();
629 v = POP();
630 /* del v[w] */
631 err = assign_subscript(v, w, (object *)NULL);
632 DECREF(v);
633 DECREF(w);
634 break;
635
636 case PRINT_EXPR:
637 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 /* Print value except if procedure result */
639 if (v != None) {
640 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000641 x = sysget("stdout");
642 softspace(x, 1);
643 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000644 flushline();
Guido van Rossum9e90a671993-06-24 11:10:19 +0000645 if (killprint) {
646 err_setstr(RuntimeError,
647 "printing expression statement");
648 x = 0;
649 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 }
651 DECREF(v);
652 break;
653
654 case PRINT_ITEM:
655 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000656 w = sysget("stdout");
657 if (softspace(w, 1))
658 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 if (is_stringobject(v)) {
660 char *s = getstringvalue(v);
661 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000662 err = writeobject(v, w, PRINT_RAW);
663 if (err == 0 && len > 0 && s[len-1] == '\n')
664 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000665 }
666 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000667 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 }
669 DECREF(v);
670 break;
671
672 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000673 x = sysget("stdout");
674 if (x == NULL)
675 err_setstr(RuntimeError, "lost sys.stdout");
676 else {
677 writestring("\n", x);
678 softspace(x, 0);
679 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 break;
681
682 case BREAK_LOOP:
683 why = WHY_BREAK;
684 break;
685
686 case RAISE_EXCEPTION:
687 v = POP();
688 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000689 /* A tuple is equivalent to its first element here */
690 while (is_tupleobject(w)) {
691 u = w;
692 w = gettupleitem(u, 0);
693 DECREF(u);
694 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 if (!is_stringobject(w))
696 err_setstr(TypeError,
697 "exceptions must be strings");
698 else
699 err_setval(w, v);
700 DECREF(v);
701 DECREF(w);
702 why = WHY_EXCEPTION;
703 break;
704
705 case LOAD_LOCALS:
706 v = f->f_locals;
707 INCREF(v);
708 PUSH(v);
709 break;
710
711 case RETURN_VALUE:
712 retval = POP();
713 why = WHY_RETURN;
714 break;
715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 case BUILD_FUNCTION:
717 v = POP();
718 x = newfuncobject(v, f->f_globals);
719 DECREF(v);
720 PUSH(x);
721 break;
722
723 case POP_BLOCK:
724 {
725 block *b = pop_block(f);
726 while (STACK_LEVEL() > b->b_level) {
727 v = POP();
728 DECREF(v);
729 }
730 }
731 break;
732
733 case END_FINALLY:
734 v = POP();
735 if (is_intobject(v)) {
736 why = (enum why_code) getintvalue(v);
737 if (why == WHY_RETURN)
738 retval = POP();
739 }
740 else if (is_stringobject(v)) {
741 w = POP();
742 err_setval(v, w);
743 DECREF(w);
744 w = POP();
745 tb_store(w);
746 DECREF(w);
747 why = WHY_RERAISE;
748 }
749 else if (v != None) {
750 err_setstr(SystemError,
751 "'finally' pops bad exception");
752 why = WHY_EXCEPTION;
753 }
754 DECREF(v);
755 break;
756
757 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000758 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000760 w = POP();
761 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000763 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 DECREF(v);
765 DECREF(w);
766 break;
767
768 case STORE_NAME:
769 w = GETNAMEV(oparg);
770 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000771 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000772 if (u == NULL) {
773 if (defmode != 0) {
774 if (v != None)
775 u = (object *)v->ob_type;
776 else
777 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000778 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000779 (typeobject *)u,
780 defmode);
781 DECREF(v);
782 if (x == NULL)
783 break;
784 v = x;
785 }
786 }
787 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000788 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000789 DECREF(v);
790 break;
791 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 err = dict2insert(f->f_locals, w, v);
793 DECREF(v);
794 break;
795
796 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000797 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000798 u = dict2lookup(f->f_locals, w);
799 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000800 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000801 (object *)NULL);
802 break;
803 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000804 if ((err = dict2remove(f->f_locals, w)) != 0)
805 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000806 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000807
808#ifdef CASE_TOO_BIG
809 default: switch (opcode) {
810#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000811
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000812 case UNPACK_VARARG:
813 if (EMPTY()) {
814 err_setstr(TypeError,
815 "no argument list");
816 why = WHY_EXCEPTION;
817 break;
818 }
819 v = POP();
820 if (!is_tupleobject(v)) {
821 err_setstr(TypeError,
822 "bad argument list");
823 why = WHY_EXCEPTION;
824 }
825 else if (gettuplesize(v) < oparg) {
826 err_setstr(TypeError,
827 "not enough arguments");
828 why = WHY_EXCEPTION;
829 }
830 else if (oparg == 0) {
831 PUSH(v);
832 break;
833 }
834 else {
835 x = gettupleslice(v, oparg, gettuplesize(v));
836 if (x != NULL) {
837 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000838 if (!CHECK_STACK(oparg)) {
839 x = NULL;
840 break;
841 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000842 for (; --oparg >= 0; ) {
843 w = gettupleitem(v, oparg);
844 INCREF(w);
845 PUSH(w);
846 }
847 }
848 }
849 DECREF(v);
850 break;
851
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000852 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000853 {
854 int n;
855 if (EMPTY()) {
856 err_setstr(TypeError,
857 "no argument list");
858 why = WHY_EXCEPTION;
859 break;
860 }
861 v = POP();
862 if (!is_tupleobject(v)) {
863 err_setstr(TypeError,
864 "bad argument list");
865 why = WHY_EXCEPTION;
866 break;
867 }
868 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000869#ifdef COMPAT_HACKS
870/* Implement various compatibility hacks (for 0.9.4 or earlier):
871 (a) f(a,b,...) accepts f((1,2,...))
872 (b) f((a,b,...)) accepts f(1,2,...)
873 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
874*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000875 if (n == 1 && oparg != 1) {
876 /* Rule (a) */
877 w = gettupleitem(v, 0);
878 if (is_tupleobject(w)) {
879 INCREF(w);
880 DECREF(v);
881 v = w;
882 n = gettuplesize(v);
883 }
884 }
885 else if (n != 1 && oparg == 1) {
886 /* Rule (b) */
887 PUSH(v);
888 break;
889 /* Don't fall through */
890 }
891 else if (n > 2 && oparg == 2) {
892 /* Rule (c) */
893 int i;
894 w = newtupleobject(n-1);
895 u = newtupleobject(2);
896 if (u == NULL || w == NULL) {
897 XDECREF(w);
898 XDECREF(u);
899 DECREF(v);
900 why = WHY_EXCEPTION;
901 break;
902 }
903 t = gettupleitem(v, 0);
904 INCREF(t);
905 settupleitem(u, 0, t);
906 for (i = 1; i < n; i++) {
907 t = gettupleitem(v, i);
908 INCREF(t);
909 settupleitem(w, i-1, t);
910 }
911 settupleitem(u, 1, w);
912 DECREF(v);
913 v = u;
914 n = 2;
915 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000916#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000917 if (n != oparg) {
918 err_setstr(TypeError,
919 "arg count mismatch");
920 why = WHY_EXCEPTION;
921 DECREF(v);
922 break;
923 }
924 PUSH(v);
925 }
926 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 case UNPACK_TUPLE:
928 v = POP();
929 if (!is_tupleobject(v)) {
930 err_setstr(TypeError, "unpack non-tuple");
931 why = WHY_EXCEPTION;
932 }
933 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000934 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 "unpack tuple of wrong size");
936 why = WHY_EXCEPTION;
937 }
938 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000939 if (!CHECK_STACK(oparg)) {
940 x = NULL;
941 break;
942 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 for (; --oparg >= 0; ) {
944 w = gettupleitem(v, oparg);
945 INCREF(w);
946 PUSH(w);
947 }
948 }
949 DECREF(v);
950 break;
951
952 case UNPACK_LIST:
953 v = POP();
954 if (!is_listobject(v)) {
955 err_setstr(TypeError, "unpack non-list");
956 why = WHY_EXCEPTION;
957 }
958 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000959 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 "unpack list of wrong size");
961 why = WHY_EXCEPTION;
962 }
963 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000964 if (!CHECK_STACK(oparg)) {
965 x = NULL;
966 break;
967 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 for (; --oparg >= 0; ) {
969 w = getlistitem(v, oparg);
970 INCREF(w);
971 PUSH(w);
972 }
973 }
974 DECREF(v);
975 break;
976
977 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000978 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 v = POP();
980 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000981 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 DECREF(v);
983 DECREF(u);
984 break;
985
986 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000987 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000989 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 DECREF(v);
991 break;
992
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000993 case STORE_GLOBAL:
994 w = GETNAMEV(oparg);
995 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000996 u = dict2lookup(f->f_locals, w);
997 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000998 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000999 DECREF(v);
1000 break;
1001 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001002 err = dict2insert(f->f_globals, w, v);
1003 DECREF(v);
1004 break;
1005
1006 case DELETE_GLOBAL:
1007 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001008 u = dict2lookup(f->f_locals, w);
1009 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001010 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001011 (object *)NULL);
1012 break;
1013 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001014 if ((err = dict2remove(f->f_globals, w)) != 0)
1015 err_setstr(NameError, getstringvalue(w));
1016 break;
1017
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 case LOAD_CONST:
1019 x = GETCONST(oparg);
1020 INCREF(x);
1021 PUSH(x);
1022 break;
1023
1024 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001025 w = GETNAMEV(oparg);
1026 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001028 err_clear();
1029 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001031 err_clear();
1032 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001034 err_setstr(NameError,
1035 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 break;
1037 }
1038 }
1039 }
Guido van Rossum25831651993-05-19 14:50:45 +00001040 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001041 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001042 if (x == NULL)
1043 break;
1044 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001045 else
1046 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 PUSH(x);
1048 break;
1049
1050 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001051 w = GETNAMEV(oparg);
1052 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001054 err_clear();
1055 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001057 err_setstr(NameError,
1058 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001059 break;
1060 }
1061 }
Guido van Rossum25831651993-05-19 14:50:45 +00001062 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001063 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001064 if (x == NULL)
1065 break;
1066 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001067 else
1068 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 PUSH(x);
1070 break;
1071
1072 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001073 w = GETNAMEV(oparg);
1074 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001076 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 break;
1078 }
Guido van Rossum25831651993-05-19 14:50:45 +00001079 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001080 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001081 if (x == NULL)
1082 break;
1083 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001084 else
1085 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001086 PUSH(x);
1087 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001088
1089 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001090 x = GETCONST(oparg);
1091 if (x == None)
1092 break;
1093 if (x == NULL || !is_dictobject(x)) {
1094 fatal("bad RESERVE_FAST");
1095 err_setstr(SystemError, "bad RESERVE_FAST");
1096 x = NULL;
1097 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001098 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001099 XDECREF(f->f_fastlocals);
1100 XDECREF(f->f_localmap);
1101 INCREF(x);
1102 f->f_localmap = x;
1103 f->f_fastlocals = x = newlistobject(
1104 x->ob_type->tp_as_mapping->mp_length(x));
1105 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001106 break;
1107
1108 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001109 x = GETLISTITEM(fastlocals, oparg);
1110 if (x == NULL) {
1111 err_setstr(NameError,
1112 "undefined local variable");
1113 break;
1114 }
Guido van Rossum25831651993-05-19 14:50:45 +00001115 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001116 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001117 if (x == NULL)
1118 break;
1119 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001120 else
1121 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001122 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001123 break;
1124
1125 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001126 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001127 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001128 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001129 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001130 DECREF(v);
1131 break;
1132 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001133 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001134 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001135 break;
1136
1137 case DELETE_FAST:
1138 x = GETLISTITEM(fastlocals, oparg);
1139 if (x == NULL) {
1140 err_setstr(NameError,
1141 "undefined local variable");
1142 break;
1143 }
Guido van Rossum25831651993-05-19 14:50:45 +00001144 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001145 err = setaccessvalue(w, f->f_locals,
1146 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001147 break;
1148 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001149 DECREF(x);
1150 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001151 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001152
1153 case BUILD_TUPLE:
1154 x = newtupleobject(oparg);
1155 if (x != NULL) {
1156 for (; --oparg >= 0;) {
1157 w = POP();
1158 err = settupleitem(x, oparg, w);
1159 if (err != 0)
1160 break;
1161 }
1162 PUSH(x);
1163 }
1164 break;
1165
1166 case BUILD_LIST:
1167 x = newlistobject(oparg);
1168 if (x != NULL) {
1169 for (; --oparg >= 0;) {
1170 w = POP();
1171 err = setlistitem(x, oparg, w);
1172 if (err != 0)
1173 break;
1174 }
1175 PUSH(x);
1176 }
1177 break;
1178
1179 case BUILD_MAP:
1180 x = newdictobject();
1181 PUSH(x);
1182 break;
1183
1184 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001185 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001187 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 DECREF(v);
1189 PUSH(x);
1190 break;
1191
1192 case COMPARE_OP:
1193 w = POP();
1194 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001195 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 DECREF(v);
1197 DECREF(w);
1198 PUSH(x);
1199 break;
1200
1201 case IMPORT_NAME:
1202 name = GETNAME(oparg);
1203 x = import_module(name);
1204 XINCREF(x);
1205 PUSH(x);
1206 break;
1207
1208 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001209 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001211 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001212 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001214
1215 case ACCESS_MODE:
1216 v = POP();
1217 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001218 if (getstringvalue(w)[0] == '*')
1219 defmode = getintvalue(v);
1220 else
1221 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001222 DECREF(v);
1223 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001224
1225 case JUMP_FORWARD:
1226 JUMPBY(oparg);
1227 break;
1228
1229 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001230 err = testbool(TOP());
1231 if (err > 0)
1232 err = 0;
1233 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 JUMPBY(oparg);
1235 break;
1236
1237 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001238 err = testbool(TOP());
1239 if (err > 0) {
1240 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001242 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
1244
1245 case JUMP_ABSOLUTE:
1246 JUMPTO(oparg);
1247 break;
1248
1249 case FOR_LOOP:
1250 /* for v in s: ...
1251 On entry: stack contains s, i.
1252 On exit: stack contains s, i+1, s[i];
1253 but if loop exhausted:
1254 s, i are popped, and we jump */
1255 w = POP(); /* Loop index */
1256 v = POP(); /* Sequence object */
1257 u = loop_subscript(v, w);
1258 if (u != NULL) {
1259 PUSH(v);
1260 x = newintobject(getintvalue(w)+1);
1261 PUSH(x);
1262 DECREF(w);
1263 PUSH(u);
1264 }
1265 else {
1266 DECREF(v);
1267 DECREF(w);
1268 /* A NULL can mean "s exhausted"
1269 but also an error: */
1270 if (err_occurred())
1271 why = WHY_EXCEPTION;
1272 else
1273 JUMPBY(oparg);
1274 }
1275 break;
1276
1277 case SETUP_LOOP:
1278 case SETUP_EXCEPT:
1279 case SETUP_FINALLY:
1280 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1281 STACK_LEVEL());
1282 break;
1283
1284 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001285#ifdef LLTRACE
1286 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 printf("--- Line %d ---\n", oparg);
1288#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001289 f->f_lineno = oparg;
1290 if (trace != NULL) {
1291 /* Trace each line of code reached */
1292 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001293 err = call_trace(&trace, &trace,
1294 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001295 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 break;
1297
1298 default:
1299 fprintf(stderr,
1300 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001301 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 err_setstr(SystemError, "eval_code: unknown opcode");
1303 why = WHY_EXCEPTION;
1304 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001305
1306#ifdef CASE_TOO_BIG
1307 }
1308#endif
1309
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 } /* switch */
1311
1312 on_error:
1313
1314 /* Quickly continue if no error occurred */
1315
1316 if (why == WHY_NOT) {
1317 if (err == 0 && x != NULL)
1318 continue; /* Normal, fast path */
1319 why = WHY_EXCEPTION;
1320 x = None;
1321 err = 0;
1322 }
1323
Guido van Rossum801dcae1992-04-08 11:32:32 +00001324#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 /* Double-check exception status */
1326
1327 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1328 if (!err_occurred()) {
1329 fprintf(stderr, "XXX ghost error\n");
1330 err_setstr(SystemError, "ghost error");
1331 why = WHY_EXCEPTION;
1332 }
1333 }
1334 else {
1335 if (err_occurred()) {
1336 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001337 abort();
1338 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 why = WHY_EXCEPTION;
1340 }
1341 }
1342#endif
1343
1344 /* Log traceback info if this is a real exception */
1345
1346 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001347 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001349 f->f_lasti -= 2;
1350 tb_here(f);
1351
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001352 if (trace)
1353 call_exc_trace(&trace, &trace, f);
1354 if (sys_profile)
1355 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 }
1357
1358 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1359
1360 if (why == WHY_RERAISE)
1361 why = WHY_EXCEPTION;
1362
1363 /* Unwind stacks if a (pseudo) exception occurred */
1364
1365 while (why != WHY_NOT && f->f_iblock > 0) {
1366 block *b = pop_block(f);
1367 while (STACK_LEVEL() > b->b_level) {
1368 v = POP();
1369 XDECREF(v);
1370 }
1371 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1372 why = WHY_NOT;
1373 JUMPTO(b->b_handler);
1374 break;
1375 }
1376 if (b->b_type == SETUP_FINALLY ||
1377 b->b_type == SETUP_EXCEPT &&
1378 why == WHY_EXCEPTION) {
1379 if (why == WHY_EXCEPTION) {
1380 object *exc, *val;
1381 err_get(&exc, &val);
1382 if (val == NULL) {
1383 val = None;
1384 INCREF(val);
1385 }
1386 v = tb_fetch();
1387 /* Make the raw exception data
1388 available to the handler,
1389 so a program can emulate the
1390 Python main loop. Don't do
1391 this for 'finally'. */
1392 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 sysset("exc_value", val);
1395 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 }
1397 PUSH(v);
1398 PUSH(val);
1399 PUSH(exc);
1400 }
1401 else {
1402 if (why == WHY_RETURN)
1403 PUSH(retval);
1404 v = newintobject((long)why);
1405 PUSH(v);
1406 }
1407 why = WHY_NOT;
1408 JUMPTO(b->b_handler);
1409 break;
1410 }
1411 } /* unwind stack */
1412
1413 /* End the loop if we still have an error (or return) */
1414
1415 if (why != WHY_NOT)
1416 break;
1417
1418 } /* main loop */
1419
1420 /* Pop remaining stack entries */
1421
1422 while (!EMPTY()) {
1423 v = POP();
1424 XDECREF(v);
1425 }
1426
Guido van Rossum96a42c81992-01-12 02:29:51 +00001427 if (why != WHY_RETURN)
1428 retval = NULL;
1429
1430 if (trace) {
1431 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001432 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001433 XDECREF(retval);
1434 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001435 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001436 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001437 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001438 XDECREF(trace);
1439 }
1440
1441 if (sys_profile && why == WHY_RETURN) {
1442 if (call_trace(&sys_profile, (object**)0,
1443 f, "return", retval)) {
1444 XDECREF(retval);
1445 retval = NULL;
1446 why = WHY_EXCEPTION;
1447 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001448 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001449
1450 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1451 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001452
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 /* Restore previous frame and release the current one */
1454
1455 current_frame = f->f_back;
1456 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001457
1458 if (needmerge)
1459 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001460
Guido van Rossum96a42c81992-01-12 02:29:51 +00001461 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001462}
1463
Guido van Rossum96a42c81992-01-12 02:29:51 +00001464#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001465static int
1466prtrace(v, str)
1467 object *v;
1468 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001471 if (printobject(v, stdout, 0) != 0)
1472 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001475#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001477static void
1478call_exc_trace(p_trace, p_newtrace, f)
1479 object **p_trace, **p_newtrace;
1480 frameobject *f;
1481{
1482 object *type, *value, *traceback, *arg;
1483 int err;
1484 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001485 if (value == NULL) {
1486 value = None;
1487 INCREF(value);
1488 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001489 traceback = tb_fetch();
1490 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001491 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001492 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001493 settupleitem(arg, 0, type);
1494 settupleitem(arg, 1, value);
1495 settupleitem(arg, 2, traceback);
1496 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001497 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001498 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001499 /* Restore original exception */
1500 err_setval(type, value);
1501 tb_store(traceback);
1502 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001503 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001504}
1505
1506static int
1507call_trace(p_trace, p_newtrace, f, msg, arg)
1508 object **p_trace; /* in/out; may not be NULL;
1509 may not point to NULL variable initially */
1510 object **p_newtrace; /* in/out; may be NULL;
1511 may point to NULL variable;
1512 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001513 frameobject *f;
1514 char *msg;
1515 object *arg;
1516{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001517 object *arglist, *what;
1518 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001519 static int tracing = 0;
1520
1521 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001522 /* Don't do recursive traces */
1523 if (p_newtrace) {
1524 XDECREF(*p_newtrace);
1525 *p_newtrace = NULL;
1526 }
1527 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001528 }
1529
1530 arglist = newtupleobject(3);
1531 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001532 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001533 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001534 if (what == NULL)
1535 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001536 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001537 settupleitem(arglist, 0, (object *)f);
1538 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001539 if (arg == NULL)
1540 arg = None;
1541 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001542 settupleitem(arglist, 2, arg);
1543 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001544 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001545 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001546 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001547 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001548 cleanup:
1549 XDECREF(arglist);
1550 if (res == NULL) {
1551 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001552 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001553 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001554 *p_trace = NULL;
1555 if (p_newtrace) {
1556 XDECREF(*p_newtrace);
1557 *p_newtrace = NULL;
1558 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001559 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001560 }
1561 else {
1562 if (p_newtrace) {
1563 XDECREF(*p_newtrace);
1564 if (res == None)
1565 *p_newtrace = NULL;
1566 else {
1567 INCREF(res);
1568 *p_newtrace = res;
1569 }
1570 }
1571 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001572 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001573 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001574}
1575
Guido van Rossum5b722181993-03-30 17:46:03 +00001576static void
1577fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001578 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001579{
1580 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001581 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001582 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001583 int pos;
1584 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001585 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001586 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001587 locals = f->f_locals;
1588 fast = f->f_fastlocals;
1589 map = f->f_localmap;
1590 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001591 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001592 if (!is_dictobject(locals) || !is_listobject(fast) ||
1593 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001594 return;
1595 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001596 pos = 0;
1597 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001598 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001599 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001600 continue;
1601 j = getintvalue(value);
1602 value = getlistitem(fast, j);
1603 if (value == NULL) {
1604 err_clear();
1605 if (dict2remove(locals, key) != 0)
1606 err_clear();
1607 }
1608 else {
1609 if (dict2insert(locals, key, value) != 0)
1610 err_clear();
1611 }
1612 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001613 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001614}
1615
1616static void
1617locals_2_fast(f, clear)
1618 frameobject *f;
1619 int clear;
1620{
1621 /* Merge f->f_locals into f->f_fastlocals */
1622 object *locals, *fast, *map;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001623 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001624 int pos;
1625 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001626 if (f == NULL)
1627 return;
1628 locals = f->f_locals;
1629 fast = f->f_fastlocals;
1630 map = f->f_localmap;
1631 if (locals == NULL || fast == NULL || map == NULL)
1632 return;
1633 if (!is_dictobject(locals) || !is_listobject(fast) ||
1634 !is_dictobject(map))
1635 return;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001636 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001637 pos = 0;
1638 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001639 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001640 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001641 continue;
1642 j = getintvalue(value);
1643 value = dict2lookup(locals, key);
1644 if (value == NULL)
1645 err_clear();
1646 else
1647 INCREF(value);
1648 if (value != NULL || clear)
1649 if (setlistitem(fast, j, value) != 0)
1650 err_clear();
1651 }
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001652 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001653}
1654
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001655static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001656mergelocals()
1657{
1658 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659}
1660
1661object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001662getlocals()
1663{
1664 if (current_frame == NULL)
1665 return NULL;
1666 fast_2_locals(current_frame);
1667 return current_frame->f_locals;
1668}
1669
1670object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001671getglobals()
1672{
1673 if (current_frame == NULL)
1674 return NULL;
1675 else
1676 return current_frame->f_globals;
1677}
1678
Guido van Rossum81daa321993-05-20 14:24:46 +00001679object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001680getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001681{
1682 if (current_frame == NULL)
1683 return NULL;
1684 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001685 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001686}
1687
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001689printtraceback(f)
1690 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691{
1692 object *v = tb_fetch();
1693 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001694 writestring("Stack backtrace (innermost last):\n", f);
1695 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698}
1699
1700
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701void
1702flushline()
1703{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001704 object *f = sysget("stdout");
1705 if (softspace(f, 0))
1706 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707}
1708
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001711or(v, w)
1712 object *v, *w;
1713{
1714 if (v->ob_type->tp_as_number != NULL) {
1715 object *x;
1716 object * (*f) FPROTO((object *, object *));
1717 if (coerce(&v, &w) != 0)
1718 return NULL;
1719 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1720 x = (*f)(v, w);
1721 DECREF(v);
1722 DECREF(w);
1723 if (f != NULL)
1724 return x;
1725 }
1726 err_setstr(TypeError, "bad operand type(s) for |");
1727 return NULL;
1728}
1729
1730static object *
1731xor(v, w)
1732 object *v, *w;
1733{
1734 if (v->ob_type->tp_as_number != NULL) {
1735 object *x;
1736 object * (*f) FPROTO((object *, object *));
1737 if (coerce(&v, &w) != 0)
1738 return NULL;
1739 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1740 x = (*f)(v, w);
1741 DECREF(v);
1742 DECREF(w);
1743 if (f != NULL)
1744 return x;
1745 }
1746 err_setstr(TypeError, "bad operand type(s) for ^");
1747 return NULL;
1748}
1749
1750static object *
1751and(v, w)
1752 object *v, *w;
1753{
1754 if (v->ob_type->tp_as_number != NULL) {
1755 object *x;
1756 object * (*f) FPROTO((object *, object *));
1757 if (coerce(&v, &w) != 0)
1758 return NULL;
1759 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1760 x = (*f)(v, w);
1761 DECREF(v);
1762 DECREF(w);
1763 if (f != NULL)
1764 return x;
1765 }
1766 err_setstr(TypeError, "bad operand type(s) for &");
1767 return NULL;
1768}
1769
1770static object *
1771lshift(v, w)
1772 object *v, *w;
1773{
1774 if (v->ob_type->tp_as_number != NULL) {
1775 object *x;
1776 object * (*f) FPROTO((object *, object *));
1777 if (coerce(&v, &w) != 0)
1778 return NULL;
1779 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1780 x = (*f)(v, w);
1781 DECREF(v);
1782 DECREF(w);
1783 if (f != NULL)
1784 return x;
1785 }
1786 err_setstr(TypeError, "bad operand type(s) for <<");
1787 return NULL;
1788}
1789
1790static object *
1791rshift(v, w)
1792 object *v, *w;
1793{
1794 if (v->ob_type->tp_as_number != NULL) {
1795 object *x;
1796 object * (*f) FPROTO((object *, object *));
1797 if (coerce(&v, &w) != 0)
1798 return NULL;
1799 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1800 x = (*f)(v, w);
1801 DECREF(v);
1802 DECREF(w);
1803 if (f != NULL)
1804 return x;
1805 }
1806 err_setstr(TypeError, "bad operand type(s) for >>");
1807 return NULL;
1808}
1809
1810static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001811add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812 object *v, *w;
1813{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001814 if (v->ob_type->tp_as_sequence != NULL)
1815 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1816 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001817 object *x;
1818 if (coerce(&v, &w) != 0)
1819 return NULL;
1820 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1821 DECREF(v);
1822 DECREF(w);
1823 return x;
1824 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001825 err_setstr(TypeError, "bad operand type(s) for +");
1826 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827}
1828
1829static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001830sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 object *v, *w;
1832{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001833 if (v->ob_type->tp_as_number != NULL) {
1834 object *x;
1835 if (coerce(&v, &w) != 0)
1836 return NULL;
1837 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1838 DECREF(v);
1839 DECREF(w);
1840 return x;
1841 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001842 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 return NULL;
1844}
1845
1846static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001847mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 object *v, *w;
1849{
1850 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001851 tp = v->ob_type;
1852 if (tp->tp_as_number != NULL &&
1853 w->ob_type->tp_as_sequence != NULL &&
1854 !is_instanceobject(v)) {
1855 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 object *tmp = v;
1857 v = w;
1858 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001859 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001861 if (tp->tp_as_number != NULL) {
1862 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001863 if (is_instanceobject(v)) {
1864 /* Instances of user-defined classes get their
1865 other argument uncoerced, so they may
1866 implement sequence*number as well as
1867 number*number. */
1868 INCREF(v);
1869 INCREF(w);
1870 }
1871 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001872 return NULL;
1873 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1874 DECREF(v);
1875 DECREF(w);
1876 return x;
1877 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878 if (tp->tp_as_sequence != NULL) {
1879 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880 err_setstr(TypeError,
1881 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 return NULL;
1883 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001884 return (*tp->tp_as_sequence->sq_repeat)
1885 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001887 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 return NULL;
1889}
1890
1891static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001892divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 object *v, *w;
1894{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001895 if (v->ob_type->tp_as_number != NULL) {
1896 object *x;
1897 if (coerce(&v, &w) != 0)
1898 return NULL;
1899 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1900 DECREF(v);
1901 DECREF(w);
1902 return x;
1903 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001904 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 return NULL;
1906}
1907
1908static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 object *v, *w;
1911{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001912 if (v->ob_type->tp_as_number != NULL) {
1913 object *x;
1914 if (coerce(&v, &w) != 0)
1915 return NULL;
1916 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1917 DECREF(v);
1918 DECREF(w);
1919 return x;
1920 }
Guido van Rossume5372401993-03-16 12:15:04 +00001921 if (is_stringobject(v)) {
1922 return formatstring(v, w);
1923 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001924 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 return NULL;
1926}
1927
1928static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001929neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 object *v;
1931{
1932 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933 return (*v->ob_type->tp_as_number->nb_negative)(v);
1934 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 return NULL;
1936}
1937
1938static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001939pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 object *v;
1941{
1942 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001943 return (*v->ob_type->tp_as_number->nb_positive)(v);
1944 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 return NULL;
1946}
1947
1948static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001949invert(v)
1950 object *v;
1951{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001952 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001953 if (v->ob_type->tp_as_number != NULL &&
1954 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1955 return (*f)(v);
1956 err_setstr(TypeError, "bad operand type(s) for unary ~");
1957 return NULL;
1958}
1959
1960static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 object *v;
1963{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001965 object *w;
1966 if (outcome < 0)
1967 return NULL;
1968 if (outcome == 0)
1969 w = True;
1970 else
1971 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001972 INCREF(w);
1973 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974}
Guido van Rossum234f9421993-06-17 12:35:49 +00001975
1976
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001977/* External interface to call any callable object. The arg may be NULL. */
1978
1979object *
1980call_object(func, arg)
1981 object *func;
1982 object *arg;
1983{
1984 if (is_instancemethodobject(func) || is_funcobject(func))
1985 return call_function(func, arg);
1986 else
1987 return call_builtin(func, arg);
1988}
1989
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001991call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 if (is_methodobject(func)) {
1996 method meth = getmethod(func);
1997 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001998 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1999 int size = gettuplesize(arg);
2000 if (size == 1)
2001 arg = gettupleitem(arg, 0);
2002 else if (size == 0)
2003 arg = NULL;
2004 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 }
2007 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002008 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002010 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011 return NULL;
2012}
2013
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002015call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002017 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019 object *newarg = NULL;
2020 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002021 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002022 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023
Guido van Rossume8122f11991-05-05 20:03:07 +00002024 if (is_instancemethodobject(func)) {
2025 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002026 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002027 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002028 if (self == NULL) {
2029 /* Unbound methods must be called with an instance of
2030 the class (or a derived class) as first argument */
2031 if (arg != NULL && is_tupleobject(arg) &&
2032 gettuplesize(arg) >= 1) {
2033 self = gettupleitem(arg, 0);
2034 if (self != NULL &&
2035 is_instanceobject(self) &&
2036 issubclass((object *)
2037 (((instanceobject *)self)->in_class),
2038 class))
2039 /* self = self */ ;
2040 else
2041 self = NULL;
2042 }
2043 if (self == NULL) {
2044 err_setstr(TypeError,
2045 "unbound method must be called with class instance argument");
2046 return NULL;
2047 }
2048 }
2049 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002050 int argcount;
2051 if (arg == NULL)
2052 argcount = 0;
2053 else if (is_tupleobject(arg))
2054 argcount = gettuplesize(arg);
2055 else
2056 argcount = 1;
2057 newarg = newtupleobject(argcount + 1);
2058 if (newarg == NULL)
2059 return NULL;
2060 INCREF(self);
2061 settupleitem(newarg, 0, self);
2062 if (arg != NULL && !is_tupleobject(arg)) {
2063 INCREF(arg);
2064 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002065 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002066 else {
2067 int i;
2068 object *v;
2069 for (i = 0; i < argcount; i++) {
2070 v = gettupleitem(arg, i);
2071 XINCREF(v);
2072 settupleitem(newarg, i+1, v);
2073 }
2074 }
2075 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 }
2077 }
2078 else {
2079 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 return NULL;
2082 }
2083 }
2084
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085 co = getfunccode(func);
2086 if (co == NULL) {
2087 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 return NULL;
2089 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 if (!is_codeobject(co)) {
2091 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 abort();
2093 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002096 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 return NULL;
2098 }
2099
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100 newglobals = getfuncglobals(func);
2101 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102
Guido van Rossum81daa321993-05-20 14:24:46 +00002103 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105 DECREF(newlocals);
2106 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107
Guido van Rossum3f5da241990-12-20 15:06:42 +00002108 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109
2110 return v;
2111}
2112
2113static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 object *v, *w;
2116{
2117 typeobject *tp = v->ob_type;
2118 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 return NULL;
2121 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002122 if (tp->tp_as_mapping != NULL) {
2123 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2124 }
2125 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 int i;
2127 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 return NULL;
2130 }
2131 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002132 if (i < 0) {
2133 int len = (*tp->tp_as_sequence->sq_length)(v);
2134 if (len < 0)
2135 return NULL;
2136 i += len;
2137 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140}
2141
2142static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002143loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 object *v, *w;
2145{
2146 sequence_methods *sq = v->ob_type->tp_as_sequence;
2147 int i, n;
2148 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002149 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150 return NULL;
2151 }
2152 i = getintvalue(w);
2153 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002154 if (n < 0)
2155 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156 if (i >= n)
2157 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002158 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159}
2160
2161static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002162slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 object *v;
2164 int isize;
2165 int *pi;
2166{
2167 if (v != NULL) {
2168 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002169 err_setstr(TypeError, "slice index must be int");
2170 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 }
2172 *pi = getintvalue(v);
2173 if (*pi < 0)
2174 *pi += isize;
2175 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002176 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177}
2178
2179static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002180apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 object *u, *v, *w;
2182{
2183 typeobject *tp = u->ob_type;
2184 int ilow, ihigh, isize;
2185 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002186 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187 return NULL;
2188 }
2189 ilow = 0;
2190 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002191 if (isize < 0)
2192 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002193 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002195 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002197 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002199
2200static int
2201assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 object *w;
2203 object *key;
2204 object *v;
2205{
2206 typeobject *tp = w->ob_type;
2207 sequence_methods *sq;
2208 mapping_methods *mp;
2209 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002210 if ((mp = tp->tp_as_mapping) != NULL &&
2211 (func = mp->mp_ass_subscript) != NULL) {
2212 return (*func)(w, key, v);
2213 }
2214 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 (func = sq->sq_ass_item) != NULL) {
2216 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002217 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002218 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002219 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002221 else {
2222 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002223 if (i < 0) {
2224 int len = (*sq->sq_length)(w);
2225 if (len < 0)
2226 return -1;
2227 i += len;
2228 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002229 return (*func)(w, i, v);
2230 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002233 err_setstr(TypeError,
2234 "can't assign to this subscripted object");
2235 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237}
2238
Guido van Rossum3f5da241990-12-20 15:06:42 +00002239static int
2240assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 object *u, *v, *w, *x;
2242{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002243 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002245 if (sq == NULL) {
2246 err_setstr(TypeError, "assign to slice of non-sequence");
2247 return -1;
2248 }
2249 if (sq == NULL || sq->sq_ass_slice == NULL) {
2250 err_setstr(TypeError, "unassignable slice");
2251 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 }
2253 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002254 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002255 if (isize < 0)
2256 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257 if (slice_index(v, isize, &ilow) != 0)
2258 return -1;
2259 if (slice_index(w, isize, &ihigh) != 0)
2260 return -1;
2261 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262}
2263
2264static int
2265cmp_exception(err, v)
2266 object *err, *v;
2267{
2268 if (is_tupleobject(v)) {
2269 int i, n;
2270 n = gettuplesize(v);
2271 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002272 /* Test recursively */
2273 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 return 1;
2275 }
2276 return 0;
2277 }
2278 return err == v;
2279}
2280
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281static int
2282cmp_member(v, w)
2283 object *v, *w;
2284{
2285 int i, n, cmp;
2286 object *x;
2287 sequence_methods *sq;
2288 /* Special case for char in string */
2289 if (is_stringobject(w)) {
2290 register char *s, *end;
2291 register char c;
2292 if (!is_stringobject(v) || getstringsize(v) != 1) {
2293 err_setstr(TypeError,
2294 "string member test needs char left operand");
2295 return -1;
2296 }
2297 c = getstringvalue(v)[0];
2298 s = getstringvalue(w);
2299 end = s + getstringsize(w);
2300 while (s < end) {
2301 if (c == *s++)
2302 return 1;
2303 }
2304 return 0;
2305 }
2306 sq = w->ob_type->tp_as_sequence;
2307 if (sq == NULL) {
2308 err_setstr(TypeError,
2309 "'in' or 'not in' needs sequence right argument");
2310 return -1;
2311 }
2312 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002313 if (n < 0)
2314 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315 for (i = 0; i < n; i++) {
2316 x = (*sq->sq_item)(w, i);
2317 cmp = cmpobject(v, x);
2318 XDECREF(x);
2319 if (cmp == 0)
2320 return 1;
2321 }
2322 return 0;
2323}
2324
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002326cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002327 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 register object *v;
2329 register object *w;
2330{
2331 register int cmp;
2332 register int res = 0;
2333 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 case IS:
2335 case IS_NOT:
2336 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002337 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002338 res = !res;
2339 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 case IN:
2341 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002342 res = cmp_member(v, w);
2343 if (res < 0)
2344 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002345 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002346 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 break;
2348 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002349 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 break;
2351 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002352 cmp = cmpobject(v, w);
2353 switch (op) {
2354 case LT: res = cmp < 0; break;
2355 case LE: res = cmp <= 0; break;
2356 case EQ: res = cmp == 0; break;
2357 case NE: res = cmp != 0; break;
2358 case GT: res = cmp > 0; break;
2359 case GE: res = cmp >= 0; break;
2360 /* XXX no default? (res is initialized to 0 though) */
2361 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 }
2363 v = res ? True : False;
2364 INCREF(v);
2365 return v;
2366}
2367
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368static int
2369import_from(locals, v, name)
2370 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002371 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002372 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002373{
2374 object *w, *x;
2375 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002376 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002377 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002378 object *name, *value;
2379 pos = 0;
2380 while (mappinggetnext(w, &pos, &name, &value)) {
2381 if (!is_stringobject(name) ||
2382 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002383 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002384 if (is_accessobject(value)) {
2385 value = getaccessvalue(value, (object *)NULL);
2386 if (value == NULL) {
2387 err_clear();
2388 continue;
2389 }
2390 }
2391 else
2392 INCREF(value);
2393 err = dict2insert(locals, name, value);
2394 DECREF(value);
2395 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002396 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002397 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002398 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002399 }
2400 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002401 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002402 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002403 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002404 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002405 getstringvalue(name));
2406 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002407 return -1;
2408 }
2409 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002410 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002411 }
2412}
2413
2414static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002415build_class(methods, bases, name)
2416 object *methods; /* dictionary */
2417 object *bases; /* tuple containing classes */
2418 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002419{
Guido van Rossum25831651993-05-19 14:50:45 +00002420 int i;
2421 if (!is_tupleobject(bases)) {
2422 err_setstr(SystemError, "build_class with non-tuple bases");
2423 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002424 }
Guido van Rossum25831651993-05-19 14:50:45 +00002425 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002426 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002427 return NULL;
2428 }
Guido van Rossum25831651993-05-19 14:50:45 +00002429 if (!is_stringobject(name)) {
2430 err_setstr(SystemError, "build_class witn non-string name");
2431 return NULL;
2432 }
2433 for (i = gettuplesize(bases); --i >= 0; ) {
2434 object *base = gettupleitem(bases, i);
2435 if (!is_classobject(base)) {
2436 err_setstr(TypeError,
2437 "base is not a class object");
2438 return NULL;
2439 }
2440 }
2441 return newclassobject(bases, methods, name);
2442}
2443
2444static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002445access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002446 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002447 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002448 frameobject *f;
2449{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002450 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002451 object *value, *ac;
2452 typeobject *type;
2453 int fastind, ret;
2454 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002455 if (f->f_localmap == NULL)
2456 value = dict2lookup(f->f_locals, name);
2457 else {
2458 value = dict2lookup(f->f_localmap, name);
2459 if (value == NULL || !is_intobject(value))
2460 value = NULL;
2461 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002462 fastind = getintvalue(value);
2463 if (0 <= fastind &&
2464 fastind < getlistsize(f->f_fastlocals))
2465 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossum25831651993-05-19 14:50:45 +00002466 else {
2467 value = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +00002468 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002469 }
2470 }
2471 }
2472 if (value && is_accessobject(value)) {
2473 err_setstr(AccessError, "can't override access");
2474 return -1;
2475 }
2476 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002477 if (value != NULL && value != None)
2478 type = value->ob_type;
2479 else
2480 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002481 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002482 if (ac == NULL)
2483 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002484 if (fastind >= 0)
2485 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002486 else {
2487 ret = dict2insert(f->f_locals, name, ac);
2488 DECREF(ac);
2489 }
2490 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002491}