blob: b5a3f4c3324ca1449a9207ecb301ca4bda56ceca [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
39#define TRACE
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#endif
41
Guido van Rossum374a9221991-04-04 10:40:29 +000042/* Forward declarations */
43/* XXX Need prototypes */
44
45void flushline();
46static object *add();
47static object *sub();
48static object *mul();
49static object *divide();
50static object *rem();
51static object *neg();
52static object *pos();
53static object *not();
Guido van Rossum7928cd71991-10-24 14:59:31 +000054static object *invert();
55static object *lshift();
56static object *rshift();
57static object *and();
58static object *xor();
59static object *or();
Guido van Rossum374a9221991-04-04 10:40:29 +000060static object *call_builtin();
61static object *call_function();
62static object *apply_subscript();
63static object *loop_subscript();
64static object *apply_slice();
65static object *cmp_outcome();
66static object *build_class();
67static int testbool();
68static int assign_subscript PROTO((object *, object *, object *));
69static int assign_slice PROTO((object *, object *, object *, object *));
Guido van Rossumdf62e441991-08-16 08:56:04 +000070static int import_from PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000071
72
73static frameobject *current_frame;
74
75
76/* Status code for main loop (reason for stack unwind) */
77
78enum why_code {
79 WHY_NOT, /* No error */
80 WHY_EXCEPTION, /* Exception occurred */
81 WHY_RERAISE, /* Exception re-raised by 'finally' */
82 WHY_RETURN, /* 'return' statement */
83 WHY_BREAK /* 'break' statement */
84};
85
86
87/* Interpreter main loop */
88
89object *
90eval_code(co, globals, locals, arg)
91 codeobject *co;
92 object *globals;
93 object *locals;
94 object *arg;
95{
96 register unsigned char *next_instr;
97 register int opcode; /* Current opcode */
98 register int oparg; /* Current opcode argument, if any */
99 register object **stack_pointer;
100 register enum why_code why; /* Reason for block stack unwind */
101 register int err; /* Error status -- nonzero if error */
102 register object *x; /* Result object -- NULL if error */
103 register object *v; /* Temporary objects popped off stack */
104 register object *w;
105 register object *u;
106 register object *t;
107 register frameobject *f; /* Current frame */
108 int lineno; /* Current line number */
109 object *retval; /* Return value iff why == WHY_RETURN */
110 char *name; /* Name used by some instructions */
111 FILE *fp; /* Used by print operations */
112#ifdef TRACE
113 int trace = dictlookup(globals, "__trace__") != NULL;
114#endif
115
116/* Code access macros */
117
118#define GETCONST(i) Getconst(f, i)
119#define GETNAME(i) Getname(f, i)
120#define GETNAMEV(i) Getnamev(f, i)
121#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
122#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
123#define NEXTOP() (*next_instr++)
124#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
125#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
126#define JUMPBY(x) (next_instr += (x))
127
128/* Stack manipulation macros */
129
130#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
131#define EMPTY() (STACK_LEVEL() == 0)
132#define TOP() (stack_pointer[-1])
133#define BASIC_PUSH(v) (*stack_pointer++ = (v))
134#define BASIC_POP() (*--stack_pointer)
135
136#ifdef TRACE
137#define PUSH(v) (BASIC_PUSH(v), trace && prtrace(TOP(), "push"))
138#define POP() (trace && prtrace(TOP(), "pop"), BASIC_POP())
139#else
140#define PUSH(v) BASIC_PUSH(v)
141#define POP() BASIC_POP()
142#endif
143
144 f = newframeobject(
145 current_frame, /*back*/
146 co, /*code*/
147 globals, /*globals*/
148 locals, /*locals*/
149 50, /*nvalues*/
150 20); /*nblocks*/
151 if (f == NULL)
152 return NULL;
153
154 current_frame = f;
155
156 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
157
158 stack_pointer = f->f_valuestack;
159
160 if (arg != NULL) {
161 INCREF(arg);
162 PUSH(arg);
163 }
164
165 why = WHY_NOT;
166 err = 0;
167 x = None; /* Not a reference, just anything non-NULL */
168 lineno = -1;
169
170 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000171 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000172
173 /* Do periodic things */
174
175 if (--ticker < 0) {
176 ticker = 100;
177 if (intrcheck()) {
178 err_set(KeyboardInterrupt);
179 why = WHY_EXCEPTION;
180 tb_here(f, INSTR_OFFSET(), lineno);
181 goto on_error;
182 }
183 }
184
185 /* Extract opcode and argument */
186
187 opcode = NEXTOP();
188 if (HAS_ARG(opcode))
189 oparg = NEXTARG();
190
191#ifdef TRACE
192 /* Instruction tracing */
193
194 if (trace) {
195 if (HAS_ARG(opcode)) {
196 printf("%d: %d, %d\n",
197 (int) (INSTR_OFFSET() - 3),
198 opcode, oparg);
199 }
200 else {
201 printf("%d: %d\n",
202 (int) (INSTR_OFFSET() - 1), opcode);
203 }
204 }
205#endif
206
207 /* Main switch on opcode */
208
209 switch (opcode) {
210
211 /* BEWARE!
212 It is essential that any operation that fails sets either
213 x to NULL, err to nonzero, or why to anything but WHY_NOT,
214 and that no operation that succeeds does this! */
215
216 /* case STOP_CODE: this is an error! */
217
218 case POP_TOP:
219 v = POP();
220 DECREF(v);
221 break;
222
223 case ROT_TWO:
224 v = POP();
225 w = POP();
226 PUSH(v);
227 PUSH(w);
228 break;
229
230 case ROT_THREE:
231 v = POP();
232 w = POP();
233 x = POP();
234 PUSH(v);
235 PUSH(x);
236 PUSH(w);
237 break;
238
239 case DUP_TOP:
240 v = TOP();
241 INCREF(v);
242 PUSH(v);
243 break;
244
245 case UNARY_POSITIVE:
246 v = POP();
247 x = pos(v);
248 DECREF(v);
249 PUSH(x);
250 break;
251
252 case UNARY_NEGATIVE:
253 v = POP();
254 x = neg(v);
255 DECREF(v);
256 PUSH(x);
257 break;
258
259 case UNARY_NOT:
260 v = POP();
261 x = not(v);
262 DECREF(v);
263 PUSH(x);
264 break;
265
266 case UNARY_CONVERT:
267 v = POP();
268 x = reprobject(v);
269 DECREF(v);
270 PUSH(x);
271 break;
272
273 case UNARY_CALL:
274 v = POP();
Guido van Rossume8122f11991-05-05 20:03:07 +0000275 if (is_instancemethodobject(v) || is_funcobject(v))
Guido van Rossum374a9221991-04-04 10:40:29 +0000276 x = call_function(v, (object *)NULL);
277 else
278 x = call_builtin(v, (object *)NULL);
279 DECREF(v);
280 PUSH(x);
281 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000282
283 case UNARY_INVERT:
284 v = POP();
285 x = invert(v);
286 DECREF(v);
287 PUSH(x);
288 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000289
290 case BINARY_MULTIPLY:
291 w = POP();
292 v = POP();
293 x = mul(v, w);
294 DECREF(v);
295 DECREF(w);
296 PUSH(x);
297 break;
298
299 case BINARY_DIVIDE:
300 w = POP();
301 v = POP();
302 x = divide(v, w);
303 DECREF(v);
304 DECREF(w);
305 PUSH(x);
306 break;
307
308 case BINARY_MODULO:
309 w = POP();
310 v = POP();
311 x = rem(v, w);
312 DECREF(v);
313 DECREF(w);
314 PUSH(x);
315 break;
316
317 case BINARY_ADD:
318 w = POP();
319 v = POP();
320 x = add(v, w);
321 DECREF(v);
322 DECREF(w);
323 PUSH(x);
324 break;
325
326 case BINARY_SUBTRACT:
327 w = POP();
328 v = POP();
329 x = sub(v, w);
330 DECREF(v);
331 DECREF(w);
332 PUSH(x);
333 break;
334
335 case BINARY_SUBSCR:
336 w = POP();
337 v = POP();
338 x = apply_subscript(v, w);
339 DECREF(v);
340 DECREF(w);
341 PUSH(x);
342 break;
343
344 case BINARY_CALL:
345 w = POP();
346 v = POP();
Guido van Rossume8122f11991-05-05 20:03:07 +0000347 if (is_instancemethodobject(v) || is_funcobject(v))
Guido van Rossum374a9221991-04-04 10:40:29 +0000348 x = call_function(v, w);
349 else
350 x = call_builtin(v, w);
351 DECREF(v);
352 DECREF(w);
353 PUSH(x);
354 break;
355
Guido van Rossum7928cd71991-10-24 14:59:31 +0000356 case BINARY_LSHIFT:
357 w = POP();
358 v = POP();
359 x = lshift(v, w);
360 DECREF(v);
361 DECREF(w);
362 PUSH(x);
363 break;
364
365 case BINARY_RSHIFT:
366 w = POP();
367 v = POP();
368 x = rshift(v, w);
369 DECREF(v);
370 DECREF(w);
371 PUSH(x);
372 break;
373
374 case BINARY_AND:
375 w = POP();
376 v = POP();
377 x = and(v, w);
378 DECREF(v);
379 DECREF(w);
380 PUSH(x);
381 break;
382
383 case BINARY_XOR:
384 w = POP();
385 v = POP();
386 x = xor(v, w);
387 DECREF(v);
388 DECREF(w);
389 PUSH(x);
390 break;
391
392 case BINARY_OR:
393 w = POP();
394 v = POP();
395 x = or(v, w);
396 DECREF(v);
397 DECREF(w);
398 PUSH(x);
399 break;
400
Guido van Rossum374a9221991-04-04 10:40:29 +0000401 case SLICE+0:
402 case SLICE+1:
403 case SLICE+2:
404 case SLICE+3:
405 if ((opcode-SLICE) & 2)
406 w = POP();
407 else
408 w = NULL;
409 if ((opcode-SLICE) & 1)
410 v = POP();
411 else
412 v = NULL;
413 u = POP();
414 x = apply_slice(u, v, w);
415 DECREF(u);
416 XDECREF(v);
417 XDECREF(w);
418 PUSH(x);
419 break;
420
421 case STORE_SLICE+0:
422 case STORE_SLICE+1:
423 case STORE_SLICE+2:
424 case STORE_SLICE+3:
425 if ((opcode-STORE_SLICE) & 2)
426 w = POP();
427 else
428 w = NULL;
429 if ((opcode-STORE_SLICE) & 1)
430 v = POP();
431 else
432 v = NULL;
433 u = POP();
434 t = POP();
435 err = assign_slice(u, v, w, t); /* u[v:w] = t */
436 DECREF(t);
437 DECREF(u);
438 XDECREF(v);
439 XDECREF(w);
440 break;
441
442 case DELETE_SLICE+0:
443 case DELETE_SLICE+1:
444 case DELETE_SLICE+2:
445 case DELETE_SLICE+3:
446 if ((opcode-DELETE_SLICE) & 2)
447 w = POP();
448 else
449 w = NULL;
450 if ((opcode-DELETE_SLICE) & 1)
451 v = POP();
452 else
453 v = NULL;
454 u = POP();
455 err = assign_slice(u, v, w, (object *)NULL);
456 /* del u[v:w] */
457 DECREF(u);
458 XDECREF(v);
459 XDECREF(w);
460 break;
461
462 case STORE_SUBSCR:
463 w = POP();
464 v = POP();
465 u = POP();
466 /* v[w] = u */
467 err = assign_subscript(v, w, u);
468 DECREF(u);
469 DECREF(v);
470 DECREF(w);
471 break;
472
473 case DELETE_SUBSCR:
474 w = POP();
475 v = POP();
476 /* del v[w] */
477 err = assign_subscript(v, w, (object *)NULL);
478 DECREF(v);
479 DECREF(w);
480 break;
481
482 case PRINT_EXPR:
483 v = POP();
484 fp = sysgetfile("stdout", stdout);
485 /* Print value except if procedure result */
486 if (v != None) {
487 flushline();
488 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000489 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000490 flushline();
491 }
492 DECREF(v);
493 break;
494
495 case PRINT_ITEM:
496 v = POP();
497 fp = sysgetfile("stdout", stdout);
498 if (softspace(sysget("stdout"), 1))
499 fprintf(fp, " ");
500 if (is_stringobject(v)) {
501 char *s = getstringvalue(v);
502 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000503 fwrite(s, 1, len, fp);
504 if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000505 softspace(sysget("stdout"), 0);
506 }
507 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000508 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000509 }
510 DECREF(v);
511 break;
512
513 case PRINT_NEWLINE:
514 fp = sysgetfile("stdout", stdout);
515 fprintf(fp, "\n");
516 softspace(sysget("stdout"), 0);
517 break;
518
519 case BREAK_LOOP:
520 why = WHY_BREAK;
521 break;
522
523 case RAISE_EXCEPTION:
524 v = POP();
525 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000526 /* A tuple is equivalent to its first element here */
527 while (is_tupleobject(w)) {
528 u = w;
529 w = gettupleitem(u, 0);
530 DECREF(u);
531 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000532 if (!is_stringobject(w))
533 err_setstr(TypeError,
534 "exceptions must be strings");
535 else
536 err_setval(w, v);
537 DECREF(v);
538 DECREF(w);
539 why = WHY_EXCEPTION;
540 break;
541
542 case LOAD_LOCALS:
543 v = f->f_locals;
544 INCREF(v);
545 PUSH(v);
546 break;
547
548 case RETURN_VALUE:
549 retval = POP();
550 why = WHY_RETURN;
551 break;
552
553 case REQUIRE_ARGS:
554 if (EMPTY()) {
555 err_setstr(TypeError,
556 "function expects argument(s)");
557 why = WHY_EXCEPTION;
558 }
559 break;
560
561 case REFUSE_ARGS:
562 if (!EMPTY()) {
563 err_setstr(TypeError,
564 "function expects no argument(s)");
565 why = WHY_EXCEPTION;
566 }
567 break;
568
569 case BUILD_FUNCTION:
570 v = POP();
571 x = newfuncobject(v, f->f_globals);
572 DECREF(v);
573 PUSH(x);
574 break;
575
576 case POP_BLOCK:
577 {
578 block *b = pop_block(f);
579 while (STACK_LEVEL() > b->b_level) {
580 v = POP();
581 DECREF(v);
582 }
583 }
584 break;
585
586 case END_FINALLY:
587 v = POP();
588 if (is_intobject(v)) {
589 why = (enum why_code) getintvalue(v);
590 if (why == WHY_RETURN)
591 retval = POP();
592 }
593 else if (is_stringobject(v)) {
594 w = POP();
595 err_setval(v, w);
596 DECREF(w);
597 w = POP();
598 tb_store(w);
599 DECREF(w);
600 why = WHY_RERAISE;
601 }
602 else if (v != None) {
603 err_setstr(SystemError,
604 "'finally' pops bad exception");
605 why = WHY_EXCEPTION;
606 }
607 DECREF(v);
608 break;
609
610 case BUILD_CLASS:
611 w = POP();
612 v = POP();
613 x = build_class(v, w);
614 PUSH(x);
615 DECREF(v);
616 DECREF(w);
617 break;
618
619 case STORE_NAME:
620 w = GETNAMEV(oparg);
621 v = POP();
622 err = dict2insert(f->f_locals, w, v);
623 DECREF(v);
624 break;
625
626 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000627 w = GETNAMEV(oparg);
628 if ((err = dict2remove(f->f_locals, w)) != 0)
629 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000630 break;
631
632 case UNPACK_TUPLE:
633 v = POP();
634 if (!is_tupleobject(v)) {
635 err_setstr(TypeError, "unpack non-tuple");
636 why = WHY_EXCEPTION;
637 }
638 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000639 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000640 "unpack tuple of wrong size");
641 why = WHY_EXCEPTION;
642 }
643 else {
644 for (; --oparg >= 0; ) {
645 w = gettupleitem(v, oparg);
646 INCREF(w);
647 PUSH(w);
648 }
649 }
650 DECREF(v);
651 break;
652
653 case UNPACK_LIST:
654 v = POP();
655 if (!is_listobject(v)) {
656 err_setstr(TypeError, "unpack non-list");
657 why = WHY_EXCEPTION;
658 }
659 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000660 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 "unpack list of wrong size");
662 why = WHY_EXCEPTION;
663 }
664 else {
665 for (; --oparg >= 0; ) {
666 w = getlistitem(v, oparg);
667 INCREF(w);
668 PUSH(w);
669 }
670 }
671 DECREF(v);
672 break;
673
674 case STORE_ATTR:
675 name = GETNAME(oparg);
676 v = POP();
677 u = POP();
678 err = setattr(v, name, u); /* v.name = u */
679 DECREF(v);
680 DECREF(u);
681 break;
682
683 case DELETE_ATTR:
684 name = GETNAME(oparg);
685 v = POP();
686 err = setattr(v, name, (object *)NULL);
687 /* del v.name */
688 DECREF(v);
689 break;
690
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000691 case STORE_GLOBAL:
692 w = GETNAMEV(oparg);
693 v = POP();
694 err = dict2insert(f->f_globals, w, v);
695 DECREF(v);
696 break;
697
698 case DELETE_GLOBAL:
699 w = GETNAMEV(oparg);
700 if ((err = dict2remove(f->f_globals, w)) != 0)
701 err_setstr(NameError, getstringvalue(w));
702 break;
703
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 case LOAD_CONST:
705 x = GETCONST(oparg);
706 INCREF(x);
707 PUSH(x);
708 break;
709
710 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000711 w = GETNAMEV(oparg);
712 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000714 err_clear();
715 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000717 err_clear();
718 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000720 err_setstr(NameError,
721 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 break;
723 }
724 }
725 }
726 INCREF(x);
727 PUSH(x);
728 break;
729
730 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000731 w = GETNAMEV(oparg);
732 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000734 err_clear();
735 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000737 err_setstr(NameError,
738 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 break;
740 }
741 }
742 INCREF(x);
743 PUSH(x);
744 break;
745
746 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000747 w = GETNAMEV(oparg);
748 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000749 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000750 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 break;
752 }
753 INCREF(x);
754 PUSH(x);
755 break;
756
757 case BUILD_TUPLE:
758 x = newtupleobject(oparg);
759 if (x != NULL) {
760 for (; --oparg >= 0;) {
761 w = POP();
762 err = settupleitem(x, oparg, w);
763 if (err != 0)
764 break;
765 }
766 PUSH(x);
767 }
768 break;
769
770 case BUILD_LIST:
771 x = newlistobject(oparg);
772 if (x != NULL) {
773 for (; --oparg >= 0;) {
774 w = POP();
775 err = setlistitem(x, oparg, w);
776 if (err != 0)
777 break;
778 }
779 PUSH(x);
780 }
781 break;
782
783 case BUILD_MAP:
784 x = newdictobject();
785 PUSH(x);
786 break;
787
788 case LOAD_ATTR:
789 name = GETNAME(oparg);
790 v = POP();
791 x = getattr(v, name);
792 DECREF(v);
793 PUSH(x);
794 break;
795
796 case COMPARE_OP:
797 w = POP();
798 v = POP();
799 x = cmp_outcome((enum cmp_op)oparg, v, w);
800 DECREF(v);
801 DECREF(w);
802 PUSH(x);
803 break;
804
805 case IMPORT_NAME:
806 name = GETNAME(oparg);
807 x = import_module(name);
808 XINCREF(x);
809 PUSH(x);
810 break;
811
812 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000813 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000815 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 break;
817
818 case JUMP_FORWARD:
819 JUMPBY(oparg);
820 break;
821
822 case JUMP_IF_FALSE:
823 if (!testbool(TOP()))
824 JUMPBY(oparg);
825 break;
826
827 case JUMP_IF_TRUE:
828 if (testbool(TOP()))
829 JUMPBY(oparg);
830 break;
831
832 case JUMP_ABSOLUTE:
833 JUMPTO(oparg);
834 break;
835
836 case FOR_LOOP:
837 /* for v in s: ...
838 On entry: stack contains s, i.
839 On exit: stack contains s, i+1, s[i];
840 but if loop exhausted:
841 s, i are popped, and we jump */
842 w = POP(); /* Loop index */
843 v = POP(); /* Sequence object */
844 u = loop_subscript(v, w);
845 if (u != NULL) {
846 PUSH(v);
847 x = newintobject(getintvalue(w)+1);
848 PUSH(x);
849 DECREF(w);
850 PUSH(u);
851 }
852 else {
853 DECREF(v);
854 DECREF(w);
855 /* A NULL can mean "s exhausted"
856 but also an error: */
857 if (err_occurred())
858 why = WHY_EXCEPTION;
859 else
860 JUMPBY(oparg);
861 }
862 break;
863
864 case SETUP_LOOP:
865 case SETUP_EXCEPT:
866 case SETUP_FINALLY:
867 setup_block(f, opcode, INSTR_OFFSET() + oparg,
868 STACK_LEVEL());
869 break;
870
871 case SET_LINENO:
872#ifdef TRACE
873 if (trace)
874 printf("--- Line %d ---\n", oparg);
875#endif
876 lineno = oparg;
877 break;
878
879 default:
880 fprintf(stderr,
881 "XXX lineno: %d, opcode: %d\n",
882 lineno, opcode);
883 err_setstr(SystemError, "eval_code: unknown opcode");
884 why = WHY_EXCEPTION;
885 break;
886
887 } /* switch */
888
889 on_error:
890
891 /* Quickly continue if no error occurred */
892
893 if (why == WHY_NOT) {
894 if (err == 0 && x != NULL)
895 continue; /* Normal, fast path */
896 why = WHY_EXCEPTION;
897 x = None;
898 err = 0;
899 }
900
901#ifndef NDEBUG
902 /* Double-check exception status */
903
904 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
905 if (!err_occurred()) {
906 fprintf(stderr, "XXX ghost error\n");
907 err_setstr(SystemError, "ghost error");
908 why = WHY_EXCEPTION;
909 }
910 }
911 else {
912 if (err_occurred()) {
913 fprintf(stderr, "XXX undetected error\n");
914 why = WHY_EXCEPTION;
915 }
916 }
917#endif
918
919 /* Log traceback info if this is a real exception */
920
921 if (why == WHY_EXCEPTION) {
922 int lasti = INSTR_OFFSET() - 1;
923 if (HAS_ARG(opcode))
924 lasti -= 2;
925 tb_here(f, lasti, lineno);
926 }
927
928 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
929
930 if (why == WHY_RERAISE)
931 why = WHY_EXCEPTION;
932
933 /* Unwind stacks if a (pseudo) exception occurred */
934
935 while (why != WHY_NOT && f->f_iblock > 0) {
936 block *b = pop_block(f);
937 while (STACK_LEVEL() > b->b_level) {
938 v = POP();
939 XDECREF(v);
940 }
941 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
942 why = WHY_NOT;
943 JUMPTO(b->b_handler);
944 break;
945 }
946 if (b->b_type == SETUP_FINALLY ||
947 b->b_type == SETUP_EXCEPT &&
948 why == WHY_EXCEPTION) {
949 if (why == WHY_EXCEPTION) {
950 object *exc, *val;
951 err_get(&exc, &val);
952 if (val == NULL) {
953 val = None;
954 INCREF(val);
955 }
956 v = tb_fetch();
957 /* Make the raw exception data
958 available to the handler,
959 so a program can emulate the
960 Python main loop. Don't do
961 this for 'finally'. */
962 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000963#if 1 /* Oops, this breaks too many things */
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 sysset("exc_traceback", v);
965#endif
966 sysset("exc_value", val);
967 sysset("exc_type", exc);
968 err_clear();
969 }
970 PUSH(v);
971 PUSH(val);
972 PUSH(exc);
973 }
974 else {
975 if (why == WHY_RETURN)
976 PUSH(retval);
977 v = newintobject((long)why);
978 PUSH(v);
979 }
980 why = WHY_NOT;
981 JUMPTO(b->b_handler);
982 break;
983 }
984 } /* unwind stack */
985
986 /* End the loop if we still have an error (or return) */
987
988 if (why != WHY_NOT)
989 break;
990
991 } /* main loop */
992
993 /* Pop remaining stack entries */
994
995 while (!EMPTY()) {
996 v = POP();
997 XDECREF(v);
998 }
999
1000 /* Restore previous frame and release the current one */
1001
1002 current_frame = f->f_back;
1003 DECREF(f);
1004
1005 if (why == WHY_RETURN)
1006 return retval;
1007 else
1008 return NULL;
1009}
1010
Guido van Rossum3f5da241990-12-20 15:06:42 +00001011#ifdef TRACE
1012static int
1013prtrace(v, str)
1014 object *v;
1015 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001017 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001018 if (printobject(v, stdout, 0) != 0)
1019 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001020 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001022#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023
Guido van Rossum3f5da241990-12-20 15:06:42 +00001024object *
1025getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001027 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001028 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001029 else
1030 return current_frame->f_locals;
1031}
1032
1033object *
1034getglobals()
1035{
1036 if (current_frame == NULL)
1037 return NULL;
1038 else
1039 return current_frame->f_globals;
1040}
1041
1042void
1043printtraceback(fp)
1044 FILE *fp;
1045{
1046 object *v = tb_fetch();
1047 if (v != NULL) {
1048 fprintf(fp, "Stack backtrace (innermost last):\n");
1049 tb_print(v, fp);
1050 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001052}
1053
1054
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001055void
1056flushline()
1057{
Guido van Rossum374a9221991-04-04 10:40:29 +00001058 if (softspace(sysget("stdout"), 0))
1059 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060}
1061
Guido van Rossum3f5da241990-12-20 15:06:42 +00001062
1063/* Test a value used as condition, e.g., in a for or if statement */
1064
1065static int
1066testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 object *v;
1068{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001069 if (v == None)
1070 return 0;
1071 if (v->ob_type->tp_as_number != NULL)
1072 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001073 if (v->ob_type->tp_as_sequence != NULL)
1074 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1075 if (v->ob_type->tp_as_mapping != NULL)
1076 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001077 /* All other objects are 'true' */
1078 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079}
1080
1081static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001082or(v, w)
1083 object *v, *w;
1084{
1085 if (v->ob_type->tp_as_number != NULL) {
1086 object *x;
1087 object * (*f) FPROTO((object *, object *));
1088 if (coerce(&v, &w) != 0)
1089 return NULL;
1090 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1091 x = (*f)(v, w);
1092 DECREF(v);
1093 DECREF(w);
1094 if (f != NULL)
1095 return x;
1096 }
1097 err_setstr(TypeError, "bad operand type(s) for |");
1098 return NULL;
1099}
1100
1101static object *
1102xor(v, w)
1103 object *v, *w;
1104{
1105 if (v->ob_type->tp_as_number != NULL) {
1106 object *x;
1107 object * (*f) FPROTO((object *, object *));
1108 if (coerce(&v, &w) != 0)
1109 return NULL;
1110 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1111 x = (*f)(v, w);
1112 DECREF(v);
1113 DECREF(w);
1114 if (f != NULL)
1115 return x;
1116 }
1117 err_setstr(TypeError, "bad operand type(s) for ^");
1118 return NULL;
1119}
1120
1121static object *
1122and(v, w)
1123 object *v, *w;
1124{
1125 if (v->ob_type->tp_as_number != NULL) {
1126 object *x;
1127 object * (*f) FPROTO((object *, object *));
1128 if (coerce(&v, &w) != 0)
1129 return NULL;
1130 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1131 x = (*f)(v, w);
1132 DECREF(v);
1133 DECREF(w);
1134 if (f != NULL)
1135 return x;
1136 }
1137 err_setstr(TypeError, "bad operand type(s) for &");
1138 return NULL;
1139}
1140
1141static object *
1142lshift(v, w)
1143 object *v, *w;
1144{
1145 if (v->ob_type->tp_as_number != NULL) {
1146 object *x;
1147 object * (*f) FPROTO((object *, object *));
1148 if (coerce(&v, &w) != 0)
1149 return NULL;
1150 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1151 x = (*f)(v, w);
1152 DECREF(v);
1153 DECREF(w);
1154 if (f != NULL)
1155 return x;
1156 }
1157 err_setstr(TypeError, "bad operand type(s) for <<");
1158 return NULL;
1159}
1160
1161static object *
1162rshift(v, w)
1163 object *v, *w;
1164{
1165 if (v->ob_type->tp_as_number != NULL) {
1166 object *x;
1167 object * (*f) FPROTO((object *, object *));
1168 if (coerce(&v, &w) != 0)
1169 return NULL;
1170 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1171 x = (*f)(v, w);
1172 DECREF(v);
1173 DECREF(w);
1174 if (f != NULL)
1175 return x;
1176 }
1177 err_setstr(TypeError, "bad operand type(s) for >>");
1178 return NULL;
1179}
1180
1181static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183 object *v, *w;
1184{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001185 if (v->ob_type->tp_as_number != NULL) {
1186 object *x;
1187 if (coerce(&v, &w) != 0)
1188 return NULL;
1189 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1190 DECREF(v);
1191 DECREF(w);
1192 return x;
1193 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001194 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001195 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001197 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 return NULL;
1199 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001200}
1201
1202static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001203sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204 object *v, *w;
1205{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001206 if (v->ob_type->tp_as_number != NULL) {
1207 object *x;
1208 if (coerce(&v, &w) != 0)
1209 return NULL;
1210 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1211 DECREF(v);
1212 DECREF(w);
1213 return x;
1214 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001215 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216 return NULL;
1217}
1218
1219static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001220mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 object *v, *w;
1222{
1223 typeobject *tp;
1224 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1225 /* int*sequence -- swap v and w */
1226 object *tmp = v;
1227 v = w;
1228 w = tmp;
1229 }
1230 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001231 if (tp->tp_as_number != NULL) {
1232 object *x;
1233 if (coerce(&v, &w) != 0)
1234 return NULL;
1235 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1236 DECREF(v);
1237 DECREF(w);
1238 return x;
1239 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001240 if (tp->tp_as_sequence != NULL) {
1241 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001242 err_setstr(TypeError,
1243 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 return NULL;
1245 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001246 return (*tp->tp_as_sequence->sq_repeat)
1247 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001249 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250 return NULL;
1251}
1252
1253static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001254divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001255 object *v, *w;
1256{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001257 if (v->ob_type->tp_as_number != NULL) {
1258 object *x;
1259 if (coerce(&v, &w) != 0)
1260 return NULL;
1261 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1262 DECREF(v);
1263 DECREF(w);
1264 return x;
1265 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001266 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267 return NULL;
1268}
1269
1270static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001271rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001272 object *v, *w;
1273{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001274 if (v->ob_type->tp_as_number != NULL) {
1275 object *x;
1276 if (coerce(&v, &w) != 0)
1277 return NULL;
1278 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1279 DECREF(v);
1280 DECREF(w);
1281 return x;
1282 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001283 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284 return NULL;
1285}
1286
1287static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001288neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 object *v;
1290{
1291 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001292 return (*v->ob_type->tp_as_number->nb_negative)(v);
1293 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294 return NULL;
1295}
1296
1297static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001298pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299 object *v;
1300{
1301 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001302 return (*v->ob_type->tp_as_number->nb_positive)(v);
1303 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 return NULL;
1305}
1306
1307static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001308invert(v)
1309 object *v;
1310{
1311 object * (*f) FPROTO((object *, object *));
1312 if (v->ob_type->tp_as_number != NULL &&
1313 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1314 return (*f)(v);
1315 err_setstr(TypeError, "bad operand type(s) for unary ~");
1316 return NULL;
1317}
1318
1319static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001320not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321 object *v;
1322{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323 int outcome = testbool(v);
1324 object *w = outcome == 0 ? True : False;
1325 INCREF(w);
1326 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001327}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001328/* External interface to call any callable object. The arg may be NULL. */
1329
1330object *
1331call_object(func, arg)
1332 object *func;
1333 object *arg;
1334{
1335 if (is_instancemethodobject(func) || is_funcobject(func))
1336 return call_function(func, arg);
1337 else
1338 return call_builtin(func, arg);
1339}
1340
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001342call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001344 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 if (is_methodobject(func)) {
1347 method meth = getmethod(func);
1348 object *self = getself(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001349 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 }
1351 if (is_classobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352 if (arg != NULL) {
1353 err_setstr(TypeError,
1354 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355 return NULL;
1356 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001359 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360 return NULL;
1361}
1362
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001364call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001366 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001368 object *newarg = NULL;
1369 object *newlocals, *newglobals;
1370 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371
Guido van Rossume8122f11991-05-05 20:03:07 +00001372 if (is_instancemethodobject(func)) {
1373 object *self = instancemethodgetself(func);
1374 func = instancemethodgetfunc(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001375 if (arg == NULL) {
1376 arg = self;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377 }
1378 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001379 newarg = newtupleobject(2);
1380 if (newarg == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381 return NULL;
1382 INCREF(self);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383 INCREF(arg);
1384 settupleitem(newarg, 0, self);
1385 settupleitem(newarg, 1, arg);
1386 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 }
1388 }
1389 else {
1390 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001391 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392 return NULL;
1393 }
1394 }
1395
Guido van Rossum3f5da241990-12-20 15:06:42 +00001396 co = getfunccode(func);
1397 if (co == NULL) {
1398 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399 return NULL;
1400 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401 if (!is_codeobject(co)) {
1402 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403 abort();
1404 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408 return NULL;
1409 }
1410
Guido van Rossum3f5da241990-12-20 15:06:42 +00001411 newglobals = getfuncglobals(func);
1412 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413
Guido van Rossum3f5da241990-12-20 15:06:42 +00001414 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415
Guido van Rossum3f5da241990-12-20 15:06:42 +00001416 DECREF(newlocals);
1417 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418
Guido van Rossum3f5da241990-12-20 15:06:42 +00001419 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420
1421 return v;
1422}
1423
1424static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001425apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 object *v, *w;
1427{
1428 typeobject *tp = v->ob_type;
1429 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001430 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 return NULL;
1432 }
1433 if (tp->tp_as_sequence != NULL) {
1434 int i;
1435 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001436 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437 return NULL;
1438 }
1439 i = getintvalue(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001442 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443}
1444
1445static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001446loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 object *v, *w;
1448{
1449 sequence_methods *sq = v->ob_type->tp_as_sequence;
1450 int i, n;
1451 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001452 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 return NULL;
1454 }
1455 i = getintvalue(w);
1456 n = (*sq->sq_length)(v);
1457 if (i >= n)
1458 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001459 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460}
1461
1462static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001463slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464 object *v;
1465 int isize;
1466 int *pi;
1467{
1468 if (v != NULL) {
1469 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 err_setstr(TypeError, "slice index must be int");
1471 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 }
1473 *pi = getintvalue(v);
1474 if (*pi < 0)
1475 *pi += isize;
1476 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478}
1479
1480static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001481apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 object *u, *v, *w;
1483{
1484 typeobject *tp = u->ob_type;
1485 int ilow, ihigh, isize;
1486 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001487 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001488 return NULL;
1489 }
1490 ilow = 0;
1491 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001494 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001496 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001498
1499static int
1500assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501 object *w;
1502 object *key;
1503 object *v;
1504{
1505 typeobject *tp = w->ob_type;
1506 sequence_methods *sq;
1507 mapping_methods *mp;
1508 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509 if ((sq = tp->tp_as_sequence) != NULL &&
1510 (func = sq->sq_ass_item) != NULL) {
1511 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001512 err_setstr(TypeError,
1513 "sequence subscript must be integer");
1514 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001516 else
1517 return (*func)(w, (int)getintvalue(key), v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 }
1519 else if ((mp = tp->tp_as_mapping) != NULL &&
1520 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001521 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 }
1523 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001524 err_setstr(TypeError,
1525 "can't assign to this subscripted object");
1526 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528}
1529
Guido van Rossum3f5da241990-12-20 15:06:42 +00001530static int
1531assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 object *u, *v, *w, *x;
1533{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001534 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001535 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001536 if (sq == NULL) {
1537 err_setstr(TypeError, "assign to slice of non-sequence");
1538 return -1;
1539 }
1540 if (sq == NULL || sq->sq_ass_slice == NULL) {
1541 err_setstr(TypeError, "unassignable slice");
1542 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001543 }
1544 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001545 isize = ihigh = (*sq->sq_length)(u);
1546 if (slice_index(v, isize, &ilow) != 0)
1547 return -1;
1548 if (slice_index(w, isize, &ihigh) != 0)
1549 return -1;
1550 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551}
1552
1553static int
1554cmp_exception(err, v)
1555 object *err, *v;
1556{
1557 if (is_tupleobject(v)) {
1558 int i, n;
1559 n = gettuplesize(v);
1560 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001561 /* Test recursively */
1562 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 return 1;
1564 }
1565 return 0;
1566 }
1567 return err == v;
1568}
1569
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570static int
1571cmp_member(v, w)
1572 object *v, *w;
1573{
1574 int i, n, cmp;
1575 object *x;
1576 sequence_methods *sq;
1577 /* Special case for char in string */
1578 if (is_stringobject(w)) {
1579 register char *s, *end;
1580 register char c;
1581 if (!is_stringobject(v) || getstringsize(v) != 1) {
1582 err_setstr(TypeError,
1583 "string member test needs char left operand");
1584 return -1;
1585 }
1586 c = getstringvalue(v)[0];
1587 s = getstringvalue(w);
1588 end = s + getstringsize(w);
1589 while (s < end) {
1590 if (c == *s++)
1591 return 1;
1592 }
1593 return 0;
1594 }
1595 sq = w->ob_type->tp_as_sequence;
1596 if (sq == NULL) {
1597 err_setstr(TypeError,
1598 "'in' or 'not in' needs sequence right argument");
1599 return -1;
1600 }
1601 n = (*sq->sq_length)(w);
1602 for (i = 0; i < n; i++) {
1603 x = (*sq->sq_item)(w, i);
1604 cmp = cmpobject(v, x);
1605 XDECREF(x);
1606 if (cmp == 0)
1607 return 1;
1608 }
1609 return 0;
1610}
1611
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 enum cmp_op op;
1615 register object *v;
1616 register object *w;
1617{
1618 register int cmp;
1619 register int res = 0;
1620 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001621 case IS:
1622 case IS_NOT:
1623 res = (v == w);
1624 if (op == IS_NOT)
1625 res = !res;
1626 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 case IN:
1628 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001629 res = cmp_member(v, w);
1630 if (res < 0)
1631 return NULL;
1632 if (op == NOT_IN)
1633 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 break;
1635 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001636 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 break;
1638 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 cmp = cmpobject(v, w);
1640 switch (op) {
1641 case LT: res = cmp < 0; break;
1642 case LE: res = cmp <= 0; break;
1643 case EQ: res = cmp == 0; break;
1644 case NE: res = cmp != 0; break;
1645 case GT: res = cmp > 0; break;
1646 case GE: res = cmp >= 0; break;
1647 /* XXX no default? (res is initialized to 0 though) */
1648 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 }
1650 v = res ? True : False;
1651 INCREF(v);
1652 return v;
1653}
1654
Guido van Rossum374a9221991-04-04 10:40:29 +00001655/* XXX This function should use dict2 variants (change interface!) */
1656
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657static int
1658import_from(locals, v, name)
1659 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001660 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001661 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001662{
1663 object *w, *x;
1664 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001665 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001666 int i;
1667 int n = getdictsize(w);
1668 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001669 name = getdict2key(w, i);
1670 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001671 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001672 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001673 if (x == NULL) {
1674 /* XXX can't happen? */
Guido van Rossumdf62e441991-08-16 08:56:04 +00001675 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001677 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001678 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001679 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001680 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001682 }
1683 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001684 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001685 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001686 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001687 return -1;
1688 }
1689 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001690 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001691 }
1692}
1693
1694static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001695build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001696 object *v; /* None or tuple containing base classes */
1697 object *w; /* dictionary */
1698{
1699 if (is_tupleobject(v)) {
1700 int i;
1701 for (i = gettuplesize(v); --i >= 0; ) {
1702 object *x = gettupleitem(v, i);
1703 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001704 err_setstr(TypeError,
1705 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001706 return NULL;
1707 }
1708 }
1709 }
1710 else {
1711 v = NULL;
1712 }
1713 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001714 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001715 return NULL;
1716 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001717 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001718}