blob: cdd71a89d9c3c225efb94c41d9ae29856339f468 [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: */
40/* #define CASE_TOO_BIG 1 /**/
41
Guido van Rossum3f5da241990-12-20 15:06:42 +000042#ifndef NDEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000043/* For debugging the interpreter: */
44#define LLTRACE 1 /* Low-level trace feature */
45#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000046#endif
47
Guido van Rossum5b722181993-03-30 17:46:03 +000048#define DEBUG
49
50
Guido van Rossum374a9221991-04-04 10:40:29 +000051/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000052
Guido van Rossum0a066c01992-03-27 17:29:15 +000053#ifdef LLTRACE
54static int prtrace PROTO((object *, char *));
55#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000056static void call_exc_trace PROTO((object **, object**, frameobject *));
57static int call_trace
58 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000059static int testbool PROTO((object *));
60static object *add PROTO((object *, object *));
61static object *sub PROTO((object *, object *));
62static object *mul PROTO((object *, object *));
63static object *divide PROTO((object *, object *));
64static object *rem PROTO((object *, object *));
65static object *neg PROTO((object *));
66static object *pos PROTO((object *));
67static object *not PROTO((object *));
68static object *invert PROTO((object *));
69static object *lshift PROTO((object *, object *));
70static object *rshift PROTO((object *, object *));
71static object *and PROTO((object *, object *));
72static object *xor PROTO((object *, object *));
73static object *or PROTO((object *, object *));
74static object *call_builtin PROTO((object *, object *));
75static object *call_function PROTO((object *, object *));
76static object *apply_subscript PROTO((object *, object *));
77static object *loop_subscript PROTO((object *, object *));
78static int slice_index PROTO((object *, int, int *));
79static object *apply_slice PROTO((object *, object *, object *));
80static int assign_subscript PROTO((object *, object *, object *));
81static int assign_slice PROTO((object *, object *, object *, object *));
82static int cmp_exception PROTO((object *, object *));
83static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000084static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000085static int import_from PROTO((object *, object *, object *));
86static object *build_class PROTO((object *, object *));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000087static void locals_2_fast PROTO((frameobject *, int));
Guido van Rossum5b722181993-03-30 17:46:03 +000088static void fast_2_locals PROTO((frameobject *));
Guido van Rossum374a9221991-04-04 10:40:29 +000089
90
Guido van Rossum0a066c01992-03-27 17:29:15 +000091/* Pointer to current frame, used to link new frames to */
92
Guido van Rossum374a9221991-04-04 10:40:29 +000093static frameobject *current_frame;
94
Guido van Rossum1984f1e1992-08-04 12:41:02 +000095#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000096
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097#include <errno.h>
98#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000099
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100static type_lock interpreter_lock;
101
102void
103init_save_thread()
104{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000106 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107 interpreter_lock = allocate_lock();
108 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000110
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111#endif
112
Guido van Rossumff4949e1992-08-05 19:58:53 +0000113/* Functions save_thread and restore_thread are always defined so
114 dynamically loaded modules needn't be compiled separately for use
115 with and without threads: */
116
Guido van Rossum04691fc1992-08-12 15:35:34 +0000117object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118save_thread()
119{
120#ifdef USE_THREAD
121 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000122 object *res;
123 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 current_frame = NULL;
125 release_lock(interpreter_lock);
126 return res;
127 }
128 else
129 return NULL;
130#endif
131}
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
187 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
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 Rossum374a9221991-04-04 10:40:29 +0000237 f = newframeobject(
238 current_frame, /*back*/
239 co, /*code*/
240 globals, /*globals*/
241 locals, /*locals*/
242 50, /*nvalues*/
243 20); /*nblocks*/
244 if (f == NULL)
245 return NULL;
246
247 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000248
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000249 if (sys_trace != NULL) {
250 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000251 be called on *every* entry to a code block.
252 Its return value, if not None, is a function that
253 will be called at the start of each executed line
254 of code. (Actually, the function must return
255 itself in order to continue tracing.)
256 The trace functions are called with three arguments:
257 a pointer to the current frame, a string indicating
258 why the function is called, and an argument which
259 depends on the situation. The global trace function
260 (sys.trace) is also called whenever an exception
261 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000262 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000263 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000264 current_frame = f->f_back;
265 DECREF(f);
266 return NULL;
267 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000268 }
269
270 if (sys_profile != NULL) {
271 /* Similar for sys_profile, except it needn't return
272 itself and isn't called for "line" events */
273 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
274 current_frame = f->f_back;
275 DECREF(f);
276 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000277 }
278 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000279
280 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000281 stack_pointer = f->f_valuestack;
282
283 if (arg != NULL) {
284 INCREF(arg);
285 PUSH(arg);
286 }
287
288 why = WHY_NOT;
289 err = 0;
290 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000291
292 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000293 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000294
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000295 /* Do periodic things.
296 Doing this every time through the loop would add
297 too much overhead (a function call per instruction).
298 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000299
300 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000301 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000302 if (intrcheck()) {
303 err_set(KeyboardInterrupt);
304 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000305 goto on_error;
306 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307
308#ifdef USE_THREAD
309 if (interpreter_lock) {
310 /* Give another thread a chance */
311
312 current_frame = NULL;
313 release_lock(interpreter_lock);
314
315 /* Other threads may run now */
316
317 acquire_lock(interpreter_lock, 1);
318 current_frame = f;
319 }
320#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000321 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322
Guido van Rossum374a9221991-04-04 10:40:29 +0000323 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000324
325#ifdef DEBUG
326 f->f_lasti = INSTR_OFFSET();
327#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000328
329 opcode = NEXTOP();
330 if (HAS_ARG(opcode))
331 oparg = NEXTARG();
332
Guido van Rossum96a42c81992-01-12 02:29:51 +0000333#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000334 /* Instruction tracing */
335
Guido van Rossum96a42c81992-01-12 02:29:51 +0000336 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000337 if (HAS_ARG(opcode)) {
338 printf("%d: %d, %d\n",
339 (int) (INSTR_OFFSET() - 3),
340 opcode, oparg);
341 }
342 else {
343 printf("%d: %d\n",
344 (int) (INSTR_OFFSET() - 1), opcode);
345 }
346 }
347#endif
348
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000349 if (!CHECK_STACK(3)) {
350 x = NULL;
351 break;
352 }
353
Guido van Rossum374a9221991-04-04 10:40:29 +0000354 /* Main switch on opcode */
355
356 switch (opcode) {
357
358 /* BEWARE!
359 It is essential that any operation that fails sets either
360 x to NULL, err to nonzero, or why to anything but WHY_NOT,
361 and that no operation that succeeds does this! */
362
363 /* case STOP_CODE: this is an error! */
364
365 case POP_TOP:
366 v = POP();
367 DECREF(v);
368 break;
369
370 case ROT_TWO:
371 v = POP();
372 w = POP();
373 PUSH(v);
374 PUSH(w);
375 break;
376
377 case ROT_THREE:
378 v = POP();
379 w = POP();
380 x = POP();
381 PUSH(v);
382 PUSH(x);
383 PUSH(w);
384 break;
385
386 case DUP_TOP:
387 v = TOP();
388 INCREF(v);
389 PUSH(v);
390 break;
391
392 case UNARY_POSITIVE:
393 v = POP();
394 x = pos(v);
395 DECREF(v);
396 PUSH(x);
397 break;
398
399 case UNARY_NEGATIVE:
400 v = POP();
401 x = neg(v);
402 DECREF(v);
403 PUSH(x);
404 break;
405
406 case UNARY_NOT:
407 v = POP();
408 x = not(v);
409 DECREF(v);
410 PUSH(x);
411 break;
412
413 case UNARY_CONVERT:
414 v = POP();
415 x = reprobject(v);
416 DECREF(v);
417 PUSH(x);
418 break;
419
420 case UNARY_CALL:
421 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000422 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000423 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000424 DECREF(v);
425 PUSH(x);
426 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000427
428 case UNARY_INVERT:
429 v = POP();
430 x = invert(v);
431 DECREF(v);
432 PUSH(x);
433 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000434
435 case BINARY_MULTIPLY:
436 w = POP();
437 v = POP();
438 x = mul(v, w);
439 DECREF(v);
440 DECREF(w);
441 PUSH(x);
442 break;
443
444 case BINARY_DIVIDE:
445 w = POP();
446 v = POP();
447 x = divide(v, w);
448 DECREF(v);
449 DECREF(w);
450 PUSH(x);
451 break;
452
453 case BINARY_MODULO:
454 w = POP();
455 v = POP();
456 x = rem(v, w);
457 DECREF(v);
458 DECREF(w);
459 PUSH(x);
460 break;
461
462 case BINARY_ADD:
463 w = POP();
464 v = POP();
465 x = add(v, w);
466 DECREF(v);
467 DECREF(w);
468 PUSH(x);
469 break;
470
471 case BINARY_SUBTRACT:
472 w = POP();
473 v = POP();
474 x = sub(v, w);
475 DECREF(v);
476 DECREF(w);
477 PUSH(x);
478 break;
479
480 case BINARY_SUBSCR:
481 w = POP();
482 v = POP();
483 x = apply_subscript(v, w);
484 DECREF(v);
485 DECREF(w);
486 PUSH(x);
487 break;
488
489 case BINARY_CALL:
490 w = POP();
491 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000492 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000493 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000494 DECREF(v);
495 DECREF(w);
496 PUSH(x);
497 break;
498
Guido van Rossum7928cd71991-10-24 14:59:31 +0000499 case BINARY_LSHIFT:
500 w = POP();
501 v = POP();
502 x = lshift(v, w);
503 DECREF(v);
504 DECREF(w);
505 PUSH(x);
506 break;
507
508 case BINARY_RSHIFT:
509 w = POP();
510 v = POP();
511 x = rshift(v, w);
512 DECREF(v);
513 DECREF(w);
514 PUSH(x);
515 break;
516
517 case BINARY_AND:
518 w = POP();
519 v = POP();
520 x = and(v, w);
521 DECREF(v);
522 DECREF(w);
523 PUSH(x);
524 break;
525
526 case BINARY_XOR:
527 w = POP();
528 v = POP();
529 x = xor(v, w);
530 DECREF(v);
531 DECREF(w);
532 PUSH(x);
533 break;
534
535 case BINARY_OR:
536 w = POP();
537 v = POP();
538 x = or(v, w);
539 DECREF(v);
540 DECREF(w);
541 PUSH(x);
542 break;
543
Guido van Rossum374a9221991-04-04 10:40:29 +0000544 case SLICE+0:
545 case SLICE+1:
546 case SLICE+2:
547 case SLICE+3:
548 if ((opcode-SLICE) & 2)
549 w = POP();
550 else
551 w = NULL;
552 if ((opcode-SLICE) & 1)
553 v = POP();
554 else
555 v = NULL;
556 u = POP();
557 x = apply_slice(u, v, w);
558 DECREF(u);
559 XDECREF(v);
560 XDECREF(w);
561 PUSH(x);
562 break;
563
564 case STORE_SLICE+0:
565 case STORE_SLICE+1:
566 case STORE_SLICE+2:
567 case STORE_SLICE+3:
568 if ((opcode-STORE_SLICE) & 2)
569 w = POP();
570 else
571 w = NULL;
572 if ((opcode-STORE_SLICE) & 1)
573 v = POP();
574 else
575 v = NULL;
576 u = POP();
577 t = POP();
578 err = assign_slice(u, v, w, t); /* u[v:w] = t */
579 DECREF(t);
580 DECREF(u);
581 XDECREF(v);
582 XDECREF(w);
583 break;
584
585 case DELETE_SLICE+0:
586 case DELETE_SLICE+1:
587 case DELETE_SLICE+2:
588 case DELETE_SLICE+3:
589 if ((opcode-DELETE_SLICE) & 2)
590 w = POP();
591 else
592 w = NULL;
593 if ((opcode-DELETE_SLICE) & 1)
594 v = POP();
595 else
596 v = NULL;
597 u = POP();
598 err = assign_slice(u, v, w, (object *)NULL);
599 /* del u[v:w] */
600 DECREF(u);
601 XDECREF(v);
602 XDECREF(w);
603 break;
604
605 case STORE_SUBSCR:
606 w = POP();
607 v = POP();
608 u = POP();
609 /* v[w] = u */
610 err = assign_subscript(v, w, u);
611 DECREF(u);
612 DECREF(v);
613 DECREF(w);
614 break;
615
616 case DELETE_SUBSCR:
617 w = POP();
618 v = POP();
619 /* del v[w] */
620 err = assign_subscript(v, w, (object *)NULL);
621 DECREF(v);
622 DECREF(w);
623 break;
624
625 case PRINT_EXPR:
626 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 /* Print value except if procedure result */
628 if (v != None) {
629 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000630 x = sysget("stdout");
631 softspace(x, 1);
632 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000633 flushline();
634 }
635 DECREF(v);
636 break;
637
638 case PRINT_ITEM:
639 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000640 w = sysget("stdout");
641 if (softspace(w, 1))
642 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000643 if (is_stringobject(v)) {
644 char *s = getstringvalue(v);
645 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000646 err = writeobject(v, w, PRINT_RAW);
647 if (err == 0 && len > 0 && s[len-1] == '\n')
648 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 }
650 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000651 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000652 }
653 DECREF(v);
654 break;
655
656 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000657 x = sysget("stdout");
658 if (x == NULL)
659 err_setstr(RuntimeError, "lost sys.stdout");
660 else {
661 writestring("\n", x);
662 softspace(x, 0);
663 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 break;
665
666 case BREAK_LOOP:
667 why = WHY_BREAK;
668 break;
669
670 case RAISE_EXCEPTION:
671 v = POP();
672 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000673 /* A tuple is equivalent to its first element here */
674 while (is_tupleobject(w)) {
675 u = w;
676 w = gettupleitem(u, 0);
677 DECREF(u);
678 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 if (!is_stringobject(w))
680 err_setstr(TypeError,
681 "exceptions must be strings");
682 else
683 err_setval(w, v);
684 DECREF(v);
685 DECREF(w);
686 why = WHY_EXCEPTION;
687 break;
688
689 case LOAD_LOCALS:
690 v = f->f_locals;
691 INCREF(v);
692 PUSH(v);
693 break;
694
695 case RETURN_VALUE:
696 retval = POP();
697 why = WHY_RETURN;
698 break;
699
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 case BUILD_FUNCTION:
701 v = POP();
702 x = newfuncobject(v, f->f_globals);
703 DECREF(v);
704 PUSH(x);
705 break;
706
707 case POP_BLOCK:
708 {
709 block *b = pop_block(f);
710 while (STACK_LEVEL() > b->b_level) {
711 v = POP();
712 DECREF(v);
713 }
714 }
715 break;
716
717 case END_FINALLY:
718 v = POP();
719 if (is_intobject(v)) {
720 why = (enum why_code) getintvalue(v);
721 if (why == WHY_RETURN)
722 retval = POP();
723 }
724 else if (is_stringobject(v)) {
725 w = POP();
726 err_setval(v, w);
727 DECREF(w);
728 w = POP();
729 tb_store(w);
730 DECREF(w);
731 why = WHY_RERAISE;
732 }
733 else if (v != None) {
734 err_setstr(SystemError,
735 "'finally' pops bad exception");
736 why = WHY_EXCEPTION;
737 }
738 DECREF(v);
739 break;
740
741 case BUILD_CLASS:
742 w = POP();
743 v = POP();
744 x = build_class(v, w);
745 PUSH(x);
746 DECREF(v);
747 DECREF(w);
748 break;
749
750 case STORE_NAME:
751 w = GETNAMEV(oparg);
752 v = POP();
753 err = dict2insert(f->f_locals, w, v);
754 DECREF(v);
755 break;
756
757 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000758 w = GETNAMEV(oparg);
759 if ((err = dict2remove(f->f_locals, w)) != 0)
760 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000762
763#ifdef CASE_TOO_BIG
764 default: switch (opcode) {
765#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000766
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000767 case UNPACK_VARARG:
768 if (EMPTY()) {
769 err_setstr(TypeError,
770 "no argument list");
771 why = WHY_EXCEPTION;
772 break;
773 }
774 v = POP();
775 if (!is_tupleobject(v)) {
776 err_setstr(TypeError,
777 "bad argument list");
778 why = WHY_EXCEPTION;
779 }
780 else if (gettuplesize(v) < oparg) {
781 err_setstr(TypeError,
782 "not enough arguments");
783 why = WHY_EXCEPTION;
784 }
785 else if (oparg == 0) {
786 PUSH(v);
787 break;
788 }
789 else {
790 x = gettupleslice(v, oparg, gettuplesize(v));
791 if (x != NULL) {
792 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000793 if (!CHECK_STACK(oparg)) {
794 x = NULL;
795 break;
796 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000797 for (; --oparg >= 0; ) {
798 w = gettupleitem(v, oparg);
799 INCREF(w);
800 PUSH(w);
801 }
802 }
803 }
804 DECREF(v);
805 break;
806
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000807 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000808 {
809 int n;
810 if (EMPTY()) {
811 err_setstr(TypeError,
812 "no argument list");
813 why = WHY_EXCEPTION;
814 break;
815 }
816 v = POP();
817 if (!is_tupleobject(v)) {
818 err_setstr(TypeError,
819 "bad argument list");
820 why = WHY_EXCEPTION;
821 break;
822 }
823 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000824#ifdef COMPAT_HACKS
825/* Implement various compatibility hacks (for 0.9.4 or earlier):
826 (a) f(a,b,...) accepts f((1,2,...))
827 (b) f((a,b,...)) accepts f(1,2,...)
828 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
829*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000830 if (n == 1 && oparg != 1) {
831 /* Rule (a) */
832 w = gettupleitem(v, 0);
833 if (is_tupleobject(w)) {
834 INCREF(w);
835 DECREF(v);
836 v = w;
837 n = gettuplesize(v);
838 }
839 }
840 else if (n != 1 && oparg == 1) {
841 /* Rule (b) */
842 PUSH(v);
843 break;
844 /* Don't fall through */
845 }
846 else if (n > 2 && oparg == 2) {
847 /* Rule (c) */
848 int i;
849 w = newtupleobject(n-1);
850 u = newtupleobject(2);
851 if (u == NULL || w == NULL) {
852 XDECREF(w);
853 XDECREF(u);
854 DECREF(v);
855 why = WHY_EXCEPTION;
856 break;
857 }
858 t = gettupleitem(v, 0);
859 INCREF(t);
860 settupleitem(u, 0, t);
861 for (i = 1; i < n; i++) {
862 t = gettupleitem(v, i);
863 INCREF(t);
864 settupleitem(w, i-1, t);
865 }
866 settupleitem(u, 1, w);
867 DECREF(v);
868 v = u;
869 n = 2;
870 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000871#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000872 if (n != oparg) {
873 err_setstr(TypeError,
874 "arg count mismatch");
875 why = WHY_EXCEPTION;
876 DECREF(v);
877 break;
878 }
879 PUSH(v);
880 }
881 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000882 case UNPACK_TUPLE:
883 v = POP();
884 if (!is_tupleobject(v)) {
885 err_setstr(TypeError, "unpack non-tuple");
886 why = WHY_EXCEPTION;
887 }
888 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000889 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 "unpack tuple of wrong size");
891 why = WHY_EXCEPTION;
892 }
893 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000894 if (!CHECK_STACK(oparg)) {
895 x = NULL;
896 break;
897 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 for (; --oparg >= 0; ) {
899 w = gettupleitem(v, oparg);
900 INCREF(w);
901 PUSH(w);
902 }
903 }
904 DECREF(v);
905 break;
906
907 case UNPACK_LIST:
908 v = POP();
909 if (!is_listobject(v)) {
910 err_setstr(TypeError, "unpack non-list");
911 why = WHY_EXCEPTION;
912 }
913 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000914 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 "unpack list of wrong size");
916 why = WHY_EXCEPTION;
917 }
918 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000919 if (!CHECK_STACK(oparg)) {
920 x = NULL;
921 break;
922 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 for (; --oparg >= 0; ) {
924 w = getlistitem(v, oparg);
925 INCREF(w);
926 PUSH(w);
927 }
928 }
929 DECREF(v);
930 break;
931
932 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000933 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 v = POP();
935 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000936 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 DECREF(v);
938 DECREF(u);
939 break;
940
941 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000942 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000944 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 DECREF(v);
946 break;
947
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000948 case STORE_GLOBAL:
949 w = GETNAMEV(oparg);
950 v = POP();
951 err = dict2insert(f->f_globals, w, v);
952 DECREF(v);
953 break;
954
955 case DELETE_GLOBAL:
956 w = GETNAMEV(oparg);
957 if ((err = dict2remove(f->f_globals, w)) != 0)
958 err_setstr(NameError, getstringvalue(w));
959 break;
960
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 case LOAD_CONST:
962 x = GETCONST(oparg);
963 INCREF(x);
964 PUSH(x);
965 break;
966
967 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000968 w = GETNAMEV(oparg);
969 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000971 err_clear();
972 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000974 err_clear();
975 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000977 err_setstr(NameError,
978 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 break;
980 }
981 }
982 }
983 INCREF(x);
984 PUSH(x);
985 break;
986
987 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000988 w = GETNAMEV(oparg);
989 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000991 err_clear();
992 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000994 err_setstr(NameError,
995 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 break;
997 }
998 }
999 INCREF(x);
1000 PUSH(x);
1001 break;
1002
1003 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001004 w = GETNAMEV(oparg);
1005 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001007 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 break;
1009 }
1010 INCREF(x);
1011 PUSH(x);
1012 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001013
1014 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001015 x = GETCONST(oparg);
1016 if (x == None)
1017 break;
1018 if (x == NULL || !is_dictobject(x)) {
1019 fatal("bad RESERVE_FAST");
1020 err_setstr(SystemError, "bad RESERVE_FAST");
1021 x = NULL;
1022 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001023 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001024 XDECREF(f->f_fastlocals);
1025 XDECREF(f->f_localmap);
1026 INCREF(x);
1027 f->f_localmap = x;
1028 f->f_fastlocals = x = newlistobject(
1029 x->ob_type->tp_as_mapping->mp_length(x));
1030 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001031 break;
1032
1033 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001034 x = GETLISTITEM(fastlocals, oparg);
1035 if (x == NULL) {
1036 err_setstr(NameError,
1037 "undefined local variable");
1038 break;
1039 }
1040 INCREF(x);
1041 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001042 break;
1043
1044 case STORE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001045 w = GETLISTITEM(fastlocals, oparg);
1046 XDECREF(w);
1047 w = POP();
1048 GETLISTITEM(fastlocals, oparg) = w;
1049 break;
1050
1051 case DELETE_FAST:
1052 x = GETLISTITEM(fastlocals, oparg);
1053 if (x == NULL) {
1054 err_setstr(NameError,
1055 "undefined local variable");
1056 break;
1057 }
1058 DECREF(x);
1059 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001060 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001061
1062 case BUILD_TUPLE:
1063 x = newtupleobject(oparg);
1064 if (x != NULL) {
1065 for (; --oparg >= 0;) {
1066 w = POP();
1067 err = settupleitem(x, oparg, w);
1068 if (err != 0)
1069 break;
1070 }
1071 PUSH(x);
1072 }
1073 break;
1074
1075 case BUILD_LIST:
1076 x = newlistobject(oparg);
1077 if (x != NULL) {
1078 for (; --oparg >= 0;) {
1079 w = POP();
1080 err = setlistitem(x, oparg, w);
1081 if (err != 0)
1082 break;
1083 }
1084 PUSH(x);
1085 }
1086 break;
1087
1088 case BUILD_MAP:
1089 x = newdictobject();
1090 PUSH(x);
1091 break;
1092
1093 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001094 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001095 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001096 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 DECREF(v);
1098 PUSH(x);
1099 break;
1100
1101 case COMPARE_OP:
1102 w = POP();
1103 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001104 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 DECREF(v);
1106 DECREF(w);
1107 PUSH(x);
1108 break;
1109
1110 case IMPORT_NAME:
1111 name = GETNAME(oparg);
1112 x = import_module(name);
1113 XINCREF(x);
1114 PUSH(x);
1115 break;
1116
1117 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001118 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001120 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001121 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 break;
1123
1124 case JUMP_FORWARD:
1125 JUMPBY(oparg);
1126 break;
1127
1128 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001129 err = testbool(TOP());
1130 if (err > 0)
1131 err = 0;
1132 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 JUMPBY(oparg);
1134 break;
1135
1136 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137 err = testbool(TOP());
1138 if (err > 0) {
1139 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001141 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 break;
1143
1144 case JUMP_ABSOLUTE:
1145 JUMPTO(oparg);
1146 break;
1147
1148 case FOR_LOOP:
1149 /* for v in s: ...
1150 On entry: stack contains s, i.
1151 On exit: stack contains s, i+1, s[i];
1152 but if loop exhausted:
1153 s, i are popped, and we jump */
1154 w = POP(); /* Loop index */
1155 v = POP(); /* Sequence object */
1156 u = loop_subscript(v, w);
1157 if (u != NULL) {
1158 PUSH(v);
1159 x = newintobject(getintvalue(w)+1);
1160 PUSH(x);
1161 DECREF(w);
1162 PUSH(u);
1163 }
1164 else {
1165 DECREF(v);
1166 DECREF(w);
1167 /* A NULL can mean "s exhausted"
1168 but also an error: */
1169 if (err_occurred())
1170 why = WHY_EXCEPTION;
1171 else
1172 JUMPBY(oparg);
1173 }
1174 break;
1175
1176 case SETUP_LOOP:
1177 case SETUP_EXCEPT:
1178 case SETUP_FINALLY:
1179 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1180 STACK_LEVEL());
1181 break;
1182
1183 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001184#ifdef LLTRACE
1185 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 printf("--- Line %d ---\n", oparg);
1187#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001188 f->f_lineno = oparg;
1189 if (trace != NULL) {
1190 /* Trace each line of code reached */
1191 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001192 err = call_trace(&trace, &trace,
1193 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001194 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 break;
1196
1197 default:
1198 fprintf(stderr,
1199 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001200 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 err_setstr(SystemError, "eval_code: unknown opcode");
1202 why = WHY_EXCEPTION;
1203 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001204
1205#ifdef CASE_TOO_BIG
1206 }
1207#endif
1208
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 } /* switch */
1210
1211 on_error:
1212
1213 /* Quickly continue if no error occurred */
1214
1215 if (why == WHY_NOT) {
1216 if (err == 0 && x != NULL)
1217 continue; /* Normal, fast path */
1218 why = WHY_EXCEPTION;
1219 x = None;
1220 err = 0;
1221 }
1222
Guido van Rossum801dcae1992-04-08 11:32:32 +00001223#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 /* Double-check exception status */
1225
1226 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1227 if (!err_occurred()) {
1228 fprintf(stderr, "XXX ghost error\n");
1229 err_setstr(SystemError, "ghost error");
1230 why = WHY_EXCEPTION;
1231 }
1232 }
1233 else {
1234 if (err_occurred()) {
1235 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001236 abort();
1237 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 why = WHY_EXCEPTION;
1239 }
1240 }
1241#endif
1242
1243 /* Log traceback info if this is a real exception */
1244
1245 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001246 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001248 f->f_lasti -= 2;
1249 tb_here(f);
1250
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001251 if (trace)
1252 call_exc_trace(&trace, &trace, f);
1253 if (sys_profile)
1254 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 }
1256
1257 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1258
1259 if (why == WHY_RERAISE)
1260 why = WHY_EXCEPTION;
1261
1262 /* Unwind stacks if a (pseudo) exception occurred */
1263
1264 while (why != WHY_NOT && f->f_iblock > 0) {
1265 block *b = pop_block(f);
1266 while (STACK_LEVEL() > b->b_level) {
1267 v = POP();
1268 XDECREF(v);
1269 }
1270 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1271 why = WHY_NOT;
1272 JUMPTO(b->b_handler);
1273 break;
1274 }
1275 if (b->b_type == SETUP_FINALLY ||
1276 b->b_type == SETUP_EXCEPT &&
1277 why == WHY_EXCEPTION) {
1278 if (why == WHY_EXCEPTION) {
1279 object *exc, *val;
1280 err_get(&exc, &val);
1281 if (val == NULL) {
1282 val = None;
1283 INCREF(val);
1284 }
1285 v = tb_fetch();
1286 /* Make the raw exception data
1287 available to the handler,
1288 so a program can emulate the
1289 Python main loop. Don't do
1290 this for 'finally'. */
1291 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 sysset("exc_value", val);
1294 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 }
1296 PUSH(v);
1297 PUSH(val);
1298 PUSH(exc);
1299 }
1300 else {
1301 if (why == WHY_RETURN)
1302 PUSH(retval);
1303 v = newintobject((long)why);
1304 PUSH(v);
1305 }
1306 why = WHY_NOT;
1307 JUMPTO(b->b_handler);
1308 break;
1309 }
1310 } /* unwind stack */
1311
1312 /* End the loop if we still have an error (or return) */
1313
1314 if (why != WHY_NOT)
1315 break;
1316
1317 } /* main loop */
1318
1319 /* Pop remaining stack entries */
1320
1321 while (!EMPTY()) {
1322 v = POP();
1323 XDECREF(v);
1324 }
1325
Guido van Rossum96a42c81992-01-12 02:29:51 +00001326 if (why != WHY_RETURN)
1327 retval = NULL;
1328
1329 if (trace) {
1330 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001331 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001332 XDECREF(retval);
1333 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001334 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001335 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001336 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001337 XDECREF(trace);
1338 }
1339
1340 if (sys_profile && why == WHY_RETURN) {
1341 if (call_trace(&sys_profile, (object**)0,
1342 f, "return", retval)) {
1343 XDECREF(retval);
1344 retval = NULL;
1345 why = WHY_EXCEPTION;
1346 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001347 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001348
1349 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1350 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001351
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 /* Restore previous frame and release the current one */
1353
1354 current_frame = f->f_back;
1355 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001356
1357 if (needmerge)
1358 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001359
Guido van Rossum96a42c81992-01-12 02:29:51 +00001360 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361}
1362
Guido van Rossum96a42c81992-01-12 02:29:51 +00001363#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001364static int
1365prtrace(v, str)
1366 object *v;
1367 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001369 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001370 if (printobject(v, stdout, 0) != 0)
1371 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001372 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001374#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001375
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001376static void
1377call_exc_trace(p_trace, p_newtrace, f)
1378 object **p_trace, **p_newtrace;
1379 frameobject *f;
1380{
1381 object *type, *value, *traceback, *arg;
1382 int err;
1383 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001384 if (value == NULL) {
1385 value = None;
1386 INCREF(value);
1387 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001388 traceback = tb_fetch();
1389 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001390 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001391 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001392 settupleitem(arg, 0, type);
1393 settupleitem(arg, 1, value);
1394 settupleitem(arg, 2, traceback);
1395 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001396 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001397 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001398 /* Restore original exception */
1399 err_setval(type, value);
1400 tb_store(traceback);
1401 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001402 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001403}
1404
1405static int
1406call_trace(p_trace, p_newtrace, f, msg, arg)
1407 object **p_trace; /* in/out; may not be NULL;
1408 may not point to NULL variable initially */
1409 object **p_newtrace; /* in/out; may be NULL;
1410 may point to NULL variable;
1411 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001412 frameobject *f;
1413 char *msg;
1414 object *arg;
1415{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001416 object *arglist, *what;
1417 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001418 static int tracing = 0;
1419
1420 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001421 /* Don't do recursive traces */
1422 if (p_newtrace) {
1423 XDECREF(*p_newtrace);
1424 *p_newtrace = NULL;
1425 }
1426 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001427 }
1428
1429 arglist = newtupleobject(3);
1430 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001431 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001432 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001433 if (what == NULL)
1434 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001435 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001436 settupleitem(arglist, 0, (object *)f);
1437 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001438 if (arg == NULL)
1439 arg = None;
1440 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001441 settupleitem(arglist, 2, arg);
1442 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001443 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001444 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001445 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001446 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001447 cleanup:
1448 XDECREF(arglist);
1449 if (res == NULL) {
1450 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001451 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001452 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001453 *p_trace = NULL;
1454 if (p_newtrace) {
1455 XDECREF(*p_newtrace);
1456 *p_newtrace = NULL;
1457 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001458 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001459 }
1460 else {
1461 if (p_newtrace) {
1462 XDECREF(*p_newtrace);
1463 if (res == None)
1464 *p_newtrace = NULL;
1465 else {
1466 INCREF(res);
1467 *p_newtrace = res;
1468 }
1469 }
1470 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001471 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001472 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001473}
1474
Guido van Rossum5b722181993-03-30 17:46:03 +00001475static void
1476fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001477 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001478{
1479 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001480 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001481 object *error_type, *error_value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001482 int i;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001483 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001484 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001485 locals = f->f_locals;
1486 fast = f->f_fastlocals;
1487 map = f->f_localmap;
1488 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001489 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001490 if (!is_dictobject(locals) || !is_listobject(fast) ||
1491 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001492 return;
1493 err_get(&error_type, &error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001494 i = getdictsize(map);
1495 while (--i >= 0) {
1496 object *key;
1497 object *value;
1498 int j;
1499 key = getdict2key(map, i);
1500 if (key == NULL)
1501 continue;
1502 value = dict2lookup(map, key);
1503 if (value == NULL || !is_intobject(value))
1504 continue;
1505 j = getintvalue(value);
1506 value = getlistitem(fast, j);
1507 if (value == NULL) {
1508 err_clear();
1509 if (dict2remove(locals, key) != 0)
1510 err_clear();
1511 }
1512 else {
1513 if (dict2insert(locals, key, value) != 0)
1514 err_clear();
1515 }
1516 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001517 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001518}
1519
1520static void
1521locals_2_fast(f, clear)
1522 frameobject *f;
1523 int clear;
1524{
1525 /* Merge f->f_locals into f->f_fastlocals */
1526 object *locals, *fast, *map;
1527 int i;
1528 if (f == NULL)
1529 return;
1530 locals = f->f_locals;
1531 fast = f->f_fastlocals;
1532 map = f->f_localmap;
1533 if (locals == NULL || fast == NULL || map == NULL)
1534 return;
1535 if (!is_dictobject(locals) || !is_listobject(fast) ||
1536 !is_dictobject(map))
1537 return;
1538 i = getdictsize(map);
1539 while (--i >= 0) {
1540 object *key;
1541 object *value;
1542 int j;
1543 key = getdict2key(map, i);
1544 if (key == NULL)
1545 continue;
1546 value = dict2lookup(map, key);
1547 if (value == NULL || !is_intobject(value))
1548 continue;
1549 j = getintvalue(value);
1550 value = dict2lookup(locals, key);
1551 if (value == NULL)
1552 err_clear();
1553 else
1554 INCREF(value);
1555 if (value != NULL || clear)
1556 if (setlistitem(fast, j, value) != 0)
1557 err_clear();
1558 }
1559}
1560
1561void
1562mergelocals()
1563{
1564 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565}
1566
1567object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001568getlocals()
1569{
1570 if (current_frame == NULL)
1571 return NULL;
1572 fast_2_locals(current_frame);
1573 return current_frame->f_locals;
1574}
1575
1576object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001577getglobals()
1578{
1579 if (current_frame == NULL)
1580 return NULL;
1581 else
1582 return current_frame->f_globals;
1583}
1584
1585void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001586printtraceback(f)
1587 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001588{
1589 object *v = tb_fetch();
1590 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001591 writestring("Stack backtrace (innermost last):\n", f);
1592 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595}
1596
1597
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598void
1599flushline()
1600{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001601 object *f = sysget("stdout");
1602 if (softspace(f, 0))
1603 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604}
1605
Guido van Rossum3f5da241990-12-20 15:06:42 +00001606
Guido van Rossum04691fc1992-08-12 15:35:34 +00001607/* Test a value used as condition, e.g., in a for or if statement.
1608 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609
1610static int
1611testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 object *v;
1613{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001614 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001615 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001616 res = 0;
1617 else if (v->ob_type->tp_as_number != NULL)
1618 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1619 else if (v->ob_type->tp_as_mapping != NULL)
1620 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1621 else if (v->ob_type->tp_as_sequence != NULL)
1622 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1623 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001624 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001625 if (res > 0)
1626 res = 1;
1627 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628}
1629
1630static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001631or(v, w)
1632 object *v, *w;
1633{
1634 if (v->ob_type->tp_as_number != NULL) {
1635 object *x;
1636 object * (*f) FPROTO((object *, object *));
1637 if (coerce(&v, &w) != 0)
1638 return NULL;
1639 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1640 x = (*f)(v, w);
1641 DECREF(v);
1642 DECREF(w);
1643 if (f != NULL)
1644 return x;
1645 }
1646 err_setstr(TypeError, "bad operand type(s) for |");
1647 return NULL;
1648}
1649
1650static object *
1651xor(v, w)
1652 object *v, *w;
1653{
1654 if (v->ob_type->tp_as_number != NULL) {
1655 object *x;
1656 object * (*f) FPROTO((object *, object *));
1657 if (coerce(&v, &w) != 0)
1658 return NULL;
1659 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1660 x = (*f)(v, w);
1661 DECREF(v);
1662 DECREF(w);
1663 if (f != NULL)
1664 return x;
1665 }
1666 err_setstr(TypeError, "bad operand type(s) for ^");
1667 return NULL;
1668}
1669
1670static object *
1671and(v, w)
1672 object *v, *w;
1673{
1674 if (v->ob_type->tp_as_number != NULL) {
1675 object *x;
1676 object * (*f) FPROTO((object *, object *));
1677 if (coerce(&v, &w) != 0)
1678 return NULL;
1679 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1680 x = (*f)(v, w);
1681 DECREF(v);
1682 DECREF(w);
1683 if (f != NULL)
1684 return x;
1685 }
1686 err_setstr(TypeError, "bad operand type(s) for &");
1687 return NULL;
1688}
1689
1690static object *
1691lshift(v, w)
1692 object *v, *w;
1693{
1694 if (v->ob_type->tp_as_number != NULL) {
1695 object *x;
1696 object * (*f) FPROTO((object *, object *));
1697 if (coerce(&v, &w) != 0)
1698 return NULL;
1699 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1700 x = (*f)(v, w);
1701 DECREF(v);
1702 DECREF(w);
1703 if (f != NULL)
1704 return x;
1705 }
1706 err_setstr(TypeError, "bad operand type(s) for <<");
1707 return NULL;
1708}
1709
1710static object *
1711rshift(v, w)
1712 object *v, *w;
1713{
1714 if (v->ob_type->tp_as_number != NULL) {
1715 object *x;
1716 object * (*f) FPROTO((object *, object *));
1717 if (coerce(&v, &w) != 0)
1718 return NULL;
1719 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1720 x = (*f)(v, w);
1721 DECREF(v);
1722 DECREF(w);
1723 if (f != NULL)
1724 return x;
1725 }
1726 err_setstr(TypeError, "bad operand type(s) for >>");
1727 return NULL;
1728}
1729
1730static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001731add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732 object *v, *w;
1733{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001734 if (v->ob_type->tp_as_sequence != NULL)
1735 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1736 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001737 object *x;
1738 if (coerce(&v, &w) != 0)
1739 return NULL;
1740 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1741 DECREF(v);
1742 DECREF(w);
1743 return x;
1744 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001745 err_setstr(TypeError, "bad operand type(s) for +");
1746 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747}
1748
1749static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751 object *v, *w;
1752{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001753 if (v->ob_type->tp_as_number != NULL) {
1754 object *x;
1755 if (coerce(&v, &w) != 0)
1756 return NULL;
1757 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1758 DECREF(v);
1759 DECREF(w);
1760 return x;
1761 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763 return NULL;
1764}
1765
1766static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001767mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768 object *v, *w;
1769{
1770 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001771 tp = v->ob_type;
1772 if (tp->tp_as_number != NULL &&
1773 w->ob_type->tp_as_sequence != NULL &&
1774 !is_instanceobject(v)) {
1775 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 object *tmp = v;
1777 v = w;
1778 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001779 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001781 if (tp->tp_as_number != NULL) {
1782 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001783 if (is_instanceobject(v)) {
1784 /* Instances of user-defined classes get their
1785 other argument uncoerced, so they may
1786 implement sequence*number as well as
1787 number*number. */
1788 INCREF(v);
1789 INCREF(w);
1790 }
1791 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001792 return NULL;
1793 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1794 DECREF(v);
1795 DECREF(w);
1796 return x;
1797 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798 if (tp->tp_as_sequence != NULL) {
1799 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001800 err_setstr(TypeError,
1801 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802 return NULL;
1803 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001804 return (*tp->tp_as_sequence->sq_repeat)
1805 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001807 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 return NULL;
1809}
1810
1811static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001812divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 object *v, *w;
1814{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001815 if (v->ob_type->tp_as_number != NULL) {
1816 object *x;
1817 if (coerce(&v, &w) != 0)
1818 return NULL;
1819 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1820 DECREF(v);
1821 DECREF(w);
1822 return x;
1823 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001824 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 return NULL;
1826}
1827
1828static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001829rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 object *v, *w;
1831{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001832 if (v->ob_type->tp_as_number != NULL) {
1833 object *x;
1834 if (coerce(&v, &w) != 0)
1835 return NULL;
1836 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1837 DECREF(v);
1838 DECREF(w);
1839 return x;
1840 }
Guido van Rossume5372401993-03-16 12:15:04 +00001841 if (is_stringobject(v)) {
1842 return formatstring(v, w);
1843 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001844 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 return NULL;
1846}
1847
1848static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 object *v;
1851{
1852 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001853 return (*v->ob_type->tp_as_number->nb_negative)(v);
1854 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855 return NULL;
1856}
1857
1858static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001859pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 object *v;
1861{
1862 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001863 return (*v->ob_type->tp_as_number->nb_positive)(v);
1864 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 return NULL;
1866}
1867
1868static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001869invert(v)
1870 object *v;
1871{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001872 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001873 if (v->ob_type->tp_as_number != NULL &&
1874 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1875 return (*f)(v);
1876 err_setstr(TypeError, "bad operand type(s) for unary ~");
1877 return NULL;
1878}
1879
1880static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001881not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882 object *v;
1883{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001884 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001885 object *w;
1886 if (outcome < 0)
1887 return NULL;
1888 if (outcome == 0)
1889 w = True;
1890 else
1891 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892 INCREF(w);
1893 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001895/* External interface to call any callable object. The arg may be NULL. */
1896
1897object *
1898call_object(func, arg)
1899 object *func;
1900 object *arg;
1901{
1902 if (is_instancemethodobject(func) || is_funcobject(func))
1903 return call_function(func, arg);
1904 else
1905 return call_builtin(func, arg);
1906}
1907
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 if (is_methodobject(func)) {
1914 method meth = getmethod(func);
1915 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001916 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1917 int size = gettuplesize(arg);
1918 if (size == 1)
1919 arg = gettupleitem(arg, 0);
1920 else if (size == 0)
1921 arg = NULL;
1922 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001923 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 }
1925 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001926 if (arg != NULL &&
1927 !(is_tupleobject(arg) &&
1928 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001929 err_setstr(TypeError,
1930 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 return NULL;
1932 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001933 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001935 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 return NULL;
1937}
1938
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001940call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001942 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001944 object *newarg = NULL;
1945 object *newlocals, *newglobals;
1946 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947
Guido van Rossume8122f11991-05-05 20:03:07 +00001948 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001949 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001950 object *self = instancemethodgetself(func);
1951 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001952 if (arg == NULL)
1953 argcount = 0;
1954 else if (is_tupleobject(arg))
1955 argcount = gettuplesize(arg);
1956 else
1957 argcount = 1;
1958 newarg = newtupleobject(argcount + 1);
1959 if (newarg == NULL)
1960 return NULL;
1961 INCREF(self);
1962 settupleitem(newarg, 0, self);
1963 if (arg != NULL && !is_tupleobject(arg)) {
1964 INCREF(arg);
1965 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 }
1967 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001968 int i;
1969 object *v;
1970 for (i = 0; i < argcount; i++) {
1971 v = gettupleitem(arg, i);
1972 XINCREF(v);
1973 settupleitem(newarg, i+1, v);
1974 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001976 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 }
1978 else {
1979 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 return NULL;
1982 }
1983 }
1984
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985 co = getfunccode(func);
1986 if (co == NULL) {
1987 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 return NULL;
1989 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990 if (!is_codeobject(co)) {
1991 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992 abort();
1993 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997 return NULL;
1998 }
1999
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000 newglobals = getfuncglobals(func);
2001 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002
Guido van Rossum3f5da241990-12-20 15:06:42 +00002003 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005 DECREF(newlocals);
2006 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009
2010 return v;
2011}
2012
2013static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 object *v, *w;
2016{
2017 typeobject *tp = v->ob_type;
2018 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 return NULL;
2021 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002022 if (tp->tp_as_mapping != NULL) {
2023 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2024 }
2025 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 int i;
2027 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002028 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 return NULL;
2030 }
2031 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002032 if (i < 0) {
2033 int len = (*tp->tp_as_sequence->sq_length)(v);
2034 if (len < 0)
2035 return NULL;
2036 i += len;
2037 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002038 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002039 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040}
2041
2042static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002043loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 object *v, *w;
2045{
2046 sequence_methods *sq = v->ob_type->tp_as_sequence;
2047 int i, n;
2048 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002049 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 return NULL;
2051 }
2052 i = getintvalue(w);
2053 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002054 if (n < 0)
2055 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 if (i >= n)
2057 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002058 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059}
2060
2061static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002062slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 object *v;
2064 int isize;
2065 int *pi;
2066{
2067 if (v != NULL) {
2068 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 err_setstr(TypeError, "slice index must be int");
2070 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 }
2072 *pi = getintvalue(v);
2073 if (*pi < 0)
2074 *pi += isize;
2075 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077}
2078
2079static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 object *u, *v, *w;
2082{
2083 typeobject *tp = u->ob_type;
2084 int ilow, ihigh, isize;
2085 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087 return NULL;
2088 }
2089 ilow = 0;
2090 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002091 if (isize < 0)
2092 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002093 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099
2100static int
2101assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 object *w;
2103 object *key;
2104 object *v;
2105{
2106 typeobject *tp = w->ob_type;
2107 sequence_methods *sq;
2108 mapping_methods *mp;
2109 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002110 if ((mp = tp->tp_as_mapping) != NULL &&
2111 (func = mp->mp_ass_subscript) != NULL) {
2112 return (*func)(w, key, v);
2113 }
2114 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 (func = sq->sq_ass_item) != NULL) {
2116 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002118 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002121 else {
2122 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002123 if (i < 0) {
2124 int len = (*sq->sq_length)(w);
2125 if (len < 0)
2126 return -1;
2127 i += len;
2128 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002129 return (*func)(w, i, v);
2130 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002133 err_setstr(TypeError,
2134 "can't assign to this subscripted object");
2135 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137}
2138
Guido van Rossum3f5da241990-12-20 15:06:42 +00002139static int
2140assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141 object *u, *v, *w, *x;
2142{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002143 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002145 if (sq == NULL) {
2146 err_setstr(TypeError, "assign to slice of non-sequence");
2147 return -1;
2148 }
2149 if (sq == NULL || sq->sq_ass_slice == NULL) {
2150 err_setstr(TypeError, "unassignable slice");
2151 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 }
2153 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002154 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002155 if (isize < 0)
2156 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002157 if (slice_index(v, isize, &ilow) != 0)
2158 return -1;
2159 if (slice_index(w, isize, &ihigh) != 0)
2160 return -1;
2161 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162}
2163
2164static int
2165cmp_exception(err, v)
2166 object *err, *v;
2167{
2168 if (is_tupleobject(v)) {
2169 int i, n;
2170 n = gettuplesize(v);
2171 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002172 /* Test recursively */
2173 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 return 1;
2175 }
2176 return 0;
2177 }
2178 return err == v;
2179}
2180
Guido van Rossum3f5da241990-12-20 15:06:42 +00002181static int
2182cmp_member(v, w)
2183 object *v, *w;
2184{
2185 int i, n, cmp;
2186 object *x;
2187 sequence_methods *sq;
2188 /* Special case for char in string */
2189 if (is_stringobject(w)) {
2190 register char *s, *end;
2191 register char c;
2192 if (!is_stringobject(v) || getstringsize(v) != 1) {
2193 err_setstr(TypeError,
2194 "string member test needs char left operand");
2195 return -1;
2196 }
2197 c = getstringvalue(v)[0];
2198 s = getstringvalue(w);
2199 end = s + getstringsize(w);
2200 while (s < end) {
2201 if (c == *s++)
2202 return 1;
2203 }
2204 return 0;
2205 }
2206 sq = w->ob_type->tp_as_sequence;
2207 if (sq == NULL) {
2208 err_setstr(TypeError,
2209 "'in' or 'not in' needs sequence right argument");
2210 return -1;
2211 }
2212 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002213 if (n < 0)
2214 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002215 for (i = 0; i < n; i++) {
2216 x = (*sq->sq_item)(w, i);
2217 cmp = cmpobject(v, x);
2218 XDECREF(x);
2219 if (cmp == 0)
2220 return 1;
2221 }
2222 return 0;
2223}
2224
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002226cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002227 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 register object *v;
2229 register object *w;
2230{
2231 register int cmp;
2232 register int res = 0;
2233 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002234 case IS:
2235 case IS_NOT:
2236 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002237 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238 res = !res;
2239 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 case IN:
2241 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 res = cmp_member(v, w);
2243 if (res < 0)
2244 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002245 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 break;
2248 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002249 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250 break;
2251 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252 cmp = cmpobject(v, w);
2253 switch (op) {
2254 case LT: res = cmp < 0; break;
2255 case LE: res = cmp <= 0; break;
2256 case EQ: res = cmp == 0; break;
2257 case NE: res = cmp != 0; break;
2258 case GT: res = cmp > 0; break;
2259 case GE: res = cmp >= 0; break;
2260 /* XXX no default? (res is initialized to 0 though) */
2261 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262 }
2263 v = res ? True : False;
2264 INCREF(v);
2265 return v;
2266}
2267
Guido van Rossum3f5da241990-12-20 15:06:42 +00002268static int
2269import_from(locals, v, name)
2270 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002271 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002272 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002273{
2274 object *w, *x;
2275 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002276 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002277 int i;
2278 int n = getdictsize(w);
2279 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002280 name = getdict2key(w, i);
2281 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002282 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002283 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002284 if (x == NULL) {
2285 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002286 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002287 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002288 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002289 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002291 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002293 }
2294 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002295 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002296 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002297 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002298 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002299 getstringvalue(name));
2300 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002301 return -1;
2302 }
2303 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002304 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002305 }
2306}
2307
2308static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002310 object *v; /* None or tuple containing base classes */
2311 object *w; /* dictionary */
2312{
2313 if (is_tupleobject(v)) {
2314 int i;
2315 for (i = gettuplesize(v); --i >= 0; ) {
2316 object *x = gettupleitem(v, i);
2317 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002318 err_setstr(TypeError,
2319 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002320 return NULL;
2321 }
2322 }
2323 }
2324 else {
2325 v = NULL;
2326 }
2327 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002328 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002329 return NULL;
2330 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002331 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002332}