blob: 129d74315a107a8d6327eb1164fc4d2695676540 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
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"
33#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000035#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "traceback.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#ifndef NDEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000039/* For debugging the interpreter: */
40#define LLTRACE 1 /* Low-level trace feature */
41#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#endif
43
Guido van Rossum374a9221991-04-04 10:40:29 +000044/* Forward declarations */
45/* XXX Need prototypes */
46
47void flushline();
48static object *add();
49static object *sub();
50static object *mul();
51static object *divide();
52static object *rem();
53static object *neg();
54static object *pos();
55static object *not();
Guido van Rossum7928cd71991-10-24 14:59:31 +000056static object *invert();
57static object *lshift();
58static object *rshift();
59static object *and();
60static object *xor();
61static object *or();
Guido van Rossum374a9221991-04-04 10:40:29 +000062static object *call_builtin();
63static object *call_function();
Guido van Rossum9c7b8611991-12-16 13:04:47 +000064object *call_object();
Guido van Rossum374a9221991-04-04 10:40:29 +000065static object *apply_subscript();
66static object *loop_subscript();
67static object *apply_slice();
68static object *cmp_outcome();
69static object *build_class();
70static int testbool();
71static int assign_subscript PROTO((object *, object *, object *));
72static int assign_slice PROTO((object *, object *, object *, object *));
Guido van Rossumdf62e441991-08-16 08:56:04 +000073static int import_from PROTO((object *, object *, object *));
Guido van Rossum96a42c81992-01-12 02:29:51 +000074static object *call_trace PROTO((object *, frameobject *, char *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000075
76
77static frameobject *current_frame;
78
79
80/* Status code for main loop (reason for stack unwind) */
81
82enum why_code {
83 WHY_NOT, /* No error */
84 WHY_EXCEPTION, /* Exception occurred */
85 WHY_RERAISE, /* Exception re-raised by 'finally' */
86 WHY_RETURN, /* 'return' statement */
87 WHY_BREAK /* 'break' statement */
88};
89
90
91/* Interpreter main loop */
92
93object *
94eval_code(co, globals, locals, arg)
95 codeobject *co;
96 object *globals;
97 object *locals;
98 object *arg;
99{
100 register unsigned char *next_instr;
101 register int opcode; /* Current opcode */
102 register int oparg; /* Current opcode argument, if any */
103 register object **stack_pointer;
104 register enum why_code why; /* Reason for block stack unwind */
105 register int err; /* Error status -- nonzero if error */
106 register object *x; /* Result object -- NULL if error */
107 register object *v; /* Temporary objects popped off stack */
108 register object *w;
109 register object *u;
110 register object *t;
111 register frameobject *f; /* Current frame */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000112 object *trace; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000113 object *retval; /* Return value iff why == WHY_RETURN */
114 char *name; /* Name used by some instructions */
115 FILE *fp; /* Used by print operations */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000116#ifdef LLTRACE
117 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000118#endif
119
120/* Code access macros */
121
122#define GETCONST(i) Getconst(f, i)
123#define GETNAME(i) Getname(f, i)
124#define GETNAMEV(i) Getnamev(f, i)
125#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
126#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
127#define NEXTOP() (*next_instr++)
128#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
129#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
130#define JUMPBY(x) (next_instr += (x))
131
132/* Stack manipulation macros */
133
134#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
135#define EMPTY() (STACK_LEVEL() == 0)
136#define TOP() (stack_pointer[-1])
137#define BASIC_PUSH(v) (*stack_pointer++ = (v))
138#define BASIC_POP() (*--stack_pointer)
139
Guido van Rossum96a42c81992-01-12 02:29:51 +0000140#ifdef LLTRACE
141#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
142#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000143#else
144#define PUSH(v) BASIC_PUSH(v)
145#define POP() BASIC_POP()
146#endif
147
148 f = newframeobject(
149 current_frame, /*back*/
150 co, /*code*/
151 globals, /*globals*/
152 locals, /*locals*/
153 50, /*nvalues*/
154 20); /*nblocks*/
155 if (f == NULL)
156 return NULL;
157
158 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000159
160 trace = sysget("trace");
161 if (trace != NULL) {
162 /* sys.trace, if defined, is a function that will
163 be called on *every* entry to a code block.
164 Its return value, if not None, is a function that
165 will be called at the start of each executed line
166 of code. (Actually, the function must return
167 itself in order to continue tracing.)
168 The trace functions are called with three arguments:
169 a pointer to the current frame, a string indicating
170 why the function is called, and an argument which
171 depends on the situation. The global trace function
172 (sys.trace) is also called whenever an exception
173 is detected. */
174 trace = call_trace(trace, f, "call", arg);
175 if (trace == NULL) {
176 /* Trace function raised an error */
177 sysset("trace", (object *)NULL);
178 current_frame = f->f_back;
179 DECREF(f);
180 return NULL;
181 }
182 if (trace == None) {
183 /* No need to trace this code block */
184 DECREF(trace);
185 trace = NULL;
186 }
187 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000188
189 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000190 stack_pointer = f->f_valuestack;
191
192 if (arg != NULL) {
193 INCREF(arg);
194 PUSH(arg);
195 }
196
197 why = WHY_NOT;
198 err = 0;
199 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000200
201 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000202 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000203
204 /* Do periodic things */
205
206 if (--ticker < 0) {
207 ticker = 100;
208 if (intrcheck()) {
209 err_set(KeyboardInterrupt);
210 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000211 goto on_error;
212 }
213 }
214
215 /* Extract opcode and argument */
216
217 opcode = NEXTOP();
218 if (HAS_ARG(opcode))
219 oparg = NEXTARG();
220
Guido van Rossum96a42c81992-01-12 02:29:51 +0000221#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000222 /* Instruction tracing */
223
Guido van Rossum96a42c81992-01-12 02:29:51 +0000224 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000225 if (HAS_ARG(opcode)) {
226 printf("%d: %d, %d\n",
227 (int) (INSTR_OFFSET() - 3),
228 opcode, oparg);
229 }
230 else {
231 printf("%d: %d\n",
232 (int) (INSTR_OFFSET() - 1), opcode);
233 }
234 }
235#endif
236
237 /* Main switch on opcode */
238
239 switch (opcode) {
240
241 /* BEWARE!
242 It is essential that any operation that fails sets either
243 x to NULL, err to nonzero, or why to anything but WHY_NOT,
244 and that no operation that succeeds does this! */
245
246 /* case STOP_CODE: this is an error! */
247
248 case POP_TOP:
249 v = POP();
250 DECREF(v);
251 break;
252
253 case ROT_TWO:
254 v = POP();
255 w = POP();
256 PUSH(v);
257 PUSH(w);
258 break;
259
260 case ROT_THREE:
261 v = POP();
262 w = POP();
263 x = POP();
264 PUSH(v);
265 PUSH(x);
266 PUSH(w);
267 break;
268
269 case DUP_TOP:
270 v = TOP();
271 INCREF(v);
272 PUSH(v);
273 break;
274
275 case UNARY_POSITIVE:
276 v = POP();
277 x = pos(v);
278 DECREF(v);
279 PUSH(x);
280 break;
281
282 case UNARY_NEGATIVE:
283 v = POP();
284 x = neg(v);
285 DECREF(v);
286 PUSH(x);
287 break;
288
289 case UNARY_NOT:
290 v = POP();
291 x = not(v);
292 DECREF(v);
293 PUSH(x);
294 break;
295
296 case UNARY_CONVERT:
297 v = POP();
298 x = reprobject(v);
299 DECREF(v);
300 PUSH(x);
301 break;
302
303 case UNARY_CALL:
304 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000305 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000306 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000307 DECREF(v);
308 PUSH(x);
309 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000310
311 case UNARY_INVERT:
312 v = POP();
313 x = invert(v);
314 DECREF(v);
315 PUSH(x);
316 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000317
318 case BINARY_MULTIPLY:
319 w = POP();
320 v = POP();
321 x = mul(v, w);
322 DECREF(v);
323 DECREF(w);
324 PUSH(x);
325 break;
326
327 case BINARY_DIVIDE:
328 w = POP();
329 v = POP();
330 x = divide(v, w);
331 DECREF(v);
332 DECREF(w);
333 PUSH(x);
334 break;
335
336 case BINARY_MODULO:
337 w = POP();
338 v = POP();
339 x = rem(v, w);
340 DECREF(v);
341 DECREF(w);
342 PUSH(x);
343 break;
344
345 case BINARY_ADD:
346 w = POP();
347 v = POP();
348 x = add(v, w);
349 DECREF(v);
350 DECREF(w);
351 PUSH(x);
352 break;
353
354 case BINARY_SUBTRACT:
355 w = POP();
356 v = POP();
357 x = sub(v, w);
358 DECREF(v);
359 DECREF(w);
360 PUSH(x);
361 break;
362
363 case BINARY_SUBSCR:
364 w = POP();
365 v = POP();
366 x = apply_subscript(v, w);
367 DECREF(v);
368 DECREF(w);
369 PUSH(x);
370 break;
371
372 case BINARY_CALL:
373 w = POP();
374 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000375 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000376 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000377 DECREF(v);
378 DECREF(w);
379 PUSH(x);
380 break;
381
Guido van Rossum7928cd71991-10-24 14:59:31 +0000382 case BINARY_LSHIFT:
383 w = POP();
384 v = POP();
385 x = lshift(v, w);
386 DECREF(v);
387 DECREF(w);
388 PUSH(x);
389 break;
390
391 case BINARY_RSHIFT:
392 w = POP();
393 v = POP();
394 x = rshift(v, w);
395 DECREF(v);
396 DECREF(w);
397 PUSH(x);
398 break;
399
400 case BINARY_AND:
401 w = POP();
402 v = POP();
403 x = and(v, w);
404 DECREF(v);
405 DECREF(w);
406 PUSH(x);
407 break;
408
409 case BINARY_XOR:
410 w = POP();
411 v = POP();
412 x = xor(v, w);
413 DECREF(v);
414 DECREF(w);
415 PUSH(x);
416 break;
417
418 case BINARY_OR:
419 w = POP();
420 v = POP();
421 x = or(v, w);
422 DECREF(v);
423 DECREF(w);
424 PUSH(x);
425 break;
426
Guido van Rossum374a9221991-04-04 10:40:29 +0000427 case SLICE+0:
428 case SLICE+1:
429 case SLICE+2:
430 case SLICE+3:
431 if ((opcode-SLICE) & 2)
432 w = POP();
433 else
434 w = NULL;
435 if ((opcode-SLICE) & 1)
436 v = POP();
437 else
438 v = NULL;
439 u = POP();
440 x = apply_slice(u, v, w);
441 DECREF(u);
442 XDECREF(v);
443 XDECREF(w);
444 PUSH(x);
445 break;
446
447 case STORE_SLICE+0:
448 case STORE_SLICE+1:
449 case STORE_SLICE+2:
450 case STORE_SLICE+3:
451 if ((opcode-STORE_SLICE) & 2)
452 w = POP();
453 else
454 w = NULL;
455 if ((opcode-STORE_SLICE) & 1)
456 v = POP();
457 else
458 v = NULL;
459 u = POP();
460 t = POP();
461 err = assign_slice(u, v, w, t); /* u[v:w] = t */
462 DECREF(t);
463 DECREF(u);
464 XDECREF(v);
465 XDECREF(w);
466 break;
467
468 case DELETE_SLICE+0:
469 case DELETE_SLICE+1:
470 case DELETE_SLICE+2:
471 case DELETE_SLICE+3:
472 if ((opcode-DELETE_SLICE) & 2)
473 w = POP();
474 else
475 w = NULL;
476 if ((opcode-DELETE_SLICE) & 1)
477 v = POP();
478 else
479 v = NULL;
480 u = POP();
481 err = assign_slice(u, v, w, (object *)NULL);
482 /* del u[v:w] */
483 DECREF(u);
484 XDECREF(v);
485 XDECREF(w);
486 break;
487
488 case STORE_SUBSCR:
489 w = POP();
490 v = POP();
491 u = POP();
492 /* v[w] = u */
493 err = assign_subscript(v, w, u);
494 DECREF(u);
495 DECREF(v);
496 DECREF(w);
497 break;
498
499 case DELETE_SUBSCR:
500 w = POP();
501 v = POP();
502 /* del v[w] */
503 err = assign_subscript(v, w, (object *)NULL);
504 DECREF(v);
505 DECREF(w);
506 break;
507
508 case PRINT_EXPR:
509 v = POP();
510 fp = sysgetfile("stdout", stdout);
511 /* Print value except if procedure result */
512 if (v != None) {
513 flushline();
514 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000515 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000516 flushline();
517 }
518 DECREF(v);
519 break;
520
521 case PRINT_ITEM:
522 v = POP();
523 fp = sysgetfile("stdout", stdout);
524 if (softspace(sysget("stdout"), 1))
525 fprintf(fp, " ");
526 if (is_stringobject(v)) {
527 char *s = getstringvalue(v);
528 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000529 fwrite(s, 1, len, fp);
530 if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000531 softspace(sysget("stdout"), 0);
532 }
533 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000534 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000535 }
536 DECREF(v);
537 break;
538
539 case PRINT_NEWLINE:
540 fp = sysgetfile("stdout", stdout);
541 fprintf(fp, "\n");
542 softspace(sysget("stdout"), 0);
543 break;
544
545 case BREAK_LOOP:
546 why = WHY_BREAK;
547 break;
548
549 case RAISE_EXCEPTION:
550 v = POP();
551 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000552 /* A tuple is equivalent to its first element here */
553 while (is_tupleobject(w)) {
554 u = w;
555 w = gettupleitem(u, 0);
556 DECREF(u);
557 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000558 if (!is_stringobject(w))
559 err_setstr(TypeError,
560 "exceptions must be strings");
561 else
562 err_setval(w, v);
563 DECREF(v);
564 DECREF(w);
565 why = WHY_EXCEPTION;
566 break;
567
568 case LOAD_LOCALS:
569 v = f->f_locals;
570 INCREF(v);
571 PUSH(v);
572 break;
573
574 case RETURN_VALUE:
575 retval = POP();
576 why = WHY_RETURN;
577 break;
578
Guido van Rossum374a9221991-04-04 10:40:29 +0000579 case BUILD_FUNCTION:
580 v = POP();
581 x = newfuncobject(v, f->f_globals);
582 DECREF(v);
583 PUSH(x);
584 break;
585
586 case POP_BLOCK:
587 {
588 block *b = pop_block(f);
589 while (STACK_LEVEL() > b->b_level) {
590 v = POP();
591 DECREF(v);
592 }
593 }
594 break;
595
596 case END_FINALLY:
597 v = POP();
598 if (is_intobject(v)) {
599 why = (enum why_code) getintvalue(v);
600 if (why == WHY_RETURN)
601 retval = POP();
602 }
603 else if (is_stringobject(v)) {
604 w = POP();
605 err_setval(v, w);
606 DECREF(w);
607 w = POP();
608 tb_store(w);
609 DECREF(w);
610 why = WHY_RERAISE;
611 }
612 else if (v != None) {
613 err_setstr(SystemError,
614 "'finally' pops bad exception");
615 why = WHY_EXCEPTION;
616 }
617 DECREF(v);
618 break;
619
620 case BUILD_CLASS:
621 w = POP();
622 v = POP();
623 x = build_class(v, w);
624 PUSH(x);
625 DECREF(v);
626 DECREF(w);
627 break;
628
629 case STORE_NAME:
630 w = GETNAMEV(oparg);
631 v = POP();
632 err = dict2insert(f->f_locals, w, v);
633 DECREF(v);
634 break;
635
636 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000637 w = GETNAMEV(oparg);
638 if ((err = dict2remove(f->f_locals, w)) != 0)
639 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 break;
641
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000642 case UNPACK_ARG:
643 /* Implement various compatibility hacks:
644 (a) f(a,b,...) should accept f((1,2,...))
645 (b) f((a,b,...)) should accept f(1,2,...)
646 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
647 */
648 {
649 int n;
650 if (EMPTY()) {
651 err_setstr(TypeError,
652 "no argument list");
653 why = WHY_EXCEPTION;
654 break;
655 }
656 v = POP();
657 if (!is_tupleobject(v)) {
658 err_setstr(TypeError,
659 "bad argument list");
660 why = WHY_EXCEPTION;
661 break;
662 }
663 n = gettuplesize(v);
664 if (n == 1 && oparg != 1) {
665 /* Rule (a) */
666 w = gettupleitem(v, 0);
667 if (is_tupleobject(w)) {
668 INCREF(w);
669 DECREF(v);
670 v = w;
671 n = gettuplesize(v);
672 }
673 }
674 else if (n != 1 && oparg == 1) {
675 /* Rule (b) */
676 PUSH(v);
677 break;
678 /* Don't fall through */
679 }
680 else if (n > 2 && oparg == 2) {
681 /* Rule (c) */
682 int i;
683 w = newtupleobject(n-1);
684 u = newtupleobject(2);
685 if (u == NULL || w == NULL) {
686 XDECREF(w);
687 XDECREF(u);
688 DECREF(v);
689 why = WHY_EXCEPTION;
690 break;
691 }
692 t = gettupleitem(v, 0);
693 INCREF(t);
694 settupleitem(u, 0, t);
695 for (i = 1; i < n; i++) {
696 t = gettupleitem(v, i);
697 INCREF(t);
698 settupleitem(w, i-1, t);
699 }
700 settupleitem(u, 1, w);
701 DECREF(v);
702 v = u;
703 n = 2;
704 }
705 if (n != oparg) {
706 err_setstr(TypeError,
707 "arg count mismatch");
708 why = WHY_EXCEPTION;
709 DECREF(v);
710 break;
711 }
712 PUSH(v);
713 }
714 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 case UNPACK_TUPLE:
716 v = POP();
717 if (!is_tupleobject(v)) {
718 err_setstr(TypeError, "unpack non-tuple");
719 why = WHY_EXCEPTION;
720 }
721 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000722 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 "unpack tuple of wrong size");
724 why = WHY_EXCEPTION;
725 }
726 else {
727 for (; --oparg >= 0; ) {
728 w = gettupleitem(v, oparg);
729 INCREF(w);
730 PUSH(w);
731 }
732 }
733 DECREF(v);
734 break;
735
736 case UNPACK_LIST:
737 v = POP();
738 if (!is_listobject(v)) {
739 err_setstr(TypeError, "unpack non-list");
740 why = WHY_EXCEPTION;
741 }
742 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000743 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 "unpack list of wrong size");
745 why = WHY_EXCEPTION;
746 }
747 else {
748 for (; --oparg >= 0; ) {
749 w = getlistitem(v, oparg);
750 INCREF(w);
751 PUSH(w);
752 }
753 }
754 DECREF(v);
755 break;
756
757 case STORE_ATTR:
758 name = GETNAME(oparg);
759 v = POP();
760 u = POP();
761 err = setattr(v, name, u); /* v.name = u */
762 DECREF(v);
763 DECREF(u);
764 break;
765
766 case DELETE_ATTR:
767 name = GETNAME(oparg);
768 v = POP();
769 err = setattr(v, name, (object *)NULL);
770 /* del v.name */
771 DECREF(v);
772 break;
773
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000774 case STORE_GLOBAL:
775 w = GETNAMEV(oparg);
776 v = POP();
777 err = dict2insert(f->f_globals, w, v);
778 DECREF(v);
779 break;
780
781 case DELETE_GLOBAL:
782 w = GETNAMEV(oparg);
783 if ((err = dict2remove(f->f_globals, w)) != 0)
784 err_setstr(NameError, getstringvalue(w));
785 break;
786
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 case LOAD_CONST:
788 x = GETCONST(oparg);
789 INCREF(x);
790 PUSH(x);
791 break;
792
793 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000794 w = GETNAMEV(oparg);
795 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000796 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000797 err_clear();
798 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000800 err_clear();
801 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000802 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000803 err_setstr(NameError,
804 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000805 break;
806 }
807 }
808 }
809 INCREF(x);
810 PUSH(x);
811 break;
812
813 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000814 w = GETNAMEV(oparg);
815 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000817 err_clear();
818 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000820 err_setstr(NameError,
821 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000822 break;
823 }
824 }
825 INCREF(x);
826 PUSH(x);
827 break;
828
829 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000830 w = GETNAMEV(oparg);
831 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000833 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 break;
835 }
836 INCREF(x);
837 PUSH(x);
838 break;
839
840 case BUILD_TUPLE:
841 x = newtupleobject(oparg);
842 if (x != NULL) {
843 for (; --oparg >= 0;) {
844 w = POP();
845 err = settupleitem(x, oparg, w);
846 if (err != 0)
847 break;
848 }
849 PUSH(x);
850 }
851 break;
852
853 case BUILD_LIST:
854 x = newlistobject(oparg);
855 if (x != NULL) {
856 for (; --oparg >= 0;) {
857 w = POP();
858 err = setlistitem(x, oparg, w);
859 if (err != 0)
860 break;
861 }
862 PUSH(x);
863 }
864 break;
865
866 case BUILD_MAP:
867 x = newdictobject();
868 PUSH(x);
869 break;
870
871 case LOAD_ATTR:
872 name = GETNAME(oparg);
873 v = POP();
874 x = getattr(v, name);
875 DECREF(v);
876 PUSH(x);
877 break;
878
879 case COMPARE_OP:
880 w = POP();
881 v = POP();
882 x = cmp_outcome((enum cmp_op)oparg, v, w);
883 DECREF(v);
884 DECREF(w);
885 PUSH(x);
886 break;
887
888 case IMPORT_NAME:
889 name = GETNAME(oparg);
890 x = import_module(name);
891 XINCREF(x);
892 PUSH(x);
893 break;
894
895 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000896 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000898 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 break;
900
901 case JUMP_FORWARD:
902 JUMPBY(oparg);
903 break;
904
905 case JUMP_IF_FALSE:
906 if (!testbool(TOP()))
907 JUMPBY(oparg);
908 break;
909
910 case JUMP_IF_TRUE:
911 if (testbool(TOP()))
912 JUMPBY(oparg);
913 break;
914
915 case JUMP_ABSOLUTE:
916 JUMPTO(oparg);
917 break;
918
919 case FOR_LOOP:
920 /* for v in s: ...
921 On entry: stack contains s, i.
922 On exit: stack contains s, i+1, s[i];
923 but if loop exhausted:
924 s, i are popped, and we jump */
925 w = POP(); /* Loop index */
926 v = POP(); /* Sequence object */
927 u = loop_subscript(v, w);
928 if (u != NULL) {
929 PUSH(v);
930 x = newintobject(getintvalue(w)+1);
931 PUSH(x);
932 DECREF(w);
933 PUSH(u);
934 }
935 else {
936 DECREF(v);
937 DECREF(w);
938 /* A NULL can mean "s exhausted"
939 but also an error: */
940 if (err_occurred())
941 why = WHY_EXCEPTION;
942 else
943 JUMPBY(oparg);
944 }
945 break;
946
947 case SETUP_LOOP:
948 case SETUP_EXCEPT:
949 case SETUP_FINALLY:
950 setup_block(f, opcode, INSTR_OFFSET() + oparg,
951 STACK_LEVEL());
952 break;
953
954 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +0000955#ifdef LLTRACE
956 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 printf("--- Line %d ---\n", oparg);
958#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +0000959 f->f_lineno = oparg;
960 if (trace != NULL) {
961 /* Trace each line of code reached */
962 f->f_lasti = INSTR_OFFSET();
963 x = call_trace(trace, f, "line", None);
964 /* The trace function must return itself
965 in order to continue tracing */
966 DECREF(trace);
967 if (x == None) {
968 DECREF(x);
969 trace = NULL;
970 }
971 else
972 trace = x;
973 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 break;
975
976 default:
977 fprintf(stderr,
978 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +0000979 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 err_setstr(SystemError, "eval_code: unknown opcode");
981 why = WHY_EXCEPTION;
982 break;
983
984 } /* switch */
985
986 on_error:
987
988 /* Quickly continue if no error occurred */
989
990 if (why == WHY_NOT) {
991 if (err == 0 && x != NULL)
992 continue; /* Normal, fast path */
993 why = WHY_EXCEPTION;
994 x = None;
995 err = 0;
996 }
997
Guido van Rossum96a42c81992-01-12 02:29:51 +0000998#ifndef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 /* Double-check exception status */
1000
1001 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1002 if (!err_occurred()) {
1003 fprintf(stderr, "XXX ghost error\n");
1004 err_setstr(SystemError, "ghost error");
1005 why = WHY_EXCEPTION;
1006 }
1007 }
1008 else {
1009 if (err_occurred()) {
1010 fprintf(stderr, "XXX undetected error\n");
1011 why = WHY_EXCEPTION;
1012 }
1013 }
1014#endif
1015
1016 /* Log traceback info if this is a real exception */
1017
1018 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001019 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001021 f->f_lasti -= 2;
1022 tb_here(f);
1023
1024 if (trace)
1025 v = trace;
1026 else
1027 v = sysget("trace");
1028 if (v) {
1029 object *type, *value, *traceback, *arg;
1030 err_get(&type, &value);
1031 traceback = tb_fetch();
1032 arg = newtupleobject(3);
1033 if (arg == NULL)
1034 err_clear();
1035 else {
1036 settupleitem(arg, 0, type);
1037 settupleitem(arg, 1, value);
1038 settupleitem(arg, 2, traceback);
1039 }
1040 v = call_trace(v, f, "exception", arg);
1041 if (v == NULL) {
1042 /* Trace function raised error */
1043 tb_here(f);
1044 sysset("trace", (object *)NULL);
1045 XDECREF(trace);
1046 trace = NULL;
1047 }
1048 else {
1049 /* Restore original exception */
1050 err_setval(type, value);
1051 tb_store(traceback);
1052 if (v == None)
1053 DECREF(v);
1054 else {
1055 /* Set trace function */
1056 XDECREF(trace);
1057 trace = v;
1058 }
1059 }
1060 XDECREF(arg);
1061 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 }
1063
1064 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1065
1066 if (why == WHY_RERAISE)
1067 why = WHY_EXCEPTION;
1068
1069 /* Unwind stacks if a (pseudo) exception occurred */
1070
1071 while (why != WHY_NOT && f->f_iblock > 0) {
1072 block *b = pop_block(f);
1073 while (STACK_LEVEL() > b->b_level) {
1074 v = POP();
1075 XDECREF(v);
1076 }
1077 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1078 why = WHY_NOT;
1079 JUMPTO(b->b_handler);
1080 break;
1081 }
1082 if (b->b_type == SETUP_FINALLY ||
1083 b->b_type == SETUP_EXCEPT &&
1084 why == WHY_EXCEPTION) {
1085 if (why == WHY_EXCEPTION) {
1086 object *exc, *val;
1087 err_get(&exc, &val);
1088 if (val == NULL) {
1089 val = None;
1090 INCREF(val);
1091 }
1092 v = tb_fetch();
1093 /* Make the raw exception data
1094 available to the handler,
1095 so a program can emulate the
1096 Python main loop. Don't do
1097 this for 'finally'. */
1098 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001100 sysset("exc_value", val);
1101 sysset("exc_type", exc);
1102 err_clear();
1103 }
1104 PUSH(v);
1105 PUSH(val);
1106 PUSH(exc);
1107 }
1108 else {
1109 if (why == WHY_RETURN)
1110 PUSH(retval);
1111 v = newintobject((long)why);
1112 PUSH(v);
1113 }
1114 why = WHY_NOT;
1115 JUMPTO(b->b_handler);
1116 break;
1117 }
1118 } /* unwind stack */
1119
1120 /* End the loop if we still have an error (or return) */
1121
1122 if (why != WHY_NOT)
1123 break;
1124
1125 } /* main loop */
1126
1127 /* Pop remaining stack entries */
1128
1129 while (!EMPTY()) {
1130 v = POP();
1131 XDECREF(v);
1132 }
1133
Guido van Rossum96a42c81992-01-12 02:29:51 +00001134 if (why != WHY_RETURN)
1135 retval = NULL;
1136
1137 if (trace) {
1138 if (why == WHY_RETURN) {
1139 x = call_trace(trace, f, "return", retval);
1140 if (x == NULL) {
1141 XDECREF(retval);
1142 retval = NULL;
1143 }
1144 else
1145 DECREF(x);
1146 }
1147 DECREF(trace);
1148 }
1149
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 /* Restore previous frame and release the current one */
1151
1152 current_frame = f->f_back;
1153 DECREF(f);
1154
Guido van Rossum96a42c81992-01-12 02:29:51 +00001155 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001156}
1157
Guido van Rossum96a42c81992-01-12 02:29:51 +00001158#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001159static int
1160prtrace(v, str)
1161 object *v;
1162 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001163{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001164 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001165 if (printobject(v, stdout, 0) != 0)
1166 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001167 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001169#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170
Guido van Rossum96a42c81992-01-12 02:29:51 +00001171static object *
1172call_trace(trace, f, msg, arg)
1173 object *trace;
1174 frameobject *f;
1175 char *msg;
1176 object *arg;
1177{
1178 object *arglist, *what, *res;
1179 static int tracing = 0;
1180
1181 if (tracing) {
1182 /* Don't trace the trace code! */
1183 INCREF(None);
1184 return None;
1185 }
1186
1187 arglist = newtupleobject(3);
1188 if (arglist == NULL)
1189 return NULL;
1190 what = newstringobject(msg);
1191 if (what == NULL) {
1192 DECREF(arglist);
1193 return NULL;
1194 }
1195 INCREF(f);
1196 if (arg == NULL)
1197 arg = None;
1198 INCREF(arg);
1199 settupleitem(arglist, 0, (object *)f);
1200 settupleitem(arglist, 1, what);
1201 settupleitem(arglist, 2, arg);
1202 tracing++;
1203 res = call_object(trace, arglist);
1204 tracing--;
1205 if (res == NULL)
1206 tb_here(f);
1207 DECREF(arglist);
1208 return res;
1209}
1210
Guido van Rossum3f5da241990-12-20 15:06:42 +00001211object *
1212getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001213{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001214 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001216 else
1217 return current_frame->f_locals;
1218}
1219
1220object *
1221getglobals()
1222{
1223 if (current_frame == NULL)
1224 return NULL;
1225 else
1226 return current_frame->f_globals;
1227}
1228
1229void
1230printtraceback(fp)
1231 FILE *fp;
1232{
1233 object *v = tb_fetch();
1234 if (v != NULL) {
1235 fprintf(fp, "Stack backtrace (innermost last):\n");
1236 tb_print(v, fp);
1237 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239}
1240
1241
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001242void
1243flushline()
1244{
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 if (softspace(sysget("stdout"), 0))
1246 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247}
1248
Guido van Rossum3f5da241990-12-20 15:06:42 +00001249
1250/* Test a value used as condition, e.g., in a for or if statement */
1251
1252static int
1253testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254 object *v;
1255{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001256 if (v == None)
1257 return 0;
1258 if (v->ob_type->tp_as_number != NULL)
1259 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001260 if (v->ob_type->tp_as_sequence != NULL)
1261 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1262 if (v->ob_type->tp_as_mapping != NULL)
1263 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001264 /* All other objects are 'true' */
1265 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001266}
1267
1268static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001269or(v, w)
1270 object *v, *w;
1271{
1272 if (v->ob_type->tp_as_number != NULL) {
1273 object *x;
1274 object * (*f) FPROTO((object *, object *));
1275 if (coerce(&v, &w) != 0)
1276 return NULL;
1277 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1278 x = (*f)(v, w);
1279 DECREF(v);
1280 DECREF(w);
1281 if (f != NULL)
1282 return x;
1283 }
1284 err_setstr(TypeError, "bad operand type(s) for |");
1285 return NULL;
1286}
1287
1288static object *
1289xor(v, w)
1290 object *v, *w;
1291{
1292 if (v->ob_type->tp_as_number != NULL) {
1293 object *x;
1294 object * (*f) FPROTO((object *, object *));
1295 if (coerce(&v, &w) != 0)
1296 return NULL;
1297 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1298 x = (*f)(v, w);
1299 DECREF(v);
1300 DECREF(w);
1301 if (f != NULL)
1302 return x;
1303 }
1304 err_setstr(TypeError, "bad operand type(s) for ^");
1305 return NULL;
1306}
1307
1308static object *
1309and(v, w)
1310 object *v, *w;
1311{
1312 if (v->ob_type->tp_as_number != NULL) {
1313 object *x;
1314 object * (*f) FPROTO((object *, object *));
1315 if (coerce(&v, &w) != 0)
1316 return NULL;
1317 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1318 x = (*f)(v, w);
1319 DECREF(v);
1320 DECREF(w);
1321 if (f != NULL)
1322 return x;
1323 }
1324 err_setstr(TypeError, "bad operand type(s) for &");
1325 return NULL;
1326}
1327
1328static object *
1329lshift(v, w)
1330 object *v, *w;
1331{
1332 if (v->ob_type->tp_as_number != NULL) {
1333 object *x;
1334 object * (*f) FPROTO((object *, object *));
1335 if (coerce(&v, &w) != 0)
1336 return NULL;
1337 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1338 x = (*f)(v, w);
1339 DECREF(v);
1340 DECREF(w);
1341 if (f != NULL)
1342 return x;
1343 }
1344 err_setstr(TypeError, "bad operand type(s) for <<");
1345 return NULL;
1346}
1347
1348static object *
1349rshift(v, w)
1350 object *v, *w;
1351{
1352 if (v->ob_type->tp_as_number != NULL) {
1353 object *x;
1354 object * (*f) FPROTO((object *, object *));
1355 if (coerce(&v, &w) != 0)
1356 return NULL;
1357 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1358 x = (*f)(v, w);
1359 DECREF(v);
1360 DECREF(w);
1361 if (f != NULL)
1362 return x;
1363 }
1364 err_setstr(TypeError, "bad operand type(s) for >>");
1365 return NULL;
1366}
1367
1368static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001369add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 object *v, *w;
1371{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001372 if (v->ob_type->tp_as_number != NULL) {
1373 object *x;
1374 if (coerce(&v, &w) != 0)
1375 return NULL;
1376 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1377 DECREF(v);
1378 DECREF(w);
1379 return x;
1380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001382 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001384 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001385 return NULL;
1386 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387}
1388
1389static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001390sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001391 object *v, *w;
1392{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001393 if (v->ob_type->tp_as_number != NULL) {
1394 object *x;
1395 if (coerce(&v, &w) != 0)
1396 return NULL;
1397 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1398 DECREF(v);
1399 DECREF(w);
1400 return x;
1401 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001402 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403 return NULL;
1404}
1405
1406static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 object *v, *w;
1409{
1410 typeobject *tp;
1411 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1412 /* int*sequence -- swap v and w */
1413 object *tmp = v;
1414 v = w;
1415 w = tmp;
1416 }
1417 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001418 if (tp->tp_as_number != NULL) {
1419 object *x;
1420 if (coerce(&v, &w) != 0)
1421 return NULL;
1422 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1423 DECREF(v);
1424 DECREF(w);
1425 return x;
1426 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 if (tp->tp_as_sequence != NULL) {
1428 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001429 err_setstr(TypeError,
1430 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 return NULL;
1432 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001433 return (*tp->tp_as_sequence->sq_repeat)
1434 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001436 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437 return NULL;
1438}
1439
1440static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001441divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 object *v, *w;
1443{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001444 if (v->ob_type->tp_as_number != NULL) {
1445 object *x;
1446 if (coerce(&v, &w) != 0)
1447 return NULL;
1448 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1449 DECREF(v);
1450 DECREF(w);
1451 return x;
1452 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001453 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 return NULL;
1455}
1456
1457static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001458rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 object *v, *w;
1460{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001461 if (v->ob_type->tp_as_number != NULL) {
1462 object *x;
1463 if (coerce(&v, &w) != 0)
1464 return NULL;
1465 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1466 DECREF(v);
1467 DECREF(w);
1468 return x;
1469 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 return NULL;
1472}
1473
1474static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001475neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476 object *v;
1477{
1478 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001479 return (*v->ob_type->tp_as_number->nb_negative)(v);
1480 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481 return NULL;
1482}
1483
1484static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001485pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 object *v;
1487{
1488 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001489 return (*v->ob_type->tp_as_number->nb_positive)(v);
1490 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491 return NULL;
1492}
1493
1494static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001495invert(v)
1496 object *v;
1497{
1498 object * (*f) FPROTO((object *, object *));
1499 if (v->ob_type->tp_as_number != NULL &&
1500 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1501 return (*f)(v);
1502 err_setstr(TypeError, "bad operand type(s) for unary ~");
1503 return NULL;
1504}
1505
1506static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001507not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 object *v;
1509{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001510 int outcome = testbool(v);
1511 object *w = outcome == 0 ? True : False;
1512 INCREF(w);
1513 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001515/* External interface to call any callable object. The arg may be NULL. */
1516
1517object *
1518call_object(func, arg)
1519 object *func;
1520 object *arg;
1521{
1522 if (is_instancemethodobject(func) || is_funcobject(func))
1523 return call_function(func, arg);
1524 else
1525 return call_builtin(func, arg);
1526}
1527
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001531 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533 if (is_methodobject(func)) {
1534 method meth = getmethod(func);
1535 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001536 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1537 int size = gettuplesize(arg);
1538 if (size == 1)
1539 arg = gettupleitem(arg, 0);
1540 else if (size == 0)
1541 arg = NULL;
1542 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001543 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001544 }
1545 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001546 if (arg != NULL &&
1547 !(is_tupleobject(arg) &&
1548 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001549 err_setstr(TypeError,
1550 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 return NULL;
1552 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556 return NULL;
1557}
1558
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001560call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001562 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001564 object *newarg = NULL;
1565 object *newlocals, *newglobals;
1566 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567
Guido van Rossume8122f11991-05-05 20:03:07 +00001568 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001569 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001570 object *self = instancemethodgetself(func);
1571 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001572 if (arg == NULL)
1573 argcount = 0;
1574 else if (is_tupleobject(arg))
1575 argcount = gettuplesize(arg);
1576 else
1577 argcount = 1;
1578 newarg = newtupleobject(argcount + 1);
1579 if (newarg == NULL)
1580 return NULL;
1581 INCREF(self);
1582 settupleitem(newarg, 0, self);
1583 if (arg != NULL && !is_tupleobject(arg)) {
1584 INCREF(arg);
1585 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586 }
1587 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001588 int i;
1589 object *v;
1590 for (i = 0; i < argcount; i++) {
1591 v = gettupleitem(arg, i);
1592 XINCREF(v);
1593 settupleitem(newarg, i+1, v);
1594 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001596 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 }
1598 else {
1599 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 return NULL;
1602 }
1603 }
1604
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605 co = getfunccode(func);
1606 if (co == NULL) {
1607 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608 return NULL;
1609 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610 if (!is_codeobject(co)) {
1611 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 abort();
1613 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001616 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 return NULL;
1618 }
1619
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620 newglobals = getfuncglobals(func);
1621 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625 DECREF(newlocals);
1626 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627
Guido van Rossum3f5da241990-12-20 15:06:42 +00001628 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629
1630 return v;
1631}
1632
1633static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001634apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 object *v, *w;
1636{
1637 typeobject *tp = v->ob_type;
1638 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 return NULL;
1641 }
1642 if (tp->tp_as_sequence != NULL) {
1643 int i;
1644 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001645 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 return NULL;
1647 }
1648 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001649 if (i < 0)
1650 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001651 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001653 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654}
1655
1656static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 object *v, *w;
1659{
1660 sequence_methods *sq = v->ob_type->tp_as_sequence;
1661 int i, n;
1662 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 return NULL;
1665 }
1666 i = getintvalue(w);
1667 n = (*sq->sq_length)(v);
1668 if (i >= n)
1669 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001670 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671}
1672
1673static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001674slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 object *v;
1676 int isize;
1677 int *pi;
1678{
1679 if (v != NULL) {
1680 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681 err_setstr(TypeError, "slice index must be int");
1682 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 }
1684 *pi = getintvalue(v);
1685 if (*pi < 0)
1686 *pi += isize;
1687 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689}
1690
1691static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001692apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 object *u, *v, *w;
1694{
1695 typeobject *tp = u->ob_type;
1696 int ilow, ihigh, isize;
1697 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 return NULL;
1700 }
1701 ilow = 0;
1702 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001705 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001707 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709
1710static int
1711assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 object *w;
1713 object *key;
1714 object *v;
1715{
1716 typeobject *tp = w->ob_type;
1717 sequence_methods *sq;
1718 mapping_methods *mp;
1719 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 if ((sq = tp->tp_as_sequence) != NULL &&
1721 (func = sq->sq_ass_item) != NULL) {
1722 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001724 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001725 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001727 else {
1728 int i = getintvalue(key);
1729 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001730 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001731 return (*func)(w, i, v);
1732 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 }
1734 else if ((mp = tp->tp_as_mapping) != NULL &&
1735 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001736 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 }
1738 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739 err_setstr(TypeError,
1740 "can't assign to this subscripted object");
1741 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743}
1744
Guido van Rossum3f5da241990-12-20 15:06:42 +00001745static int
1746assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 object *u, *v, *w, *x;
1748{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001749 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001751 if (sq == NULL) {
1752 err_setstr(TypeError, "assign to slice of non-sequence");
1753 return -1;
1754 }
1755 if (sq == NULL || sq->sq_ass_slice == NULL) {
1756 err_setstr(TypeError, "unassignable slice");
1757 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 }
1759 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001760 isize = ihigh = (*sq->sq_length)(u);
1761 if (slice_index(v, isize, &ilow) != 0)
1762 return -1;
1763 if (slice_index(w, isize, &ihigh) != 0)
1764 return -1;
1765 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766}
1767
1768static int
1769cmp_exception(err, v)
1770 object *err, *v;
1771{
1772 if (is_tupleobject(v)) {
1773 int i, n;
1774 n = gettuplesize(v);
1775 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001776 /* Test recursively */
1777 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 return 1;
1779 }
1780 return 0;
1781 }
1782 return err == v;
1783}
1784
Guido van Rossum3f5da241990-12-20 15:06:42 +00001785static int
1786cmp_member(v, w)
1787 object *v, *w;
1788{
1789 int i, n, cmp;
1790 object *x;
1791 sequence_methods *sq;
1792 /* Special case for char in string */
1793 if (is_stringobject(w)) {
1794 register char *s, *end;
1795 register char c;
1796 if (!is_stringobject(v) || getstringsize(v) != 1) {
1797 err_setstr(TypeError,
1798 "string member test needs char left operand");
1799 return -1;
1800 }
1801 c = getstringvalue(v)[0];
1802 s = getstringvalue(w);
1803 end = s + getstringsize(w);
1804 while (s < end) {
1805 if (c == *s++)
1806 return 1;
1807 }
1808 return 0;
1809 }
1810 sq = w->ob_type->tp_as_sequence;
1811 if (sq == NULL) {
1812 err_setstr(TypeError,
1813 "'in' or 'not in' needs sequence right argument");
1814 return -1;
1815 }
1816 n = (*sq->sq_length)(w);
1817 for (i = 0; i < n; i++) {
1818 x = (*sq->sq_item)(w, i);
1819 cmp = cmpobject(v, x);
1820 XDECREF(x);
1821 if (cmp == 0)
1822 return 1;
1823 }
1824 return 0;
1825}
1826
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001828cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 enum cmp_op op;
1830 register object *v;
1831 register object *w;
1832{
1833 register int cmp;
1834 register int res = 0;
1835 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001836 case IS:
1837 case IS_NOT:
1838 res = (v == w);
1839 if (op == IS_NOT)
1840 res = !res;
1841 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842 case IN:
1843 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001844 res = cmp_member(v, w);
1845 if (res < 0)
1846 return NULL;
1847 if (op == NOT_IN)
1848 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 break;
1850 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001851 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852 break;
1853 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001854 cmp = cmpobject(v, w);
1855 switch (op) {
1856 case LT: res = cmp < 0; break;
1857 case LE: res = cmp <= 0; break;
1858 case EQ: res = cmp == 0; break;
1859 case NE: res = cmp != 0; break;
1860 case GT: res = cmp > 0; break;
1861 case GE: res = cmp >= 0; break;
1862 /* XXX no default? (res is initialized to 0 though) */
1863 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 }
1865 v = res ? True : False;
1866 INCREF(v);
1867 return v;
1868}
1869
Guido van Rossum3f5da241990-12-20 15:06:42 +00001870static int
1871import_from(locals, v, name)
1872 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001873 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001874 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001875{
1876 object *w, *x;
1877 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001878 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001879 int i;
1880 int n = getdictsize(w);
1881 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001882 name = getdict2key(w, i);
1883 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001884 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001885 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001886 if (x == NULL) {
1887 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001888 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001889 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001890 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001891 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001893 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001894 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001895 }
1896 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001897 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001898 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001899 char buf[250];
1900 sprintf(buf, "cannot import name %s",
1901 getstringvalue(name));
1902 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001903 return -1;
1904 }
1905 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001906 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001907 }
1908}
1909
1910static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001912 object *v; /* None or tuple containing base classes */
1913 object *w; /* dictionary */
1914{
1915 if (is_tupleobject(v)) {
1916 int i;
1917 for (i = gettuplesize(v); --i >= 0; ) {
1918 object *x = gettupleitem(v, i);
1919 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920 err_setstr(TypeError,
1921 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001922 return NULL;
1923 }
1924 }
1925 }
1926 else {
1927 v = NULL;
1928 }
1929 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001931 return NULL;
1932 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001933 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001934}