blob: 39a20d7150da52ef984859fc3eb44b0f0b1a7802 [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 Rossum5b722181993-03-30 17:46:03 +000052
Guido van Rossum374a9221991-04-04 10:40:29 +000053/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000054
Guido van Rossum0a066c01992-03-27 17:29:15 +000055#ifdef LLTRACE
56static int prtrace PROTO((object *, char *));
57#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000058static void call_exc_trace PROTO((object **, object**, frameobject *));
59static int call_trace
60 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000061static object *add PROTO((object *, object *));
62static object *sub PROTO((object *, object *));
63static object *mul PROTO((object *, object *));
64static object *divide PROTO((object *, object *));
65static object *rem PROTO((object *, object *));
66static object *neg PROTO((object *));
67static object *pos PROTO((object *));
68static object *not PROTO((object *));
69static object *invert PROTO((object *));
70static object *lshift PROTO((object *, object *));
71static object *rshift PROTO((object *, object *));
72static object *and PROTO((object *, object *));
73static object *xor PROTO((object *, object *));
74static object *or PROTO((object *, object *));
75static object *call_builtin PROTO((object *, object *));
76static object *call_function PROTO((object *, object *));
77static object *apply_subscript PROTO((object *, object *));
78static object *loop_subscript PROTO((object *, object *));
79static int slice_index PROTO((object *, int, int *));
80static object *apply_slice PROTO((object *, object *, object *));
81static int assign_subscript PROTO((object *, object *, object *));
82static int assign_slice PROTO((object *, object *, object *, object *));
83static int cmp_exception PROTO((object *, object *));
84static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000085static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000086static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000087static object *build_class PROTO((object *, object *, object *));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000088static void locals_2_fast PROTO((frameobject *, int));
Guido van Rossum5b722181993-03-30 17:46:03 +000089static void fast_2_locals PROTO((frameobject *));
Guido van Rossum25831651993-05-19 14:50:45 +000090static int access_statement PROTO((object *, int, frameobject *));
Guido van Rossum374a9221991-04-04 10:40:29 +000091
92
Guido van Rossum0a066c01992-03-27 17:29:15 +000093/* Pointer to current frame, used to link new frames to */
94
Guido van Rossum374a9221991-04-04 10:40:29 +000095static frameobject *current_frame;
96
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000098
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099#include <errno.h>
100#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102static type_lock interpreter_lock;
103
104void
105init_save_thread()
106{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000108 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109 interpreter_lock = allocate_lock();
110 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113#endif
114
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115/* Functions save_thread and restore_thread are always defined so
116 dynamically loaded modules needn't be compiled separately for use
117 with and without threads: */
118
Guido van Rossum04691fc1992-08-12 15:35:34 +0000119object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120save_thread()
121{
122#ifdef USE_THREAD
123 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000124 object *res;
125 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126 current_frame = NULL;
127 release_lock(interpreter_lock);
128 return res;
129 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000131 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132}
133
134void
135restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000136 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137{
138#ifdef USE_THREAD
139 if (interpreter_lock) {
140 int err;
141 err = errno;
142 acquire_lock(interpreter_lock, 1);
143 errno = err;
144 current_frame = (frameobject *)x;
145 }
146#endif
147}
148
149
Guido van Rossum374a9221991-04-04 10:40:29 +0000150/* Status code for main loop (reason for stack unwind) */
151
152enum why_code {
153 WHY_NOT, /* No error */
154 WHY_EXCEPTION, /* Exception occurred */
155 WHY_RERAISE, /* Exception re-raised by 'finally' */
156 WHY_RETURN, /* 'return' statement */
157 WHY_BREAK /* 'break' statement */
158};
159
160
161/* Interpreter main loop */
162
163object *
Guido van Rossum81daa321993-05-20 14:24:46 +0000164eval_code(co, globals, locals, class, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000165 codeobject *co;
166 object *globals;
167 object *locals;
Guido van Rossum81daa321993-05-20 14:24:46 +0000168 object *class;
Guido van Rossum374a9221991-04-04 10:40:29 +0000169 object *arg;
170{
171 register unsigned char *next_instr;
172 register int opcode; /* Current opcode */
173 register int oparg; /* Current opcode argument, if any */
174 register object **stack_pointer;
175 register enum why_code why; /* Reason for block stack unwind */
176 register int err; /* Error status -- nonzero if error */
177 register object *x; /* Result object -- NULL if error */
178 register object *v; /* Temporary objects popped off stack */
179 register object *w;
180 register object *u;
181 register object *t;
182 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000183 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000184 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000185 object *retval; /* Return value iff why == WHY_RETURN */
186 char *name; /* Name used by some instructions */
Guido van Rossum5b722181993-03-30 17:46:03 +0000187 int needmerge = 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000188#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000189 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000190#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000191#ifdef DEBUG
192 /* Make it easier to find out where we are with dbx */
193 char *filename = getstringvalue(co->co_filename);
194#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000195
196/* Code access macros */
197
198#define GETCONST(i) Getconst(f, i)
199#define GETNAME(i) Getname(f, i)
200#define GETNAMEV(i) Getnamev(f, i)
201#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
202#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
203#define NEXTOP() (*next_instr++)
204#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
205#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
206#define JUMPBY(x) (next_instr += (x))
207
208/* Stack manipulation macros */
209
210#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
211#define EMPTY() (STACK_LEVEL() == 0)
212#define TOP() (stack_pointer[-1])
213#define BASIC_PUSH(v) (*stack_pointer++ = (v))
214#define BASIC_POP() (*--stack_pointer)
215
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000216#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
217 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
218
Guido van Rossum96a42c81992-01-12 02:29:51 +0000219#ifdef LLTRACE
220#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
221#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000222#else
223#define PUSH(v) BASIC_PUSH(v)
224#define POP() BASIC_POP()
225#endif
226
Guido van Rossum5b722181993-03-30 17:46:03 +0000227 if (globals == NULL) {
228 globals = getglobals();
229 if (locals == NULL) {
230 locals = getlocals();
231 needmerge = 1;
232 }
233 }
234 else {
235 if (locals == NULL)
236 locals = globals;
237 }
238
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000239#ifdef LLTRACE
240 lltrace = dictlookup(globals, "__lltrace__") != NULL;
241#endif
242
Guido van Rossum374a9221991-04-04 10:40:29 +0000243 f = newframeobject(
244 current_frame, /*back*/
245 co, /*code*/
246 globals, /*globals*/
247 locals, /*locals*/
Guido van Rossum81daa321993-05-20 14:24:46 +0000248 class, /*class*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000249 50, /*nvalues*/
250 20); /*nblocks*/
251 if (f == NULL)
252 return NULL;
253
254 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000255
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000256 if (sys_trace != NULL) {
257 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000258 be called on *every* entry to a code block.
259 Its return value, if not None, is a function that
260 will be called at the start of each executed line
261 of code. (Actually, the function must return
262 itself in order to continue tracing.)
263 The trace functions are called with three arguments:
264 a pointer to the current frame, a string indicating
265 why the function is called, and an argument which
266 depends on the situation. The global trace function
267 (sys.trace) is also called whenever an exception
268 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000269 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000270 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000271 current_frame = f->f_back;
272 DECREF(f);
273 return NULL;
274 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000275 }
276
277 if (sys_profile != NULL) {
278 /* Similar for sys_profile, except it needn't return
279 itself and isn't called for "line" events */
280 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
281 current_frame = f->f_back;
282 DECREF(f);
283 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000284 }
285 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000286
287 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000288 stack_pointer = f->f_valuestack;
289
290 if (arg != NULL) {
291 INCREF(arg);
292 PUSH(arg);
293 }
294
295 why = WHY_NOT;
296 err = 0;
297 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000298
299 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000300 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000301
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000302 /* Do periodic things.
303 Doing this every time through the loop would add
304 too much overhead (a function call per instruction).
305 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000306
307 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000308 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000309 if (intrcheck()) {
310 err_set(KeyboardInterrupt);
311 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000312 goto on_error;
313 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000314
315#ifdef USE_THREAD
316 if (interpreter_lock) {
317 /* Give another thread a chance */
318
319 current_frame = NULL;
320 release_lock(interpreter_lock);
321
322 /* Other threads may run now */
323
324 acquire_lock(interpreter_lock, 1);
325 current_frame = f;
326 }
327#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000328 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000329
Guido van Rossum374a9221991-04-04 10:40:29 +0000330 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000331
332#ifdef DEBUG
333 f->f_lasti = INSTR_OFFSET();
334#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000335
336 opcode = NEXTOP();
337 if (HAS_ARG(opcode))
338 oparg = NEXTARG();
339
Guido van Rossum96a42c81992-01-12 02:29:51 +0000340#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000341 /* Instruction tracing */
342
Guido van Rossum96a42c81992-01-12 02:29:51 +0000343 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000344 if (HAS_ARG(opcode)) {
345 printf("%d: %d, %d\n",
346 (int) (INSTR_OFFSET() - 3),
347 opcode, oparg);
348 }
349 else {
350 printf("%d: %d\n",
351 (int) (INSTR_OFFSET() - 1), opcode);
352 }
353 }
354#endif
355
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000356 if (!CHECK_STACK(3)) {
357 x = NULL;
358 break;
359 }
360
Guido van Rossum374a9221991-04-04 10:40:29 +0000361 /* Main switch on opcode */
362
363 switch (opcode) {
364
365 /* BEWARE!
366 It is essential that any operation that fails sets either
367 x to NULL, err to nonzero, or why to anything but WHY_NOT,
368 and that no operation that succeeds does this! */
369
370 /* case STOP_CODE: this is an error! */
371
372 case POP_TOP:
373 v = POP();
374 DECREF(v);
375 break;
376
377 case ROT_TWO:
378 v = POP();
379 w = POP();
380 PUSH(v);
381 PUSH(w);
382 break;
383
384 case ROT_THREE:
385 v = POP();
386 w = POP();
387 x = POP();
388 PUSH(v);
389 PUSH(x);
390 PUSH(w);
391 break;
392
393 case DUP_TOP:
394 v = TOP();
395 INCREF(v);
396 PUSH(v);
397 break;
398
399 case UNARY_POSITIVE:
400 v = POP();
401 x = pos(v);
402 DECREF(v);
403 PUSH(x);
404 break;
405
406 case UNARY_NEGATIVE:
407 v = POP();
408 x = neg(v);
409 DECREF(v);
410 PUSH(x);
411 break;
412
413 case UNARY_NOT:
414 v = POP();
415 x = not(v);
416 DECREF(v);
417 PUSH(x);
418 break;
419
420 case UNARY_CONVERT:
421 v = POP();
422 x = reprobject(v);
423 DECREF(v);
424 PUSH(x);
425 break;
426
427 case UNARY_CALL:
428 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000429 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000430 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000431 DECREF(v);
432 PUSH(x);
433 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000434
435 case UNARY_INVERT:
436 v = POP();
437 x = invert(v);
438 DECREF(v);
439 PUSH(x);
440 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000441
442 case BINARY_MULTIPLY:
443 w = POP();
444 v = POP();
445 x = mul(v, w);
446 DECREF(v);
447 DECREF(w);
448 PUSH(x);
449 break;
450
451 case BINARY_DIVIDE:
452 w = POP();
453 v = POP();
454 x = divide(v, w);
455 DECREF(v);
456 DECREF(w);
457 PUSH(x);
458 break;
459
460 case BINARY_MODULO:
461 w = POP();
462 v = POP();
463 x = rem(v, w);
464 DECREF(v);
465 DECREF(w);
466 PUSH(x);
467 break;
468
469 case BINARY_ADD:
470 w = POP();
471 v = POP();
472 x = add(v, w);
473 DECREF(v);
474 DECREF(w);
475 PUSH(x);
476 break;
477
478 case BINARY_SUBTRACT:
479 w = POP();
480 v = POP();
481 x = sub(v, w);
482 DECREF(v);
483 DECREF(w);
484 PUSH(x);
485 break;
486
487 case BINARY_SUBSCR:
488 w = POP();
489 v = POP();
490 x = apply_subscript(v, w);
491 DECREF(v);
492 DECREF(w);
493 PUSH(x);
494 break;
495
496 case BINARY_CALL:
497 w = POP();
498 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000499 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000500 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000501 DECREF(v);
502 DECREF(w);
503 PUSH(x);
504 break;
505
Guido van Rossum7928cd71991-10-24 14:59:31 +0000506 case BINARY_LSHIFT:
507 w = POP();
508 v = POP();
509 x = lshift(v, w);
510 DECREF(v);
511 DECREF(w);
512 PUSH(x);
513 break;
514
515 case BINARY_RSHIFT:
516 w = POP();
517 v = POP();
518 x = rshift(v, w);
519 DECREF(v);
520 DECREF(w);
521 PUSH(x);
522 break;
523
524 case BINARY_AND:
525 w = POP();
526 v = POP();
527 x = and(v, w);
528 DECREF(v);
529 DECREF(w);
530 PUSH(x);
531 break;
532
533 case BINARY_XOR:
534 w = POP();
535 v = POP();
536 x = xor(v, w);
537 DECREF(v);
538 DECREF(w);
539 PUSH(x);
540 break;
541
542 case BINARY_OR:
543 w = POP();
544 v = POP();
545 x = or(v, w);
546 DECREF(v);
547 DECREF(w);
548 PUSH(x);
549 break;
550
Guido van Rossum374a9221991-04-04 10:40:29 +0000551 case SLICE+0:
552 case SLICE+1:
553 case SLICE+2:
554 case SLICE+3:
555 if ((opcode-SLICE) & 2)
556 w = POP();
557 else
558 w = NULL;
559 if ((opcode-SLICE) & 1)
560 v = POP();
561 else
562 v = NULL;
563 u = POP();
564 x = apply_slice(u, v, w);
565 DECREF(u);
566 XDECREF(v);
567 XDECREF(w);
568 PUSH(x);
569 break;
570
571 case STORE_SLICE+0:
572 case STORE_SLICE+1:
573 case STORE_SLICE+2:
574 case STORE_SLICE+3:
575 if ((opcode-STORE_SLICE) & 2)
576 w = POP();
577 else
578 w = NULL;
579 if ((opcode-STORE_SLICE) & 1)
580 v = POP();
581 else
582 v = NULL;
583 u = POP();
584 t = POP();
585 err = assign_slice(u, v, w, t); /* u[v:w] = t */
586 DECREF(t);
587 DECREF(u);
588 XDECREF(v);
589 XDECREF(w);
590 break;
591
592 case DELETE_SLICE+0:
593 case DELETE_SLICE+1:
594 case DELETE_SLICE+2:
595 case DELETE_SLICE+3:
596 if ((opcode-DELETE_SLICE) & 2)
597 w = POP();
598 else
599 w = NULL;
600 if ((opcode-DELETE_SLICE) & 1)
601 v = POP();
602 else
603 v = NULL;
604 u = POP();
605 err = assign_slice(u, v, w, (object *)NULL);
606 /* del u[v:w] */
607 DECREF(u);
608 XDECREF(v);
609 XDECREF(w);
610 break;
611
612 case STORE_SUBSCR:
613 w = POP();
614 v = POP();
615 u = POP();
616 /* v[w] = u */
617 err = assign_subscript(v, w, u);
618 DECREF(u);
619 DECREF(v);
620 DECREF(w);
621 break;
622
623 case DELETE_SUBSCR:
624 w = POP();
625 v = POP();
626 /* del v[w] */
627 err = assign_subscript(v, w, (object *)NULL);
628 DECREF(v);
629 DECREF(w);
630 break;
631
632 case PRINT_EXPR:
633 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 /* Print value except if procedure result */
635 if (v != None) {
636 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000637 x = sysget("stdout");
638 softspace(x, 1);
639 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 flushline();
641 }
642 DECREF(v);
643 break;
644
645 case PRINT_ITEM:
646 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000647 w = sysget("stdout");
648 if (softspace(w, 1))
649 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 if (is_stringobject(v)) {
651 char *s = getstringvalue(v);
652 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000653 err = writeobject(v, w, PRINT_RAW);
654 if (err == 0 && len > 0 && s[len-1] == '\n')
655 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 }
657 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000658 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 }
660 DECREF(v);
661 break;
662
663 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000664 x = sysget("stdout");
665 if (x == NULL)
666 err_setstr(RuntimeError, "lost sys.stdout");
667 else {
668 writestring("\n", x);
669 softspace(x, 0);
670 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 break;
672
673 case BREAK_LOOP:
674 why = WHY_BREAK;
675 break;
676
677 case RAISE_EXCEPTION:
678 v = POP();
679 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000680 /* A tuple is equivalent to its first element here */
681 while (is_tupleobject(w)) {
682 u = w;
683 w = gettupleitem(u, 0);
684 DECREF(u);
685 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 if (!is_stringobject(w))
687 err_setstr(TypeError,
688 "exceptions must be strings");
689 else
690 err_setval(w, v);
691 DECREF(v);
692 DECREF(w);
693 why = WHY_EXCEPTION;
694 break;
695
696 case LOAD_LOCALS:
697 v = f->f_locals;
698 INCREF(v);
699 PUSH(v);
700 break;
701
702 case RETURN_VALUE:
703 retval = POP();
704 why = WHY_RETURN;
705 break;
706
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 case BUILD_FUNCTION:
708 v = POP();
709 x = newfuncobject(v, f->f_globals);
710 DECREF(v);
711 PUSH(x);
712 break;
713
714 case POP_BLOCK:
715 {
716 block *b = pop_block(f);
717 while (STACK_LEVEL() > b->b_level) {
718 v = POP();
719 DECREF(v);
720 }
721 }
722 break;
723
724 case END_FINALLY:
725 v = POP();
726 if (is_intobject(v)) {
727 why = (enum why_code) getintvalue(v);
728 if (why == WHY_RETURN)
729 retval = POP();
730 }
731 else if (is_stringobject(v)) {
732 w = POP();
733 err_setval(v, w);
734 DECREF(w);
735 w = POP();
736 tb_store(w);
737 DECREF(w);
738 why = WHY_RERAISE;
739 }
740 else if (v != None) {
741 err_setstr(SystemError,
742 "'finally' pops bad exception");
743 why = WHY_EXCEPTION;
744 }
745 DECREF(v);
746 break;
747
748 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000749 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000751 w = POP();
752 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000754 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 DECREF(v);
756 DECREF(w);
757 break;
758
759 case STORE_NAME:
760 w = GETNAMEV(oparg);
761 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000762 u = dict2lookup(f->f_locals, w);
763 if (u != NULL && is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000764 err = setaccessvalue(u, class, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000765 DECREF(v);
766 break;
767 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 err = dict2insert(f->f_locals, w, v);
769 DECREF(v);
770 break;
771
772 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000773 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000774 u = dict2lookup(f->f_locals, w);
775 if (u != NULL && is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000776 err = setaccessvalue(u, class,
Guido van Rossum25831651993-05-19 14:50:45 +0000777 (object *)NULL);
778 break;
779 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000780 if ((err = dict2remove(f->f_locals, w)) != 0)
781 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000783
784#ifdef CASE_TOO_BIG
785 default: switch (opcode) {
786#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000787
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000788 case UNPACK_VARARG:
789 if (EMPTY()) {
790 err_setstr(TypeError,
791 "no argument list");
792 why = WHY_EXCEPTION;
793 break;
794 }
795 v = POP();
796 if (!is_tupleobject(v)) {
797 err_setstr(TypeError,
798 "bad argument list");
799 why = WHY_EXCEPTION;
800 }
801 else if (gettuplesize(v) < oparg) {
802 err_setstr(TypeError,
803 "not enough arguments");
804 why = WHY_EXCEPTION;
805 }
806 else if (oparg == 0) {
807 PUSH(v);
808 break;
809 }
810 else {
811 x = gettupleslice(v, oparg, gettuplesize(v));
812 if (x != NULL) {
813 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000814 if (!CHECK_STACK(oparg)) {
815 x = NULL;
816 break;
817 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000818 for (; --oparg >= 0; ) {
819 w = gettupleitem(v, oparg);
820 INCREF(w);
821 PUSH(w);
822 }
823 }
824 }
825 DECREF(v);
826 break;
827
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000828 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000829 {
830 int n;
831 if (EMPTY()) {
832 err_setstr(TypeError,
833 "no argument list");
834 why = WHY_EXCEPTION;
835 break;
836 }
837 v = POP();
838 if (!is_tupleobject(v)) {
839 err_setstr(TypeError,
840 "bad argument list");
841 why = WHY_EXCEPTION;
842 break;
843 }
844 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000845#ifdef COMPAT_HACKS
846/* Implement various compatibility hacks (for 0.9.4 or earlier):
847 (a) f(a,b,...) accepts f((1,2,...))
848 (b) f((a,b,...)) accepts f(1,2,...)
849 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
850*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000851 if (n == 1 && oparg != 1) {
852 /* Rule (a) */
853 w = gettupleitem(v, 0);
854 if (is_tupleobject(w)) {
855 INCREF(w);
856 DECREF(v);
857 v = w;
858 n = gettuplesize(v);
859 }
860 }
861 else if (n != 1 && oparg == 1) {
862 /* Rule (b) */
863 PUSH(v);
864 break;
865 /* Don't fall through */
866 }
867 else if (n > 2 && oparg == 2) {
868 /* Rule (c) */
869 int i;
870 w = newtupleobject(n-1);
871 u = newtupleobject(2);
872 if (u == NULL || w == NULL) {
873 XDECREF(w);
874 XDECREF(u);
875 DECREF(v);
876 why = WHY_EXCEPTION;
877 break;
878 }
879 t = gettupleitem(v, 0);
880 INCREF(t);
881 settupleitem(u, 0, t);
882 for (i = 1; i < n; i++) {
883 t = gettupleitem(v, i);
884 INCREF(t);
885 settupleitem(w, i-1, t);
886 }
887 settupleitem(u, 1, w);
888 DECREF(v);
889 v = u;
890 n = 2;
891 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000892#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000893 if (n != oparg) {
894 err_setstr(TypeError,
895 "arg count mismatch");
896 why = WHY_EXCEPTION;
897 DECREF(v);
898 break;
899 }
900 PUSH(v);
901 }
902 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 case UNPACK_TUPLE:
904 v = POP();
905 if (!is_tupleobject(v)) {
906 err_setstr(TypeError, "unpack non-tuple");
907 why = WHY_EXCEPTION;
908 }
909 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000910 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 "unpack tuple of wrong size");
912 why = WHY_EXCEPTION;
913 }
914 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000915 if (!CHECK_STACK(oparg)) {
916 x = NULL;
917 break;
918 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 for (; --oparg >= 0; ) {
920 w = gettupleitem(v, oparg);
921 INCREF(w);
922 PUSH(w);
923 }
924 }
925 DECREF(v);
926 break;
927
928 case UNPACK_LIST:
929 v = POP();
930 if (!is_listobject(v)) {
931 err_setstr(TypeError, "unpack non-list");
932 why = WHY_EXCEPTION;
933 }
934 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000935 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 "unpack list of wrong size");
937 why = WHY_EXCEPTION;
938 }
939 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000940 if (!CHECK_STACK(oparg)) {
941 x = NULL;
942 break;
943 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 for (; --oparg >= 0; ) {
945 w = getlistitem(v, oparg);
946 INCREF(w);
947 PUSH(w);
948 }
949 }
950 DECREF(v);
951 break;
952
953 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000954 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 v = POP();
956 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000957 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 DECREF(v);
959 DECREF(u);
960 break;
961
962 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000963 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000965 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 DECREF(v);
967 break;
968
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000969 case STORE_GLOBAL:
970 w = GETNAMEV(oparg);
971 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000972 u = dict2lookup(f->f_locals, w);
973 if (u != NULL && is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000974 err = setaccessvalue(u, class, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000975 DECREF(v);
976 break;
977 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000978 err = dict2insert(f->f_globals, w, v);
979 DECREF(v);
980 break;
981
982 case DELETE_GLOBAL:
983 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000984 u = dict2lookup(f->f_locals, w);
985 if (u != NULL && is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000986 err = setaccessvalue(u, class,
Guido van Rossum25831651993-05-19 14:50:45 +0000987 (object *)NULL);
988 break;
989 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000990 if ((err = dict2remove(f->f_globals, w)) != 0)
991 err_setstr(NameError, getstringvalue(w));
992 break;
993
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 case LOAD_CONST:
995 x = GETCONST(oparg);
996 INCREF(x);
997 PUSH(x);
998 break;
999
1000 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001001 w = GETNAMEV(oparg);
1002 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001003 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001004 err_clear();
1005 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001007 err_clear();
1008 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001009 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001010 err_setstr(NameError,
1011 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 break;
1013 }
1014 }
1015 }
Guido van Rossum25831651993-05-19 14:50:45 +00001016 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001017 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001018 if (x == NULL)
1019 break;
1020 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001021 else
1022 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001023 PUSH(x);
1024 break;
1025
1026 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001027 w = GETNAMEV(oparg);
1028 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001030 err_clear();
1031 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001033 err_setstr(NameError,
1034 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 break;
1036 }
1037 }
Guido van Rossum25831651993-05-19 14:50:45 +00001038 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001039 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001040 if (x == NULL)
1041 break;
1042 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001043 else
1044 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 PUSH(x);
1046 break;
1047
1048 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001049 w = GETNAMEV(oparg);
1050 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001052 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 break;
1054 }
Guido van Rossum25831651993-05-19 14:50:45 +00001055 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001056 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001057 if (x == NULL)
1058 break;
1059 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001060 else
1061 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 PUSH(x);
1063 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001064
1065 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001066 x = GETCONST(oparg);
1067 if (x == None)
1068 break;
1069 if (x == NULL || !is_dictobject(x)) {
1070 fatal("bad RESERVE_FAST");
1071 err_setstr(SystemError, "bad RESERVE_FAST");
1072 x = NULL;
1073 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001074 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001075 XDECREF(f->f_fastlocals);
1076 XDECREF(f->f_localmap);
1077 INCREF(x);
1078 f->f_localmap = x;
1079 f->f_fastlocals = x = newlistobject(
1080 x->ob_type->tp_as_mapping->mp_length(x));
1081 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001082 break;
1083
1084 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001085 x = GETLISTITEM(fastlocals, oparg);
1086 if (x == NULL) {
1087 err_setstr(NameError,
1088 "undefined local variable");
1089 break;
1090 }
Guido van Rossum25831651993-05-19 14:50:45 +00001091 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001092 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001093 if (x == NULL)
1094 break;
1095 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001096 else
1097 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001098 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001099 break;
1100
1101 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001102 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001103 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001104 if (w != NULL && is_accessobject(w)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001105 err = setaccessvalue(w, class, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001106 DECREF(v);
1107 break;
1108 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001109 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001110 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001111 break;
1112
1113 case DELETE_FAST:
1114 x = GETLISTITEM(fastlocals, oparg);
1115 if (x == NULL) {
1116 err_setstr(NameError,
1117 "undefined local variable");
1118 break;
1119 }
Guido van Rossum25831651993-05-19 14:50:45 +00001120 if (w != NULL && is_accessobject(w)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001121 err = setaccessvalue(w, class, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001122 break;
1123 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001124 DECREF(x);
1125 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001126 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001127
1128 case BUILD_TUPLE:
1129 x = newtupleobject(oparg);
1130 if (x != NULL) {
1131 for (; --oparg >= 0;) {
1132 w = POP();
1133 err = settupleitem(x, oparg, w);
1134 if (err != 0)
1135 break;
1136 }
1137 PUSH(x);
1138 }
1139 break;
1140
1141 case BUILD_LIST:
1142 x = newlistobject(oparg);
1143 if (x != NULL) {
1144 for (; --oparg >= 0;) {
1145 w = POP();
1146 err = setlistitem(x, oparg, w);
1147 if (err != 0)
1148 break;
1149 }
1150 PUSH(x);
1151 }
1152 break;
1153
1154 case BUILD_MAP:
1155 x = newdictobject();
1156 PUSH(x);
1157 break;
1158
1159 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001160 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001162 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 DECREF(v);
1164 PUSH(x);
1165 break;
1166
1167 case COMPARE_OP:
1168 w = POP();
1169 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001170 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 DECREF(v);
1172 DECREF(w);
1173 PUSH(x);
1174 break;
1175
1176 case IMPORT_NAME:
1177 name = GETNAME(oparg);
1178 x = import_module(name);
1179 XINCREF(x);
1180 PUSH(x);
1181 break;
1182
1183 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001184 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001186 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001187 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001189
1190 case ACCESS_MODE:
1191 v = POP();
1192 w = GETNAMEV(oparg);
1193 err = access_statement(w, (int)getintvalue(v), f);
1194 DECREF(v);
1195 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001196
1197 case JUMP_FORWARD:
1198 JUMPBY(oparg);
1199 break;
1200
1201 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001202 err = testbool(TOP());
1203 if (err > 0)
1204 err = 0;
1205 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 JUMPBY(oparg);
1207 break;
1208
1209 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001210 err = testbool(TOP());
1211 if (err > 0) {
1212 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001214 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 break;
1216
1217 case JUMP_ABSOLUTE:
1218 JUMPTO(oparg);
1219 break;
1220
1221 case FOR_LOOP:
1222 /* for v in s: ...
1223 On entry: stack contains s, i.
1224 On exit: stack contains s, i+1, s[i];
1225 but if loop exhausted:
1226 s, i are popped, and we jump */
1227 w = POP(); /* Loop index */
1228 v = POP(); /* Sequence object */
1229 u = loop_subscript(v, w);
1230 if (u != NULL) {
1231 PUSH(v);
1232 x = newintobject(getintvalue(w)+1);
1233 PUSH(x);
1234 DECREF(w);
1235 PUSH(u);
1236 }
1237 else {
1238 DECREF(v);
1239 DECREF(w);
1240 /* A NULL can mean "s exhausted"
1241 but also an error: */
1242 if (err_occurred())
1243 why = WHY_EXCEPTION;
1244 else
1245 JUMPBY(oparg);
1246 }
1247 break;
1248
1249 case SETUP_LOOP:
1250 case SETUP_EXCEPT:
1251 case SETUP_FINALLY:
1252 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1253 STACK_LEVEL());
1254 break;
1255
1256 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001257#ifdef LLTRACE
1258 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 printf("--- Line %d ---\n", oparg);
1260#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001261 f->f_lineno = oparg;
1262 if (trace != NULL) {
1263 /* Trace each line of code reached */
1264 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001265 err = call_trace(&trace, &trace,
1266 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001267 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 break;
1269
1270 default:
1271 fprintf(stderr,
1272 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001273 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 err_setstr(SystemError, "eval_code: unknown opcode");
1275 why = WHY_EXCEPTION;
1276 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001277
1278#ifdef CASE_TOO_BIG
1279 }
1280#endif
1281
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 } /* switch */
1283
1284 on_error:
1285
1286 /* Quickly continue if no error occurred */
1287
1288 if (why == WHY_NOT) {
1289 if (err == 0 && x != NULL)
1290 continue; /* Normal, fast path */
1291 why = WHY_EXCEPTION;
1292 x = None;
1293 err = 0;
1294 }
1295
Guido van Rossum801dcae1992-04-08 11:32:32 +00001296#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 /* Double-check exception status */
1298
1299 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1300 if (!err_occurred()) {
1301 fprintf(stderr, "XXX ghost error\n");
1302 err_setstr(SystemError, "ghost error");
1303 why = WHY_EXCEPTION;
1304 }
1305 }
1306 else {
1307 if (err_occurred()) {
1308 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001309 abort();
1310 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 why = WHY_EXCEPTION;
1312 }
1313 }
1314#endif
1315
1316 /* Log traceback info if this is a real exception */
1317
1318 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001319 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001321 f->f_lasti -= 2;
1322 tb_here(f);
1323
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001324 if (trace)
1325 call_exc_trace(&trace, &trace, f);
1326 if (sys_profile)
1327 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 }
1329
1330 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1331
1332 if (why == WHY_RERAISE)
1333 why = WHY_EXCEPTION;
1334
1335 /* Unwind stacks if a (pseudo) exception occurred */
1336
1337 while (why != WHY_NOT && f->f_iblock > 0) {
1338 block *b = pop_block(f);
1339 while (STACK_LEVEL() > b->b_level) {
1340 v = POP();
1341 XDECREF(v);
1342 }
1343 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1344 why = WHY_NOT;
1345 JUMPTO(b->b_handler);
1346 break;
1347 }
1348 if (b->b_type == SETUP_FINALLY ||
1349 b->b_type == SETUP_EXCEPT &&
1350 why == WHY_EXCEPTION) {
1351 if (why == WHY_EXCEPTION) {
1352 object *exc, *val;
1353 err_get(&exc, &val);
1354 if (val == NULL) {
1355 val = None;
1356 INCREF(val);
1357 }
1358 v = tb_fetch();
1359 /* Make the raw exception data
1360 available to the handler,
1361 so a program can emulate the
1362 Python main loop. Don't do
1363 this for 'finally'. */
1364 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 sysset("exc_value", val);
1367 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 }
1369 PUSH(v);
1370 PUSH(val);
1371 PUSH(exc);
1372 }
1373 else {
1374 if (why == WHY_RETURN)
1375 PUSH(retval);
1376 v = newintobject((long)why);
1377 PUSH(v);
1378 }
1379 why = WHY_NOT;
1380 JUMPTO(b->b_handler);
1381 break;
1382 }
1383 } /* unwind stack */
1384
1385 /* End the loop if we still have an error (or return) */
1386
1387 if (why != WHY_NOT)
1388 break;
1389
1390 } /* main loop */
1391
1392 /* Pop remaining stack entries */
1393
1394 while (!EMPTY()) {
1395 v = POP();
1396 XDECREF(v);
1397 }
1398
Guido van Rossum96a42c81992-01-12 02:29:51 +00001399 if (why != WHY_RETURN)
1400 retval = NULL;
1401
1402 if (trace) {
1403 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001404 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001405 XDECREF(retval);
1406 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001407 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001408 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001409 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001410 XDECREF(trace);
1411 }
1412
1413 if (sys_profile && why == WHY_RETURN) {
1414 if (call_trace(&sys_profile, (object**)0,
1415 f, "return", retval)) {
1416 XDECREF(retval);
1417 retval = NULL;
1418 why = WHY_EXCEPTION;
1419 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001420 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001421
1422 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1423 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001424
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 /* Restore previous frame and release the current one */
1426
1427 current_frame = f->f_back;
1428 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001429
1430 if (needmerge)
1431 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001432
Guido van Rossum96a42c81992-01-12 02:29:51 +00001433 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001434}
1435
Guido van Rossum96a42c81992-01-12 02:29:51 +00001436#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001437static int
1438prtrace(v, str)
1439 object *v;
1440 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001442 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001443 if (printobject(v, stdout, 0) != 0)
1444 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001445 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001447#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001449static void
1450call_exc_trace(p_trace, p_newtrace, f)
1451 object **p_trace, **p_newtrace;
1452 frameobject *f;
1453{
1454 object *type, *value, *traceback, *arg;
1455 int err;
1456 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001457 if (value == NULL) {
1458 value = None;
1459 INCREF(value);
1460 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001461 traceback = tb_fetch();
1462 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001463 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001464 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001465 settupleitem(arg, 0, type);
1466 settupleitem(arg, 1, value);
1467 settupleitem(arg, 2, traceback);
1468 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001469 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001470 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001471 /* Restore original exception */
1472 err_setval(type, value);
1473 tb_store(traceback);
1474 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001475 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001476}
1477
1478static int
1479call_trace(p_trace, p_newtrace, f, msg, arg)
1480 object **p_trace; /* in/out; may not be NULL;
1481 may not point to NULL variable initially */
1482 object **p_newtrace; /* in/out; may be NULL;
1483 may point to NULL variable;
1484 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001485 frameobject *f;
1486 char *msg;
1487 object *arg;
1488{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001489 object *arglist, *what;
1490 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001491 static int tracing = 0;
1492
1493 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001494 /* Don't do recursive traces */
1495 if (p_newtrace) {
1496 XDECREF(*p_newtrace);
1497 *p_newtrace = NULL;
1498 }
1499 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001500 }
1501
1502 arglist = newtupleobject(3);
1503 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001504 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001505 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001506 if (what == NULL)
1507 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001508 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001509 settupleitem(arglist, 0, (object *)f);
1510 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001511 if (arg == NULL)
1512 arg = None;
1513 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001514 settupleitem(arglist, 2, arg);
1515 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001516 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001517 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001518 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001519 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001520 cleanup:
1521 XDECREF(arglist);
1522 if (res == NULL) {
1523 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001524 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001525 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001526 *p_trace = NULL;
1527 if (p_newtrace) {
1528 XDECREF(*p_newtrace);
1529 *p_newtrace = NULL;
1530 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001531 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001532 }
1533 else {
1534 if (p_newtrace) {
1535 XDECREF(*p_newtrace);
1536 if (res == None)
1537 *p_newtrace = NULL;
1538 else {
1539 INCREF(res);
1540 *p_newtrace = res;
1541 }
1542 }
1543 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001544 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001545 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001546}
1547
Guido van Rossum5b722181993-03-30 17:46:03 +00001548static void
1549fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001550 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001551{
1552 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001553 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001554 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001555 int pos;
1556 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001557 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001558 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001559 locals = f->f_locals;
1560 fast = f->f_fastlocals;
1561 map = f->f_localmap;
1562 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001563 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001564 if (!is_dictobject(locals) || !is_listobject(fast) ||
1565 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001566 return;
1567 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001568 pos = 0;
1569 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001570 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001571 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001572 continue;
1573 j = getintvalue(value);
1574 value = getlistitem(fast, j);
1575 if (value == NULL) {
1576 err_clear();
1577 if (dict2remove(locals, key) != 0)
1578 err_clear();
1579 }
1580 else {
1581 if (dict2insert(locals, key, value) != 0)
1582 err_clear();
1583 }
1584 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001585 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001586}
1587
1588static void
1589locals_2_fast(f, clear)
1590 frameobject *f;
1591 int clear;
1592{
1593 /* Merge f->f_locals into f->f_fastlocals */
1594 object *locals, *fast, *map;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001595 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001596 int pos;
1597 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001598 if (f == NULL)
1599 return;
1600 locals = f->f_locals;
1601 fast = f->f_fastlocals;
1602 map = f->f_localmap;
1603 if (locals == NULL || fast == NULL || map == NULL)
1604 return;
1605 if (!is_dictobject(locals) || !is_listobject(fast) ||
1606 !is_dictobject(map))
1607 return;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001608 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001609 pos = 0;
1610 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001611 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001612 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001613 continue;
1614 j = getintvalue(value);
1615 value = dict2lookup(locals, key);
1616 if (value == NULL)
1617 err_clear();
1618 else
1619 INCREF(value);
1620 if (value != NULL || clear)
1621 if (setlistitem(fast, j, value) != 0)
1622 err_clear();
1623 }
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001624 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001625}
1626
1627void
1628mergelocals()
1629{
1630 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001631}
1632
1633object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001634getlocals()
1635{
1636 if (current_frame == NULL)
1637 return NULL;
1638 fast_2_locals(current_frame);
1639 return current_frame->f_locals;
1640}
1641
1642object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001643getglobals()
1644{
1645 if (current_frame == NULL)
1646 return NULL;
1647 else
1648 return current_frame->f_globals;
1649}
1650
Guido van Rossum81daa321993-05-20 14:24:46 +00001651object *
1652getclass()
1653{
1654 if (current_frame == NULL)
1655 return NULL;
1656 else
1657 return current_frame->f_class;
1658}
1659
Guido van Rossum3f5da241990-12-20 15:06:42 +00001660void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001661printtraceback(f)
1662 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663{
1664 object *v = tb_fetch();
1665 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001666 writestring("Stack backtrace (innermost last):\n", f);
1667 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001668 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670}
1671
1672
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673void
1674flushline()
1675{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001676 object *f = sysget("stdout");
1677 if (softspace(f, 0))
1678 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679}
1680
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001683or(v, w)
1684 object *v, *w;
1685{
1686 if (v->ob_type->tp_as_number != NULL) {
1687 object *x;
1688 object * (*f) FPROTO((object *, object *));
1689 if (coerce(&v, &w) != 0)
1690 return NULL;
1691 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1692 x = (*f)(v, w);
1693 DECREF(v);
1694 DECREF(w);
1695 if (f != NULL)
1696 return x;
1697 }
1698 err_setstr(TypeError, "bad operand type(s) for |");
1699 return NULL;
1700}
1701
1702static object *
1703xor(v, w)
1704 object *v, *w;
1705{
1706 if (v->ob_type->tp_as_number != NULL) {
1707 object *x;
1708 object * (*f) FPROTO((object *, object *));
1709 if (coerce(&v, &w) != 0)
1710 return NULL;
1711 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1712 x = (*f)(v, w);
1713 DECREF(v);
1714 DECREF(w);
1715 if (f != NULL)
1716 return x;
1717 }
1718 err_setstr(TypeError, "bad operand type(s) for ^");
1719 return NULL;
1720}
1721
1722static object *
1723and(v, w)
1724 object *v, *w;
1725{
1726 if (v->ob_type->tp_as_number != NULL) {
1727 object *x;
1728 object * (*f) FPROTO((object *, object *));
1729 if (coerce(&v, &w) != 0)
1730 return NULL;
1731 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1732 x = (*f)(v, w);
1733 DECREF(v);
1734 DECREF(w);
1735 if (f != NULL)
1736 return x;
1737 }
1738 err_setstr(TypeError, "bad operand type(s) for &");
1739 return NULL;
1740}
1741
1742static object *
1743lshift(v, w)
1744 object *v, *w;
1745{
1746 if (v->ob_type->tp_as_number != NULL) {
1747 object *x;
1748 object * (*f) FPROTO((object *, object *));
1749 if (coerce(&v, &w) != 0)
1750 return NULL;
1751 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1752 x = (*f)(v, w);
1753 DECREF(v);
1754 DECREF(w);
1755 if (f != NULL)
1756 return x;
1757 }
1758 err_setstr(TypeError, "bad operand type(s) for <<");
1759 return NULL;
1760}
1761
1762static object *
1763rshift(v, w)
1764 object *v, *w;
1765{
1766 if (v->ob_type->tp_as_number != NULL) {
1767 object *x;
1768 object * (*f) FPROTO((object *, object *));
1769 if (coerce(&v, &w) != 0)
1770 return NULL;
1771 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1772 x = (*f)(v, w);
1773 DECREF(v);
1774 DECREF(w);
1775 if (f != NULL)
1776 return x;
1777 }
1778 err_setstr(TypeError, "bad operand type(s) for >>");
1779 return NULL;
1780}
1781
1782static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001783add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784 object *v, *w;
1785{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001786 if (v->ob_type->tp_as_sequence != NULL)
1787 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1788 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001789 object *x;
1790 if (coerce(&v, &w) != 0)
1791 return NULL;
1792 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1793 DECREF(v);
1794 DECREF(w);
1795 return x;
1796 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001797 err_setstr(TypeError, "bad operand type(s) for +");
1798 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799}
1800
1801static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001802sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 object *v, *w;
1804{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001805 if (v->ob_type->tp_as_number != NULL) {
1806 object *x;
1807 if (coerce(&v, &w) != 0)
1808 return NULL;
1809 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1810 DECREF(v);
1811 DECREF(w);
1812 return x;
1813 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001814 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 return NULL;
1816}
1817
1818static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001819mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 object *v, *w;
1821{
1822 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001823 tp = v->ob_type;
1824 if (tp->tp_as_number != NULL &&
1825 w->ob_type->tp_as_sequence != NULL &&
1826 !is_instanceobject(v)) {
1827 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 object *tmp = v;
1829 v = w;
1830 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001831 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001833 if (tp->tp_as_number != NULL) {
1834 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001835 if (is_instanceobject(v)) {
1836 /* Instances of user-defined classes get their
1837 other argument uncoerced, so they may
1838 implement sequence*number as well as
1839 number*number. */
1840 INCREF(v);
1841 INCREF(w);
1842 }
1843 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001844 return NULL;
1845 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1846 DECREF(v);
1847 DECREF(w);
1848 return x;
1849 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 if (tp->tp_as_sequence != NULL) {
1851 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001852 err_setstr(TypeError,
1853 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 return NULL;
1855 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 return (*tp->tp_as_sequence->sq_repeat)
1857 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 }
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 Rossum40d0b7e1990-12-20 23:03:11 +00001864divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 object *v, *w;
1866{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001867 if (v->ob_type->tp_as_number != NULL) {
1868 object *x;
1869 if (coerce(&v, &w) != 0)
1870 return NULL;
1871 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1872 DECREF(v);
1873 DECREF(w);
1874 return x;
1875 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 return NULL;
1878}
1879
1880static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001881rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 object *v, *w;
1883{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001884 if (v->ob_type->tp_as_number != NULL) {
1885 object *x;
1886 if (coerce(&v, &w) != 0)
1887 return NULL;
1888 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1889 DECREF(v);
1890 DECREF(w);
1891 return x;
1892 }
Guido van Rossume5372401993-03-16 12:15:04 +00001893 if (is_stringobject(v)) {
1894 return formatstring(v, w);
1895 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001896 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 return NULL;
1898}
1899
1900static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001901neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 object *v;
1903{
1904 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001905 return (*v->ob_type->tp_as_number->nb_negative)(v);
1906 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 return NULL;
1908}
1909
1910static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 object *v;
1913{
1914 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915 return (*v->ob_type->tp_as_number->nb_positive)(v);
1916 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001917 return NULL;
1918}
1919
1920static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001921invert(v)
1922 object *v;
1923{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001924 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001925 if (v->ob_type->tp_as_number != NULL &&
1926 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1927 return (*f)(v);
1928 err_setstr(TypeError, "bad operand type(s) for unary ~");
1929 return NULL;
1930}
1931
1932static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 object *v;
1935{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001937 object *w;
1938 if (outcome < 0)
1939 return NULL;
1940 if (outcome == 0)
1941 w = True;
1942 else
1943 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001944 INCREF(w);
1945 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001947/* External interface to call any callable object. The arg may be NULL. */
1948
1949object *
1950call_object(func, arg)
1951 object *func;
1952 object *arg;
1953{
1954 if (is_instancemethodobject(func) || is_funcobject(func))
1955 return call_function(func, arg);
1956 else
1957 return call_builtin(func, arg);
1958}
1959
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 if (is_methodobject(func)) {
1966 method meth = getmethod(func);
1967 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001968 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1969 int size = gettuplesize(arg);
1970 if (size == 1)
1971 arg = gettupleitem(arg, 0);
1972 else if (size == 0)
1973 arg = NULL;
1974 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001975 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 }
1977 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00001978 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 return NULL;
1982}
1983
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001987 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001989 object *newarg = NULL;
1990 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00001991 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001992 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993
Guido van Rossume8122f11991-05-05 20:03:07 +00001994 if (is_instancemethodobject(func)) {
1995 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001996 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00001997 func = instancemethodgetfunc(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001998 if (self != NULL) {
1999 int argcount;
2000 if (arg == NULL)
2001 argcount = 0;
2002 else if (is_tupleobject(arg))
2003 argcount = gettuplesize(arg);
2004 else
2005 argcount = 1;
2006 newarg = newtupleobject(argcount + 1);
2007 if (newarg == NULL)
2008 return NULL;
2009 INCREF(self);
2010 settupleitem(newarg, 0, self);
2011 if (arg != NULL && !is_tupleobject(arg)) {
2012 INCREF(arg);
2013 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002014 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002015 else {
2016 int i;
2017 object *v;
2018 for (i = 0; i < argcount; i++) {
2019 v = gettupleitem(arg, i);
2020 XINCREF(v);
2021 settupleitem(newarg, i+1, v);
2022 }
2023 }
2024 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 }
2026 }
2027 else {
2028 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002029 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 return NULL;
2031 }
2032 }
2033
Guido van Rossum3f5da241990-12-20 15:06:42 +00002034 co = getfunccode(func);
2035 if (co == NULL) {
2036 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 return NULL;
2038 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002039 if (!is_codeobject(co)) {
2040 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 abort();
2042 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002043 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002045 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 return NULL;
2047 }
2048
Guido van Rossum3f5da241990-12-20 15:06:42 +00002049 newglobals = getfuncglobals(func);
2050 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051
Guido van Rossum81daa321993-05-20 14:24:46 +00002052 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053
Guido van Rossum3f5da241990-12-20 15:06:42 +00002054 DECREF(newlocals);
2055 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056
Guido van Rossum3f5da241990-12-20 15:06:42 +00002057 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058
2059 return v;
2060}
2061
2062static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002063apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 object *v, *w;
2065{
2066 typeobject *tp = v->ob_type;
2067 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 return NULL;
2070 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002071 if (tp->tp_as_mapping != NULL) {
2072 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2073 }
2074 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 int i;
2076 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 return NULL;
2079 }
2080 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002081 if (i < 0) {
2082 int len = (*tp->tp_as_sequence->sq_length)(v);
2083 if (len < 0)
2084 return NULL;
2085 i += len;
2086 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002087 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089}
2090
2091static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 object *v, *w;
2094{
2095 sequence_methods *sq = v->ob_type->tp_as_sequence;
2096 int i, n;
2097 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002098 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 return NULL;
2100 }
2101 i = getintvalue(w);
2102 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002103 if (n < 0)
2104 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 if (i >= n)
2106 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108}
2109
2110static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112 object *v;
2113 int isize;
2114 int *pi;
2115{
2116 if (v != NULL) {
2117 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002118 err_setstr(TypeError, "slice index must be int");
2119 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 }
2121 *pi = getintvalue(v);
2122 if (*pi < 0)
2123 *pi += isize;
2124 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002125 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126}
2127
2128static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 object *u, *v, *w;
2131{
2132 typeobject *tp = u->ob_type;
2133 int ilow, ihigh, isize;
2134 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002135 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 return NULL;
2137 }
2138 ilow = 0;
2139 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002140 if (isize < 0)
2141 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002142 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002144 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002146 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148
2149static int
2150assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 object *w;
2152 object *key;
2153 object *v;
2154{
2155 typeobject *tp = w->ob_type;
2156 sequence_methods *sq;
2157 mapping_methods *mp;
2158 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002159 if ((mp = tp->tp_as_mapping) != NULL &&
2160 (func = mp->mp_ass_subscript) != NULL) {
2161 return (*func)(w, key, v);
2162 }
2163 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 (func = sq->sq_ass_item) != NULL) {
2165 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002166 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002167 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002168 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002170 else {
2171 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002172 if (i < 0) {
2173 int len = (*sq->sq_length)(w);
2174 if (len < 0)
2175 return -1;
2176 i += len;
2177 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002178 return (*func)(w, i, v);
2179 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002182 err_setstr(TypeError,
2183 "can't assign to this subscripted object");
2184 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186}
2187
Guido van Rossum3f5da241990-12-20 15:06:42 +00002188static int
2189assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 object *u, *v, *w, *x;
2191{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002192 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002194 if (sq == NULL) {
2195 err_setstr(TypeError, "assign to slice of non-sequence");
2196 return -1;
2197 }
2198 if (sq == NULL || sq->sq_ass_slice == NULL) {
2199 err_setstr(TypeError, "unassignable slice");
2200 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 }
2202 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002204 if (isize < 0)
2205 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002206 if (slice_index(v, isize, &ilow) != 0)
2207 return -1;
2208 if (slice_index(w, isize, &ihigh) != 0)
2209 return -1;
2210 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211}
2212
2213static int
2214cmp_exception(err, v)
2215 object *err, *v;
2216{
2217 if (is_tupleobject(v)) {
2218 int i, n;
2219 n = gettuplesize(v);
2220 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002221 /* Test recursively */
2222 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223 return 1;
2224 }
2225 return 0;
2226 }
2227 return err == v;
2228}
2229
Guido van Rossum3f5da241990-12-20 15:06:42 +00002230static int
2231cmp_member(v, w)
2232 object *v, *w;
2233{
2234 int i, n, cmp;
2235 object *x;
2236 sequence_methods *sq;
2237 /* Special case for char in string */
2238 if (is_stringobject(w)) {
2239 register char *s, *end;
2240 register char c;
2241 if (!is_stringobject(v) || getstringsize(v) != 1) {
2242 err_setstr(TypeError,
2243 "string member test needs char left operand");
2244 return -1;
2245 }
2246 c = getstringvalue(v)[0];
2247 s = getstringvalue(w);
2248 end = s + getstringsize(w);
2249 while (s < end) {
2250 if (c == *s++)
2251 return 1;
2252 }
2253 return 0;
2254 }
2255 sq = w->ob_type->tp_as_sequence;
2256 if (sq == NULL) {
2257 err_setstr(TypeError,
2258 "'in' or 'not in' needs sequence right argument");
2259 return -1;
2260 }
2261 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002262 if (n < 0)
2263 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002264 for (i = 0; i < n; i++) {
2265 x = (*sq->sq_item)(w, i);
2266 cmp = cmpobject(v, x);
2267 XDECREF(x);
2268 if (cmp == 0)
2269 return 1;
2270 }
2271 return 0;
2272}
2273
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002276 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 register object *v;
2278 register object *w;
2279{
2280 register int cmp;
2281 register int res = 0;
2282 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002283 case IS:
2284 case IS_NOT:
2285 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002286 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002287 res = !res;
2288 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 case IN:
2290 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002291 res = cmp_member(v, w);
2292 if (res < 0)
2293 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002294 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002295 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 break;
2297 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002298 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 break;
2300 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002301 cmp = cmpobject(v, w);
2302 switch (op) {
2303 case LT: res = cmp < 0; break;
2304 case LE: res = cmp <= 0; break;
2305 case EQ: res = cmp == 0; break;
2306 case NE: res = cmp != 0; break;
2307 case GT: res = cmp > 0; break;
2308 case GE: res = cmp >= 0; break;
2309 /* XXX no default? (res is initialized to 0 though) */
2310 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 }
2312 v = res ? True : False;
2313 INCREF(v);
2314 return v;
2315}
2316
Guido van Rossum3f5da241990-12-20 15:06:42 +00002317static int
2318import_from(locals, v, name)
2319 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002320 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002321 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002322{
2323 object *w, *x;
2324 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002325 if (getstringvalue(name)[0] == '*') {
Guido van Rossum25831651993-05-19 14:50:45 +00002326 int pos;
2327 object *name, *value;
2328 pos = 0;
2329 while (mappinggetnext(w, &pos, &name, &value)) {
2330 if (!is_stringobject(name) ||
2331 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002332 continue;
Guido van Rossum25831651993-05-19 14:50:45 +00002333 if (dict2insert(locals, name, value) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002334 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002335 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002336 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002337 }
2338 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002339 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002340 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002341 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002342 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002343 getstringvalue(name));
2344 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002345 return -1;
2346 }
2347 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002348 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002349 }
2350}
2351
2352static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002353build_class(methods, bases, name)
2354 object *methods; /* dictionary */
2355 object *bases; /* tuple containing classes */
2356 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002357{
Guido van Rossum25831651993-05-19 14:50:45 +00002358 int i;
2359 if (!is_tupleobject(bases)) {
2360 err_setstr(SystemError, "build_class with non-tuple bases");
2361 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002362 }
Guido van Rossum25831651993-05-19 14:50:45 +00002363 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002364 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002365 return NULL;
2366 }
Guido van Rossum25831651993-05-19 14:50:45 +00002367 if (!is_stringobject(name)) {
2368 err_setstr(SystemError, "build_class witn non-string name");
2369 return NULL;
2370 }
2371 for (i = gettuplesize(bases); --i >= 0; ) {
2372 object *base = gettupleitem(bases, i);
2373 if (!is_classobject(base)) {
2374 err_setstr(TypeError,
2375 "base is not a class object");
2376 return NULL;
2377 }
2378 }
2379 return newclassobject(bases, methods, name);
2380}
2381
2382static int
2383access_statement(name, mode, f)
2384 object *name;
2385 int mode;
2386 frameobject *f;
2387{
Guido van Rossum81daa321993-05-20 14:24:46 +00002388 object *value, *ac;
2389 typeobject *type;
2390 int fastind, ret;
2391 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002392 if (f->f_localmap == NULL)
2393 value = dict2lookup(f->f_locals, name);
2394 else {
2395 value = dict2lookup(f->f_localmap, name);
2396 if (value == NULL || !is_intobject(value))
2397 value = NULL;
2398 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002399 fastind = getintvalue(value);
2400 if (0 <= fastind &&
2401 fastind < getlistsize(f->f_fastlocals))
2402 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossum25831651993-05-19 14:50:45 +00002403 else {
2404 value = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +00002405 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002406 }
2407 }
2408 }
2409 if (value && is_accessobject(value)) {
2410 err_setstr(AccessError, "can't override access");
2411 return -1;
2412 }
2413 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002414 if (value != NULL && value != None)
2415 type = value->ob_type;
2416 else
2417 type = NULL;
2418 ac = newaccessobject(value, (object*)NULL, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002419 if (ac == NULL)
2420 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002421 if (fastind >= 0)
2422 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002423 else {
2424 ret = dict2insert(f->f_locals, name, ac);
2425 DECREF(ac);
2426 }
2427 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002428}