blob: cc2f034b798c93be11d7e8ed361a318a44009e64 [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 Rossum6a3f9a81992-01-14 18:29:20 +0000642 case UNPACK_VARARG:
643 if (EMPTY()) {
644 err_setstr(TypeError,
645 "no argument list");
646 why = WHY_EXCEPTION;
647 break;
648 }
649 v = POP();
650 if (!is_tupleobject(v)) {
651 err_setstr(TypeError,
652 "bad argument list");
653 why = WHY_EXCEPTION;
654 }
655 else if (gettuplesize(v) < oparg) {
656 err_setstr(TypeError,
657 "not enough arguments");
658 why = WHY_EXCEPTION;
659 }
660 else if (oparg == 0) {
661 PUSH(v);
662 break;
663 }
664 else {
665 x = gettupleslice(v, oparg, gettuplesize(v));
666 if (x != NULL) {
667 PUSH(x);
668 for (; --oparg >= 0; ) {
669 w = gettupleitem(v, oparg);
670 INCREF(w);
671 PUSH(w);
672 }
673 }
674 }
675 DECREF(v);
676 break;
677
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000678 case UNPACK_ARG:
679 /* Implement various compatibility hacks:
680 (a) f(a,b,...) should accept f((1,2,...))
681 (b) f((a,b,...)) should accept f(1,2,...)
682 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
683 */
684 {
685 int n;
686 if (EMPTY()) {
687 err_setstr(TypeError,
688 "no argument list");
689 why = WHY_EXCEPTION;
690 break;
691 }
692 v = POP();
693 if (!is_tupleobject(v)) {
694 err_setstr(TypeError,
695 "bad argument list");
696 why = WHY_EXCEPTION;
697 break;
698 }
699 n = gettuplesize(v);
700 if (n == 1 && oparg != 1) {
701 /* Rule (a) */
702 w = gettupleitem(v, 0);
703 if (is_tupleobject(w)) {
704 INCREF(w);
705 DECREF(v);
706 v = w;
707 n = gettuplesize(v);
708 }
709 }
710 else if (n != 1 && oparg == 1) {
711 /* Rule (b) */
712 PUSH(v);
713 break;
714 /* Don't fall through */
715 }
716 else if (n > 2 && oparg == 2) {
717 /* Rule (c) */
718 int i;
719 w = newtupleobject(n-1);
720 u = newtupleobject(2);
721 if (u == NULL || w == NULL) {
722 XDECREF(w);
723 XDECREF(u);
724 DECREF(v);
725 why = WHY_EXCEPTION;
726 break;
727 }
728 t = gettupleitem(v, 0);
729 INCREF(t);
730 settupleitem(u, 0, t);
731 for (i = 1; i < n; i++) {
732 t = gettupleitem(v, i);
733 INCREF(t);
734 settupleitem(w, i-1, t);
735 }
736 settupleitem(u, 1, w);
737 DECREF(v);
738 v = u;
739 n = 2;
740 }
741 if (n != oparg) {
742 err_setstr(TypeError,
743 "arg count mismatch");
744 why = WHY_EXCEPTION;
745 DECREF(v);
746 break;
747 }
748 PUSH(v);
749 }
750 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 case UNPACK_TUPLE:
752 v = POP();
753 if (!is_tupleobject(v)) {
754 err_setstr(TypeError, "unpack non-tuple");
755 why = WHY_EXCEPTION;
756 }
757 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000758 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 "unpack tuple of wrong size");
760 why = WHY_EXCEPTION;
761 }
762 else {
763 for (; --oparg >= 0; ) {
764 w = gettupleitem(v, oparg);
765 INCREF(w);
766 PUSH(w);
767 }
768 }
769 DECREF(v);
770 break;
771
772 case UNPACK_LIST:
773 v = POP();
774 if (!is_listobject(v)) {
775 err_setstr(TypeError, "unpack non-list");
776 why = WHY_EXCEPTION;
777 }
778 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000779 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000780 "unpack list of wrong size");
781 why = WHY_EXCEPTION;
782 }
783 else {
784 for (; --oparg >= 0; ) {
785 w = getlistitem(v, oparg);
786 INCREF(w);
787 PUSH(w);
788 }
789 }
790 DECREF(v);
791 break;
792
793 case STORE_ATTR:
794 name = GETNAME(oparg);
795 v = POP();
796 u = POP();
797 err = setattr(v, name, u); /* v.name = u */
798 DECREF(v);
799 DECREF(u);
800 break;
801
802 case DELETE_ATTR:
803 name = GETNAME(oparg);
804 v = POP();
805 err = setattr(v, name, (object *)NULL);
806 /* del v.name */
807 DECREF(v);
808 break;
809
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000810 case STORE_GLOBAL:
811 w = GETNAMEV(oparg);
812 v = POP();
813 err = dict2insert(f->f_globals, w, v);
814 DECREF(v);
815 break;
816
817 case DELETE_GLOBAL:
818 w = GETNAMEV(oparg);
819 if ((err = dict2remove(f->f_globals, w)) != 0)
820 err_setstr(NameError, getstringvalue(w));
821 break;
822
Guido van Rossum374a9221991-04-04 10:40:29 +0000823 case LOAD_CONST:
824 x = GETCONST(oparg);
825 INCREF(x);
826 PUSH(x);
827 break;
828
829 case LOAD_NAME:
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_clear();
834 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000836 err_clear();
837 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000839 err_setstr(NameError,
840 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
842 }
843 }
844 }
845 INCREF(x);
846 PUSH(x);
847 break;
848
849 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000850 w = GETNAMEV(oparg);
851 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000853 err_clear();
854 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000855 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000856 err_setstr(NameError,
857 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000858 break;
859 }
860 }
861 INCREF(x);
862 PUSH(x);
863 break;
864
865 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000866 w = GETNAMEV(oparg);
867 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000869 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
871 }
872 INCREF(x);
873 PUSH(x);
874 break;
875
876 case BUILD_TUPLE:
877 x = newtupleobject(oparg);
878 if (x != NULL) {
879 for (; --oparg >= 0;) {
880 w = POP();
881 err = settupleitem(x, oparg, w);
882 if (err != 0)
883 break;
884 }
885 PUSH(x);
886 }
887 break;
888
889 case BUILD_LIST:
890 x = newlistobject(oparg);
891 if (x != NULL) {
892 for (; --oparg >= 0;) {
893 w = POP();
894 err = setlistitem(x, oparg, w);
895 if (err != 0)
896 break;
897 }
898 PUSH(x);
899 }
900 break;
901
902 case BUILD_MAP:
903 x = newdictobject();
904 PUSH(x);
905 break;
906
907 case LOAD_ATTR:
908 name = GETNAME(oparg);
909 v = POP();
910 x = getattr(v, name);
911 DECREF(v);
912 PUSH(x);
913 break;
914
915 case COMPARE_OP:
916 w = POP();
917 v = POP();
918 x = cmp_outcome((enum cmp_op)oparg, v, w);
919 DECREF(v);
920 DECREF(w);
921 PUSH(x);
922 break;
923
924 case IMPORT_NAME:
925 name = GETNAME(oparg);
926 x = import_module(name);
927 XINCREF(x);
928 PUSH(x);
929 break;
930
931 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000932 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000934 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 break;
936
937 case JUMP_FORWARD:
938 JUMPBY(oparg);
939 break;
940
941 case JUMP_IF_FALSE:
942 if (!testbool(TOP()))
943 JUMPBY(oparg);
944 break;
945
946 case JUMP_IF_TRUE:
947 if (testbool(TOP()))
948 JUMPBY(oparg);
949 break;
950
951 case JUMP_ABSOLUTE:
952 JUMPTO(oparg);
953 break;
954
955 case FOR_LOOP:
956 /* for v in s: ...
957 On entry: stack contains s, i.
958 On exit: stack contains s, i+1, s[i];
959 but if loop exhausted:
960 s, i are popped, and we jump */
961 w = POP(); /* Loop index */
962 v = POP(); /* Sequence object */
963 u = loop_subscript(v, w);
964 if (u != NULL) {
965 PUSH(v);
966 x = newintobject(getintvalue(w)+1);
967 PUSH(x);
968 DECREF(w);
969 PUSH(u);
970 }
971 else {
972 DECREF(v);
973 DECREF(w);
974 /* A NULL can mean "s exhausted"
975 but also an error: */
976 if (err_occurred())
977 why = WHY_EXCEPTION;
978 else
979 JUMPBY(oparg);
980 }
981 break;
982
983 case SETUP_LOOP:
984 case SETUP_EXCEPT:
985 case SETUP_FINALLY:
986 setup_block(f, opcode, INSTR_OFFSET() + oparg,
987 STACK_LEVEL());
988 break;
989
990 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +0000991#ifdef LLTRACE
992 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 printf("--- Line %d ---\n", oparg);
994#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +0000995 f->f_lineno = oparg;
996 if (trace != NULL) {
997 /* Trace each line of code reached */
998 f->f_lasti = INSTR_OFFSET();
999 x = call_trace(trace, f, "line", None);
1000 /* The trace function must return itself
1001 in order to continue tracing */
1002 DECREF(trace);
1003 if (x == None) {
1004 DECREF(x);
1005 trace = NULL;
1006 }
1007 else
1008 trace = x;
1009 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 break;
1011
1012 default:
1013 fprintf(stderr,
1014 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001015 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 err_setstr(SystemError, "eval_code: unknown opcode");
1017 why = WHY_EXCEPTION;
1018 break;
1019
1020 } /* switch */
1021
1022 on_error:
1023
1024 /* Quickly continue if no error occurred */
1025
1026 if (why == WHY_NOT) {
1027 if (err == 0 && x != NULL)
1028 continue; /* Normal, fast path */
1029 why = WHY_EXCEPTION;
1030 x = None;
1031 err = 0;
1032 }
1033
Guido van Rossum96a42c81992-01-12 02:29:51 +00001034#ifndef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 /* Double-check exception status */
1036
1037 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1038 if (!err_occurred()) {
1039 fprintf(stderr, "XXX ghost error\n");
1040 err_setstr(SystemError, "ghost error");
1041 why = WHY_EXCEPTION;
1042 }
1043 }
1044 else {
1045 if (err_occurred()) {
1046 fprintf(stderr, "XXX undetected error\n");
1047 why = WHY_EXCEPTION;
1048 }
1049 }
1050#endif
1051
1052 /* Log traceback info if this is a real exception */
1053
1054 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001055 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001057 f->f_lasti -= 2;
1058 tb_here(f);
1059
1060 if (trace)
1061 v = trace;
1062 else
1063 v = sysget("trace");
1064 if (v) {
1065 object *type, *value, *traceback, *arg;
1066 err_get(&type, &value);
1067 traceback = tb_fetch();
1068 arg = newtupleobject(3);
1069 if (arg == NULL)
1070 err_clear();
1071 else {
1072 settupleitem(arg, 0, type);
1073 settupleitem(arg, 1, value);
1074 settupleitem(arg, 2, traceback);
1075 }
1076 v = call_trace(v, f, "exception", arg);
1077 if (v == NULL) {
1078 /* Trace function raised error */
1079 tb_here(f);
1080 sysset("trace", (object *)NULL);
1081 XDECREF(trace);
1082 trace = NULL;
1083 }
1084 else {
1085 /* Restore original exception */
1086 err_setval(type, value);
1087 tb_store(traceback);
1088 if (v == None)
1089 DECREF(v);
1090 else {
1091 /* Set trace function */
1092 XDECREF(trace);
1093 trace = v;
1094 }
1095 }
1096 XDECREF(arg);
1097 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 }
1099
1100 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1101
1102 if (why == WHY_RERAISE)
1103 why = WHY_EXCEPTION;
1104
1105 /* Unwind stacks if a (pseudo) exception occurred */
1106
1107 while (why != WHY_NOT && f->f_iblock > 0) {
1108 block *b = pop_block(f);
1109 while (STACK_LEVEL() > b->b_level) {
1110 v = POP();
1111 XDECREF(v);
1112 }
1113 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1114 why = WHY_NOT;
1115 JUMPTO(b->b_handler);
1116 break;
1117 }
1118 if (b->b_type == SETUP_FINALLY ||
1119 b->b_type == SETUP_EXCEPT &&
1120 why == WHY_EXCEPTION) {
1121 if (why == WHY_EXCEPTION) {
1122 object *exc, *val;
1123 err_get(&exc, &val);
1124 if (val == NULL) {
1125 val = None;
1126 INCREF(val);
1127 }
1128 v = tb_fetch();
1129 /* Make the raw exception data
1130 available to the handler,
1131 so a program can emulate the
1132 Python main loop. Don't do
1133 this for 'finally'. */
1134 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 sysset("exc_value", val);
1137 sysset("exc_type", exc);
1138 err_clear();
1139 }
1140 PUSH(v);
1141 PUSH(val);
1142 PUSH(exc);
1143 }
1144 else {
1145 if (why == WHY_RETURN)
1146 PUSH(retval);
1147 v = newintobject((long)why);
1148 PUSH(v);
1149 }
1150 why = WHY_NOT;
1151 JUMPTO(b->b_handler);
1152 break;
1153 }
1154 } /* unwind stack */
1155
1156 /* End the loop if we still have an error (or return) */
1157
1158 if (why != WHY_NOT)
1159 break;
1160
1161 } /* main loop */
1162
1163 /* Pop remaining stack entries */
1164
1165 while (!EMPTY()) {
1166 v = POP();
1167 XDECREF(v);
1168 }
1169
Guido van Rossum96a42c81992-01-12 02:29:51 +00001170 if (why != WHY_RETURN)
1171 retval = NULL;
1172
1173 if (trace) {
1174 if (why == WHY_RETURN) {
1175 x = call_trace(trace, f, "return", retval);
1176 if (x == NULL) {
1177 XDECREF(retval);
1178 retval = NULL;
1179 }
1180 else
1181 DECREF(x);
1182 }
1183 DECREF(trace);
1184 }
1185
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 /* Restore previous frame and release the current one */
1187
1188 current_frame = f->f_back;
1189 DECREF(f);
1190
Guido van Rossum96a42c81992-01-12 02:29:51 +00001191 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001192}
1193
Guido van Rossum96a42c81992-01-12 02:29:51 +00001194#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001195static int
1196prtrace(v, str)
1197 object *v;
1198 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001199{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001200 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001201 if (printobject(v, stdout, 0) != 0)
1202 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001203 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001205#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001206
Guido van Rossum96a42c81992-01-12 02:29:51 +00001207static object *
1208call_trace(trace, f, msg, arg)
1209 object *trace;
1210 frameobject *f;
1211 char *msg;
1212 object *arg;
1213{
1214 object *arglist, *what, *res;
1215 static int tracing = 0;
1216
1217 if (tracing) {
1218 /* Don't trace the trace code! */
1219 INCREF(None);
1220 return None;
1221 }
1222
1223 arglist = newtupleobject(3);
1224 if (arglist == NULL)
1225 return NULL;
1226 what = newstringobject(msg);
1227 if (what == NULL) {
1228 DECREF(arglist);
1229 return NULL;
1230 }
1231 INCREF(f);
1232 if (arg == NULL)
1233 arg = None;
1234 INCREF(arg);
1235 settupleitem(arglist, 0, (object *)f);
1236 settupleitem(arglist, 1, what);
1237 settupleitem(arglist, 2, arg);
1238 tracing++;
1239 res = call_object(trace, arglist);
1240 tracing--;
1241 if (res == NULL)
1242 tb_here(f);
1243 DECREF(arglist);
1244 return res;
1245}
1246
Guido van Rossum3f5da241990-12-20 15:06:42 +00001247object *
1248getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001250 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001251 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001252 else
1253 return current_frame->f_locals;
1254}
1255
1256object *
1257getglobals()
1258{
1259 if (current_frame == NULL)
1260 return NULL;
1261 else
1262 return current_frame->f_globals;
1263}
1264
1265void
1266printtraceback(fp)
1267 FILE *fp;
1268{
1269 object *v = tb_fetch();
1270 if (v != NULL) {
1271 fprintf(fp, "Stack backtrace (innermost last):\n");
1272 tb_print(v, fp);
1273 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001274 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275}
1276
1277
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278void
1279flushline()
1280{
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 if (softspace(sysget("stdout"), 0))
1282 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001283}
1284
Guido van Rossum3f5da241990-12-20 15:06:42 +00001285
1286/* Test a value used as condition, e.g., in a for or if statement */
1287
1288static int
1289testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290 object *v;
1291{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001292 if (v == None)
1293 return 0;
1294 if (v->ob_type->tp_as_number != NULL)
1295 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001296 if (v->ob_type->tp_as_sequence != NULL)
1297 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1298 if (v->ob_type->tp_as_mapping != NULL)
1299 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001300 /* All other objects are 'true' */
1301 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302}
1303
1304static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001305or(v, w)
1306 object *v, *w;
1307{
1308 if (v->ob_type->tp_as_number != NULL) {
1309 object *x;
1310 object * (*f) FPROTO((object *, object *));
1311 if (coerce(&v, &w) != 0)
1312 return NULL;
1313 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1314 x = (*f)(v, w);
1315 DECREF(v);
1316 DECREF(w);
1317 if (f != NULL)
1318 return x;
1319 }
1320 err_setstr(TypeError, "bad operand type(s) for |");
1321 return NULL;
1322}
1323
1324static object *
1325xor(v, w)
1326 object *v, *w;
1327{
1328 if (v->ob_type->tp_as_number != NULL) {
1329 object *x;
1330 object * (*f) FPROTO((object *, object *));
1331 if (coerce(&v, &w) != 0)
1332 return NULL;
1333 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1334 x = (*f)(v, w);
1335 DECREF(v);
1336 DECREF(w);
1337 if (f != NULL)
1338 return x;
1339 }
1340 err_setstr(TypeError, "bad operand type(s) for ^");
1341 return NULL;
1342}
1343
1344static object *
1345and(v, w)
1346 object *v, *w;
1347{
1348 if (v->ob_type->tp_as_number != NULL) {
1349 object *x;
1350 object * (*f) FPROTO((object *, object *));
1351 if (coerce(&v, &w) != 0)
1352 return NULL;
1353 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1354 x = (*f)(v, w);
1355 DECREF(v);
1356 DECREF(w);
1357 if (f != NULL)
1358 return x;
1359 }
1360 err_setstr(TypeError, "bad operand type(s) for &");
1361 return NULL;
1362}
1363
1364static object *
1365lshift(v, w)
1366 object *v, *w;
1367{
1368 if (v->ob_type->tp_as_number != NULL) {
1369 object *x;
1370 object * (*f) FPROTO((object *, object *));
1371 if (coerce(&v, &w) != 0)
1372 return NULL;
1373 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1374 x = (*f)(v, w);
1375 DECREF(v);
1376 DECREF(w);
1377 if (f != NULL)
1378 return x;
1379 }
1380 err_setstr(TypeError, "bad operand type(s) for <<");
1381 return NULL;
1382}
1383
1384static object *
1385rshift(v, w)
1386 object *v, *w;
1387{
1388 if (v->ob_type->tp_as_number != NULL) {
1389 object *x;
1390 object * (*f) FPROTO((object *, object *));
1391 if (coerce(&v, &w) != 0)
1392 return NULL;
1393 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1394 x = (*f)(v, w);
1395 DECREF(v);
1396 DECREF(w);
1397 if (f != NULL)
1398 return x;
1399 }
1400 err_setstr(TypeError, "bad operand type(s) for >>");
1401 return NULL;
1402}
1403
1404static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 object *v, *w;
1407{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001408 if (v->ob_type->tp_as_number != NULL) {
1409 object *x;
1410 if (coerce(&v, &w) != 0)
1411 return NULL;
1412 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1413 DECREF(v);
1414 DECREF(w);
1415 return x;
1416 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001418 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 return NULL;
1422 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423}
1424
1425static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001426sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 object *v, *w;
1428{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001429 if (v->ob_type->tp_as_number != NULL) {
1430 object *x;
1431 if (coerce(&v, &w) != 0)
1432 return NULL;
1433 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1434 DECREF(v);
1435 DECREF(w);
1436 return x;
1437 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001438 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439 return NULL;
1440}
1441
1442static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001443mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 object *v, *w;
1445{
1446 typeobject *tp;
1447 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1448 /* int*sequence -- swap v and w */
1449 object *tmp = v;
1450 v = w;
1451 w = tmp;
1452 }
1453 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001454 if (tp->tp_as_number != NULL) {
1455 object *x;
1456 if (coerce(&v, &w) != 0)
1457 return NULL;
1458 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1459 DECREF(v);
1460 DECREF(w);
1461 return x;
1462 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 if (tp->tp_as_sequence != NULL) {
1464 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001465 err_setstr(TypeError,
1466 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 return NULL;
1468 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001469 return (*tp->tp_as_sequence->sq_repeat)
1470 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001472 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 return NULL;
1474}
1475
1476static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001477divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 object *v, *w;
1479{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001480 if (v->ob_type->tp_as_number != NULL) {
1481 object *x;
1482 if (coerce(&v, &w) != 0)
1483 return NULL;
1484 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1485 DECREF(v);
1486 DECREF(w);
1487 return x;
1488 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001489 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490 return NULL;
1491}
1492
1493static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001494rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 object *v, *w;
1496{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001497 if (v->ob_type->tp_as_number != NULL) {
1498 object *x;
1499 if (coerce(&v, &w) != 0)
1500 return NULL;
1501 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1502 DECREF(v);
1503 DECREF(w);
1504 return x;
1505 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001506 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 return NULL;
1508}
1509
1510static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001511neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001512 object *v;
1513{
1514 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001515 return (*v->ob_type->tp_as_number->nb_negative)(v);
1516 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 return NULL;
1518}
1519
1520static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001521pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 object *v;
1523{
1524 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001525 return (*v->ob_type->tp_as_number->nb_positive)(v);
1526 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 return NULL;
1528}
1529
1530static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001531invert(v)
1532 object *v;
1533{
1534 object * (*f) FPROTO((object *, object *));
1535 if (v->ob_type->tp_as_number != NULL &&
1536 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1537 return (*f)(v);
1538 err_setstr(TypeError, "bad operand type(s) for unary ~");
1539 return NULL;
1540}
1541
1542static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001543not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001544 object *v;
1545{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001546 int outcome = testbool(v);
1547 object *w = outcome == 0 ? True : False;
1548 INCREF(w);
1549 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001551/* External interface to call any callable object. The arg may be NULL. */
1552
1553object *
1554call_object(func, arg)
1555 object *func;
1556 object *arg;
1557{
1558 if (is_instancemethodobject(func) || is_funcobject(func))
1559 return call_function(func, arg);
1560 else
1561 return call_builtin(func, arg);
1562}
1563
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001567 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 if (is_methodobject(func)) {
1570 method meth = getmethod(func);
1571 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001572 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1573 int size = gettuplesize(arg);
1574 if (size == 1)
1575 arg = gettupleitem(arg, 0);
1576 else if (size == 0)
1577 arg = NULL;
1578 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001579 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 }
1581 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001582 if (arg != NULL &&
1583 !(is_tupleobject(arg) &&
1584 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001585 err_setstr(TypeError,
1586 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 return NULL;
1588 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001591 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 return NULL;
1593}
1594
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001598 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600 object *newarg = NULL;
1601 object *newlocals, *newglobals;
1602 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603
Guido van Rossume8122f11991-05-05 20:03:07 +00001604 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001605 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001606 object *self = instancemethodgetself(func);
1607 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001608 if (arg == NULL)
1609 argcount = 0;
1610 else if (is_tupleobject(arg))
1611 argcount = gettuplesize(arg);
1612 else
1613 argcount = 1;
1614 newarg = newtupleobject(argcount + 1);
1615 if (newarg == NULL)
1616 return NULL;
1617 INCREF(self);
1618 settupleitem(newarg, 0, self);
1619 if (arg != NULL && !is_tupleobject(arg)) {
1620 INCREF(arg);
1621 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 }
1623 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001624 int i;
1625 object *v;
1626 for (i = 0; i < argcount; i++) {
1627 v = gettupleitem(arg, i);
1628 XINCREF(v);
1629 settupleitem(newarg, i+1, v);
1630 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001632 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 }
1634 else {
1635 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001636 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 return NULL;
1638 }
1639 }
1640
Guido van Rossum3f5da241990-12-20 15:06:42 +00001641 co = getfunccode(func);
1642 if (co == NULL) {
1643 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 return NULL;
1645 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001646 if (!is_codeobject(co)) {
1647 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001648 abort();
1649 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001650 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001652 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653 return NULL;
1654 }
1655
Guido van Rossum3f5da241990-12-20 15:06:42 +00001656 newglobals = getfuncglobals(func);
1657 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660
Guido van Rossum3f5da241990-12-20 15:06:42 +00001661 DECREF(newlocals);
1662 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663
Guido van Rossum3f5da241990-12-20 15:06:42 +00001664 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665
1666 return v;
1667}
1668
1669static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001670apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671 object *v, *w;
1672{
1673 typeobject *tp = v->ob_type;
1674 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001675 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 return NULL;
1677 }
1678 if (tp->tp_as_sequence != NULL) {
1679 int i;
1680 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682 return NULL;
1683 }
1684 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001685 if (i < 0)
1686 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001687 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001689 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690}
1691
1692static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 object *v, *w;
1695{
1696 sequence_methods *sq = v->ob_type->tp_as_sequence;
1697 int i, n;
1698 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001699 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700 return NULL;
1701 }
1702 i = getintvalue(w);
1703 n = (*sq->sq_length)(v);
1704 if (i >= n)
1705 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001706 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707}
1708
1709static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 object *v;
1712 int isize;
1713 int *pi;
1714{
1715 if (v != NULL) {
1716 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001717 err_setstr(TypeError, "slice index must be int");
1718 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719 }
1720 *pi = getintvalue(v);
1721 if (*pi < 0)
1722 *pi += isize;
1723 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001724 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725}
1726
1727static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001728apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 object *u, *v, *w;
1730{
1731 typeobject *tp = u->ob_type;
1732 int ilow, ihigh, isize;
1733 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001734 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 return NULL;
1736 }
1737 ilow = 0;
1738 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001741 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001743 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001745
1746static int
1747assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748 object *w;
1749 object *key;
1750 object *v;
1751{
1752 typeobject *tp = w->ob_type;
1753 sequence_methods *sq;
1754 mapping_methods *mp;
1755 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756 if ((sq = tp->tp_as_sequence) != NULL &&
1757 (func = sq->sq_ass_item) != NULL) {
1758 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001760 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001761 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001763 else {
1764 int i = getintvalue(key);
1765 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001766 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001767 return (*func)(w, i, v);
1768 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769 }
1770 else if ((mp = tp->tp_as_mapping) != NULL &&
1771 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001772 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773 }
1774 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775 err_setstr(TypeError,
1776 "can't assign to this subscripted object");
1777 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779}
1780
Guido van Rossum3f5da241990-12-20 15:06:42 +00001781static int
1782assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 object *u, *v, *w, *x;
1784{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001785 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001787 if (sq == NULL) {
1788 err_setstr(TypeError, "assign to slice of non-sequence");
1789 return -1;
1790 }
1791 if (sq == NULL || sq->sq_ass_slice == NULL) {
1792 err_setstr(TypeError, "unassignable slice");
1793 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794 }
1795 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001796 isize = ihigh = (*sq->sq_length)(u);
1797 if (slice_index(v, isize, &ilow) != 0)
1798 return -1;
1799 if (slice_index(w, isize, &ihigh) != 0)
1800 return -1;
1801 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802}
1803
1804static int
1805cmp_exception(err, v)
1806 object *err, *v;
1807{
1808 if (is_tupleobject(v)) {
1809 int i, n;
1810 n = gettuplesize(v);
1811 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001812 /* Test recursively */
1813 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 return 1;
1815 }
1816 return 0;
1817 }
1818 return err == v;
1819}
1820
Guido van Rossum3f5da241990-12-20 15:06:42 +00001821static int
1822cmp_member(v, w)
1823 object *v, *w;
1824{
1825 int i, n, cmp;
1826 object *x;
1827 sequence_methods *sq;
1828 /* Special case for char in string */
1829 if (is_stringobject(w)) {
1830 register char *s, *end;
1831 register char c;
1832 if (!is_stringobject(v) || getstringsize(v) != 1) {
1833 err_setstr(TypeError,
1834 "string member test needs char left operand");
1835 return -1;
1836 }
1837 c = getstringvalue(v)[0];
1838 s = getstringvalue(w);
1839 end = s + getstringsize(w);
1840 while (s < end) {
1841 if (c == *s++)
1842 return 1;
1843 }
1844 return 0;
1845 }
1846 sq = w->ob_type->tp_as_sequence;
1847 if (sq == NULL) {
1848 err_setstr(TypeError,
1849 "'in' or 'not in' needs sequence right argument");
1850 return -1;
1851 }
1852 n = (*sq->sq_length)(w);
1853 for (i = 0; i < n; i++) {
1854 x = (*sq->sq_item)(w, i);
1855 cmp = cmpobject(v, x);
1856 XDECREF(x);
1857 if (cmp == 0)
1858 return 1;
1859 }
1860 return 0;
1861}
1862
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 enum cmp_op op;
1866 register object *v;
1867 register object *w;
1868{
1869 register int cmp;
1870 register int res = 0;
1871 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001872 case IS:
1873 case IS_NOT:
1874 res = (v == w);
1875 if (op == IS_NOT)
1876 res = !res;
1877 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878 case IN:
1879 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880 res = cmp_member(v, w);
1881 if (res < 0)
1882 return NULL;
1883 if (op == NOT_IN)
1884 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 break;
1886 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001887 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 break;
1889 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001890 cmp = cmpobject(v, w);
1891 switch (op) {
1892 case LT: res = cmp < 0; break;
1893 case LE: res = cmp <= 0; break;
1894 case EQ: res = cmp == 0; break;
1895 case NE: res = cmp != 0; break;
1896 case GT: res = cmp > 0; break;
1897 case GE: res = cmp >= 0; break;
1898 /* XXX no default? (res is initialized to 0 though) */
1899 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 }
1901 v = res ? True : False;
1902 INCREF(v);
1903 return v;
1904}
1905
Guido van Rossum3f5da241990-12-20 15:06:42 +00001906static int
1907import_from(locals, v, name)
1908 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001909 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001910 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001911{
1912 object *w, *x;
1913 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001914 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001915 int i;
1916 int n = getdictsize(w);
1917 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001918 name = getdict2key(w, i);
1919 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001920 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001921 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001922 if (x == NULL) {
1923 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001924 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001926 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001927 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001928 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001929 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001931 }
1932 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001933 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001934 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001935 char buf[250];
1936 sprintf(buf, "cannot import name %s",
1937 getstringvalue(name));
1938 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001939 return -1;
1940 }
1941 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001942 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001943 }
1944}
1945
1946static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001947build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001948 object *v; /* None or tuple containing base classes */
1949 object *w; /* dictionary */
1950{
1951 if (is_tupleobject(v)) {
1952 int i;
1953 for (i = gettuplesize(v); --i >= 0; ) {
1954 object *x = gettupleitem(v, i);
1955 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956 err_setstr(TypeError,
1957 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001958 return NULL;
1959 }
1960 }
1961 }
1962 else {
1963 v = NULL;
1964 }
1965 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001966 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001967 return NULL;
1968 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001969 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001970}