blob: 44239e6c6fc153a2c38ace82673e44c4538eeaf5 [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 *));
87static object *build_class PROTO((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 Rossum374a9221991-04-04 10:40:29 +000090
91
Guido van Rossum0a066c01992-03-27 17:29:15 +000092/* Pointer to current frame, used to link new frames to */
93
Guido van Rossum374a9221991-04-04 10:40:29 +000094static frameobject *current_frame;
95
Guido van Rossum1984f1e1992-08-04 12:41:02 +000096#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000097
Guido van Rossum1984f1e1992-08-04 12:41:02 +000098#include <errno.h>
99#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000100
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101static type_lock interpreter_lock;
102
103void
104init_save_thread()
105{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000106 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000107 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108 interpreter_lock = allocate_lock();
109 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112#endif
113
Guido van Rossumff4949e1992-08-05 19:58:53 +0000114/* Functions save_thread and restore_thread are always defined so
115 dynamically loaded modules needn't be compiled separately for use
116 with and without threads: */
117
Guido van Rossum04691fc1992-08-12 15:35:34 +0000118object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119save_thread()
120{
121#ifdef USE_THREAD
122 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000123 object *res;
124 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125 current_frame = NULL;
126 release_lock(interpreter_lock);
127 return res;
128 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000130 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131}
132
133void
134restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000135 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000136{
137#ifdef USE_THREAD
138 if (interpreter_lock) {
139 int err;
140 err = errno;
141 acquire_lock(interpreter_lock, 1);
142 errno = err;
143 current_frame = (frameobject *)x;
144 }
145#endif
146}
147
148
Guido van Rossum374a9221991-04-04 10:40:29 +0000149/* Status code for main loop (reason for stack unwind) */
150
151enum why_code {
152 WHY_NOT, /* No error */
153 WHY_EXCEPTION, /* Exception occurred */
154 WHY_RERAISE, /* Exception re-raised by 'finally' */
155 WHY_RETURN, /* 'return' statement */
156 WHY_BREAK /* 'break' statement */
157};
158
159
160/* Interpreter main loop */
161
162object *
163eval_code(co, globals, locals, arg)
164 codeobject *co;
165 object *globals;
166 object *locals;
167 object *arg;
168{
169 register unsigned char *next_instr;
170 register int opcode; /* Current opcode */
171 register int oparg; /* Current opcode argument, if any */
172 register object **stack_pointer;
173 register enum why_code why; /* Reason for block stack unwind */
174 register int err; /* Error status -- nonzero if error */
175 register object *x; /* Result object -- NULL if error */
176 register object *v; /* Temporary objects popped off stack */
177 register object *w;
178 register object *u;
179 register object *t;
180 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000181 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000182 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000183 object *retval; /* Return value iff why == WHY_RETURN */
184 char *name; /* Name used by some instructions */
Guido van Rossum5b722181993-03-30 17:46:03 +0000185 int needmerge = 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000186#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000187 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000188#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000189#ifdef DEBUG
190 /* Make it easier to find out where we are with dbx */
191 char *filename = getstringvalue(co->co_filename);
192#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000193
194/* Code access macros */
195
196#define GETCONST(i) Getconst(f, i)
197#define GETNAME(i) Getname(f, i)
198#define GETNAMEV(i) Getnamev(f, i)
199#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
200#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
201#define NEXTOP() (*next_instr++)
202#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
203#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
204#define JUMPBY(x) (next_instr += (x))
205
206/* Stack manipulation macros */
207
208#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
209#define EMPTY() (STACK_LEVEL() == 0)
210#define TOP() (stack_pointer[-1])
211#define BASIC_PUSH(v) (*stack_pointer++ = (v))
212#define BASIC_POP() (*--stack_pointer)
213
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000214#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
215 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
216
Guido van Rossum96a42c81992-01-12 02:29:51 +0000217#ifdef LLTRACE
218#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
219#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000220#else
221#define PUSH(v) BASIC_PUSH(v)
222#define POP() BASIC_POP()
223#endif
224
Guido van Rossum5b722181993-03-30 17:46:03 +0000225 if (globals == NULL) {
226 globals = getglobals();
227 if (locals == NULL) {
228 locals = getlocals();
229 needmerge = 1;
230 }
231 }
232 else {
233 if (locals == NULL)
234 locals = globals;
235 }
236
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000237#ifdef LLTRACE
238 lltrace = dictlookup(globals, "__lltrace__") != NULL;
239#endif
240
Guido van Rossum374a9221991-04-04 10:40:29 +0000241 f = newframeobject(
242 current_frame, /*back*/
243 co, /*code*/
244 globals, /*globals*/
245 locals, /*locals*/
246 50, /*nvalues*/
247 20); /*nblocks*/
248 if (f == NULL)
249 return NULL;
250
251 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000252
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000253 if (sys_trace != NULL) {
254 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000255 be called on *every* entry to a code block.
256 Its return value, if not None, is a function that
257 will be called at the start of each executed line
258 of code. (Actually, the function must return
259 itself in order to continue tracing.)
260 The trace functions are called with three arguments:
261 a pointer to the current frame, a string indicating
262 why the function is called, and an argument which
263 depends on the situation. The global trace function
264 (sys.trace) is also called whenever an exception
265 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000266 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000267 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000268 current_frame = f->f_back;
269 DECREF(f);
270 return NULL;
271 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000272 }
273
274 if (sys_profile != NULL) {
275 /* Similar for sys_profile, except it needn't return
276 itself and isn't called for "line" events */
277 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
278 current_frame = f->f_back;
279 DECREF(f);
280 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000281 }
282 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000283
284 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000285 stack_pointer = f->f_valuestack;
286
287 if (arg != NULL) {
288 INCREF(arg);
289 PUSH(arg);
290 }
291
292 why = WHY_NOT;
293 err = 0;
294 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000295
296 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000297 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000298
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000299 /* Do periodic things.
300 Doing this every time through the loop would add
301 too much overhead (a function call per instruction).
302 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000303
304 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000305 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000306 if (intrcheck()) {
307 err_set(KeyboardInterrupt);
308 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000309 goto on_error;
310 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000311
312#ifdef USE_THREAD
313 if (interpreter_lock) {
314 /* Give another thread a chance */
315
316 current_frame = NULL;
317 release_lock(interpreter_lock);
318
319 /* Other threads may run now */
320
321 acquire_lock(interpreter_lock, 1);
322 current_frame = f;
323 }
324#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000325 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000326
Guido van Rossum374a9221991-04-04 10:40:29 +0000327 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000328
329#ifdef DEBUG
330 f->f_lasti = INSTR_OFFSET();
331#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000332
333 opcode = NEXTOP();
334 if (HAS_ARG(opcode))
335 oparg = NEXTARG();
336
Guido van Rossum96a42c81992-01-12 02:29:51 +0000337#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000338 /* Instruction tracing */
339
Guido van Rossum96a42c81992-01-12 02:29:51 +0000340 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000341 if (HAS_ARG(opcode)) {
342 printf("%d: %d, %d\n",
343 (int) (INSTR_OFFSET() - 3),
344 opcode, oparg);
345 }
346 else {
347 printf("%d: %d\n",
348 (int) (INSTR_OFFSET() - 1), opcode);
349 }
350 }
351#endif
352
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000353 if (!CHECK_STACK(3)) {
354 x = NULL;
355 break;
356 }
357
Guido van Rossum374a9221991-04-04 10:40:29 +0000358 /* Main switch on opcode */
359
360 switch (opcode) {
361
362 /* BEWARE!
363 It is essential that any operation that fails sets either
364 x to NULL, err to nonzero, or why to anything but WHY_NOT,
365 and that no operation that succeeds does this! */
366
367 /* case STOP_CODE: this is an error! */
368
369 case POP_TOP:
370 v = POP();
371 DECREF(v);
372 break;
373
374 case ROT_TWO:
375 v = POP();
376 w = POP();
377 PUSH(v);
378 PUSH(w);
379 break;
380
381 case ROT_THREE:
382 v = POP();
383 w = POP();
384 x = POP();
385 PUSH(v);
386 PUSH(x);
387 PUSH(w);
388 break;
389
390 case DUP_TOP:
391 v = TOP();
392 INCREF(v);
393 PUSH(v);
394 break;
395
396 case UNARY_POSITIVE:
397 v = POP();
398 x = pos(v);
399 DECREF(v);
400 PUSH(x);
401 break;
402
403 case UNARY_NEGATIVE:
404 v = POP();
405 x = neg(v);
406 DECREF(v);
407 PUSH(x);
408 break;
409
410 case UNARY_NOT:
411 v = POP();
412 x = not(v);
413 DECREF(v);
414 PUSH(x);
415 break;
416
417 case UNARY_CONVERT:
418 v = POP();
419 x = reprobject(v);
420 DECREF(v);
421 PUSH(x);
422 break;
423
424 case UNARY_CALL:
425 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000426 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000427 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000428 DECREF(v);
429 PUSH(x);
430 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000431
432 case UNARY_INVERT:
433 v = POP();
434 x = invert(v);
435 DECREF(v);
436 PUSH(x);
437 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000438
439 case BINARY_MULTIPLY:
440 w = POP();
441 v = POP();
442 x = mul(v, w);
443 DECREF(v);
444 DECREF(w);
445 PUSH(x);
446 break;
447
448 case BINARY_DIVIDE:
449 w = POP();
450 v = POP();
451 x = divide(v, w);
452 DECREF(v);
453 DECREF(w);
454 PUSH(x);
455 break;
456
457 case BINARY_MODULO:
458 w = POP();
459 v = POP();
460 x = rem(v, w);
461 DECREF(v);
462 DECREF(w);
463 PUSH(x);
464 break;
465
466 case BINARY_ADD:
467 w = POP();
468 v = POP();
469 x = add(v, w);
470 DECREF(v);
471 DECREF(w);
472 PUSH(x);
473 break;
474
475 case BINARY_SUBTRACT:
476 w = POP();
477 v = POP();
478 x = sub(v, w);
479 DECREF(v);
480 DECREF(w);
481 PUSH(x);
482 break;
483
484 case BINARY_SUBSCR:
485 w = POP();
486 v = POP();
487 x = apply_subscript(v, w);
488 DECREF(v);
489 DECREF(w);
490 PUSH(x);
491 break;
492
493 case BINARY_CALL:
494 w = POP();
495 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000496 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000497 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000498 DECREF(v);
499 DECREF(w);
500 PUSH(x);
501 break;
502
Guido van Rossum7928cd71991-10-24 14:59:31 +0000503 case BINARY_LSHIFT:
504 w = POP();
505 v = POP();
506 x = lshift(v, w);
507 DECREF(v);
508 DECREF(w);
509 PUSH(x);
510 break;
511
512 case BINARY_RSHIFT:
513 w = POP();
514 v = POP();
515 x = rshift(v, w);
516 DECREF(v);
517 DECREF(w);
518 PUSH(x);
519 break;
520
521 case BINARY_AND:
522 w = POP();
523 v = POP();
524 x = and(v, w);
525 DECREF(v);
526 DECREF(w);
527 PUSH(x);
528 break;
529
530 case BINARY_XOR:
531 w = POP();
532 v = POP();
533 x = xor(v, w);
534 DECREF(v);
535 DECREF(w);
536 PUSH(x);
537 break;
538
539 case BINARY_OR:
540 w = POP();
541 v = POP();
542 x = or(v, w);
543 DECREF(v);
544 DECREF(w);
545 PUSH(x);
546 break;
547
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 case SLICE+0:
549 case SLICE+1:
550 case SLICE+2:
551 case SLICE+3:
552 if ((opcode-SLICE) & 2)
553 w = POP();
554 else
555 w = NULL;
556 if ((opcode-SLICE) & 1)
557 v = POP();
558 else
559 v = NULL;
560 u = POP();
561 x = apply_slice(u, v, w);
562 DECREF(u);
563 XDECREF(v);
564 XDECREF(w);
565 PUSH(x);
566 break;
567
568 case STORE_SLICE+0:
569 case STORE_SLICE+1:
570 case STORE_SLICE+2:
571 case STORE_SLICE+3:
572 if ((opcode-STORE_SLICE) & 2)
573 w = POP();
574 else
575 w = NULL;
576 if ((opcode-STORE_SLICE) & 1)
577 v = POP();
578 else
579 v = NULL;
580 u = POP();
581 t = POP();
582 err = assign_slice(u, v, w, t); /* u[v:w] = t */
583 DECREF(t);
584 DECREF(u);
585 XDECREF(v);
586 XDECREF(w);
587 break;
588
589 case DELETE_SLICE+0:
590 case DELETE_SLICE+1:
591 case DELETE_SLICE+2:
592 case DELETE_SLICE+3:
593 if ((opcode-DELETE_SLICE) & 2)
594 w = POP();
595 else
596 w = NULL;
597 if ((opcode-DELETE_SLICE) & 1)
598 v = POP();
599 else
600 v = NULL;
601 u = POP();
602 err = assign_slice(u, v, w, (object *)NULL);
603 /* del u[v:w] */
604 DECREF(u);
605 XDECREF(v);
606 XDECREF(w);
607 break;
608
609 case STORE_SUBSCR:
610 w = POP();
611 v = POP();
612 u = POP();
613 /* v[w] = u */
614 err = assign_subscript(v, w, u);
615 DECREF(u);
616 DECREF(v);
617 DECREF(w);
618 break;
619
620 case DELETE_SUBSCR:
621 w = POP();
622 v = POP();
623 /* del v[w] */
624 err = assign_subscript(v, w, (object *)NULL);
625 DECREF(v);
626 DECREF(w);
627 break;
628
629 case PRINT_EXPR:
630 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 /* Print value except if procedure result */
632 if (v != None) {
633 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000634 x = sysget("stdout");
635 softspace(x, 1);
636 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 flushline();
638 }
639 DECREF(v);
640 break;
641
642 case PRINT_ITEM:
643 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000644 w = sysget("stdout");
645 if (softspace(w, 1))
646 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 if (is_stringobject(v)) {
648 char *s = getstringvalue(v);
649 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000650 err = writeobject(v, w, PRINT_RAW);
651 if (err == 0 && len > 0 && s[len-1] == '\n')
652 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 }
654 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000655 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 }
657 DECREF(v);
658 break;
659
660 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000661 x = sysget("stdout");
662 if (x == NULL)
663 err_setstr(RuntimeError, "lost sys.stdout");
664 else {
665 writestring("\n", x);
666 softspace(x, 0);
667 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 break;
669
670 case BREAK_LOOP:
671 why = WHY_BREAK;
672 break;
673
674 case RAISE_EXCEPTION:
675 v = POP();
676 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000677 /* A tuple is equivalent to its first element here */
678 while (is_tupleobject(w)) {
679 u = w;
680 w = gettupleitem(u, 0);
681 DECREF(u);
682 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 if (!is_stringobject(w))
684 err_setstr(TypeError,
685 "exceptions must be strings");
686 else
687 err_setval(w, v);
688 DECREF(v);
689 DECREF(w);
690 why = WHY_EXCEPTION;
691 break;
692
693 case LOAD_LOCALS:
694 v = f->f_locals;
695 INCREF(v);
696 PUSH(v);
697 break;
698
699 case RETURN_VALUE:
700 retval = POP();
701 why = WHY_RETURN;
702 break;
703
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 case BUILD_FUNCTION:
705 v = POP();
706 x = newfuncobject(v, f->f_globals);
707 DECREF(v);
708 PUSH(x);
709 break;
710
711 case POP_BLOCK:
712 {
713 block *b = pop_block(f);
714 while (STACK_LEVEL() > b->b_level) {
715 v = POP();
716 DECREF(v);
717 }
718 }
719 break;
720
721 case END_FINALLY:
722 v = POP();
723 if (is_intobject(v)) {
724 why = (enum why_code) getintvalue(v);
725 if (why == WHY_RETURN)
726 retval = POP();
727 }
728 else if (is_stringobject(v)) {
729 w = POP();
730 err_setval(v, w);
731 DECREF(w);
732 w = POP();
733 tb_store(w);
734 DECREF(w);
735 why = WHY_RERAISE;
736 }
737 else if (v != None) {
738 err_setstr(SystemError,
739 "'finally' pops bad exception");
740 why = WHY_EXCEPTION;
741 }
742 DECREF(v);
743 break;
744
745 case BUILD_CLASS:
746 w = POP();
747 v = POP();
748 x = build_class(v, w);
749 PUSH(x);
750 DECREF(v);
751 DECREF(w);
752 break;
753
754 case STORE_NAME:
755 w = GETNAMEV(oparg);
756 v = POP();
757 err = dict2insert(f->f_locals, w, v);
758 DECREF(v);
759 break;
760
761 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000762 w = GETNAMEV(oparg);
763 if ((err = dict2remove(f->f_locals, w)) != 0)
764 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000766
767#ifdef CASE_TOO_BIG
768 default: switch (opcode) {
769#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000770
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000771 case UNPACK_VARARG:
772 if (EMPTY()) {
773 err_setstr(TypeError,
774 "no argument list");
775 why = WHY_EXCEPTION;
776 break;
777 }
778 v = POP();
779 if (!is_tupleobject(v)) {
780 err_setstr(TypeError,
781 "bad argument list");
782 why = WHY_EXCEPTION;
783 }
784 else if (gettuplesize(v) < oparg) {
785 err_setstr(TypeError,
786 "not enough arguments");
787 why = WHY_EXCEPTION;
788 }
789 else if (oparg == 0) {
790 PUSH(v);
791 break;
792 }
793 else {
794 x = gettupleslice(v, oparg, gettuplesize(v));
795 if (x != NULL) {
796 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000797 if (!CHECK_STACK(oparg)) {
798 x = NULL;
799 break;
800 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000801 for (; --oparg >= 0; ) {
802 w = gettupleitem(v, oparg);
803 INCREF(w);
804 PUSH(w);
805 }
806 }
807 }
808 DECREF(v);
809 break;
810
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000811 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000812 {
813 int n;
814 if (EMPTY()) {
815 err_setstr(TypeError,
816 "no argument list");
817 why = WHY_EXCEPTION;
818 break;
819 }
820 v = POP();
821 if (!is_tupleobject(v)) {
822 err_setstr(TypeError,
823 "bad argument list");
824 why = WHY_EXCEPTION;
825 break;
826 }
827 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000828#ifdef COMPAT_HACKS
829/* Implement various compatibility hacks (for 0.9.4 or earlier):
830 (a) f(a,b,...) accepts f((1,2,...))
831 (b) f((a,b,...)) accepts f(1,2,...)
832 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
833*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000834 if (n == 1 && oparg != 1) {
835 /* Rule (a) */
836 w = gettupleitem(v, 0);
837 if (is_tupleobject(w)) {
838 INCREF(w);
839 DECREF(v);
840 v = w;
841 n = gettuplesize(v);
842 }
843 }
844 else if (n != 1 && oparg == 1) {
845 /* Rule (b) */
846 PUSH(v);
847 break;
848 /* Don't fall through */
849 }
850 else if (n > 2 && oparg == 2) {
851 /* Rule (c) */
852 int i;
853 w = newtupleobject(n-1);
854 u = newtupleobject(2);
855 if (u == NULL || w == NULL) {
856 XDECREF(w);
857 XDECREF(u);
858 DECREF(v);
859 why = WHY_EXCEPTION;
860 break;
861 }
862 t = gettupleitem(v, 0);
863 INCREF(t);
864 settupleitem(u, 0, t);
865 for (i = 1; i < n; i++) {
866 t = gettupleitem(v, i);
867 INCREF(t);
868 settupleitem(w, i-1, t);
869 }
870 settupleitem(u, 1, w);
871 DECREF(v);
872 v = u;
873 n = 2;
874 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000875#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000876 if (n != oparg) {
877 err_setstr(TypeError,
878 "arg count mismatch");
879 why = WHY_EXCEPTION;
880 DECREF(v);
881 break;
882 }
883 PUSH(v);
884 }
885 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 case UNPACK_TUPLE:
887 v = POP();
888 if (!is_tupleobject(v)) {
889 err_setstr(TypeError, "unpack non-tuple");
890 why = WHY_EXCEPTION;
891 }
892 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000893 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 "unpack tuple of wrong size");
895 why = WHY_EXCEPTION;
896 }
897 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000898 if (!CHECK_STACK(oparg)) {
899 x = NULL;
900 break;
901 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 for (; --oparg >= 0; ) {
903 w = gettupleitem(v, oparg);
904 INCREF(w);
905 PUSH(w);
906 }
907 }
908 DECREF(v);
909 break;
910
911 case UNPACK_LIST:
912 v = POP();
913 if (!is_listobject(v)) {
914 err_setstr(TypeError, "unpack non-list");
915 why = WHY_EXCEPTION;
916 }
917 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000918 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 "unpack list of wrong size");
920 why = WHY_EXCEPTION;
921 }
922 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000923 if (!CHECK_STACK(oparg)) {
924 x = NULL;
925 break;
926 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 for (; --oparg >= 0; ) {
928 w = getlistitem(v, oparg);
929 INCREF(w);
930 PUSH(w);
931 }
932 }
933 DECREF(v);
934 break;
935
936 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000937 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 v = POP();
939 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000940 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 DECREF(v);
942 DECREF(u);
943 break;
944
945 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000946 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000948 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 DECREF(v);
950 break;
951
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000952 case STORE_GLOBAL:
953 w = GETNAMEV(oparg);
954 v = POP();
955 err = dict2insert(f->f_globals, w, v);
956 DECREF(v);
957 break;
958
959 case DELETE_GLOBAL:
960 w = GETNAMEV(oparg);
961 if ((err = dict2remove(f->f_globals, w)) != 0)
962 err_setstr(NameError, getstringvalue(w));
963 break;
964
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 case LOAD_CONST:
966 x = GETCONST(oparg);
967 INCREF(x);
968 PUSH(x);
969 break;
970
971 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000972 w = GETNAMEV(oparg);
973 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000975 err_clear();
976 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000978 err_clear();
979 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000981 err_setstr(NameError,
982 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
984 }
985 }
986 }
987 INCREF(x);
988 PUSH(x);
989 break;
990
991 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000992 w = GETNAMEV(oparg);
993 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000995 err_clear();
996 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000998 err_setstr(NameError,
999 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001000 break;
1001 }
1002 }
1003 INCREF(x);
1004 PUSH(x);
1005 break;
1006
1007 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001008 w = GETNAMEV(oparg);
1009 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001011 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 break;
1013 }
1014 INCREF(x);
1015 PUSH(x);
1016 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001017
1018 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001019 x = GETCONST(oparg);
1020 if (x == None)
1021 break;
1022 if (x == NULL || !is_dictobject(x)) {
1023 fatal("bad RESERVE_FAST");
1024 err_setstr(SystemError, "bad RESERVE_FAST");
1025 x = NULL;
1026 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001027 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001028 XDECREF(f->f_fastlocals);
1029 XDECREF(f->f_localmap);
1030 INCREF(x);
1031 f->f_localmap = x;
1032 f->f_fastlocals = x = newlistobject(
1033 x->ob_type->tp_as_mapping->mp_length(x));
1034 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001035 break;
1036
1037 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001038 x = GETLISTITEM(fastlocals, oparg);
1039 if (x == NULL) {
1040 err_setstr(NameError,
1041 "undefined local variable");
1042 break;
1043 }
1044 INCREF(x);
1045 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001046 break;
1047
1048 case STORE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001049 w = GETLISTITEM(fastlocals, oparg);
1050 XDECREF(w);
1051 w = POP();
1052 GETLISTITEM(fastlocals, oparg) = w;
1053 break;
1054
1055 case DELETE_FAST:
1056 x = GETLISTITEM(fastlocals, oparg);
1057 if (x == NULL) {
1058 err_setstr(NameError,
1059 "undefined local variable");
1060 break;
1061 }
1062 DECREF(x);
1063 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001064 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001065
1066 case BUILD_TUPLE:
1067 x = newtupleobject(oparg);
1068 if (x != NULL) {
1069 for (; --oparg >= 0;) {
1070 w = POP();
1071 err = settupleitem(x, oparg, w);
1072 if (err != 0)
1073 break;
1074 }
1075 PUSH(x);
1076 }
1077 break;
1078
1079 case BUILD_LIST:
1080 x = newlistobject(oparg);
1081 if (x != NULL) {
1082 for (; --oparg >= 0;) {
1083 w = POP();
1084 err = setlistitem(x, oparg, w);
1085 if (err != 0)
1086 break;
1087 }
1088 PUSH(x);
1089 }
1090 break;
1091
1092 case BUILD_MAP:
1093 x = newdictobject();
1094 PUSH(x);
1095 break;
1096
1097 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001098 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001100 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 DECREF(v);
1102 PUSH(x);
1103 break;
1104
1105 case COMPARE_OP:
1106 w = POP();
1107 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001108 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 DECREF(v);
1110 DECREF(w);
1111 PUSH(x);
1112 break;
1113
1114 case IMPORT_NAME:
1115 name = GETNAME(oparg);
1116 x = import_module(name);
1117 XINCREF(x);
1118 PUSH(x);
1119 break;
1120
1121 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001122 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001124 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001125 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 break;
1127
1128 case JUMP_FORWARD:
1129 JUMPBY(oparg);
1130 break;
1131
1132 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001133 err = testbool(TOP());
1134 if (err > 0)
1135 err = 0;
1136 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 JUMPBY(oparg);
1138 break;
1139
1140 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001141 err = testbool(TOP());
1142 if (err > 0) {
1143 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001145 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 break;
1147
1148 case JUMP_ABSOLUTE:
1149 JUMPTO(oparg);
1150 break;
1151
1152 case FOR_LOOP:
1153 /* for v in s: ...
1154 On entry: stack contains s, i.
1155 On exit: stack contains s, i+1, s[i];
1156 but if loop exhausted:
1157 s, i are popped, and we jump */
1158 w = POP(); /* Loop index */
1159 v = POP(); /* Sequence object */
1160 u = loop_subscript(v, w);
1161 if (u != NULL) {
1162 PUSH(v);
1163 x = newintobject(getintvalue(w)+1);
1164 PUSH(x);
1165 DECREF(w);
1166 PUSH(u);
1167 }
1168 else {
1169 DECREF(v);
1170 DECREF(w);
1171 /* A NULL can mean "s exhausted"
1172 but also an error: */
1173 if (err_occurred())
1174 why = WHY_EXCEPTION;
1175 else
1176 JUMPBY(oparg);
1177 }
1178 break;
1179
1180 case SETUP_LOOP:
1181 case SETUP_EXCEPT:
1182 case SETUP_FINALLY:
1183 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1184 STACK_LEVEL());
1185 break;
1186
1187 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001188#ifdef LLTRACE
1189 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 printf("--- Line %d ---\n", oparg);
1191#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001192 f->f_lineno = oparg;
1193 if (trace != NULL) {
1194 /* Trace each line of code reached */
1195 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001196 err = call_trace(&trace, &trace,
1197 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001198 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 break;
1200
1201 default:
1202 fprintf(stderr,
1203 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001204 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 err_setstr(SystemError, "eval_code: unknown opcode");
1206 why = WHY_EXCEPTION;
1207 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001208
1209#ifdef CASE_TOO_BIG
1210 }
1211#endif
1212
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 } /* switch */
1214
1215 on_error:
1216
1217 /* Quickly continue if no error occurred */
1218
1219 if (why == WHY_NOT) {
1220 if (err == 0 && x != NULL)
1221 continue; /* Normal, fast path */
1222 why = WHY_EXCEPTION;
1223 x = None;
1224 err = 0;
1225 }
1226
Guido van Rossum801dcae1992-04-08 11:32:32 +00001227#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 /* Double-check exception status */
1229
1230 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1231 if (!err_occurred()) {
1232 fprintf(stderr, "XXX ghost error\n");
1233 err_setstr(SystemError, "ghost error");
1234 why = WHY_EXCEPTION;
1235 }
1236 }
1237 else {
1238 if (err_occurred()) {
1239 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001240 abort();
1241 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 why = WHY_EXCEPTION;
1243 }
1244 }
1245#endif
1246
1247 /* Log traceback info if this is a real exception */
1248
1249 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001250 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001252 f->f_lasti -= 2;
1253 tb_here(f);
1254
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001255 if (trace)
1256 call_exc_trace(&trace, &trace, f);
1257 if (sys_profile)
1258 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 }
1260
1261 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1262
1263 if (why == WHY_RERAISE)
1264 why = WHY_EXCEPTION;
1265
1266 /* Unwind stacks if a (pseudo) exception occurred */
1267
1268 while (why != WHY_NOT && f->f_iblock > 0) {
1269 block *b = pop_block(f);
1270 while (STACK_LEVEL() > b->b_level) {
1271 v = POP();
1272 XDECREF(v);
1273 }
1274 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1275 why = WHY_NOT;
1276 JUMPTO(b->b_handler);
1277 break;
1278 }
1279 if (b->b_type == SETUP_FINALLY ||
1280 b->b_type == SETUP_EXCEPT &&
1281 why == WHY_EXCEPTION) {
1282 if (why == WHY_EXCEPTION) {
1283 object *exc, *val;
1284 err_get(&exc, &val);
1285 if (val == NULL) {
1286 val = None;
1287 INCREF(val);
1288 }
1289 v = tb_fetch();
1290 /* Make the raw exception data
1291 available to the handler,
1292 so a program can emulate the
1293 Python main loop. Don't do
1294 this for 'finally'. */
1295 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 sysset("exc_value", val);
1298 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 }
1300 PUSH(v);
1301 PUSH(val);
1302 PUSH(exc);
1303 }
1304 else {
1305 if (why == WHY_RETURN)
1306 PUSH(retval);
1307 v = newintobject((long)why);
1308 PUSH(v);
1309 }
1310 why = WHY_NOT;
1311 JUMPTO(b->b_handler);
1312 break;
1313 }
1314 } /* unwind stack */
1315
1316 /* End the loop if we still have an error (or return) */
1317
1318 if (why != WHY_NOT)
1319 break;
1320
1321 } /* main loop */
1322
1323 /* Pop remaining stack entries */
1324
1325 while (!EMPTY()) {
1326 v = POP();
1327 XDECREF(v);
1328 }
1329
Guido van Rossum96a42c81992-01-12 02:29:51 +00001330 if (why != WHY_RETURN)
1331 retval = NULL;
1332
1333 if (trace) {
1334 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001335 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001336 XDECREF(retval);
1337 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001338 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001339 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001340 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001341 XDECREF(trace);
1342 }
1343
1344 if (sys_profile && why == WHY_RETURN) {
1345 if (call_trace(&sys_profile, (object**)0,
1346 f, "return", retval)) {
1347 XDECREF(retval);
1348 retval = NULL;
1349 why = WHY_EXCEPTION;
1350 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001351 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001352
1353 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1354 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001355
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 /* Restore previous frame and release the current one */
1357
1358 current_frame = f->f_back;
1359 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001360
1361 if (needmerge)
1362 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363
Guido van Rossum96a42c81992-01-12 02:29:51 +00001364 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365}
1366
Guido van Rossum96a42c81992-01-12 02:29:51 +00001367#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001368static int
1369prtrace(v, str)
1370 object *v;
1371 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001372{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001373 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001374 if (printobject(v, stdout, 0) != 0)
1375 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001376 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001378#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001380static void
1381call_exc_trace(p_trace, p_newtrace, f)
1382 object **p_trace, **p_newtrace;
1383 frameobject *f;
1384{
1385 object *type, *value, *traceback, *arg;
1386 int err;
1387 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001388 if (value == NULL) {
1389 value = None;
1390 INCREF(value);
1391 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001392 traceback = tb_fetch();
1393 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001394 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001395 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001396 settupleitem(arg, 0, type);
1397 settupleitem(arg, 1, value);
1398 settupleitem(arg, 2, traceback);
1399 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001400 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001401 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001402 /* Restore original exception */
1403 err_setval(type, value);
1404 tb_store(traceback);
1405 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001406 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001407}
1408
1409static int
1410call_trace(p_trace, p_newtrace, f, msg, arg)
1411 object **p_trace; /* in/out; may not be NULL;
1412 may not point to NULL variable initially */
1413 object **p_newtrace; /* in/out; may be NULL;
1414 may point to NULL variable;
1415 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001416 frameobject *f;
1417 char *msg;
1418 object *arg;
1419{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001420 object *arglist, *what;
1421 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001422 static int tracing = 0;
1423
1424 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001425 /* Don't do recursive traces */
1426 if (p_newtrace) {
1427 XDECREF(*p_newtrace);
1428 *p_newtrace = NULL;
1429 }
1430 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001431 }
1432
1433 arglist = newtupleobject(3);
1434 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001435 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001436 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001437 if (what == NULL)
1438 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001439 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001440 settupleitem(arglist, 0, (object *)f);
1441 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001442 if (arg == NULL)
1443 arg = None;
1444 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001445 settupleitem(arglist, 2, arg);
1446 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001447 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001448 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001449 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001450 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001451 cleanup:
1452 XDECREF(arglist);
1453 if (res == NULL) {
1454 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001455 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001456 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001457 *p_trace = NULL;
1458 if (p_newtrace) {
1459 XDECREF(*p_newtrace);
1460 *p_newtrace = NULL;
1461 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001462 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001463 }
1464 else {
1465 if (p_newtrace) {
1466 XDECREF(*p_newtrace);
1467 if (res == None)
1468 *p_newtrace = NULL;
1469 else {
1470 INCREF(res);
1471 *p_newtrace = res;
1472 }
1473 }
1474 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001475 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001476 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001477}
1478
Guido van Rossum5b722181993-03-30 17:46:03 +00001479static void
1480fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001481 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001482{
1483 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001484 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001485 object *error_type, *error_value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001486 int i;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001487 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001488 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001489 locals = f->f_locals;
1490 fast = f->f_fastlocals;
1491 map = f->f_localmap;
1492 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001493 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001494 if (!is_dictobject(locals) || !is_listobject(fast) ||
1495 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001496 return;
1497 err_get(&error_type, &error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001498 i = getdictsize(map);
1499 while (--i >= 0) {
1500 object *key;
1501 object *value;
1502 int j;
1503 key = getdict2key(map, i);
1504 if (key == NULL)
1505 continue;
1506 value = dict2lookup(map, key);
1507 if (value == NULL || !is_intobject(value))
1508 continue;
1509 j = getintvalue(value);
1510 value = getlistitem(fast, j);
1511 if (value == NULL) {
1512 err_clear();
1513 if (dict2remove(locals, key) != 0)
1514 err_clear();
1515 }
1516 else {
1517 if (dict2insert(locals, key, value) != 0)
1518 err_clear();
1519 }
1520 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001521 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001522}
1523
1524static void
1525locals_2_fast(f, clear)
1526 frameobject *f;
1527 int clear;
1528{
1529 /* Merge f->f_locals into f->f_fastlocals */
1530 object *locals, *fast, *map;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001531 object *error_type, *error_value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001532 int i;
1533 if (f == NULL)
1534 return;
1535 locals = f->f_locals;
1536 fast = f->f_fastlocals;
1537 map = f->f_localmap;
1538 if (locals == NULL || fast == NULL || map == NULL)
1539 return;
1540 if (!is_dictobject(locals) || !is_listobject(fast) ||
1541 !is_dictobject(map))
1542 return;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001543 err_get(&error_type, &error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001544 i = getdictsize(map);
1545 while (--i >= 0) {
1546 object *key;
1547 object *value;
1548 int j;
1549 key = getdict2key(map, i);
1550 if (key == NULL)
1551 continue;
1552 value = dict2lookup(map, key);
1553 if (value == NULL || !is_intobject(value))
1554 continue;
1555 j = getintvalue(value);
1556 value = dict2lookup(locals, key);
1557 if (value == NULL)
1558 err_clear();
1559 else
1560 INCREF(value);
1561 if (value != NULL || clear)
1562 if (setlistitem(fast, j, value) != 0)
1563 err_clear();
1564 }
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001565 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001566}
1567
1568void
1569mergelocals()
1570{
1571 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572}
1573
1574object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001575getlocals()
1576{
1577 if (current_frame == NULL)
1578 return NULL;
1579 fast_2_locals(current_frame);
1580 return current_frame->f_locals;
1581}
1582
1583object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001584getglobals()
1585{
1586 if (current_frame == NULL)
1587 return NULL;
1588 else
1589 return current_frame->f_globals;
1590}
1591
1592void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001593printtraceback(f)
1594 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001595{
1596 object *v = tb_fetch();
1597 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001598 writestring("Stack backtrace (innermost last):\n", f);
1599 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602}
1603
1604
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605void
1606flushline()
1607{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001608 object *f = sysget("stdout");
1609 if (softspace(f, 0))
1610 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611}
1612
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001615or(v, w)
1616 object *v, *w;
1617{
1618 if (v->ob_type->tp_as_number != NULL) {
1619 object *x;
1620 object * (*f) FPROTO((object *, object *));
1621 if (coerce(&v, &w) != 0)
1622 return NULL;
1623 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1624 x = (*f)(v, w);
1625 DECREF(v);
1626 DECREF(w);
1627 if (f != NULL)
1628 return x;
1629 }
1630 err_setstr(TypeError, "bad operand type(s) for |");
1631 return NULL;
1632}
1633
1634static object *
1635xor(v, w)
1636 object *v, *w;
1637{
1638 if (v->ob_type->tp_as_number != NULL) {
1639 object *x;
1640 object * (*f) FPROTO((object *, object *));
1641 if (coerce(&v, &w) != 0)
1642 return NULL;
1643 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1644 x = (*f)(v, w);
1645 DECREF(v);
1646 DECREF(w);
1647 if (f != NULL)
1648 return x;
1649 }
1650 err_setstr(TypeError, "bad operand type(s) for ^");
1651 return NULL;
1652}
1653
1654static object *
1655and(v, w)
1656 object *v, *w;
1657{
1658 if (v->ob_type->tp_as_number != NULL) {
1659 object *x;
1660 object * (*f) FPROTO((object *, object *));
1661 if (coerce(&v, &w) != 0)
1662 return NULL;
1663 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1664 x = (*f)(v, w);
1665 DECREF(v);
1666 DECREF(w);
1667 if (f != NULL)
1668 return x;
1669 }
1670 err_setstr(TypeError, "bad operand type(s) for &");
1671 return NULL;
1672}
1673
1674static object *
1675lshift(v, w)
1676 object *v, *w;
1677{
1678 if (v->ob_type->tp_as_number != NULL) {
1679 object *x;
1680 object * (*f) FPROTO((object *, object *));
1681 if (coerce(&v, &w) != 0)
1682 return NULL;
1683 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1684 x = (*f)(v, w);
1685 DECREF(v);
1686 DECREF(w);
1687 if (f != NULL)
1688 return x;
1689 }
1690 err_setstr(TypeError, "bad operand type(s) for <<");
1691 return NULL;
1692}
1693
1694static object *
1695rshift(v, w)
1696 object *v, *w;
1697{
1698 if (v->ob_type->tp_as_number != NULL) {
1699 object *x;
1700 object * (*f) FPROTO((object *, object *));
1701 if (coerce(&v, &w) != 0)
1702 return NULL;
1703 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1704 x = (*f)(v, w);
1705 DECREF(v);
1706 DECREF(w);
1707 if (f != NULL)
1708 return x;
1709 }
1710 err_setstr(TypeError, "bad operand type(s) for >>");
1711 return NULL;
1712}
1713
1714static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 object *v, *w;
1717{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001718 if (v->ob_type->tp_as_sequence != NULL)
1719 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1720 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001721 object *x;
1722 if (coerce(&v, &w) != 0)
1723 return NULL;
1724 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1725 DECREF(v);
1726 DECREF(w);
1727 return x;
1728 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001729 err_setstr(TypeError, "bad operand type(s) for +");
1730 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731}
1732
1733static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001734sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 object *v, *w;
1736{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001737 if (v->ob_type->tp_as_number != NULL) {
1738 object *x;
1739 if (coerce(&v, &w) != 0)
1740 return NULL;
1741 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1742 DECREF(v);
1743 DECREF(w);
1744 return x;
1745 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001746 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 return NULL;
1748}
1749
1750static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001751mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001752 object *v, *w;
1753{
1754 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001755 tp = v->ob_type;
1756 if (tp->tp_as_number != NULL &&
1757 w->ob_type->tp_as_sequence != NULL &&
1758 !is_instanceobject(v)) {
1759 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001760 object *tmp = v;
1761 v = w;
1762 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001763 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001765 if (tp->tp_as_number != NULL) {
1766 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001767 if (is_instanceobject(v)) {
1768 /* Instances of user-defined classes get their
1769 other argument uncoerced, so they may
1770 implement sequence*number as well as
1771 number*number. */
1772 INCREF(v);
1773 INCREF(w);
1774 }
1775 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001776 return NULL;
1777 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1778 DECREF(v);
1779 DECREF(w);
1780 return x;
1781 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 if (tp->tp_as_sequence != NULL) {
1783 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001784 err_setstr(TypeError,
1785 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 return NULL;
1787 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001788 return (*tp->tp_as_sequence->sq_repeat)
1789 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001791 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 return NULL;
1793}
1794
1795static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001796divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 object *v, *w;
1798{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001799 if (v->ob_type->tp_as_number != NULL) {
1800 object *x;
1801 if (coerce(&v, &w) != 0)
1802 return NULL;
1803 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1804 DECREF(v);
1805 DECREF(w);
1806 return x;
1807 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001808 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 return NULL;
1810}
1811
1812static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001813rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 object *v, *w;
1815{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001816 if (v->ob_type->tp_as_number != NULL) {
1817 object *x;
1818 if (coerce(&v, &w) != 0)
1819 return NULL;
1820 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1821 DECREF(v);
1822 DECREF(w);
1823 return x;
1824 }
Guido van Rossume5372401993-03-16 12:15:04 +00001825 if (is_stringobject(v)) {
1826 return formatstring(v, w);
1827 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001828 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 return NULL;
1830}
1831
1832static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001833neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 object *v;
1835{
1836 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001837 return (*v->ob_type->tp_as_number->nb_negative)(v);
1838 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 return NULL;
1840}
1841
1842static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001843pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 object *v;
1845{
1846 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001847 return (*v->ob_type->tp_as_number->nb_positive)(v);
1848 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 return NULL;
1850}
1851
1852static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001853invert(v)
1854 object *v;
1855{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001856 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001857 if (v->ob_type->tp_as_number != NULL &&
1858 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1859 return (*f)(v);
1860 err_setstr(TypeError, "bad operand type(s) for unary ~");
1861 return NULL;
1862}
1863
1864static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001865not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 object *v;
1867{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001868 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001869 object *w;
1870 if (outcome < 0)
1871 return NULL;
1872 if (outcome == 0)
1873 w = True;
1874 else
1875 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876 INCREF(w);
1877 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001879/* External interface to call any callable object. The arg may be NULL. */
1880
1881object *
1882call_object(func, arg)
1883 object *func;
1884 object *arg;
1885{
1886 if (is_instancemethodobject(func) || is_funcobject(func))
1887 return call_function(func, arg);
1888 else
1889 return call_builtin(func, arg);
1890}
1891
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001893call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001895 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 if (is_methodobject(func)) {
1898 method meth = getmethod(func);
1899 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001900 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1901 int size = gettuplesize(arg);
1902 if (size == 1)
1903 arg = gettupleitem(arg, 0);
1904 else if (size == 0)
1905 arg = NULL;
1906 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001907 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 }
1909 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001910 if (arg != NULL &&
1911 !(is_tupleobject(arg) &&
1912 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913 err_setstr(TypeError,
1914 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 return NULL;
1916 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001917 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001919 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 return NULL;
1921}
1922
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001924call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001926 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001928 object *newarg = NULL;
1929 object *newlocals, *newglobals;
1930 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931
Guido van Rossume8122f11991-05-05 20:03:07 +00001932 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001933 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001934 object *self = instancemethodgetself(func);
1935 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001936 if (arg == NULL)
1937 argcount = 0;
1938 else if (is_tupleobject(arg))
1939 argcount = gettuplesize(arg);
1940 else
1941 argcount = 1;
1942 newarg = newtupleobject(argcount + 1);
1943 if (newarg == NULL)
1944 return NULL;
1945 INCREF(self);
1946 settupleitem(newarg, 0, self);
1947 if (arg != NULL && !is_tupleobject(arg)) {
1948 INCREF(arg);
1949 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 }
1951 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001952 int i;
1953 object *v;
1954 for (i = 0; i < argcount; i++) {
1955 v = gettupleitem(arg, i);
1956 XINCREF(v);
1957 settupleitem(newarg, i+1, v);
1958 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001960 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 }
1962 else {
1963 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 return NULL;
1966 }
1967 }
1968
Guido van Rossum3f5da241990-12-20 15:06:42 +00001969 co = getfunccode(func);
1970 if (co == NULL) {
1971 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 return NULL;
1973 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001974 if (!is_codeobject(co)) {
1975 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 abort();
1977 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 return NULL;
1982 }
1983
Guido van Rossum3f5da241990-12-20 15:06:42 +00001984 newglobals = getfuncglobals(func);
1985 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986
Guido van Rossum3f5da241990-12-20 15:06:42 +00001987 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988
Guido van Rossum3f5da241990-12-20 15:06:42 +00001989 DECREF(newlocals);
1990 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991
Guido van Rossum3f5da241990-12-20 15:06:42 +00001992 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993
1994 return v;
1995}
1996
1997static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001998apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999 object *v, *w;
2000{
2001 typeobject *tp = v->ob_type;
2002 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002003 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004 return NULL;
2005 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002006 if (tp->tp_as_mapping != NULL) {
2007 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2008 }
2009 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 int i;
2011 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002012 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 return NULL;
2014 }
2015 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002016 if (i < 0) {
2017 int len = (*tp->tp_as_sequence->sq_length)(v);
2018 if (len < 0)
2019 return NULL;
2020 i += len;
2021 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002022 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024}
2025
2026static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002027loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 object *v, *w;
2029{
2030 sequence_methods *sq = v->ob_type->tp_as_sequence;
2031 int i, n;
2032 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002033 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034 return NULL;
2035 }
2036 i = getintvalue(w);
2037 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002038 if (n < 0)
2039 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 if (i >= n)
2041 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002042 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043}
2044
2045static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002046slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 object *v;
2048 int isize;
2049 int *pi;
2050{
2051 if (v != NULL) {
2052 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002053 err_setstr(TypeError, "slice index must be int");
2054 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 }
2056 *pi = getintvalue(v);
2057 if (*pi < 0)
2058 *pi += isize;
2059 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002060 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061}
2062
2063static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002064apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 object *u, *v, *w;
2066{
2067 typeobject *tp = u->ob_type;
2068 int ilow, ihigh, isize;
2069 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002070 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 return NULL;
2072 }
2073 ilow = 0;
2074 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002075 if (isize < 0)
2076 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002081 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083
2084static int
2085assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 object *w;
2087 object *key;
2088 object *v;
2089{
2090 typeobject *tp = w->ob_type;
2091 sequence_methods *sq;
2092 mapping_methods *mp;
2093 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002094 if ((mp = tp->tp_as_mapping) != NULL &&
2095 (func = mp->mp_ass_subscript) != NULL) {
2096 return (*func)(w, key, v);
2097 }
2098 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 (func = sq->sq_ass_item) != NULL) {
2100 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002102 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002105 else {
2106 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002107 if (i < 0) {
2108 int len = (*sq->sq_length)(w);
2109 if (len < 0)
2110 return -1;
2111 i += len;
2112 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002113 return (*func)(w, i, v);
2114 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 err_setstr(TypeError,
2118 "can't assign to this subscripted object");
2119 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121}
2122
Guido van Rossum3f5da241990-12-20 15:06:42 +00002123static int
2124assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125 object *u, *v, *w, *x;
2126{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002127 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002128 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129 if (sq == NULL) {
2130 err_setstr(TypeError, "assign to slice of non-sequence");
2131 return -1;
2132 }
2133 if (sq == NULL || sq->sq_ass_slice == NULL) {
2134 err_setstr(TypeError, "unassignable slice");
2135 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 }
2137 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002139 if (isize < 0)
2140 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141 if (slice_index(v, isize, &ilow) != 0)
2142 return -1;
2143 if (slice_index(w, isize, &ihigh) != 0)
2144 return -1;
2145 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146}
2147
2148static int
2149cmp_exception(err, v)
2150 object *err, *v;
2151{
2152 if (is_tupleobject(v)) {
2153 int i, n;
2154 n = gettuplesize(v);
2155 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002156 /* Test recursively */
2157 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 return 1;
2159 }
2160 return 0;
2161 }
2162 return err == v;
2163}
2164
Guido van Rossum3f5da241990-12-20 15:06:42 +00002165static int
2166cmp_member(v, w)
2167 object *v, *w;
2168{
2169 int i, n, cmp;
2170 object *x;
2171 sequence_methods *sq;
2172 /* Special case for char in string */
2173 if (is_stringobject(w)) {
2174 register char *s, *end;
2175 register char c;
2176 if (!is_stringobject(v) || getstringsize(v) != 1) {
2177 err_setstr(TypeError,
2178 "string member test needs char left operand");
2179 return -1;
2180 }
2181 c = getstringvalue(v)[0];
2182 s = getstringvalue(w);
2183 end = s + getstringsize(w);
2184 while (s < end) {
2185 if (c == *s++)
2186 return 1;
2187 }
2188 return 0;
2189 }
2190 sq = w->ob_type->tp_as_sequence;
2191 if (sq == NULL) {
2192 err_setstr(TypeError,
2193 "'in' or 'not in' needs sequence right argument");
2194 return -1;
2195 }
2196 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002197 if (n < 0)
2198 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002199 for (i = 0; i < n; i++) {
2200 x = (*sq->sq_item)(w, i);
2201 cmp = cmpobject(v, x);
2202 XDECREF(x);
2203 if (cmp == 0)
2204 return 1;
2205 }
2206 return 0;
2207}
2208
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002210cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002211 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 register object *v;
2213 register object *w;
2214{
2215 register int cmp;
2216 register int res = 0;
2217 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218 case IS:
2219 case IS_NOT:
2220 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002221 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002222 res = !res;
2223 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 case IN:
2225 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002226 res = cmp_member(v, w);
2227 if (res < 0)
2228 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002229 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002230 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 break;
2232 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002233 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 break;
2235 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002236 cmp = cmpobject(v, w);
2237 switch (op) {
2238 case LT: res = cmp < 0; break;
2239 case LE: res = cmp <= 0; break;
2240 case EQ: res = cmp == 0; break;
2241 case NE: res = cmp != 0; break;
2242 case GT: res = cmp > 0; break;
2243 case GE: res = cmp >= 0; break;
2244 /* XXX no default? (res is initialized to 0 though) */
2245 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 }
2247 v = res ? True : False;
2248 INCREF(v);
2249 return v;
2250}
2251
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252static int
2253import_from(locals, v, name)
2254 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002255 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002256 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002257{
2258 object *w, *x;
2259 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002260 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002261 int i;
2262 int n = getdictsize(w);
2263 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002264 name = getdict2key(w, i);
2265 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002266 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002267 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002268 if (x == NULL) {
2269 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002270 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002272 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002273 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002275 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002276 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002277 }
2278 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002279 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002280 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002281 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002282 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002283 getstringvalue(name));
2284 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002285 return -1;
2286 }
2287 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002288 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002289 }
2290}
2291
2292static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002294 object *v; /* None or tuple containing base classes */
2295 object *w; /* dictionary */
2296{
2297 if (is_tupleobject(v)) {
2298 int i;
2299 for (i = gettuplesize(v); --i >= 0; ) {
2300 object *x = gettupleitem(v, i);
2301 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002302 err_setstr(TypeError,
2303 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002304 return NULL;
2305 }
2306 }
2307 }
2308 else {
2309 v = NULL;
2310 }
2311 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002313 return NULL;
2314 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002315 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002316}