blob: 329494e7c4ace44ca50d80d32a6a1d4d8a781d02 [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 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 Rossum04691fc1992-08-12 15:35:34 +000041/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000042/* #define CASE_TOO_BIG 1 /**/
Guido van Rossum04691fc1992-08-12 15:35:34 +000043
Guido van Rossumacbe8da1993-04-15 15:33:52 +000044/* Turn this on if you want to debug the interpreter: */
45/* (This can be on even if NDEBUG is defined) */
46/* #define DEBUG 1 /**/
47
48#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000049/* For debugging the interpreter: */
50#define LLTRACE 1 /* Low-level trace feature */
51#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#endif
53
Guido van Rossum9e90a671993-06-24 11:10:19 +000054/* Global option, may be set by main() */
55int killprint;
56
Guido van Rossum5b722181993-03-30 17:46:03 +000057
Guido van Rossum374a9221991-04-04 10:40:29 +000058/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000059
Guido van Rossum0a066c01992-03-27 17:29:15 +000060#ifdef LLTRACE
61static int prtrace PROTO((object *, char *));
62#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000063static void call_exc_trace PROTO((object **, object**, frameobject *));
64static int call_trace
65 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000066static object *add PROTO((object *, object *));
67static object *sub PROTO((object *, object *));
68static object *mul PROTO((object *, object *));
69static object *divide PROTO((object *, object *));
70static object *rem PROTO((object *, object *));
71static object *neg PROTO((object *));
72static object *pos PROTO((object *));
73static object *not PROTO((object *));
74static object *invert PROTO((object *));
75static object *lshift PROTO((object *, object *));
76static object *rshift PROTO((object *, object *));
77static object *and PROTO((object *, object *));
78static object *xor PROTO((object *, object *));
79static object *or PROTO((object *, object *));
80static object *call_builtin PROTO((object *, object *));
81static object *call_function PROTO((object *, object *));
82static object *apply_subscript PROTO((object *, object *));
83static object *loop_subscript PROTO((object *, object *));
84static int slice_index PROTO((object *, int, int *));
85static object *apply_slice PROTO((object *, object *, object *));
86static int assign_subscript PROTO((object *, object *, object *));
87static int assign_slice PROTO((object *, object *, object *, object *));
88static int cmp_exception PROTO((object *, object *));
89static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000090static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000091static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000092static object *build_class PROTO((object *, object *, object *));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000093static void locals_2_fast PROTO((frameobject *, int));
Guido van Rossum5b722181993-03-30 17:46:03 +000094static void fast_2_locals PROTO((frameobject *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000095static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000096static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000097
98
Guido van Rossum0a066c01992-03-27 17:29:15 +000099/* Pointer to current frame, used to link new frames to */
100
Guido van Rossum374a9221991-04-04 10:40:29 +0000101static frameobject *current_frame;
102
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000104
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105#include <errno.h>
106#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000107
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108static type_lock interpreter_lock;
109
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 Rossum1984f1e1992-08-04 12:41:02 +0000117}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000118
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119#endif
120
Guido van Rossumff4949e1992-08-05 19:58:53 +0000121/* Functions save_thread and restore_thread are always defined so
122 dynamically loaded modules needn't be compiled separately for use
123 with and without threads: */
124
Guido van Rossum04691fc1992-08-12 15:35:34 +0000125object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126save_thread()
127{
128#ifdef USE_THREAD
129 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000130 object *res;
131 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132 current_frame = NULL;
133 release_lock(interpreter_lock);
134 return res;
135 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000136#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000137 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138}
139
140void
141restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000142 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000143{
144#ifdef USE_THREAD
145 if (interpreter_lock) {
146 int err;
147 err = errno;
148 acquire_lock(interpreter_lock, 1);
149 errno = err;
150 current_frame = (frameobject *)x;
151 }
152#endif
153}
154
155
Guido van Rossum374a9221991-04-04 10:40:29 +0000156/* Status code for main loop (reason for stack unwind) */
157
158enum why_code {
159 WHY_NOT, /* No error */
160 WHY_EXCEPTION, /* Exception occurred */
161 WHY_RERAISE, /* Exception re-raised by 'finally' */
162 WHY_RETURN, /* 'return' statement */
163 WHY_BREAK /* 'break' statement */
164};
165
166
167/* Interpreter main loop */
168
169object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000170eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000171 codeobject *co;
172 object *globals;
173 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000174 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000175 object *arg;
176{
177 register unsigned char *next_instr;
178 register int opcode; /* Current opcode */
179 register int oparg; /* Current opcode argument, if any */
180 register object **stack_pointer;
181 register enum why_code why; /* Reason for block stack unwind */
182 register int err; /* Error status -- nonzero if error */
183 register object *x; /* Result object -- NULL if error */
184 register object *v; /* Temporary objects popped off stack */
185 register object *w;
186 register object *u;
187 register object *t;
188 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000189 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000190 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000191 object *retval; /* Return value iff why == WHY_RETURN */
192 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000193 int needmerge = 0; /* Set if need to merge locals back at end */
194 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000195#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000196 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000197#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000198#ifdef DEBUG
199 /* Make it easier to find out where we are with dbx */
200 char *filename = getstringvalue(co->co_filename);
201#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000202
203/* Code access macros */
204
205#define GETCONST(i) Getconst(f, i)
206#define GETNAME(i) Getname(f, i)
207#define GETNAMEV(i) Getnamev(f, i)
208#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
209#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
210#define NEXTOP() (*next_instr++)
211#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
212#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
213#define JUMPBY(x) (next_instr += (x))
214
215/* Stack manipulation macros */
216
217#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
218#define EMPTY() (STACK_LEVEL() == 0)
219#define TOP() (stack_pointer[-1])
220#define BASIC_PUSH(v) (*stack_pointer++ = (v))
221#define BASIC_POP() (*--stack_pointer)
222
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000223#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
224 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
225
Guido van Rossum96a42c81992-01-12 02:29:51 +0000226#ifdef LLTRACE
227#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
228#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000229#else
230#define PUSH(v) BASIC_PUSH(v)
231#define POP() BASIC_POP()
232#endif
233
Guido van Rossum5b722181993-03-30 17:46:03 +0000234 if (globals == NULL) {
235 globals = getglobals();
236 if (locals == NULL) {
237 locals = getlocals();
238 needmerge = 1;
239 }
240 }
241 else {
242 if (locals == NULL)
243 locals = globals;
244 }
245
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000246#ifdef LLTRACE
247 lltrace = dictlookup(globals, "__lltrace__") != NULL;
248#endif
249
Guido van Rossum374a9221991-04-04 10:40:29 +0000250 f = newframeobject(
251 current_frame, /*back*/
252 co, /*code*/
253 globals, /*globals*/
254 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000255 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000256 50, /*nvalues*/
257 20); /*nblocks*/
258 if (f == NULL)
259 return NULL;
260
261 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000262
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000263 if (sys_trace != NULL) {
264 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000265 be called on *every* entry to a code block.
266 Its return value, if not None, is a function that
267 will be called at the start of each executed line
268 of code. (Actually, the function must return
269 itself in order to continue tracing.)
270 The trace functions are called with three arguments:
271 a pointer to the current frame, a string indicating
272 why the function is called, and an argument which
273 depends on the situation. The global trace function
274 (sys.trace) is also called whenever an exception
275 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000276 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000277 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000278 current_frame = f->f_back;
279 DECREF(f);
280 return NULL;
281 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000282 }
283
284 if (sys_profile != NULL) {
285 /* Similar for sys_profile, except it needn't return
286 itself and isn't called for "line" events */
287 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
288 current_frame = f->f_back;
289 DECREF(f);
290 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000291 }
292 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000293
294 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000295 stack_pointer = f->f_valuestack;
296
297 if (arg != NULL) {
298 INCREF(arg);
299 PUSH(arg);
300 }
301
302 why = WHY_NOT;
303 err = 0;
304 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000305
306 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000307 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000308
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000309 /* Do periodic things.
310 Doing this every time through the loop would add
311 too much overhead (a function call per instruction).
312 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000313
314 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000316 if (intrcheck()) {
317 err_set(KeyboardInterrupt);
318 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000319 goto on_error;
320 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000321
322#ifdef USE_THREAD
323 if (interpreter_lock) {
324 /* Give another thread a chance */
325
326 current_frame = NULL;
327 release_lock(interpreter_lock);
328
329 /* Other threads may run now */
330
331 acquire_lock(interpreter_lock, 1);
332 current_frame = f;
333 }
334#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336
Guido van Rossum374a9221991-04-04 10:40:29 +0000337 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000338
339#ifdef DEBUG
340 f->f_lasti = INSTR_OFFSET();
341#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000342
343 opcode = NEXTOP();
344 if (HAS_ARG(opcode))
345 oparg = NEXTARG();
346
Guido van Rossum96a42c81992-01-12 02:29:51 +0000347#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000348 /* Instruction tracing */
349
Guido van Rossum96a42c81992-01-12 02:29:51 +0000350 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000351 if (HAS_ARG(opcode)) {
352 printf("%d: %d, %d\n",
353 (int) (INSTR_OFFSET() - 3),
354 opcode, oparg);
355 }
356 else {
357 printf("%d: %d\n",
358 (int) (INSTR_OFFSET() - 1), opcode);
359 }
360 }
361#endif
362
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000363 if (!CHECK_STACK(3)) {
364 x = NULL;
365 break;
366 }
367
Guido van Rossum374a9221991-04-04 10:40:29 +0000368 /* Main switch on opcode */
369
370 switch (opcode) {
371
372 /* BEWARE!
373 It is essential that any operation that fails sets either
374 x to NULL, err to nonzero, or why to anything but WHY_NOT,
375 and that no operation that succeeds does this! */
376
377 /* case STOP_CODE: this is an error! */
378
379 case POP_TOP:
380 v = POP();
381 DECREF(v);
382 break;
383
384 case ROT_TWO:
385 v = POP();
386 w = POP();
387 PUSH(v);
388 PUSH(w);
389 break;
390
391 case ROT_THREE:
392 v = POP();
393 w = POP();
394 x = POP();
395 PUSH(v);
396 PUSH(x);
397 PUSH(w);
398 break;
399
400 case DUP_TOP:
401 v = TOP();
402 INCREF(v);
403 PUSH(v);
404 break;
405
406 case UNARY_POSITIVE:
407 v = POP();
408 x = pos(v);
409 DECREF(v);
410 PUSH(x);
411 break;
412
413 case UNARY_NEGATIVE:
414 v = POP();
415 x = neg(v);
416 DECREF(v);
417 PUSH(x);
418 break;
419
420 case UNARY_NOT:
421 v = POP();
422 x = not(v);
423 DECREF(v);
424 PUSH(x);
425 break;
426
427 case UNARY_CONVERT:
428 v = POP();
429 x = reprobject(v);
430 DECREF(v);
431 PUSH(x);
432 break;
433
434 case UNARY_CALL:
435 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000436 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000437 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000438 DECREF(v);
439 PUSH(x);
440 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000441
442 case UNARY_INVERT:
443 v = POP();
444 x = invert(v);
445 DECREF(v);
446 PUSH(x);
447 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000448
449 case BINARY_MULTIPLY:
450 w = POP();
451 v = POP();
452 x = mul(v, w);
453 DECREF(v);
454 DECREF(w);
455 PUSH(x);
456 break;
457
458 case BINARY_DIVIDE:
459 w = POP();
460 v = POP();
461 x = divide(v, w);
462 DECREF(v);
463 DECREF(w);
464 PUSH(x);
465 break;
466
467 case BINARY_MODULO:
468 w = POP();
469 v = POP();
470 x = rem(v, w);
471 DECREF(v);
472 DECREF(w);
473 PUSH(x);
474 break;
475
476 case BINARY_ADD:
477 w = POP();
478 v = POP();
479 x = add(v, w);
480 DECREF(v);
481 DECREF(w);
482 PUSH(x);
483 break;
484
485 case BINARY_SUBTRACT:
486 w = POP();
487 v = POP();
488 x = sub(v, w);
489 DECREF(v);
490 DECREF(w);
491 PUSH(x);
492 break;
493
494 case BINARY_SUBSCR:
495 w = POP();
496 v = POP();
497 x = apply_subscript(v, w);
498 DECREF(v);
499 DECREF(w);
500 PUSH(x);
501 break;
502
503 case BINARY_CALL:
504 w = POP();
505 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000506 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000507 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000508 DECREF(v);
509 DECREF(w);
510 PUSH(x);
511 break;
512
Guido van Rossum7928cd71991-10-24 14:59:31 +0000513 case BINARY_LSHIFT:
514 w = POP();
515 v = POP();
516 x = lshift(v, w);
517 DECREF(v);
518 DECREF(w);
519 PUSH(x);
520 break;
521
522 case BINARY_RSHIFT:
523 w = POP();
524 v = POP();
525 x = rshift(v, w);
526 DECREF(v);
527 DECREF(w);
528 PUSH(x);
529 break;
530
531 case BINARY_AND:
532 w = POP();
533 v = POP();
534 x = and(v, w);
535 DECREF(v);
536 DECREF(w);
537 PUSH(x);
538 break;
539
540 case BINARY_XOR:
541 w = POP();
542 v = POP();
543 x = xor(v, w);
544 DECREF(v);
545 DECREF(w);
546 PUSH(x);
547 break;
548
549 case BINARY_OR:
550 w = POP();
551 v = POP();
552 x = or(v, w);
553 DECREF(v);
554 DECREF(w);
555 PUSH(x);
556 break;
557
Guido van Rossum374a9221991-04-04 10:40:29 +0000558 case SLICE+0:
559 case SLICE+1:
560 case SLICE+2:
561 case SLICE+3:
562 if ((opcode-SLICE) & 2)
563 w = POP();
564 else
565 w = NULL;
566 if ((opcode-SLICE) & 1)
567 v = POP();
568 else
569 v = NULL;
570 u = POP();
571 x = apply_slice(u, v, w);
572 DECREF(u);
573 XDECREF(v);
574 XDECREF(w);
575 PUSH(x);
576 break;
577
578 case STORE_SLICE+0:
579 case STORE_SLICE+1:
580 case STORE_SLICE+2:
581 case STORE_SLICE+3:
582 if ((opcode-STORE_SLICE) & 2)
583 w = POP();
584 else
585 w = NULL;
586 if ((opcode-STORE_SLICE) & 1)
587 v = POP();
588 else
589 v = NULL;
590 u = POP();
591 t = POP();
592 err = assign_slice(u, v, w, t); /* u[v:w] = t */
593 DECREF(t);
594 DECREF(u);
595 XDECREF(v);
596 XDECREF(w);
597 break;
598
599 case DELETE_SLICE+0:
600 case DELETE_SLICE+1:
601 case DELETE_SLICE+2:
602 case DELETE_SLICE+3:
603 if ((opcode-DELETE_SLICE) & 2)
604 w = POP();
605 else
606 w = NULL;
607 if ((opcode-DELETE_SLICE) & 1)
608 v = POP();
609 else
610 v = NULL;
611 u = POP();
612 err = assign_slice(u, v, w, (object *)NULL);
613 /* del u[v:w] */
614 DECREF(u);
615 XDECREF(v);
616 XDECREF(w);
617 break;
618
619 case STORE_SUBSCR:
620 w = POP();
621 v = POP();
622 u = POP();
623 /* v[w] = u */
624 err = assign_subscript(v, w, u);
625 DECREF(u);
626 DECREF(v);
627 DECREF(w);
628 break;
629
630 case DELETE_SUBSCR:
631 w = POP();
632 v = POP();
633 /* del v[w] */
634 err = assign_subscript(v, w, (object *)NULL);
635 DECREF(v);
636 DECREF(w);
637 break;
638
639 case PRINT_EXPR:
640 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000641 /* Print value except if procedure result */
642 if (v != None) {
643 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000644 x = sysget("stdout");
645 softspace(x, 1);
646 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 flushline();
Guido van Rossum9e90a671993-06-24 11:10:19 +0000648 if (killprint) {
649 err_setstr(RuntimeError,
650 "printing expression statement");
651 x = 0;
652 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 }
654 DECREF(v);
655 break;
656
657 case PRINT_ITEM:
658 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000659 w = sysget("stdout");
660 if (softspace(w, 1))
661 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 if (is_stringobject(v)) {
663 char *s = getstringvalue(v);
664 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000665 err = writeobject(v, w, PRINT_RAW);
666 if (err == 0 && len > 0 && s[len-1] == '\n')
667 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 }
669 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000670 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 }
672 DECREF(v);
673 break;
674
675 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000676 x = sysget("stdout");
677 if (x == NULL)
678 err_setstr(RuntimeError, "lost sys.stdout");
679 else {
680 writestring("\n", x);
681 softspace(x, 0);
682 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 break;
684
685 case BREAK_LOOP:
686 why = WHY_BREAK;
687 break;
688
689 case RAISE_EXCEPTION:
690 v = POP();
691 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000692 /* A tuple is equivalent to its first element here */
693 while (is_tupleobject(w)) {
694 u = w;
695 w = gettupleitem(u, 0);
696 DECREF(u);
697 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 if (!is_stringobject(w))
699 err_setstr(TypeError,
700 "exceptions must be strings");
701 else
702 err_setval(w, v);
703 DECREF(v);
704 DECREF(w);
705 why = WHY_EXCEPTION;
706 break;
707
708 case LOAD_LOCALS:
709 v = f->f_locals;
710 INCREF(v);
711 PUSH(v);
712 break;
713
714 case RETURN_VALUE:
715 retval = POP();
716 why = WHY_RETURN;
717 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000718
719 case LOAD_GLOBALS:
720 v = f->f_locals;
721 INCREF(v);
722 PUSH(v);
723 break;
724
725 case EXEC_STMT:
726 w = POP();
727 v = POP();
728 u = POP();
729 err = exec_statement(u, v, w);
730 DECREF(u);
731 DECREF(v);
732 DECREF(w);
733 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000734
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 case BUILD_FUNCTION:
736 v = POP();
737 x = newfuncobject(v, f->f_globals);
738 DECREF(v);
739 PUSH(x);
740 break;
741
742 case POP_BLOCK:
743 {
744 block *b = pop_block(f);
745 while (STACK_LEVEL() > b->b_level) {
746 v = POP();
747 DECREF(v);
748 }
749 }
750 break;
751
752 case END_FINALLY:
753 v = POP();
754 if (is_intobject(v)) {
755 why = (enum why_code) getintvalue(v);
756 if (why == WHY_RETURN)
757 retval = POP();
758 }
759 else if (is_stringobject(v)) {
760 w = POP();
761 err_setval(v, w);
762 DECREF(w);
763 w = POP();
764 tb_store(w);
765 DECREF(w);
766 why = WHY_RERAISE;
767 }
768 else if (v != None) {
769 err_setstr(SystemError,
770 "'finally' pops bad exception");
771 why = WHY_EXCEPTION;
772 }
773 DECREF(v);
774 break;
775
776 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000777 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000779 w = POP();
780 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000782 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 DECREF(v);
784 DECREF(w);
785 break;
786
787 case STORE_NAME:
788 w = GETNAMEV(oparg);
789 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000790 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000791 if (u == NULL) {
792 if (defmode != 0) {
793 if (v != None)
794 u = (object *)v->ob_type;
795 else
796 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000797 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000798 (typeobject *)u,
799 defmode);
800 DECREF(v);
801 if (x == NULL)
802 break;
803 v = x;
804 }
805 }
806 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000807 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000808 DECREF(v);
809 break;
810 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000811 err = dict2insert(f->f_locals, w, v);
812 DECREF(v);
813 break;
814
815 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000816 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000817 u = dict2lookup(f->f_locals, w);
818 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000819 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000820 (object *)NULL);
821 break;
822 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000823 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000824 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000826
827#ifdef CASE_TOO_BIG
828 default: switch (opcode) {
829#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000830
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000831 case UNPACK_VARARG:
832 if (EMPTY()) {
833 err_setstr(TypeError,
834 "no argument list");
835 why = WHY_EXCEPTION;
836 break;
837 }
838 v = POP();
839 if (!is_tupleobject(v)) {
840 err_setstr(TypeError,
841 "bad argument list");
842 why = WHY_EXCEPTION;
843 }
844 else if (gettuplesize(v) < oparg) {
845 err_setstr(TypeError,
846 "not enough arguments");
847 why = WHY_EXCEPTION;
848 }
849 else if (oparg == 0) {
850 PUSH(v);
851 break;
852 }
853 else {
854 x = gettupleslice(v, oparg, gettuplesize(v));
855 if (x != NULL) {
856 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000857 if (!CHECK_STACK(oparg)) {
858 x = NULL;
859 break;
860 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000861 for (; --oparg >= 0; ) {
862 w = gettupleitem(v, oparg);
863 INCREF(w);
864 PUSH(w);
865 }
866 }
867 }
868 DECREF(v);
869 break;
870
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000871 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000872 {
873 int n;
874 if (EMPTY()) {
875 err_setstr(TypeError,
876 "no argument list");
877 why = WHY_EXCEPTION;
878 break;
879 }
880 v = POP();
881 if (!is_tupleobject(v)) {
882 err_setstr(TypeError,
883 "bad argument list");
884 why = WHY_EXCEPTION;
885 break;
886 }
887 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000888#ifdef COMPAT_HACKS
889/* Implement various compatibility hacks (for 0.9.4 or earlier):
890 (a) f(a,b,...) accepts f((1,2,...))
891 (b) f((a,b,...)) accepts f(1,2,...)
892 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
893*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000894 if (n == 1 && oparg != 1) {
895 /* Rule (a) */
896 w = gettupleitem(v, 0);
897 if (is_tupleobject(w)) {
898 INCREF(w);
899 DECREF(v);
900 v = w;
901 n = gettuplesize(v);
902 }
903 }
904 else if (n != 1 && oparg == 1) {
905 /* Rule (b) */
906 PUSH(v);
907 break;
908 /* Don't fall through */
909 }
910 else if (n > 2 && oparg == 2) {
911 /* Rule (c) */
912 int i;
913 w = newtupleobject(n-1);
914 u = newtupleobject(2);
915 if (u == NULL || w == NULL) {
916 XDECREF(w);
917 XDECREF(u);
918 DECREF(v);
919 why = WHY_EXCEPTION;
920 break;
921 }
922 t = gettupleitem(v, 0);
923 INCREF(t);
924 settupleitem(u, 0, t);
925 for (i = 1; i < n; i++) {
926 t = gettupleitem(v, i);
927 INCREF(t);
928 settupleitem(w, i-1, t);
929 }
930 settupleitem(u, 1, w);
931 DECREF(v);
932 v = u;
933 n = 2;
934 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000935#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000936 if (n != oparg) {
937 err_setstr(TypeError,
938 "arg count mismatch");
939 why = WHY_EXCEPTION;
940 DECREF(v);
941 break;
942 }
943 PUSH(v);
944 }
945 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 case UNPACK_TUPLE:
947 v = POP();
948 if (!is_tupleobject(v)) {
949 err_setstr(TypeError, "unpack non-tuple");
950 why = WHY_EXCEPTION;
951 }
952 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000953 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 "unpack tuple of wrong size");
955 why = WHY_EXCEPTION;
956 }
957 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000958 if (!CHECK_STACK(oparg)) {
959 x = NULL;
960 break;
961 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 for (; --oparg >= 0; ) {
963 w = gettupleitem(v, oparg);
964 INCREF(w);
965 PUSH(w);
966 }
967 }
968 DECREF(v);
969 break;
970
971 case UNPACK_LIST:
972 v = POP();
973 if (!is_listobject(v)) {
974 err_setstr(TypeError, "unpack non-list");
975 why = WHY_EXCEPTION;
976 }
977 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000978 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 "unpack list of wrong size");
980 why = WHY_EXCEPTION;
981 }
982 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000983 if (!CHECK_STACK(oparg)) {
984 x = NULL;
985 break;
986 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 for (; --oparg >= 0; ) {
988 w = getlistitem(v, oparg);
989 INCREF(w);
990 PUSH(w);
991 }
992 }
993 DECREF(v);
994 break;
995
996 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000997 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 v = POP();
999 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001000 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 DECREF(v);
1002 DECREF(u);
1003 break;
1004
1005 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001006 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001008 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001009 DECREF(v);
1010 break;
1011
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001012 case STORE_GLOBAL:
1013 w = GETNAMEV(oparg);
1014 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001015 u = dict2lookup(f->f_locals, w);
1016 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001017 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001018 DECREF(v);
1019 break;
1020 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001021 err = dict2insert(f->f_globals, w, v);
1022 DECREF(v);
1023 break;
1024
1025 case DELETE_GLOBAL:
1026 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001027 u = dict2lookup(f->f_locals, w);
1028 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001029 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001030 (object *)NULL);
1031 break;
1032 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001033 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001034 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001035 break;
1036
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 case LOAD_CONST:
1038 x = GETCONST(oparg);
1039 INCREF(x);
1040 PUSH(x);
1041 break;
1042
1043 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001044 w = GETNAMEV(oparg);
1045 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001047 err_clear();
1048 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001050 err_clear();
1051 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001053 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001054 break;
1055 }
1056 }
1057 }
Guido van Rossum25831651993-05-19 14:50:45 +00001058 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001059 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001060 if (x == NULL)
1061 break;
1062 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001063 else
1064 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001065 PUSH(x);
1066 break;
1067
1068 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001069 w = GETNAMEV(oparg);
1070 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001072 err_clear();
1073 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001074 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001075 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 break;
1077 }
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_globals);
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;
1088
1089 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001090 w = GETNAMEV(oparg);
1091 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001092 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001093 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001094 break;
1095 }
Guido van Rossum25831651993-05-19 14:50:45 +00001096 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001097 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001098 if (x == NULL)
1099 break;
1100 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001101 else
1102 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 PUSH(x);
1104 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001105
1106 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001107 x = GETCONST(oparg);
1108 if (x == None)
1109 break;
1110 if (x == NULL || !is_dictobject(x)) {
1111 fatal("bad RESERVE_FAST");
1112 err_setstr(SystemError, "bad RESERVE_FAST");
1113 x = NULL;
1114 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001116 XDECREF(f->f_fastlocals);
1117 XDECREF(f->f_localmap);
1118 INCREF(x);
1119 f->f_localmap = x;
1120 f->f_fastlocals = x = newlistobject(
1121 x->ob_type->tp_as_mapping->mp_length(x));
1122 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001123 break;
1124
1125 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001126 x = GETLISTITEM(fastlocals, oparg);
1127 if (x == NULL) {
1128 err_setstr(NameError,
1129 "undefined local variable");
1130 break;
1131 }
Guido van Rossum25831651993-05-19 14:50:45 +00001132 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001133 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001134 if (x == NULL)
1135 break;
1136 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001137 else
1138 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001139 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001140 break;
1141
1142 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001143 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001144 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001145 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001146 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001147 DECREF(v);
1148 break;
1149 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001150 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001151 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001152 break;
1153
1154 case DELETE_FAST:
1155 x = GETLISTITEM(fastlocals, oparg);
1156 if (x == NULL) {
1157 err_setstr(NameError,
1158 "undefined local variable");
1159 break;
1160 }
Guido van Rossum25831651993-05-19 14:50:45 +00001161 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001162 err = setaccessvalue(w, f->f_locals,
1163 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001164 break;
1165 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001166 DECREF(x);
1167 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001168 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001169
1170 case BUILD_TUPLE:
1171 x = newtupleobject(oparg);
1172 if (x != NULL) {
1173 for (; --oparg >= 0;) {
1174 w = POP();
1175 err = settupleitem(x, oparg, w);
1176 if (err != 0)
1177 break;
1178 }
1179 PUSH(x);
1180 }
1181 break;
1182
1183 case BUILD_LIST:
1184 x = newlistobject(oparg);
1185 if (x != NULL) {
1186 for (; --oparg >= 0;) {
1187 w = POP();
1188 err = setlistitem(x, oparg, w);
1189 if (err != 0)
1190 break;
1191 }
1192 PUSH(x);
1193 }
1194 break;
1195
1196 case BUILD_MAP:
1197 x = newdictobject();
1198 PUSH(x);
1199 break;
1200
1201 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001202 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001204 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 DECREF(v);
1206 PUSH(x);
1207 break;
1208
1209 case COMPARE_OP:
1210 w = POP();
1211 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001212 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 DECREF(v);
1214 DECREF(w);
1215 PUSH(x);
1216 break;
1217
1218 case IMPORT_NAME:
1219 name = GETNAME(oparg);
1220 x = import_module(name);
1221 XINCREF(x);
1222 PUSH(x);
1223 break;
1224
1225 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001226 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001228 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001229 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001231
1232 case ACCESS_MODE:
1233 v = POP();
1234 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001235 if (getstringvalue(w)[0] == '*')
1236 defmode = getintvalue(v);
1237 else
1238 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001239 DECREF(v);
1240 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001241
1242 case JUMP_FORWARD:
1243 JUMPBY(oparg);
1244 break;
1245
1246 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001247 err = testbool(TOP());
1248 if (err > 0)
1249 err = 0;
1250 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 JUMPBY(oparg);
1252 break;
1253
1254 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001255 err = testbool(TOP());
1256 if (err > 0) {
1257 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001259 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 break;
1261
1262 case JUMP_ABSOLUTE:
1263 JUMPTO(oparg);
1264 break;
1265
1266 case FOR_LOOP:
1267 /* for v in s: ...
1268 On entry: stack contains s, i.
1269 On exit: stack contains s, i+1, s[i];
1270 but if loop exhausted:
1271 s, i are popped, and we jump */
1272 w = POP(); /* Loop index */
1273 v = POP(); /* Sequence object */
1274 u = loop_subscript(v, w);
1275 if (u != NULL) {
1276 PUSH(v);
1277 x = newintobject(getintvalue(w)+1);
1278 PUSH(x);
1279 DECREF(w);
1280 PUSH(u);
1281 }
1282 else {
1283 DECREF(v);
1284 DECREF(w);
1285 /* A NULL can mean "s exhausted"
1286 but also an error: */
1287 if (err_occurred())
1288 why = WHY_EXCEPTION;
1289 else
1290 JUMPBY(oparg);
1291 }
1292 break;
1293
1294 case SETUP_LOOP:
1295 case SETUP_EXCEPT:
1296 case SETUP_FINALLY:
1297 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1298 STACK_LEVEL());
1299 break;
1300
1301 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001302#ifdef LLTRACE
1303 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 printf("--- Line %d ---\n", oparg);
1305#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001306 f->f_lineno = oparg;
1307 if (trace != NULL) {
1308 /* Trace each line of code reached */
1309 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001310 err = call_trace(&trace, &trace,
1311 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001312 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 break;
1314
1315 default:
1316 fprintf(stderr,
1317 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001318 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 err_setstr(SystemError, "eval_code: unknown opcode");
1320 why = WHY_EXCEPTION;
1321 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001322
1323#ifdef CASE_TOO_BIG
1324 }
1325#endif
1326
Guido van Rossum374a9221991-04-04 10:40:29 +00001327 } /* switch */
1328
1329 on_error:
1330
1331 /* Quickly continue if no error occurred */
1332
1333 if (why == WHY_NOT) {
1334 if (err == 0 && x != NULL)
1335 continue; /* Normal, fast path */
1336 why = WHY_EXCEPTION;
1337 x = None;
1338 err = 0;
1339 }
1340
Guido van Rossum801dcae1992-04-08 11:32:32 +00001341#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 /* Double-check exception status */
1343
1344 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1345 if (!err_occurred()) {
1346 fprintf(stderr, "XXX ghost error\n");
1347 err_setstr(SystemError, "ghost error");
1348 why = WHY_EXCEPTION;
1349 }
1350 }
1351 else {
1352 if (err_occurred()) {
1353 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001354 abort();
1355 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 why = WHY_EXCEPTION;
1357 }
1358 }
1359#endif
1360
1361 /* Log traceback info if this is a real exception */
1362
1363 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001364 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001366 f->f_lasti -= 2;
1367 tb_here(f);
1368
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001369 if (trace)
1370 call_exc_trace(&trace, &trace, f);
1371 if (sys_profile)
1372 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 }
1374
1375 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1376
1377 if (why == WHY_RERAISE)
1378 why = WHY_EXCEPTION;
1379
1380 /* Unwind stacks if a (pseudo) exception occurred */
1381
1382 while (why != WHY_NOT && f->f_iblock > 0) {
1383 block *b = pop_block(f);
1384 while (STACK_LEVEL() > b->b_level) {
1385 v = POP();
1386 XDECREF(v);
1387 }
1388 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1389 why = WHY_NOT;
1390 JUMPTO(b->b_handler);
1391 break;
1392 }
1393 if (b->b_type == SETUP_FINALLY ||
1394 b->b_type == SETUP_EXCEPT &&
1395 why == WHY_EXCEPTION) {
1396 if (why == WHY_EXCEPTION) {
1397 object *exc, *val;
1398 err_get(&exc, &val);
1399 if (val == NULL) {
1400 val = None;
1401 INCREF(val);
1402 }
1403 v = tb_fetch();
1404 /* Make the raw exception data
1405 available to the handler,
1406 so a program can emulate the
1407 Python main loop. Don't do
1408 this for 'finally'. */
1409 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001411 sysset("exc_value", val);
1412 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 }
1414 PUSH(v);
1415 PUSH(val);
1416 PUSH(exc);
1417 }
1418 else {
1419 if (why == WHY_RETURN)
1420 PUSH(retval);
1421 v = newintobject((long)why);
1422 PUSH(v);
1423 }
1424 why = WHY_NOT;
1425 JUMPTO(b->b_handler);
1426 break;
1427 }
1428 } /* unwind stack */
1429
1430 /* End the loop if we still have an error (or return) */
1431
1432 if (why != WHY_NOT)
1433 break;
1434
1435 } /* main loop */
1436
1437 /* Pop remaining stack entries */
1438
1439 while (!EMPTY()) {
1440 v = POP();
1441 XDECREF(v);
1442 }
1443
Guido van Rossum96a42c81992-01-12 02:29:51 +00001444 if (why != WHY_RETURN)
1445 retval = NULL;
1446
1447 if (trace) {
1448 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001449 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001450 XDECREF(retval);
1451 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001452 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001453 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001454 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001455 XDECREF(trace);
1456 }
1457
1458 if (sys_profile && why == WHY_RETURN) {
1459 if (call_trace(&sys_profile, (object**)0,
1460 f, "return", retval)) {
1461 XDECREF(retval);
1462 retval = NULL;
1463 why = WHY_EXCEPTION;
1464 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001465 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001466
1467 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1468 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001469
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 /* Restore previous frame and release the current one */
1471
1472 current_frame = f->f_back;
1473 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001474
1475 if (needmerge)
1476 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001477
Guido van Rossum96a42c81992-01-12 02:29:51 +00001478 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001479}
1480
Guido van Rossum96a42c81992-01-12 02:29:51 +00001481#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001482static int
1483prtrace(v, str)
1484 object *v;
1485 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001487 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001488 if (printobject(v, stdout, 0) != 0)
1489 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001490 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001494static void
1495call_exc_trace(p_trace, p_newtrace, f)
1496 object **p_trace, **p_newtrace;
1497 frameobject *f;
1498{
1499 object *type, *value, *traceback, *arg;
1500 int err;
1501 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001502 if (value == NULL) {
1503 value = None;
1504 INCREF(value);
1505 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001506 traceback = tb_fetch();
1507 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001508 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001509 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001510 settupleitem(arg, 0, type);
1511 settupleitem(arg, 1, value);
1512 settupleitem(arg, 2, traceback);
1513 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001514 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001515 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001516 /* Restore original exception */
1517 err_setval(type, value);
1518 tb_store(traceback);
1519 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001520 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001521}
1522
1523static int
1524call_trace(p_trace, p_newtrace, f, msg, arg)
1525 object **p_trace; /* in/out; may not be NULL;
1526 may not point to NULL variable initially */
1527 object **p_newtrace; /* in/out; may be NULL;
1528 may point to NULL variable;
1529 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001530 frameobject *f;
1531 char *msg;
1532 object *arg;
1533{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001534 object *arglist, *what;
1535 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001536 static int tracing = 0;
1537
1538 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001539 /* Don't do recursive traces */
1540 if (p_newtrace) {
1541 XDECREF(*p_newtrace);
1542 *p_newtrace = NULL;
1543 }
1544 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001545 }
1546
1547 arglist = newtupleobject(3);
1548 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001549 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001550 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001551 if (what == NULL)
1552 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001553 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001554 settupleitem(arglist, 0, (object *)f);
1555 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001556 if (arg == NULL)
1557 arg = None;
1558 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001559 settupleitem(arglist, 2, arg);
1560 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001561 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001562 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001563 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001564 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001565 cleanup:
1566 XDECREF(arglist);
1567 if (res == NULL) {
1568 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001569 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001570 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001571 *p_trace = NULL;
1572 if (p_newtrace) {
1573 XDECREF(*p_newtrace);
1574 *p_newtrace = NULL;
1575 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001576 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001577 }
1578 else {
1579 if (p_newtrace) {
1580 XDECREF(*p_newtrace);
1581 if (res == None)
1582 *p_newtrace = NULL;
1583 else {
1584 INCREF(res);
1585 *p_newtrace = res;
1586 }
1587 }
1588 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001589 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001590 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001591}
1592
Guido van Rossum5b722181993-03-30 17:46:03 +00001593static void
1594fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001595 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001596{
1597 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001598 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001599 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001600 int pos;
1601 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001602 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001603 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001604 locals = f->f_locals;
1605 fast = f->f_fastlocals;
1606 map = f->f_localmap;
1607 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001608 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001609 if (!is_dictobject(locals) || !is_listobject(fast) ||
1610 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001611 return;
1612 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001613 pos = 0;
1614 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001615 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001616 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001617 continue;
1618 j = getintvalue(value);
1619 value = getlistitem(fast, j);
1620 if (value == NULL) {
1621 err_clear();
1622 if (dict2remove(locals, key) != 0)
1623 err_clear();
1624 }
1625 else {
1626 if (dict2insert(locals, key, value) != 0)
1627 err_clear();
1628 }
1629 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001630 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001631}
1632
1633static void
1634locals_2_fast(f, clear)
1635 frameobject *f;
1636 int clear;
1637{
1638 /* Merge f->f_locals into f->f_fastlocals */
1639 object *locals, *fast, *map;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001640 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001641 int pos;
1642 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001643 if (f == NULL)
1644 return;
1645 locals = f->f_locals;
1646 fast = f->f_fastlocals;
1647 map = f->f_localmap;
1648 if (locals == NULL || fast == NULL || map == NULL)
1649 return;
1650 if (!is_dictobject(locals) || !is_listobject(fast) ||
1651 !is_dictobject(map))
1652 return;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001653 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001654 pos = 0;
1655 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001656 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001657 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001658 continue;
1659 j = getintvalue(value);
1660 value = dict2lookup(locals, key);
1661 if (value == NULL)
1662 err_clear();
1663 else
1664 INCREF(value);
1665 if (value != NULL || clear)
1666 if (setlistitem(fast, j, value) != 0)
1667 err_clear();
1668 }
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001669 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001670}
1671
Guido van Rossumf1dc5661993-07-05 10:31:29 +00001672static void
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001673mergelocals()
1674{
1675 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676}
1677
1678object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001679getlocals()
1680{
1681 if (current_frame == NULL)
1682 return NULL;
1683 fast_2_locals(current_frame);
1684 return current_frame->f_locals;
1685}
1686
1687object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688getglobals()
1689{
1690 if (current_frame == NULL)
1691 return NULL;
1692 else
1693 return current_frame->f_globals;
1694}
1695
Guido van Rossum81daa321993-05-20 14:24:46 +00001696object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001697getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001698{
1699 if (current_frame == NULL)
1700 return NULL;
1701 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001702 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001703}
1704
Guido van Rossum3f5da241990-12-20 15:06:42 +00001705void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001706printtraceback(f)
1707 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001708{
1709 object *v = tb_fetch();
1710 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001711 writestring("Stack backtrace (innermost last):\n", f);
1712 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001713 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715}
1716
1717
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001718void
1719flushline()
1720{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001721 object *f = sysget("stdout");
1722 if (softspace(f, 0))
1723 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724}
1725
Guido van Rossum3f5da241990-12-20 15:06:42 +00001726
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001728or(v, w)
1729 object *v, *w;
1730{
1731 if (v->ob_type->tp_as_number != NULL) {
1732 object *x;
1733 object * (*f) FPROTO((object *, object *));
1734 if (coerce(&v, &w) != 0)
1735 return NULL;
1736 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1737 x = (*f)(v, w);
1738 DECREF(v);
1739 DECREF(w);
1740 if (f != NULL)
1741 return x;
1742 }
1743 err_setstr(TypeError, "bad operand type(s) for |");
1744 return NULL;
1745}
1746
1747static object *
1748xor(v, w)
1749 object *v, *w;
1750{
1751 if (v->ob_type->tp_as_number != NULL) {
1752 object *x;
1753 object * (*f) FPROTO((object *, object *));
1754 if (coerce(&v, &w) != 0)
1755 return NULL;
1756 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1757 x = (*f)(v, w);
1758 DECREF(v);
1759 DECREF(w);
1760 if (f != NULL)
1761 return x;
1762 }
1763 err_setstr(TypeError, "bad operand type(s) for ^");
1764 return NULL;
1765}
1766
1767static object *
1768and(v, w)
1769 object *v, *w;
1770{
1771 if (v->ob_type->tp_as_number != NULL) {
1772 object *x;
1773 object * (*f) FPROTO((object *, object *));
1774 if (coerce(&v, &w) != 0)
1775 return NULL;
1776 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1777 x = (*f)(v, w);
1778 DECREF(v);
1779 DECREF(w);
1780 if (f != NULL)
1781 return x;
1782 }
1783 err_setstr(TypeError, "bad operand type(s) for &");
1784 return NULL;
1785}
1786
1787static object *
1788lshift(v, w)
1789 object *v, *w;
1790{
1791 if (v->ob_type->tp_as_number != NULL) {
1792 object *x;
1793 object * (*f) FPROTO((object *, object *));
1794 if (coerce(&v, &w) != 0)
1795 return NULL;
1796 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1797 x = (*f)(v, w);
1798 DECREF(v);
1799 DECREF(w);
1800 if (f != NULL)
1801 return x;
1802 }
1803 err_setstr(TypeError, "bad operand type(s) for <<");
1804 return NULL;
1805}
1806
1807static object *
1808rshift(v, w)
1809 object *v, *w;
1810{
1811 if (v->ob_type->tp_as_number != NULL) {
1812 object *x;
1813 object * (*f) FPROTO((object *, object *));
1814 if (coerce(&v, &w) != 0)
1815 return NULL;
1816 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1817 x = (*f)(v, w);
1818 DECREF(v);
1819 DECREF(w);
1820 if (f != NULL)
1821 return x;
1822 }
1823 err_setstr(TypeError, "bad operand type(s) for >>");
1824 return NULL;
1825}
1826
1827static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001828add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 object *v, *w;
1830{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001831 if (v->ob_type->tp_as_sequence != NULL)
1832 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1833 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001834 object *x;
1835 if (coerce(&v, &w) != 0)
1836 return NULL;
1837 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1838 DECREF(v);
1839 DECREF(w);
1840 return x;
1841 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001842 err_setstr(TypeError, "bad operand type(s) for +");
1843 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844}
1845
1846static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001847sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 object *v, *w;
1849{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001850 if (v->ob_type->tp_as_number != NULL) {
1851 object *x;
1852 if (coerce(&v, &w) != 0)
1853 return NULL;
1854 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1855 DECREF(v);
1856 DECREF(w);
1857 return x;
1858 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001859 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 return NULL;
1861}
1862
1863static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 object *v, *w;
1866{
1867 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001868 tp = v->ob_type;
1869 if (tp->tp_as_number != NULL &&
1870 w->ob_type->tp_as_sequence != NULL &&
1871 !is_instanceobject(v)) {
1872 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 object *tmp = v;
1874 v = w;
1875 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001876 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001878 if (tp->tp_as_number != NULL) {
1879 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001880 if (is_instanceobject(v)) {
1881 /* Instances of user-defined classes get their
1882 other argument uncoerced, so they may
1883 implement sequence*number as well as
1884 number*number. */
1885 INCREF(v);
1886 INCREF(w);
1887 }
1888 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001889 return NULL;
1890 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1891 DECREF(v);
1892 DECREF(w);
1893 return x;
1894 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 if (tp->tp_as_sequence != NULL) {
1896 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001897 err_setstr(TypeError,
1898 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 return NULL;
1900 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001901 return (*tp->tp_as_sequence->sq_repeat)
1902 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 }
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 Rossum40d0b7e1990-12-20 23:03:11 +00001909divide(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_divide)(v, w);
1917 DECREF(v);
1918 DECREF(w);
1919 return x;
1920 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001921 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 return NULL;
1923}
1924
1925static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001926rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 object *v, *w;
1928{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001929 if (v->ob_type->tp_as_number != NULL) {
1930 object *x;
1931 if (coerce(&v, &w) != 0)
1932 return NULL;
1933 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1934 DECREF(v);
1935 DECREF(w);
1936 return x;
1937 }
Guido van Rossume5372401993-03-16 12:15:04 +00001938 if (is_stringobject(v)) {
1939 return formatstring(v, w);
1940 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001941 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 return NULL;
1943}
1944
1945static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001946neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 object *v;
1948{
1949 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 return (*v->ob_type->tp_as_number->nb_negative)(v);
1951 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 return NULL;
1953}
1954
1955static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957 object *v;
1958{
1959 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001960 return (*v->ob_type->tp_as_number->nb_positive)(v);
1961 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 return NULL;
1963}
1964
1965static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001966invert(v)
1967 object *v;
1968{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001969 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001970 if (v->ob_type->tp_as_number != NULL &&
1971 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1972 return (*f)(v);
1973 err_setstr(TypeError, "bad operand type(s) for unary ~");
1974 return NULL;
1975}
1976
1977static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 object *v;
1980{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001981 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001982 object *w;
1983 if (outcome < 0)
1984 return NULL;
1985 if (outcome == 0)
1986 w = True;
1987 else
1988 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001989 INCREF(w);
1990 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991}
Guido van Rossum234f9421993-06-17 12:35:49 +00001992
1993
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001994/* External interface to call any callable object. The arg may be NULL. */
1995
1996object *
1997call_object(func, arg)
1998 object *func;
1999 object *arg;
2000{
2001 if (is_instancemethodobject(func) || is_funcobject(func))
2002 return call_function(func, arg);
2003 else
2004 return call_builtin(func, arg);
2005}
2006
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002010 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002011{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 if (is_methodobject(func)) {
2013 method meth = getmethod(func);
2014 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002015 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2016 int size = gettuplesize(arg);
2017 if (size == 1)
2018 arg = gettupleitem(arg, 0);
2019 else if (size == 0)
2020 arg = NULL;
2021 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002022 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 }
2024 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002025 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002027 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 return NULL;
2029}
2030
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002032call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002034 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002036 object *newarg = NULL;
2037 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002038 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002039 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040
Guido van Rossume8122f11991-05-05 20:03:07 +00002041 if (is_instancemethodobject(func)) {
2042 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002043 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002044 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002045 if (self == NULL) {
2046 /* Unbound methods must be called with an instance of
2047 the class (or a derived class) as first argument */
2048 if (arg != NULL && is_tupleobject(arg) &&
2049 gettuplesize(arg) >= 1) {
2050 self = gettupleitem(arg, 0);
2051 if (self != NULL &&
2052 is_instanceobject(self) &&
2053 issubclass((object *)
2054 (((instanceobject *)self)->in_class),
2055 class))
2056 /* self = self */ ;
2057 else
2058 self = NULL;
2059 }
2060 if (self == NULL) {
2061 err_setstr(TypeError,
2062 "unbound method must be called with class instance argument");
2063 return NULL;
2064 }
2065 }
2066 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002067 int argcount;
2068 if (arg == NULL)
2069 argcount = 0;
2070 else if (is_tupleobject(arg))
2071 argcount = gettuplesize(arg);
2072 else
2073 argcount = 1;
2074 newarg = newtupleobject(argcount + 1);
2075 if (newarg == NULL)
2076 return NULL;
2077 INCREF(self);
2078 settupleitem(newarg, 0, self);
2079 if (arg != NULL && !is_tupleobject(arg)) {
2080 INCREF(arg);
2081 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002082 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002083 else {
2084 int i;
2085 object *v;
2086 for (i = 0; i < argcount; i++) {
2087 v = gettupleitem(arg, i);
2088 XINCREF(v);
2089 settupleitem(newarg, i+1, v);
2090 }
2091 }
2092 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 }
2094 }
2095 else {
2096 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 return NULL;
2099 }
2100 }
2101
Guido van Rossum3f5da241990-12-20 15:06:42 +00002102 co = getfunccode(func);
2103 if (co == NULL) {
2104 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 return NULL;
2106 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107 if (!is_codeobject(co)) {
2108 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 abort();
2110 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002113 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 return NULL;
2115 }
2116
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 newglobals = getfuncglobals(func);
2118 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119
Guido van Rossum81daa321993-05-20 14:24:46 +00002120 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121
Guido van Rossum3f5da241990-12-20 15:06:42 +00002122 DECREF(newlocals);
2123 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124
Guido van Rossum3f5da241990-12-20 15:06:42 +00002125 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126
2127 return v;
2128}
2129
2130static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002131apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132 object *v, *w;
2133{
2134 typeobject *tp = v->ob_type;
2135 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002136 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 return NULL;
2138 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002139 if (tp->tp_as_mapping != NULL) {
2140 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2141 }
2142 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 int i;
2144 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002145 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 return NULL;
2147 }
2148 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002149 if (i < 0) {
2150 int len = (*tp->tp_as_sequence->sq_length)(v);
2151 if (len < 0)
2152 return NULL;
2153 i += len;
2154 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002155 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157}
2158
2159static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002160loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 object *v, *w;
2162{
2163 sequence_methods *sq = v->ob_type->tp_as_sequence;
2164 int i, n;
2165 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002166 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 return NULL;
2168 }
2169 i = getintvalue(w);
2170 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002171 if (n < 0)
2172 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 if (i >= n)
2174 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002175 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176}
2177
2178static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002179slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 object *v;
2181 int isize;
2182 int *pi;
2183{
2184 if (v != NULL) {
2185 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002186 err_setstr(TypeError, "slice index must be int");
2187 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 }
2189 *pi = getintvalue(v);
2190 if (*pi < 0)
2191 *pi += isize;
2192 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002193 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194}
2195
2196static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002197apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 object *u, *v, *w;
2199{
2200 typeobject *tp = u->ob_type;
2201 int ilow, ihigh, isize;
2202 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 return NULL;
2205 }
2206 ilow = 0;
2207 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002208 if (isize < 0)
2209 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002210 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002212 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002216
2217static int
2218assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 object *w;
2220 object *key;
2221 object *v;
2222{
2223 typeobject *tp = w->ob_type;
2224 sequence_methods *sq;
2225 mapping_methods *mp;
2226 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002227 if ((mp = tp->tp_as_mapping) != NULL &&
2228 (func = mp->mp_ass_subscript) != NULL) {
2229 return (*func)(w, key, v);
2230 }
2231 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 (func = sq->sq_ass_item) != NULL) {
2233 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002234 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002235 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002236 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002238 else {
2239 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002240 if (i < 0) {
2241 int len = (*sq->sq_length)(w);
2242 if (len < 0)
2243 return -1;
2244 i += len;
2245 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002246 return (*func)(w, i, v);
2247 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002250 err_setstr(TypeError,
2251 "can't assign to this subscripted object");
2252 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254}
2255
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256static int
2257assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 object *u, *v, *w, *x;
2259{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002261 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262 if (sq == NULL) {
2263 err_setstr(TypeError, "assign to slice of non-sequence");
2264 return -1;
2265 }
2266 if (sq == NULL || sq->sq_ass_slice == NULL) {
2267 err_setstr(TypeError, "unassignable slice");
2268 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269 }
2270 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002272 if (isize < 0)
2273 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274 if (slice_index(v, isize, &ilow) != 0)
2275 return -1;
2276 if (slice_index(w, isize, &ihigh) != 0)
2277 return -1;
2278 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static int
2282cmp_exception(err, v)
2283 object *err, *v;
2284{
2285 if (is_tupleobject(v)) {
2286 int i, n;
2287 n = gettuplesize(v);
2288 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002289 /* Test recursively */
2290 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 return 1;
2292 }
2293 return 0;
2294 }
2295 return err == v;
2296}
2297
Guido van Rossum3f5da241990-12-20 15:06:42 +00002298static int
2299cmp_member(v, w)
2300 object *v, *w;
2301{
2302 int i, n, cmp;
2303 object *x;
2304 sequence_methods *sq;
2305 /* Special case for char in string */
2306 if (is_stringobject(w)) {
2307 register char *s, *end;
2308 register char c;
2309 if (!is_stringobject(v) || getstringsize(v) != 1) {
2310 err_setstr(TypeError,
2311 "string member test needs char left operand");
2312 return -1;
2313 }
2314 c = getstringvalue(v)[0];
2315 s = getstringvalue(w);
2316 end = s + getstringsize(w);
2317 while (s < end) {
2318 if (c == *s++)
2319 return 1;
2320 }
2321 return 0;
2322 }
2323 sq = w->ob_type->tp_as_sequence;
2324 if (sq == NULL) {
2325 err_setstr(TypeError,
2326 "'in' or 'not in' needs sequence right argument");
2327 return -1;
2328 }
2329 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002330 if (n < 0)
2331 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002332 for (i = 0; i < n; i++) {
2333 x = (*sq->sq_item)(w, i);
2334 cmp = cmpobject(v, x);
2335 XDECREF(x);
2336 if (cmp == 0)
2337 return 1;
2338 }
2339 return 0;
2340}
2341
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002344 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 register object *v;
2346 register object *w;
2347{
2348 register int cmp;
2349 register int res = 0;
2350 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 case IS:
2352 case IS_NOT:
2353 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002354 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355 res = !res;
2356 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 case IN:
2358 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 res = cmp_member(v, w);
2360 if (res < 0)
2361 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002362 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002363 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 break;
2365 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002366 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 break;
2368 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002369 cmp = cmpobject(v, w);
2370 switch (op) {
2371 case LT: res = cmp < 0; break;
2372 case LE: res = cmp <= 0; break;
2373 case EQ: res = cmp == 0; break;
2374 case NE: res = cmp != 0; break;
2375 case GT: res = cmp > 0; break;
2376 case GE: res = cmp >= 0; break;
2377 /* XXX no default? (res is initialized to 0 though) */
2378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 }
2380 v = res ? True : False;
2381 INCREF(v);
2382 return v;
2383}
2384
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385static int
2386import_from(locals, v, name)
2387 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002388 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002389 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002390{
2391 object *w, *x;
2392 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002393 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002394 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002395 object *name, *value;
2396 pos = 0;
2397 while (mappinggetnext(w, &pos, &name, &value)) {
2398 if (!is_stringobject(name) ||
2399 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002400 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002401 if (is_accessobject(value)) {
2402 value = getaccessvalue(value, (object *)NULL);
2403 if (value == NULL) {
2404 err_clear();
2405 continue;
2406 }
2407 }
2408 else
2409 INCREF(value);
2410 err = dict2insert(locals, name, value);
2411 DECREF(value);
2412 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002413 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002414 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002416 }
2417 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002418 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002419 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002420 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002421 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002422 getstringvalue(name));
2423 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002424 return -1;
2425 }
2426 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002427 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002428 }
2429}
2430
2431static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002432build_class(methods, bases, name)
2433 object *methods; /* dictionary */
2434 object *bases; /* tuple containing classes */
2435 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002436{
Guido van Rossum25831651993-05-19 14:50:45 +00002437 int i;
2438 if (!is_tupleobject(bases)) {
2439 err_setstr(SystemError, "build_class with non-tuple bases");
2440 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002441 }
Guido van Rossum25831651993-05-19 14:50:45 +00002442 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002443 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002444 return NULL;
2445 }
Guido van Rossum25831651993-05-19 14:50:45 +00002446 if (!is_stringobject(name)) {
2447 err_setstr(SystemError, "build_class witn non-string name");
2448 return NULL;
2449 }
2450 for (i = gettuplesize(bases); --i >= 0; ) {
2451 object *base = gettupleitem(bases, i);
2452 if (!is_classobject(base)) {
2453 err_setstr(TypeError,
2454 "base is not a class object");
2455 return NULL;
2456 }
2457 }
2458 return newclassobject(bases, methods, name);
2459}
2460
2461static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002462access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002463 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002464 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002465 frameobject *f;
2466{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002467 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002468 object *value, *ac;
2469 typeobject *type;
2470 int fastind, ret;
2471 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002472 if (f->f_localmap == NULL)
2473 value = dict2lookup(f->f_locals, name);
2474 else {
2475 value = dict2lookup(f->f_localmap, name);
2476 if (value == NULL || !is_intobject(value))
2477 value = NULL;
2478 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002479 fastind = getintvalue(value);
2480 if (0 <= fastind &&
2481 fastind < getlistsize(f->f_fastlocals))
2482 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossum25831651993-05-19 14:50:45 +00002483 else {
2484 value = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +00002485 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002486 }
2487 }
2488 }
2489 if (value && is_accessobject(value)) {
2490 err_setstr(AccessError, "can't override access");
2491 return -1;
2492 }
2493 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002494 if (value != NULL && value != None)
2495 type = value->ob_type;
2496 else
2497 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002498 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002499 if (ac == NULL)
2500 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002501 if (fastind >= 0)
2502 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002503 else {
2504 ret = dict2insert(f->f_locals, name, ac);
2505 DECREF(ac);
2506 }
2507 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002508}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002509
2510static int
2511exec_statement(prog, globals, locals)
2512 object *prog;
2513 object *globals;
2514 object *locals;
2515{
2516 char *s;
2517 int n;
2518
2519 if (is_tupleobject(prog) && globals == None && locals == None &&
2520 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2521 /* Backward compatibility hack */
2522 globals = gettupleitem(prog, 1);
2523 if (n == 3)
2524 locals = gettupleitem(prog, 2);
2525 prog = gettupleitem(prog, 0);
2526 }
2527 if (globals == None) {
2528 globals = getglobals();
2529 if (locals == None)
2530 locals = getlocals();
2531 }
2532 else if (locals == None)
2533 locals = globals;
2534 if (!is_stringobject(prog) &&
2535 !is_codeobject(prog) &&
2536 !is_fileobject(prog)) {
2537 err_setstr(TypeError,
2538 "exec 1st arg must be string, code or file object");
2539 return -1;
2540 }
2541 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2542 err_setstr(TypeError,
2543 "exec 2nd/3rd args must be dict or None");
2544 return -1;
2545 }
2546 if (is_codeobject(prog)) {
2547 if (eval_code((codeobject *) prog, globals, locals,
2548 (object *)NULL, (object *)NULL) == NULL)
2549 return -1;
2550 return 0;
2551 }
2552 if (is_fileobject(prog)) {
2553 FILE *fp = getfilefile(prog);
2554 char *name = getstringvalue(getfilename(prog));
2555 if (run_file(fp, name, file_input, globals, locals) == NULL)
2556 return -1;
2557 return 0;
2558 }
2559 s = getstringvalue(prog);
2560 if (strlen(s) != getstringsize(prog)) {
2561 err_setstr(ValueError, "embedded '\\0' in exec string");
2562 return -1;
2563 }
2564 if (run_string(s, file_input, globals, locals) == NULL)
2565 return -1;
2566 return 0;
2567}