blob: 0e2acfc5f23e626fd5c8e90269fde63884bac880 [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 Rossumb3f72581993-05-21 19:56:10 +000090static int access_statement PROTO((object *, object *, 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 Rossumb3f72581993-05-21 19:56:10 +0000187 int needmerge = 0; /* Set if need to merge locals back at end */
188 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000189#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000190 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000191#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000192#ifdef DEBUG
193 /* Make it easier to find out where we are with dbx */
194 char *filename = getstringvalue(co->co_filename);
195#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000196
197/* Code access macros */
198
199#define GETCONST(i) Getconst(f, i)
200#define GETNAME(i) Getname(f, i)
201#define GETNAMEV(i) Getnamev(f, i)
202#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
203#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
204#define NEXTOP() (*next_instr++)
205#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
206#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
207#define JUMPBY(x) (next_instr += (x))
208
209/* Stack manipulation macros */
210
211#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
212#define EMPTY() (STACK_LEVEL() == 0)
213#define TOP() (stack_pointer[-1])
214#define BASIC_PUSH(v) (*stack_pointer++ = (v))
215#define BASIC_POP() (*--stack_pointer)
216
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000217#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
218 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
219
Guido van Rossum96a42c81992-01-12 02:29:51 +0000220#ifdef LLTRACE
221#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
222#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000223#else
224#define PUSH(v) BASIC_PUSH(v)
225#define POP() BASIC_POP()
226#endif
227
Guido van Rossum5b722181993-03-30 17:46:03 +0000228 if (globals == NULL) {
229 globals = getglobals();
230 if (locals == NULL) {
231 locals = getlocals();
232 needmerge = 1;
233 }
234 }
235 else {
236 if (locals == NULL)
237 locals = globals;
238 }
239
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000240#ifdef LLTRACE
241 lltrace = dictlookup(globals, "__lltrace__") != NULL;
242#endif
243
Guido van Rossum374a9221991-04-04 10:40:29 +0000244 f = newframeobject(
245 current_frame, /*back*/
246 co, /*code*/
247 globals, /*globals*/
248 locals, /*locals*/
Guido van Rossum81daa321993-05-20 14:24:46 +0000249 class, /*class*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000250 50, /*nvalues*/
251 20); /*nblocks*/
252 if (f == NULL)
253 return NULL;
254
255 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000256
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000257 if (sys_trace != NULL) {
258 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000259 be called on *every* entry to a code block.
260 Its return value, if not None, is a function that
261 will be called at the start of each executed line
262 of code. (Actually, the function must return
263 itself in order to continue tracing.)
264 The trace functions are called with three arguments:
265 a pointer to the current frame, a string indicating
266 why the function is called, and an argument which
267 depends on the situation. The global trace function
268 (sys.trace) is also called whenever an exception
269 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000270 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000271 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000272 current_frame = f->f_back;
273 DECREF(f);
274 return NULL;
275 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000276 }
277
278 if (sys_profile != NULL) {
279 /* Similar for sys_profile, except it needn't return
280 itself and isn't called for "line" events */
281 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
282 current_frame = f->f_back;
283 DECREF(f);
284 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000285 }
286 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000287
288 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000289 stack_pointer = f->f_valuestack;
290
291 if (arg != NULL) {
292 INCREF(arg);
293 PUSH(arg);
294 }
295
296 why = WHY_NOT;
297 err = 0;
298 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000299
300 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000301 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000302
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303 /* Do periodic things.
304 Doing this every time through the loop would add
305 too much overhead (a function call per instruction).
306 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000307
308 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000309 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000310 if (intrcheck()) {
311 err_set(KeyboardInterrupt);
312 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000313 goto on_error;
314 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315
316#ifdef USE_THREAD
317 if (interpreter_lock) {
318 /* Give another thread a chance */
319
320 current_frame = NULL;
321 release_lock(interpreter_lock);
322
323 /* Other threads may run now */
324
325 acquire_lock(interpreter_lock, 1);
326 current_frame = f;
327 }
328#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000329 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330
Guido van Rossum374a9221991-04-04 10:40:29 +0000331 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000332
333#ifdef DEBUG
334 f->f_lasti = INSTR_OFFSET();
335#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000336
337 opcode = NEXTOP();
338 if (HAS_ARG(opcode))
339 oparg = NEXTARG();
340
Guido van Rossum96a42c81992-01-12 02:29:51 +0000341#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 /* Instruction tracing */
343
Guido van Rossum96a42c81992-01-12 02:29:51 +0000344 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000345 if (HAS_ARG(opcode)) {
346 printf("%d: %d, %d\n",
347 (int) (INSTR_OFFSET() - 3),
348 opcode, oparg);
349 }
350 else {
351 printf("%d: %d\n",
352 (int) (INSTR_OFFSET() - 1), opcode);
353 }
354 }
355#endif
356
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000357 if (!CHECK_STACK(3)) {
358 x = NULL;
359 break;
360 }
361
Guido van Rossum374a9221991-04-04 10:40:29 +0000362 /* Main switch on opcode */
363
364 switch (opcode) {
365
366 /* BEWARE!
367 It is essential that any operation that fails sets either
368 x to NULL, err to nonzero, or why to anything but WHY_NOT,
369 and that no operation that succeeds does this! */
370
371 /* case STOP_CODE: this is an error! */
372
373 case POP_TOP:
374 v = POP();
375 DECREF(v);
376 break;
377
378 case ROT_TWO:
379 v = POP();
380 w = POP();
381 PUSH(v);
382 PUSH(w);
383 break;
384
385 case ROT_THREE:
386 v = POP();
387 w = POP();
388 x = POP();
389 PUSH(v);
390 PUSH(x);
391 PUSH(w);
392 break;
393
394 case DUP_TOP:
395 v = TOP();
396 INCREF(v);
397 PUSH(v);
398 break;
399
400 case UNARY_POSITIVE:
401 v = POP();
402 x = pos(v);
403 DECREF(v);
404 PUSH(x);
405 break;
406
407 case UNARY_NEGATIVE:
408 v = POP();
409 x = neg(v);
410 DECREF(v);
411 PUSH(x);
412 break;
413
414 case UNARY_NOT:
415 v = POP();
416 x = not(v);
417 DECREF(v);
418 PUSH(x);
419 break;
420
421 case UNARY_CONVERT:
422 v = POP();
423 x = reprobject(v);
424 DECREF(v);
425 PUSH(x);
426 break;
427
428 case UNARY_CALL:
429 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000430 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000431 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 DECREF(v);
433 PUSH(x);
434 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000435
436 case UNARY_INVERT:
437 v = POP();
438 x = invert(v);
439 DECREF(v);
440 PUSH(x);
441 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000442
443 case BINARY_MULTIPLY:
444 w = POP();
445 v = POP();
446 x = mul(v, w);
447 DECREF(v);
448 DECREF(w);
449 PUSH(x);
450 break;
451
452 case BINARY_DIVIDE:
453 w = POP();
454 v = POP();
455 x = divide(v, w);
456 DECREF(v);
457 DECREF(w);
458 PUSH(x);
459 break;
460
461 case BINARY_MODULO:
462 w = POP();
463 v = POP();
464 x = rem(v, w);
465 DECREF(v);
466 DECREF(w);
467 PUSH(x);
468 break;
469
470 case BINARY_ADD:
471 w = POP();
472 v = POP();
473 x = add(v, w);
474 DECREF(v);
475 DECREF(w);
476 PUSH(x);
477 break;
478
479 case BINARY_SUBTRACT:
480 w = POP();
481 v = POP();
482 x = sub(v, w);
483 DECREF(v);
484 DECREF(w);
485 PUSH(x);
486 break;
487
488 case BINARY_SUBSCR:
489 w = POP();
490 v = POP();
491 x = apply_subscript(v, w);
492 DECREF(v);
493 DECREF(w);
494 PUSH(x);
495 break;
496
497 case BINARY_CALL:
498 w = POP();
499 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000500 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000501 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000502 DECREF(v);
503 DECREF(w);
504 PUSH(x);
505 break;
506
Guido van Rossum7928cd71991-10-24 14:59:31 +0000507 case BINARY_LSHIFT:
508 w = POP();
509 v = POP();
510 x = lshift(v, w);
511 DECREF(v);
512 DECREF(w);
513 PUSH(x);
514 break;
515
516 case BINARY_RSHIFT:
517 w = POP();
518 v = POP();
519 x = rshift(v, w);
520 DECREF(v);
521 DECREF(w);
522 PUSH(x);
523 break;
524
525 case BINARY_AND:
526 w = POP();
527 v = POP();
528 x = and(v, w);
529 DECREF(v);
530 DECREF(w);
531 PUSH(x);
532 break;
533
534 case BINARY_XOR:
535 w = POP();
536 v = POP();
537 x = xor(v, w);
538 DECREF(v);
539 DECREF(w);
540 PUSH(x);
541 break;
542
543 case BINARY_OR:
544 w = POP();
545 v = POP();
546 x = or(v, w);
547 DECREF(v);
548 DECREF(w);
549 PUSH(x);
550 break;
551
Guido van Rossum374a9221991-04-04 10:40:29 +0000552 case SLICE+0:
553 case SLICE+1:
554 case SLICE+2:
555 case SLICE+3:
556 if ((opcode-SLICE) & 2)
557 w = POP();
558 else
559 w = NULL;
560 if ((opcode-SLICE) & 1)
561 v = POP();
562 else
563 v = NULL;
564 u = POP();
565 x = apply_slice(u, v, w);
566 DECREF(u);
567 XDECREF(v);
568 XDECREF(w);
569 PUSH(x);
570 break;
571
572 case STORE_SLICE+0:
573 case STORE_SLICE+1:
574 case STORE_SLICE+2:
575 case STORE_SLICE+3:
576 if ((opcode-STORE_SLICE) & 2)
577 w = POP();
578 else
579 w = NULL;
580 if ((opcode-STORE_SLICE) & 1)
581 v = POP();
582 else
583 v = NULL;
584 u = POP();
585 t = POP();
586 err = assign_slice(u, v, w, t); /* u[v:w] = t */
587 DECREF(t);
588 DECREF(u);
589 XDECREF(v);
590 XDECREF(w);
591 break;
592
593 case DELETE_SLICE+0:
594 case DELETE_SLICE+1:
595 case DELETE_SLICE+2:
596 case DELETE_SLICE+3:
597 if ((opcode-DELETE_SLICE) & 2)
598 w = POP();
599 else
600 w = NULL;
601 if ((opcode-DELETE_SLICE) & 1)
602 v = POP();
603 else
604 v = NULL;
605 u = POP();
606 err = assign_slice(u, v, w, (object *)NULL);
607 /* del u[v:w] */
608 DECREF(u);
609 XDECREF(v);
610 XDECREF(w);
611 break;
612
613 case STORE_SUBSCR:
614 w = POP();
615 v = POP();
616 u = POP();
617 /* v[w] = u */
618 err = assign_subscript(v, w, u);
619 DECREF(u);
620 DECREF(v);
621 DECREF(w);
622 break;
623
624 case DELETE_SUBSCR:
625 w = POP();
626 v = POP();
627 /* del v[w] */
628 err = assign_subscript(v, w, (object *)NULL);
629 DECREF(v);
630 DECREF(w);
631 break;
632
633 case PRINT_EXPR:
634 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 /* Print value except if procedure result */
636 if (v != None) {
637 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000638 x = sysget("stdout");
639 softspace(x, 1);
640 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000641 flushline();
642 }
643 DECREF(v);
644 break;
645
646 case PRINT_ITEM:
647 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000648 w = sysget("stdout");
649 if (softspace(w, 1))
650 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000651 if (is_stringobject(v)) {
652 char *s = getstringvalue(v);
653 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000654 err = writeobject(v, w, PRINT_RAW);
655 if (err == 0 && len > 0 && s[len-1] == '\n')
656 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 }
658 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000659 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 }
661 DECREF(v);
662 break;
663
664 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000665 x = sysget("stdout");
666 if (x == NULL)
667 err_setstr(RuntimeError, "lost sys.stdout");
668 else {
669 writestring("\n", x);
670 softspace(x, 0);
671 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000672 break;
673
674 case BREAK_LOOP:
675 why = WHY_BREAK;
676 break;
677
678 case RAISE_EXCEPTION:
679 v = POP();
680 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000681 /* A tuple is equivalent to its first element here */
682 while (is_tupleobject(w)) {
683 u = w;
684 w = gettupleitem(u, 0);
685 DECREF(u);
686 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 if (!is_stringobject(w))
688 err_setstr(TypeError,
689 "exceptions must be strings");
690 else
691 err_setval(w, v);
692 DECREF(v);
693 DECREF(w);
694 why = WHY_EXCEPTION;
695 break;
696
697 case LOAD_LOCALS:
698 v = f->f_locals;
699 INCREF(v);
700 PUSH(v);
701 break;
702
703 case RETURN_VALUE:
704 retval = POP();
705 why = WHY_RETURN;
706 break;
707
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 case BUILD_FUNCTION:
709 v = POP();
710 x = newfuncobject(v, f->f_globals);
711 DECREF(v);
712 PUSH(x);
713 break;
714
715 case POP_BLOCK:
716 {
717 block *b = pop_block(f);
718 while (STACK_LEVEL() > b->b_level) {
719 v = POP();
720 DECREF(v);
721 }
722 }
723 break;
724
725 case END_FINALLY:
726 v = POP();
727 if (is_intobject(v)) {
728 why = (enum why_code) getintvalue(v);
729 if (why == WHY_RETURN)
730 retval = POP();
731 }
732 else if (is_stringobject(v)) {
733 w = POP();
734 err_setval(v, w);
735 DECREF(w);
736 w = POP();
737 tb_store(w);
738 DECREF(w);
739 why = WHY_RERAISE;
740 }
741 else if (v != None) {
742 err_setstr(SystemError,
743 "'finally' pops bad exception");
744 why = WHY_EXCEPTION;
745 }
746 DECREF(v);
747 break;
748
749 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000750 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000752 w = POP();
753 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000755 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 DECREF(v);
757 DECREF(w);
758 break;
759
760 case STORE_NAME:
761 w = GETNAMEV(oparg);
762 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000763 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000764 if (u == NULL) {
765 if (defmode != 0) {
766 if (v != None)
767 u = (object *)v->ob_type;
768 else
769 u = NULL;
770 x = newaccessobject(v, class,
771 (typeobject *)u,
772 defmode);
773 DECREF(v);
774 if (x == NULL)
775 break;
776 v = x;
777 }
778 }
779 else if (is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000780 err = setaccessvalue(u, class, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000781 DECREF(v);
782 break;
783 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 err = dict2insert(f->f_locals, w, v);
785 DECREF(v);
786 break;
787
788 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000789 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000790 u = dict2lookup(f->f_locals, w);
791 if (u != NULL && is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000792 err = setaccessvalue(u, class,
Guido van Rossum25831651993-05-19 14:50:45 +0000793 (object *)NULL);
794 break;
795 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000796 if ((err = dict2remove(f->f_locals, w)) != 0)
797 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000798 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000799
800#ifdef CASE_TOO_BIG
801 default: switch (opcode) {
802#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000803
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000804 case UNPACK_VARARG:
805 if (EMPTY()) {
806 err_setstr(TypeError,
807 "no argument list");
808 why = WHY_EXCEPTION;
809 break;
810 }
811 v = POP();
812 if (!is_tupleobject(v)) {
813 err_setstr(TypeError,
814 "bad argument list");
815 why = WHY_EXCEPTION;
816 }
817 else if (gettuplesize(v) < oparg) {
818 err_setstr(TypeError,
819 "not enough arguments");
820 why = WHY_EXCEPTION;
821 }
822 else if (oparg == 0) {
823 PUSH(v);
824 break;
825 }
826 else {
827 x = gettupleslice(v, oparg, gettuplesize(v));
828 if (x != NULL) {
829 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000830 if (!CHECK_STACK(oparg)) {
831 x = NULL;
832 break;
833 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000834 for (; --oparg >= 0; ) {
835 w = gettupleitem(v, oparg);
836 INCREF(w);
837 PUSH(w);
838 }
839 }
840 }
841 DECREF(v);
842 break;
843
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000844 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000845 {
846 int n;
847 if (EMPTY()) {
848 err_setstr(TypeError,
849 "no argument list");
850 why = WHY_EXCEPTION;
851 break;
852 }
853 v = POP();
854 if (!is_tupleobject(v)) {
855 err_setstr(TypeError,
856 "bad argument list");
857 why = WHY_EXCEPTION;
858 break;
859 }
860 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000861#ifdef COMPAT_HACKS
862/* Implement various compatibility hacks (for 0.9.4 or earlier):
863 (a) f(a,b,...) accepts f((1,2,...))
864 (b) f((a,b,...)) accepts f(1,2,...)
865 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
866*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000867 if (n == 1 && oparg != 1) {
868 /* Rule (a) */
869 w = gettupleitem(v, 0);
870 if (is_tupleobject(w)) {
871 INCREF(w);
872 DECREF(v);
873 v = w;
874 n = gettuplesize(v);
875 }
876 }
877 else if (n != 1 && oparg == 1) {
878 /* Rule (b) */
879 PUSH(v);
880 break;
881 /* Don't fall through */
882 }
883 else if (n > 2 && oparg == 2) {
884 /* Rule (c) */
885 int i;
886 w = newtupleobject(n-1);
887 u = newtupleobject(2);
888 if (u == NULL || w == NULL) {
889 XDECREF(w);
890 XDECREF(u);
891 DECREF(v);
892 why = WHY_EXCEPTION;
893 break;
894 }
895 t = gettupleitem(v, 0);
896 INCREF(t);
897 settupleitem(u, 0, t);
898 for (i = 1; i < n; i++) {
899 t = gettupleitem(v, i);
900 INCREF(t);
901 settupleitem(w, i-1, t);
902 }
903 settupleitem(u, 1, w);
904 DECREF(v);
905 v = u;
906 n = 2;
907 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000908#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000909 if (n != oparg) {
910 err_setstr(TypeError,
911 "arg count mismatch");
912 why = WHY_EXCEPTION;
913 DECREF(v);
914 break;
915 }
916 PUSH(v);
917 }
918 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 case UNPACK_TUPLE:
920 v = POP();
921 if (!is_tupleobject(v)) {
922 err_setstr(TypeError, "unpack non-tuple");
923 why = WHY_EXCEPTION;
924 }
925 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000926 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 "unpack tuple of wrong size");
928 why = WHY_EXCEPTION;
929 }
930 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000931 if (!CHECK_STACK(oparg)) {
932 x = NULL;
933 break;
934 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 for (; --oparg >= 0; ) {
936 w = gettupleitem(v, oparg);
937 INCREF(w);
938 PUSH(w);
939 }
940 }
941 DECREF(v);
942 break;
943
944 case UNPACK_LIST:
945 v = POP();
946 if (!is_listobject(v)) {
947 err_setstr(TypeError, "unpack non-list");
948 why = WHY_EXCEPTION;
949 }
950 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000951 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 "unpack list of wrong size");
953 why = WHY_EXCEPTION;
954 }
955 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000956 if (!CHECK_STACK(oparg)) {
957 x = NULL;
958 break;
959 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 for (; --oparg >= 0; ) {
961 w = getlistitem(v, oparg);
962 INCREF(w);
963 PUSH(w);
964 }
965 }
966 DECREF(v);
967 break;
968
969 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000970 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 v = POP();
972 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000973 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 DECREF(v);
975 DECREF(u);
976 break;
977
978 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000979 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000981 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 DECREF(v);
983 break;
984
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000985 case STORE_GLOBAL:
986 w = GETNAMEV(oparg);
987 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000988 u = dict2lookup(f->f_locals, w);
989 if (u != NULL && is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +0000990 err = setaccessvalue(u, class, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000991 DECREF(v);
992 break;
993 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000994 err = dict2insert(f->f_globals, w, v);
995 DECREF(v);
996 break;
997
998 case DELETE_GLOBAL:
999 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001000 u = dict2lookup(f->f_locals, w);
1001 if (u != NULL && is_accessobject(u)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001002 err = setaccessvalue(u, class,
Guido van Rossum25831651993-05-19 14:50:45 +00001003 (object *)NULL);
1004 break;
1005 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001006 if ((err = dict2remove(f->f_globals, w)) != 0)
1007 err_setstr(NameError, getstringvalue(w));
1008 break;
1009
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 case LOAD_CONST:
1011 x = GETCONST(oparg);
1012 INCREF(x);
1013 PUSH(x);
1014 break;
1015
1016 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001017 w = GETNAMEV(oparg);
1018 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001020 err_clear();
1021 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001023 err_clear();
1024 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001026 err_setstr(NameError,
1027 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 break;
1029 }
1030 }
1031 }
Guido van Rossum25831651993-05-19 14:50:45 +00001032 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001033 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001034 if (x == NULL)
1035 break;
1036 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001037 else
1038 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 PUSH(x);
1040 break;
1041
1042 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001043 w = GETNAMEV(oparg);
1044 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001046 err_clear();
1047 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001049 err_setstr(NameError,
1050 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 break;
1052 }
1053 }
Guido van Rossum25831651993-05-19 14:50:45 +00001054 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001055 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001056 if (x == NULL)
1057 break;
1058 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001059 else
1060 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 PUSH(x);
1062 break;
1063
1064 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001065 w = GETNAMEV(oparg);
1066 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001067 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001068 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 break;
1070 }
Guido van Rossum25831651993-05-19 14:50:45 +00001071 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001072 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001073 if (x == NULL)
1074 break;
1075 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001076 else
1077 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001078 PUSH(x);
1079 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001080
1081 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001082 x = GETCONST(oparg);
1083 if (x == None)
1084 break;
1085 if (x == NULL || !is_dictobject(x)) {
1086 fatal("bad RESERVE_FAST");
1087 err_setstr(SystemError, "bad RESERVE_FAST");
1088 x = NULL;
1089 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001090 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001091 XDECREF(f->f_fastlocals);
1092 XDECREF(f->f_localmap);
1093 INCREF(x);
1094 f->f_localmap = x;
1095 f->f_fastlocals = x = newlistobject(
1096 x->ob_type->tp_as_mapping->mp_length(x));
1097 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001098 break;
1099
1100 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001101 x = GETLISTITEM(fastlocals, oparg);
1102 if (x == NULL) {
1103 err_setstr(NameError,
1104 "undefined local variable");
1105 break;
1106 }
Guido van Rossum25831651993-05-19 14:50:45 +00001107 if (is_accessobject(x)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001108 x = getaccessvalue(x, class);
Guido van Rossum25831651993-05-19 14:50:45 +00001109 if (x == NULL)
1110 break;
1111 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001112 else
1113 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001114 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 break;
1116
1117 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001118 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001119 w = GETLISTITEM(fastlocals, oparg);
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, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001122 DECREF(v);
1123 break;
1124 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001125 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001126 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001127 break;
1128
1129 case DELETE_FAST:
1130 x = GETLISTITEM(fastlocals, oparg);
1131 if (x == NULL) {
1132 err_setstr(NameError,
1133 "undefined local variable");
1134 break;
1135 }
Guido van Rossum25831651993-05-19 14:50:45 +00001136 if (w != NULL && is_accessobject(w)) {
Guido van Rossum81daa321993-05-20 14:24:46 +00001137 err = setaccessvalue(w, class, (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001138 break;
1139 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001140 DECREF(x);
1141 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001142 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001143
1144 case BUILD_TUPLE:
1145 x = newtupleobject(oparg);
1146 if (x != NULL) {
1147 for (; --oparg >= 0;) {
1148 w = POP();
1149 err = settupleitem(x, oparg, w);
1150 if (err != 0)
1151 break;
1152 }
1153 PUSH(x);
1154 }
1155 break;
1156
1157 case BUILD_LIST:
1158 x = newlistobject(oparg);
1159 if (x != NULL) {
1160 for (; --oparg >= 0;) {
1161 w = POP();
1162 err = setlistitem(x, oparg, w);
1163 if (err != 0)
1164 break;
1165 }
1166 PUSH(x);
1167 }
1168 break;
1169
1170 case BUILD_MAP:
1171 x = newdictobject();
1172 PUSH(x);
1173 break;
1174
1175 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001176 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001178 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 DECREF(v);
1180 PUSH(x);
1181 break;
1182
1183 case COMPARE_OP:
1184 w = POP();
1185 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001186 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 DECREF(v);
1188 DECREF(w);
1189 PUSH(x);
1190 break;
1191
1192 case IMPORT_NAME:
1193 name = GETNAME(oparg);
1194 x = import_module(name);
1195 XINCREF(x);
1196 PUSH(x);
1197 break;
1198
1199 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001200 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001202 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001203 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001205
1206 case ACCESS_MODE:
1207 v = POP();
1208 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001209 if (getstringvalue(w)[0] == '*')
1210 defmode = getintvalue(v);
1211 else
1212 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001213 DECREF(v);
1214 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001215
1216 case JUMP_FORWARD:
1217 JUMPBY(oparg);
1218 break;
1219
1220 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001221 err = testbool(TOP());
1222 if (err > 0)
1223 err = 0;
1224 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 JUMPBY(oparg);
1226 break;
1227
1228 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001229 err = testbool(TOP());
1230 if (err > 0) {
1231 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001233 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 break;
1235
1236 case JUMP_ABSOLUTE:
1237 JUMPTO(oparg);
1238 break;
1239
1240 case FOR_LOOP:
1241 /* for v in s: ...
1242 On entry: stack contains s, i.
1243 On exit: stack contains s, i+1, s[i];
1244 but if loop exhausted:
1245 s, i are popped, and we jump */
1246 w = POP(); /* Loop index */
1247 v = POP(); /* Sequence object */
1248 u = loop_subscript(v, w);
1249 if (u != NULL) {
1250 PUSH(v);
1251 x = newintobject(getintvalue(w)+1);
1252 PUSH(x);
1253 DECREF(w);
1254 PUSH(u);
1255 }
1256 else {
1257 DECREF(v);
1258 DECREF(w);
1259 /* A NULL can mean "s exhausted"
1260 but also an error: */
1261 if (err_occurred())
1262 why = WHY_EXCEPTION;
1263 else
1264 JUMPBY(oparg);
1265 }
1266 break;
1267
1268 case SETUP_LOOP:
1269 case SETUP_EXCEPT:
1270 case SETUP_FINALLY:
1271 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1272 STACK_LEVEL());
1273 break;
1274
1275 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001276#ifdef LLTRACE
1277 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 printf("--- Line %d ---\n", oparg);
1279#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001280 f->f_lineno = oparg;
1281 if (trace != NULL) {
1282 /* Trace each line of code reached */
1283 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001284 err = call_trace(&trace, &trace,
1285 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001286 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 break;
1288
1289 default:
1290 fprintf(stderr,
1291 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001292 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 err_setstr(SystemError, "eval_code: unknown opcode");
1294 why = WHY_EXCEPTION;
1295 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001296
1297#ifdef CASE_TOO_BIG
1298 }
1299#endif
1300
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 } /* switch */
1302
1303 on_error:
1304
1305 /* Quickly continue if no error occurred */
1306
1307 if (why == WHY_NOT) {
1308 if (err == 0 && x != NULL)
1309 continue; /* Normal, fast path */
1310 why = WHY_EXCEPTION;
1311 x = None;
1312 err = 0;
1313 }
1314
Guido van Rossum801dcae1992-04-08 11:32:32 +00001315#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 /* Double-check exception status */
1317
1318 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1319 if (!err_occurred()) {
1320 fprintf(stderr, "XXX ghost error\n");
1321 err_setstr(SystemError, "ghost error");
1322 why = WHY_EXCEPTION;
1323 }
1324 }
1325 else {
1326 if (err_occurred()) {
1327 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001328 abort();
1329 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001330 why = WHY_EXCEPTION;
1331 }
1332 }
1333#endif
1334
1335 /* Log traceback info if this is a real exception */
1336
1337 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001338 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001340 f->f_lasti -= 2;
1341 tb_here(f);
1342
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001343 if (trace)
1344 call_exc_trace(&trace, &trace, f);
1345 if (sys_profile)
1346 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 }
1348
1349 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1350
1351 if (why == WHY_RERAISE)
1352 why = WHY_EXCEPTION;
1353
1354 /* Unwind stacks if a (pseudo) exception occurred */
1355
1356 while (why != WHY_NOT && f->f_iblock > 0) {
1357 block *b = pop_block(f);
1358 while (STACK_LEVEL() > b->b_level) {
1359 v = POP();
1360 XDECREF(v);
1361 }
1362 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1363 why = WHY_NOT;
1364 JUMPTO(b->b_handler);
1365 break;
1366 }
1367 if (b->b_type == SETUP_FINALLY ||
1368 b->b_type == SETUP_EXCEPT &&
1369 why == WHY_EXCEPTION) {
1370 if (why == WHY_EXCEPTION) {
1371 object *exc, *val;
1372 err_get(&exc, &val);
1373 if (val == NULL) {
1374 val = None;
1375 INCREF(val);
1376 }
1377 v = tb_fetch();
1378 /* Make the raw exception data
1379 available to the handler,
1380 so a program can emulate the
1381 Python main loop. Don't do
1382 this for 'finally'. */
1383 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 sysset("exc_value", val);
1386 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 }
1388 PUSH(v);
1389 PUSH(val);
1390 PUSH(exc);
1391 }
1392 else {
1393 if (why == WHY_RETURN)
1394 PUSH(retval);
1395 v = newintobject((long)why);
1396 PUSH(v);
1397 }
1398 why = WHY_NOT;
1399 JUMPTO(b->b_handler);
1400 break;
1401 }
1402 } /* unwind stack */
1403
1404 /* End the loop if we still have an error (or return) */
1405
1406 if (why != WHY_NOT)
1407 break;
1408
1409 } /* main loop */
1410
1411 /* Pop remaining stack entries */
1412
1413 while (!EMPTY()) {
1414 v = POP();
1415 XDECREF(v);
1416 }
1417
Guido van Rossum96a42c81992-01-12 02:29:51 +00001418 if (why != WHY_RETURN)
1419 retval = NULL;
1420
1421 if (trace) {
1422 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001423 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001424 XDECREF(retval);
1425 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001426 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001427 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001428 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001429 XDECREF(trace);
1430 }
1431
1432 if (sys_profile && why == WHY_RETURN) {
1433 if (call_trace(&sys_profile, (object**)0,
1434 f, "return", retval)) {
1435 XDECREF(retval);
1436 retval = NULL;
1437 why = WHY_EXCEPTION;
1438 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001439 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001440
1441 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1442 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001443
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 /* Restore previous frame and release the current one */
1445
1446 current_frame = f->f_back;
1447 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001448
1449 if (needmerge)
1450 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001451
Guido van Rossum96a42c81992-01-12 02:29:51 +00001452 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001453}
1454
Guido van Rossum96a42c81992-01-12 02:29:51 +00001455#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001456static int
1457prtrace(v, str)
1458 object *v;
1459 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001461 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001462 if (printobject(v, stdout, 0) != 0)
1463 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001464 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001466#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001468static void
1469call_exc_trace(p_trace, p_newtrace, f)
1470 object **p_trace, **p_newtrace;
1471 frameobject *f;
1472{
1473 object *type, *value, *traceback, *arg;
1474 int err;
1475 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001476 if (value == NULL) {
1477 value = None;
1478 INCREF(value);
1479 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001480 traceback = tb_fetch();
1481 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001482 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001483 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001484 settupleitem(arg, 0, type);
1485 settupleitem(arg, 1, value);
1486 settupleitem(arg, 2, traceback);
1487 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001488 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001489 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001490 /* Restore original exception */
1491 err_setval(type, value);
1492 tb_store(traceback);
1493 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001494 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001495}
1496
1497static int
1498call_trace(p_trace, p_newtrace, f, msg, arg)
1499 object **p_trace; /* in/out; may not be NULL;
1500 may not point to NULL variable initially */
1501 object **p_newtrace; /* in/out; may be NULL;
1502 may point to NULL variable;
1503 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001504 frameobject *f;
1505 char *msg;
1506 object *arg;
1507{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001508 object *arglist, *what;
1509 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001510 static int tracing = 0;
1511
1512 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001513 /* Don't do recursive traces */
1514 if (p_newtrace) {
1515 XDECREF(*p_newtrace);
1516 *p_newtrace = NULL;
1517 }
1518 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001519 }
1520
1521 arglist = newtupleobject(3);
1522 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001523 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001524 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001525 if (what == NULL)
1526 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001527 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001528 settupleitem(arglist, 0, (object *)f);
1529 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001530 if (arg == NULL)
1531 arg = None;
1532 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001533 settupleitem(arglist, 2, arg);
1534 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001535 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001536 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001537 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001538 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001539 cleanup:
1540 XDECREF(arglist);
1541 if (res == NULL) {
1542 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001543 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001544 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001545 *p_trace = NULL;
1546 if (p_newtrace) {
1547 XDECREF(*p_newtrace);
1548 *p_newtrace = NULL;
1549 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001550 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001551 }
1552 else {
1553 if (p_newtrace) {
1554 XDECREF(*p_newtrace);
1555 if (res == None)
1556 *p_newtrace = NULL;
1557 else {
1558 INCREF(res);
1559 *p_newtrace = res;
1560 }
1561 }
1562 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001563 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001564 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001565}
1566
Guido van Rossum5b722181993-03-30 17:46:03 +00001567static void
1568fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001569 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001570{
1571 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001572 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001573 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001574 int pos;
1575 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001576 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001577 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001578 locals = f->f_locals;
1579 fast = f->f_fastlocals;
1580 map = f->f_localmap;
1581 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001582 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001583 if (!is_dictobject(locals) || !is_listobject(fast) ||
1584 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001585 return;
1586 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001587 pos = 0;
1588 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001589 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001590 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001591 continue;
1592 j = getintvalue(value);
1593 value = getlistitem(fast, j);
1594 if (value == NULL) {
1595 err_clear();
1596 if (dict2remove(locals, key) != 0)
1597 err_clear();
1598 }
1599 else {
1600 if (dict2insert(locals, key, value) != 0)
1601 err_clear();
1602 }
1603 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001604 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001605}
1606
1607static void
1608locals_2_fast(f, clear)
1609 frameobject *f;
1610 int clear;
1611{
1612 /* Merge f->f_locals into f->f_fastlocals */
1613 object *locals, *fast, *map;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001614 object *error_type, *error_value;
Guido van Rossum25831651993-05-19 14:50:45 +00001615 int pos;
1616 object *key, *value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001617 if (f == NULL)
1618 return;
1619 locals = f->f_locals;
1620 fast = f->f_fastlocals;
1621 map = f->f_localmap;
1622 if (locals == NULL || fast == NULL || map == NULL)
1623 return;
1624 if (!is_dictobject(locals) || !is_listobject(fast) ||
1625 !is_dictobject(map))
1626 return;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001627 err_get(&error_type, &error_value);
Guido van Rossum25831651993-05-19 14:50:45 +00001628 pos = 0;
1629 while (mappinggetnext(map, &pos, &key, &value)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001630 int j;
Guido van Rossum25831651993-05-19 14:50:45 +00001631 if (!is_intobject(value))
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001632 continue;
1633 j = getintvalue(value);
1634 value = dict2lookup(locals, key);
1635 if (value == NULL)
1636 err_clear();
1637 else
1638 INCREF(value);
1639 if (value != NULL || clear)
1640 if (setlistitem(fast, j, value) != 0)
1641 err_clear();
1642 }
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001643 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001644}
1645
1646void
1647mergelocals()
1648{
1649 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001650}
1651
1652object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001653getlocals()
1654{
1655 if (current_frame == NULL)
1656 return NULL;
1657 fast_2_locals(current_frame);
1658 return current_frame->f_locals;
1659}
1660
1661object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001662getglobals()
1663{
1664 if (current_frame == NULL)
1665 return NULL;
1666 else
1667 return current_frame->f_globals;
1668}
1669
Guido van Rossum81daa321993-05-20 14:24:46 +00001670object *
1671getclass()
1672{
1673 if (current_frame == NULL)
1674 return NULL;
1675 else
1676 return current_frame->f_class;
1677}
1678
Guido van Rossum3f5da241990-12-20 15:06:42 +00001679void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001680printtraceback(f)
1681 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001682{
1683 object *v = tb_fetch();
1684 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001685 writestring("Stack backtrace (innermost last):\n", f);
1686 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001687 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689}
1690
1691
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692void
1693flushline()
1694{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001695 object *f = sysget("stdout");
1696 if (softspace(f, 0))
1697 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698}
1699
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001702or(v, w)
1703 object *v, *w;
1704{
1705 if (v->ob_type->tp_as_number != NULL) {
1706 object *x;
1707 object * (*f) FPROTO((object *, object *));
1708 if (coerce(&v, &w) != 0)
1709 return NULL;
1710 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1711 x = (*f)(v, w);
1712 DECREF(v);
1713 DECREF(w);
1714 if (f != NULL)
1715 return x;
1716 }
1717 err_setstr(TypeError, "bad operand type(s) for |");
1718 return NULL;
1719}
1720
1721static object *
1722xor(v, w)
1723 object *v, *w;
1724{
1725 if (v->ob_type->tp_as_number != NULL) {
1726 object *x;
1727 object * (*f) FPROTO((object *, object *));
1728 if (coerce(&v, &w) != 0)
1729 return NULL;
1730 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1731 x = (*f)(v, w);
1732 DECREF(v);
1733 DECREF(w);
1734 if (f != NULL)
1735 return x;
1736 }
1737 err_setstr(TypeError, "bad operand type(s) for ^");
1738 return NULL;
1739}
1740
1741static object *
1742and(v, w)
1743 object *v, *w;
1744{
1745 if (v->ob_type->tp_as_number != NULL) {
1746 object *x;
1747 object * (*f) FPROTO((object *, object *));
1748 if (coerce(&v, &w) != 0)
1749 return NULL;
1750 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1751 x = (*f)(v, w);
1752 DECREF(v);
1753 DECREF(w);
1754 if (f != NULL)
1755 return x;
1756 }
1757 err_setstr(TypeError, "bad operand type(s) for &");
1758 return NULL;
1759}
1760
1761static object *
1762lshift(v, w)
1763 object *v, *w;
1764{
1765 if (v->ob_type->tp_as_number != NULL) {
1766 object *x;
1767 object * (*f) FPROTO((object *, object *));
1768 if (coerce(&v, &w) != 0)
1769 return NULL;
1770 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1771 x = (*f)(v, w);
1772 DECREF(v);
1773 DECREF(w);
1774 if (f != NULL)
1775 return x;
1776 }
1777 err_setstr(TypeError, "bad operand type(s) for <<");
1778 return NULL;
1779}
1780
1781static object *
1782rshift(v, w)
1783 object *v, *w;
1784{
1785 if (v->ob_type->tp_as_number != NULL) {
1786 object *x;
1787 object * (*f) FPROTO((object *, object *));
1788 if (coerce(&v, &w) != 0)
1789 return NULL;
1790 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1791 x = (*f)(v, w);
1792 DECREF(v);
1793 DECREF(w);
1794 if (f != NULL)
1795 return x;
1796 }
1797 err_setstr(TypeError, "bad operand type(s) for >>");
1798 return NULL;
1799}
1800
1801static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001802add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 object *v, *w;
1804{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001805 if (v->ob_type->tp_as_sequence != NULL)
1806 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1807 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001808 object *x;
1809 if (coerce(&v, &w) != 0)
1810 return NULL;
1811 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1812 DECREF(v);
1813 DECREF(w);
1814 return x;
1815 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001816 err_setstr(TypeError, "bad operand type(s) for +");
1817 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818}
1819
1820static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001821sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 object *v, *w;
1823{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001824 if (v->ob_type->tp_as_number != NULL) {
1825 object *x;
1826 if (coerce(&v, &w) != 0)
1827 return NULL;
1828 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1829 DECREF(v);
1830 DECREF(w);
1831 return x;
1832 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001833 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 return NULL;
1835}
1836
1837static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 object *v, *w;
1840{
1841 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001842 tp = v->ob_type;
1843 if (tp->tp_as_number != NULL &&
1844 w->ob_type->tp_as_sequence != NULL &&
1845 !is_instanceobject(v)) {
1846 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 object *tmp = v;
1848 v = w;
1849 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001850 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001852 if (tp->tp_as_number != NULL) {
1853 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001854 if (is_instanceobject(v)) {
1855 /* Instances of user-defined classes get their
1856 other argument uncoerced, so they may
1857 implement sequence*number as well as
1858 number*number. */
1859 INCREF(v);
1860 INCREF(w);
1861 }
1862 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001863 return NULL;
1864 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1865 DECREF(v);
1866 DECREF(w);
1867 return x;
1868 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 if (tp->tp_as_sequence != NULL) {
1870 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001871 err_setstr(TypeError,
1872 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 return NULL;
1874 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001875 return (*tp->tp_as_sequence->sq_repeat)
1876 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001878 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 return NULL;
1880}
1881
1882static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001883divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 object *v, *w;
1885{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001886 if (v->ob_type->tp_as_number != NULL) {
1887 object *x;
1888 if (coerce(&v, &w) != 0)
1889 return NULL;
1890 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1891 DECREF(v);
1892 DECREF(w);
1893 return x;
1894 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001895 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 return NULL;
1897}
1898
1899static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001900rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 object *v, *w;
1902{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001903 if (v->ob_type->tp_as_number != NULL) {
1904 object *x;
1905 if (coerce(&v, &w) != 0)
1906 return NULL;
1907 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1908 DECREF(v);
1909 DECREF(w);
1910 return x;
1911 }
Guido van Rossume5372401993-03-16 12:15:04 +00001912 if (is_stringobject(v)) {
1913 return formatstring(v, w);
1914 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 return NULL;
1917}
1918
1919static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 object *v;
1922{
1923 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001924 return (*v->ob_type->tp_as_number->nb_negative)(v);
1925 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 return NULL;
1927}
1928
1929static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 object *v;
1932{
1933 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001934 return (*v->ob_type->tp_as_number->nb_positive)(v);
1935 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 return NULL;
1937}
1938
1939static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001940invert(v)
1941 object *v;
1942{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001943 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001944 if (v->ob_type->tp_as_number != NULL &&
1945 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1946 return (*f)(v);
1947 err_setstr(TypeError, "bad operand type(s) for unary ~");
1948 return NULL;
1949}
1950
1951static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 object *v;
1954{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001956 object *w;
1957 if (outcome < 0)
1958 return NULL;
1959 if (outcome == 0)
1960 w = True;
1961 else
1962 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963 INCREF(w);
1964 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001966/* External interface to call any callable object. The arg may be NULL. */
1967
1968object *
1969call_object(func, arg)
1970 object *func;
1971 object *arg;
1972{
1973 if (is_instancemethodobject(func) || is_funcobject(func))
1974 return call_function(func, arg);
1975 else
1976 return call_builtin(func, arg);
1977}
1978
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 if (is_methodobject(func)) {
1985 method meth = getmethod(func);
1986 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001987 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1988 int size = gettuplesize(arg);
1989 if (size == 1)
1990 arg = gettupleitem(arg, 0);
1991 else if (size == 0)
1992 arg = NULL;
1993 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 }
1996 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00001997 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001999 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 return NULL;
2001}
2002
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002004call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002006 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008 object *newarg = NULL;
2009 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002010 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002011 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012
Guido van Rossume8122f11991-05-05 20:03:07 +00002013 if (is_instancemethodobject(func)) {
2014 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002015 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002016 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002017 if (self == NULL) {
2018 /* Unbound methods must be called with an instance of
2019 the class (or a derived class) as first argument */
2020 if (arg != NULL && is_tupleobject(arg) &&
2021 gettuplesize(arg) >= 1) {
2022 self = gettupleitem(arg, 0);
2023 if (self != NULL &&
2024 is_instanceobject(self) &&
2025 issubclass((object *)
2026 (((instanceobject *)self)->in_class),
2027 class))
2028 /* self = self */ ;
2029 else
2030 self = NULL;
2031 }
2032 if (self == NULL) {
2033 err_setstr(TypeError,
2034 "unbound method must be called with class instance argument");
2035 return NULL;
2036 }
2037 }
2038 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002039 int argcount;
2040 if (arg == NULL)
2041 argcount = 0;
2042 else if (is_tupleobject(arg))
2043 argcount = gettuplesize(arg);
2044 else
2045 argcount = 1;
2046 newarg = newtupleobject(argcount + 1);
2047 if (newarg == NULL)
2048 return NULL;
2049 INCREF(self);
2050 settupleitem(newarg, 0, self);
2051 if (arg != NULL && !is_tupleobject(arg)) {
2052 INCREF(arg);
2053 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002054 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002055 else {
2056 int i;
2057 object *v;
2058 for (i = 0; i < argcount; i++) {
2059 v = gettupleitem(arg, i);
2060 XINCREF(v);
2061 settupleitem(newarg, i+1, v);
2062 }
2063 }
2064 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 }
2066 }
2067 else {
2068 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 return NULL;
2071 }
2072 }
2073
Guido van Rossum3f5da241990-12-20 15:06:42 +00002074 co = getfunccode(func);
2075 if (co == NULL) {
2076 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077 return NULL;
2078 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 if (!is_codeobject(co)) {
2080 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 abort();
2082 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 return NULL;
2087 }
2088
Guido van Rossum3f5da241990-12-20 15:06:42 +00002089 newglobals = getfuncglobals(func);
2090 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091
Guido van Rossum81daa321993-05-20 14:24:46 +00002092 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 DECREF(newlocals);
2095 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098
2099 return v;
2100}
2101
2102static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 object *v, *w;
2105{
2106 typeobject *tp = v->ob_type;
2107 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002108 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 return NULL;
2110 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002111 if (tp->tp_as_mapping != NULL) {
2112 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2113 }
2114 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 int i;
2116 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 return NULL;
2119 }
2120 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002121 if (i < 0) {
2122 int len = (*tp->tp_as_sequence->sq_length)(v);
2123 if (len < 0)
2124 return NULL;
2125 i += len;
2126 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002127 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002128 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129}
2130
2131static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002132loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 object *v, *w;
2134{
2135 sequence_methods *sq = v->ob_type->tp_as_sequence;
2136 int i, n;
2137 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 return NULL;
2140 }
2141 i = getintvalue(w);
2142 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002143 if (n < 0)
2144 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 if (i >= n)
2146 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002147 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148}
2149
2150static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002151slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 object *v;
2153 int isize;
2154 int *pi;
2155{
2156 if (v != NULL) {
2157 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002158 err_setstr(TypeError, "slice index must be int");
2159 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 }
2161 *pi = getintvalue(v);
2162 if (*pi < 0)
2163 *pi += isize;
2164 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002165 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166}
2167
2168static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002169apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 object *u, *v, *w;
2171{
2172 typeobject *tp = u->ob_type;
2173 int ilow, ihigh, isize;
2174 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002175 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 return NULL;
2177 }
2178 ilow = 0;
2179 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002180 if (isize < 0)
2181 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002182 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002184 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002186 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002188
2189static int
2190assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191 object *w;
2192 object *key;
2193 object *v;
2194{
2195 typeobject *tp = w->ob_type;
2196 sequence_methods *sq;
2197 mapping_methods *mp;
2198 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002199 if ((mp = tp->tp_as_mapping) != NULL &&
2200 (func = mp->mp_ass_subscript) != NULL) {
2201 return (*func)(w, key, v);
2202 }
2203 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 (func = sq->sq_ass_item) != NULL) {
2205 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002206 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002207 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002208 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002210 else {
2211 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002212 if (i < 0) {
2213 int len = (*sq->sq_length)(w);
2214 if (len < 0)
2215 return -1;
2216 i += len;
2217 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002218 return (*func)(w, i, v);
2219 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002222 err_setstr(TypeError,
2223 "can't assign to this subscripted object");
2224 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226}
2227
Guido van Rossum3f5da241990-12-20 15:06:42 +00002228static int
2229assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 object *u, *v, *w, *x;
2231{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002234 if (sq == NULL) {
2235 err_setstr(TypeError, "assign to slice of non-sequence");
2236 return -1;
2237 }
2238 if (sq == NULL || sq->sq_ass_slice == NULL) {
2239 err_setstr(TypeError, "unassignable slice");
2240 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 }
2242 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002243 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002244 if (isize < 0)
2245 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 if (slice_index(v, isize, &ilow) != 0)
2247 return -1;
2248 if (slice_index(w, isize, &ihigh) != 0)
2249 return -1;
2250 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251}
2252
2253static int
2254cmp_exception(err, v)
2255 object *err, *v;
2256{
2257 if (is_tupleobject(v)) {
2258 int i, n;
2259 n = gettuplesize(v);
2260 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002261 /* Test recursively */
2262 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 return 1;
2264 }
2265 return 0;
2266 }
2267 return err == v;
2268}
2269
Guido van Rossum3f5da241990-12-20 15:06:42 +00002270static int
2271cmp_member(v, w)
2272 object *v, *w;
2273{
2274 int i, n, cmp;
2275 object *x;
2276 sequence_methods *sq;
2277 /* Special case for char in string */
2278 if (is_stringobject(w)) {
2279 register char *s, *end;
2280 register char c;
2281 if (!is_stringobject(v) || getstringsize(v) != 1) {
2282 err_setstr(TypeError,
2283 "string member test needs char left operand");
2284 return -1;
2285 }
2286 c = getstringvalue(v)[0];
2287 s = getstringvalue(w);
2288 end = s + getstringsize(w);
2289 while (s < end) {
2290 if (c == *s++)
2291 return 1;
2292 }
2293 return 0;
2294 }
2295 sq = w->ob_type->tp_as_sequence;
2296 if (sq == NULL) {
2297 err_setstr(TypeError,
2298 "'in' or 'not in' needs sequence right argument");
2299 return -1;
2300 }
2301 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002302 if (n < 0)
2303 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304 for (i = 0; i < n; i++) {
2305 x = (*sq->sq_item)(w, i);
2306 cmp = cmpobject(v, x);
2307 XDECREF(x);
2308 if (cmp == 0)
2309 return 1;
2310 }
2311 return 0;
2312}
2313
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002316 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 register object *v;
2318 register object *w;
2319{
2320 register int cmp;
2321 register int res = 0;
2322 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002323 case IS:
2324 case IS_NOT:
2325 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002326 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002327 res = !res;
2328 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 case IN:
2330 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331 res = cmp_member(v, w);
2332 if (res < 0)
2333 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002334 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 break;
2337 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002338 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 break;
2340 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002341 cmp = cmpobject(v, w);
2342 switch (op) {
2343 case LT: res = cmp < 0; break;
2344 case LE: res = cmp <= 0; break;
2345 case EQ: res = cmp == 0; break;
2346 case NE: res = cmp != 0; break;
2347 case GT: res = cmp > 0; break;
2348 case GE: res = cmp >= 0; break;
2349 /* XXX no default? (res is initialized to 0 though) */
2350 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 }
2352 v = res ? True : False;
2353 INCREF(v);
2354 return v;
2355}
2356
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357static int
2358import_from(locals, v, name)
2359 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002360 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002361 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002362{
2363 object *w, *x;
2364 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002365 if (getstringvalue(name)[0] == '*') {
Guido van Rossum25831651993-05-19 14:50:45 +00002366 int pos;
2367 object *name, *value;
2368 pos = 0;
2369 while (mappinggetnext(w, &pos, &name, &value)) {
2370 if (!is_stringobject(name) ||
2371 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002372 continue;
Guido van Rossum25831651993-05-19 14:50:45 +00002373 if (dict2insert(locals, name, value) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002374 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002375 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002376 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002377 }
2378 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002379 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002381 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002382 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002383 getstringvalue(name));
2384 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385 return -1;
2386 }
2387 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002388 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002389 }
2390}
2391
2392static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002393build_class(methods, bases, name)
2394 object *methods; /* dictionary */
2395 object *bases; /* tuple containing classes */
2396 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002397{
Guido van Rossum25831651993-05-19 14:50:45 +00002398 int i;
2399 if (!is_tupleobject(bases)) {
2400 err_setstr(SystemError, "build_class with non-tuple bases");
2401 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002402 }
Guido van Rossum25831651993-05-19 14:50:45 +00002403 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002405 return NULL;
2406 }
Guido van Rossum25831651993-05-19 14:50:45 +00002407 if (!is_stringobject(name)) {
2408 err_setstr(SystemError, "build_class witn non-string name");
2409 return NULL;
2410 }
2411 for (i = gettuplesize(bases); --i >= 0; ) {
2412 object *base = gettupleitem(bases, i);
2413 if (!is_classobject(base)) {
2414 err_setstr(TypeError,
2415 "base is not a class object");
2416 return NULL;
2417 }
2418 }
2419 return newclassobject(bases, methods, name);
2420}
2421
2422static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002423access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002424 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002425 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002426 frameobject *f;
2427{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002428 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002429 object *value, *ac;
2430 typeobject *type;
2431 int fastind, ret;
2432 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002433 if (f->f_localmap == NULL)
2434 value = dict2lookup(f->f_locals, name);
2435 else {
2436 value = dict2lookup(f->f_localmap, name);
2437 if (value == NULL || !is_intobject(value))
2438 value = NULL;
2439 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002440 fastind = getintvalue(value);
2441 if (0 <= fastind &&
2442 fastind < getlistsize(f->f_fastlocals))
2443 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossum25831651993-05-19 14:50:45 +00002444 else {
2445 value = NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +00002446 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002447 }
2448 }
2449 }
2450 if (value && is_accessobject(value)) {
2451 err_setstr(AccessError, "can't override access");
2452 return -1;
2453 }
2454 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002455 if (value != NULL && value != None)
2456 type = value->ob_type;
2457 else
2458 type = NULL;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002459 ac = newaccessobject(value, f->f_class, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002460 if (ac == NULL)
2461 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002462 if (fastind >= 0)
2463 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002464 else {
2465 ret = dict2insert(f->f_locals, name, ac);
2466 DECREF(ac);
2467 }
2468 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002469}