blob: 7399623735a64374a1d779ee972b4c0d4c3cf059 [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();
526 if (!is_stringobject(w))
527 err_setstr(TypeError,
528 "exceptions must be strings");
529 else
530 err_setval(w, v);
531 DECREF(v);
532 DECREF(w);
533 why = WHY_EXCEPTION;
534 break;
535
536 case LOAD_LOCALS:
537 v = f->f_locals;
538 INCREF(v);
539 PUSH(v);
540 break;
541
542 case RETURN_VALUE:
543 retval = POP();
544 why = WHY_RETURN;
545 break;
546
547 case REQUIRE_ARGS:
548 if (EMPTY()) {
549 err_setstr(TypeError,
550 "function expects argument(s)");
551 why = WHY_EXCEPTION;
552 }
553 break;
554
555 case REFUSE_ARGS:
556 if (!EMPTY()) {
557 err_setstr(TypeError,
558 "function expects no argument(s)");
559 why = WHY_EXCEPTION;
560 }
561 break;
562
563 case BUILD_FUNCTION:
564 v = POP();
565 x = newfuncobject(v, f->f_globals);
566 DECREF(v);
567 PUSH(x);
568 break;
569
570 case POP_BLOCK:
571 {
572 block *b = pop_block(f);
573 while (STACK_LEVEL() > b->b_level) {
574 v = POP();
575 DECREF(v);
576 }
577 }
578 break;
579
580 case END_FINALLY:
581 v = POP();
582 if (is_intobject(v)) {
583 why = (enum why_code) getintvalue(v);
584 if (why == WHY_RETURN)
585 retval = POP();
586 }
587 else if (is_stringobject(v)) {
588 w = POP();
589 err_setval(v, w);
590 DECREF(w);
591 w = POP();
592 tb_store(w);
593 DECREF(w);
594 why = WHY_RERAISE;
595 }
596 else if (v != None) {
597 err_setstr(SystemError,
598 "'finally' pops bad exception");
599 why = WHY_EXCEPTION;
600 }
601 DECREF(v);
602 break;
603
604 case BUILD_CLASS:
605 w = POP();
606 v = POP();
607 x = build_class(v, w);
608 PUSH(x);
609 DECREF(v);
610 DECREF(w);
611 break;
612
613 case STORE_NAME:
614 w = GETNAMEV(oparg);
615 v = POP();
616 err = dict2insert(f->f_locals, w, v);
617 DECREF(v);
618 break;
619
620 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000621 w = GETNAMEV(oparg);
622 if ((err = dict2remove(f->f_locals, w)) != 0)
623 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 break;
625
626 case UNPACK_TUPLE:
627 v = POP();
628 if (!is_tupleobject(v)) {
629 err_setstr(TypeError, "unpack non-tuple");
630 why = WHY_EXCEPTION;
631 }
632 else if (gettuplesize(v) != oparg) {
633 err_setstr(RuntimeError,
634 "unpack tuple of wrong size");
635 why = WHY_EXCEPTION;
636 }
637 else {
638 for (; --oparg >= 0; ) {
639 w = gettupleitem(v, oparg);
640 INCREF(w);
641 PUSH(w);
642 }
643 }
644 DECREF(v);
645 break;
646
647 case UNPACK_LIST:
648 v = POP();
649 if (!is_listobject(v)) {
650 err_setstr(TypeError, "unpack non-list");
651 why = WHY_EXCEPTION;
652 }
653 else if (getlistsize(v) != oparg) {
654 err_setstr(RuntimeError,
655 "unpack list of wrong size");
656 why = WHY_EXCEPTION;
657 }
658 else {
659 for (; --oparg >= 0; ) {
660 w = getlistitem(v, oparg);
661 INCREF(w);
662 PUSH(w);
663 }
664 }
665 DECREF(v);
666 break;
667
668 case STORE_ATTR:
669 name = GETNAME(oparg);
670 v = POP();
671 u = POP();
672 err = setattr(v, name, u); /* v.name = u */
673 DECREF(v);
674 DECREF(u);
675 break;
676
677 case DELETE_ATTR:
678 name = GETNAME(oparg);
679 v = POP();
680 err = setattr(v, name, (object *)NULL);
681 /* del v.name */
682 DECREF(v);
683 break;
684
685 case LOAD_CONST:
686 x = GETCONST(oparg);
687 INCREF(x);
688 PUSH(x);
689 break;
690
691 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000692 w = GETNAMEV(oparg);
693 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000694 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000695 err_clear();
696 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000698 err_clear();
699 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000701 err_setstr(NameError,
702 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 break;
704 }
705 }
706 }
707 INCREF(x);
708 PUSH(x);
709 break;
710
711 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000712 w = GETNAMEV(oparg);
713 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000715 err_clear();
716 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000718 err_setstr(NameError,
719 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 break;
721 }
722 }
723 INCREF(x);
724 PUSH(x);
725 break;
726
727 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000728 w = GETNAMEV(oparg);
729 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000731 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 break;
733 }
734 INCREF(x);
735 PUSH(x);
736 break;
737
738 case BUILD_TUPLE:
739 x = newtupleobject(oparg);
740 if (x != NULL) {
741 for (; --oparg >= 0;) {
742 w = POP();
743 err = settupleitem(x, oparg, w);
744 if (err != 0)
745 break;
746 }
747 PUSH(x);
748 }
749 break;
750
751 case BUILD_LIST:
752 x = newlistobject(oparg);
753 if (x != NULL) {
754 for (; --oparg >= 0;) {
755 w = POP();
756 err = setlistitem(x, oparg, w);
757 if (err != 0)
758 break;
759 }
760 PUSH(x);
761 }
762 break;
763
764 case BUILD_MAP:
765 x = newdictobject();
766 PUSH(x);
767 break;
768
769 case LOAD_ATTR:
770 name = GETNAME(oparg);
771 v = POP();
772 x = getattr(v, name);
773 DECREF(v);
774 PUSH(x);
775 break;
776
777 case COMPARE_OP:
778 w = POP();
779 v = POP();
780 x = cmp_outcome((enum cmp_op)oparg, v, w);
781 DECREF(v);
782 DECREF(w);
783 PUSH(x);
784 break;
785
786 case IMPORT_NAME:
787 name = GETNAME(oparg);
788 x = import_module(name);
789 XINCREF(x);
790 PUSH(x);
791 break;
792
793 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000794 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000796 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000797 break;
798
799 case JUMP_FORWARD:
800 JUMPBY(oparg);
801 break;
802
803 case JUMP_IF_FALSE:
804 if (!testbool(TOP()))
805 JUMPBY(oparg);
806 break;
807
808 case JUMP_IF_TRUE:
809 if (testbool(TOP()))
810 JUMPBY(oparg);
811 break;
812
813 case JUMP_ABSOLUTE:
814 JUMPTO(oparg);
815 break;
816
817 case FOR_LOOP:
818 /* for v in s: ...
819 On entry: stack contains s, i.
820 On exit: stack contains s, i+1, s[i];
821 but if loop exhausted:
822 s, i are popped, and we jump */
823 w = POP(); /* Loop index */
824 v = POP(); /* Sequence object */
825 u = loop_subscript(v, w);
826 if (u != NULL) {
827 PUSH(v);
828 x = newintobject(getintvalue(w)+1);
829 PUSH(x);
830 DECREF(w);
831 PUSH(u);
832 }
833 else {
834 DECREF(v);
835 DECREF(w);
836 /* A NULL can mean "s exhausted"
837 but also an error: */
838 if (err_occurred())
839 why = WHY_EXCEPTION;
840 else
841 JUMPBY(oparg);
842 }
843 break;
844
845 case SETUP_LOOP:
846 case SETUP_EXCEPT:
847 case SETUP_FINALLY:
848 setup_block(f, opcode, INSTR_OFFSET() + oparg,
849 STACK_LEVEL());
850 break;
851
852 case SET_LINENO:
853#ifdef TRACE
854 if (trace)
855 printf("--- Line %d ---\n", oparg);
856#endif
857 lineno = oparg;
858 break;
859
860 default:
861 fprintf(stderr,
862 "XXX lineno: %d, opcode: %d\n",
863 lineno, opcode);
864 err_setstr(SystemError, "eval_code: unknown opcode");
865 why = WHY_EXCEPTION;
866 break;
867
868 } /* switch */
869
870 on_error:
871
872 /* Quickly continue if no error occurred */
873
874 if (why == WHY_NOT) {
875 if (err == 0 && x != NULL)
876 continue; /* Normal, fast path */
877 why = WHY_EXCEPTION;
878 x = None;
879 err = 0;
880 }
881
882#ifndef NDEBUG
883 /* Double-check exception status */
884
885 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
886 if (!err_occurred()) {
887 fprintf(stderr, "XXX ghost error\n");
888 err_setstr(SystemError, "ghost error");
889 why = WHY_EXCEPTION;
890 }
891 }
892 else {
893 if (err_occurred()) {
894 fprintf(stderr, "XXX undetected error\n");
895 why = WHY_EXCEPTION;
896 }
897 }
898#endif
899
900 /* Log traceback info if this is a real exception */
901
902 if (why == WHY_EXCEPTION) {
903 int lasti = INSTR_OFFSET() - 1;
904 if (HAS_ARG(opcode))
905 lasti -= 2;
906 tb_here(f, lasti, lineno);
907 }
908
909 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
910
911 if (why == WHY_RERAISE)
912 why = WHY_EXCEPTION;
913
914 /* Unwind stacks if a (pseudo) exception occurred */
915
916 while (why != WHY_NOT && f->f_iblock > 0) {
917 block *b = pop_block(f);
918 while (STACK_LEVEL() > b->b_level) {
919 v = POP();
920 XDECREF(v);
921 }
922 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
923 why = WHY_NOT;
924 JUMPTO(b->b_handler);
925 break;
926 }
927 if (b->b_type == SETUP_FINALLY ||
928 b->b_type == SETUP_EXCEPT &&
929 why == WHY_EXCEPTION) {
930 if (why == WHY_EXCEPTION) {
931 object *exc, *val;
932 err_get(&exc, &val);
933 if (val == NULL) {
934 val = None;
935 INCREF(val);
936 }
937 v = tb_fetch();
938 /* Make the raw exception data
939 available to the handler,
940 so a program can emulate the
941 Python main loop. Don't do
942 this for 'finally'. */
943 if (b->b_type == SETUP_EXCEPT) {
944#if 0 /* Oops, this breaks too many things */
945 sysset("exc_traceback", v);
946#endif
947 sysset("exc_value", val);
948 sysset("exc_type", exc);
949 err_clear();
950 }
951 PUSH(v);
952 PUSH(val);
953 PUSH(exc);
954 }
955 else {
956 if (why == WHY_RETURN)
957 PUSH(retval);
958 v = newintobject((long)why);
959 PUSH(v);
960 }
961 why = WHY_NOT;
962 JUMPTO(b->b_handler);
963 break;
964 }
965 } /* unwind stack */
966
967 /* End the loop if we still have an error (or return) */
968
969 if (why != WHY_NOT)
970 break;
971
972 } /* main loop */
973
974 /* Pop remaining stack entries */
975
976 while (!EMPTY()) {
977 v = POP();
978 XDECREF(v);
979 }
980
981 /* Restore previous frame and release the current one */
982
983 current_frame = f->f_back;
984 DECREF(f);
985
986 if (why == WHY_RETURN)
987 return retval;
988 else
989 return NULL;
990}
991
Guido van Rossum3f5da241990-12-20 15:06:42 +0000992#ifdef TRACE
993static int
994prtrace(v, str)
995 object *v;
996 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000997{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000998 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +0000999 if (printobject(v, stdout, 0) != 0)
1000 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001001 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001002}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001003#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001004
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005object *
1006getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001007{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001008 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001009 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001010 else
1011 return current_frame->f_locals;
1012}
1013
1014object *
1015getglobals()
1016{
1017 if (current_frame == NULL)
1018 return NULL;
1019 else
1020 return current_frame->f_globals;
1021}
1022
1023void
1024printtraceback(fp)
1025 FILE *fp;
1026{
1027 object *v = tb_fetch();
1028 if (v != NULL) {
1029 fprintf(fp, "Stack backtrace (innermost last):\n");
1030 tb_print(v, fp);
1031 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001033}
1034
1035
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001036void
1037flushline()
1038{
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 if (softspace(sysget("stdout"), 0))
1040 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041}
1042
Guido van Rossum3f5da241990-12-20 15:06:42 +00001043
1044/* Test a value used as condition, e.g., in a for or if statement */
1045
1046static int
1047testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001048 object *v;
1049{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001050 if (v == None)
1051 return 0;
1052 if (v->ob_type->tp_as_number != NULL)
1053 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001054 if (v->ob_type->tp_as_sequence != NULL)
1055 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1056 if (v->ob_type->tp_as_mapping != NULL)
1057 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058 /* All other objects are 'true' */
1059 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060}
1061
1062static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001063or(v, w)
1064 object *v, *w;
1065{
1066 if (v->ob_type->tp_as_number != NULL) {
1067 object *x;
1068 object * (*f) FPROTO((object *, object *));
1069 if (coerce(&v, &w) != 0)
1070 return NULL;
1071 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1072 x = (*f)(v, w);
1073 DECREF(v);
1074 DECREF(w);
1075 if (f != NULL)
1076 return x;
1077 }
1078 err_setstr(TypeError, "bad operand type(s) for |");
1079 return NULL;
1080}
1081
1082static object *
1083xor(v, w)
1084 object *v, *w;
1085{
1086 if (v->ob_type->tp_as_number != NULL) {
1087 object *x;
1088 object * (*f) FPROTO((object *, object *));
1089 if (coerce(&v, &w) != 0)
1090 return NULL;
1091 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1092 x = (*f)(v, w);
1093 DECREF(v);
1094 DECREF(w);
1095 if (f != NULL)
1096 return x;
1097 }
1098 err_setstr(TypeError, "bad operand type(s) for ^");
1099 return NULL;
1100}
1101
1102static object *
1103and(v, w)
1104 object *v, *w;
1105{
1106 if (v->ob_type->tp_as_number != NULL) {
1107 object *x;
1108 object * (*f) FPROTO((object *, object *));
1109 if (coerce(&v, &w) != 0)
1110 return NULL;
1111 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1112 x = (*f)(v, w);
1113 DECREF(v);
1114 DECREF(w);
1115 if (f != NULL)
1116 return x;
1117 }
1118 err_setstr(TypeError, "bad operand type(s) for &");
1119 return NULL;
1120}
1121
1122static object *
1123lshift(v, w)
1124 object *v, *w;
1125{
1126 if (v->ob_type->tp_as_number != NULL) {
1127 object *x;
1128 object * (*f) FPROTO((object *, object *));
1129 if (coerce(&v, &w) != 0)
1130 return NULL;
1131 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1132 x = (*f)(v, w);
1133 DECREF(v);
1134 DECREF(w);
1135 if (f != NULL)
1136 return x;
1137 }
1138 err_setstr(TypeError, "bad operand type(s) for <<");
1139 return NULL;
1140}
1141
1142static object *
1143rshift(v, w)
1144 object *v, *w;
1145{
1146 if (v->ob_type->tp_as_number != NULL) {
1147 object *x;
1148 object * (*f) FPROTO((object *, object *));
1149 if (coerce(&v, &w) != 0)
1150 return NULL;
1151 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1152 x = (*f)(v, w);
1153 DECREF(v);
1154 DECREF(w);
1155 if (f != NULL)
1156 return x;
1157 }
1158 err_setstr(TypeError, "bad operand type(s) for >>");
1159 return NULL;
1160}
1161
1162static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001163add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 object *v, *w;
1165{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001166 if (v->ob_type->tp_as_number != NULL) {
1167 object *x;
1168 if (coerce(&v, &w) != 0)
1169 return NULL;
1170 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1171 DECREF(v);
1172 DECREF(w);
1173 return x;
1174 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001175 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001176 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179 return NULL;
1180 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181}
1182
1183static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001184sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 object *v, *w;
1186{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001187 if (v->ob_type->tp_as_number != NULL) {
1188 object *x;
1189 if (coerce(&v, &w) != 0)
1190 return NULL;
1191 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1192 DECREF(v);
1193 DECREF(w);
1194 return x;
1195 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001196 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001197 return NULL;
1198}
1199
1200static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001201mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202 object *v, *w;
1203{
1204 typeobject *tp;
1205 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1206 /* int*sequence -- swap v and w */
1207 object *tmp = v;
1208 v = w;
1209 w = tmp;
1210 }
1211 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001212 if (tp->tp_as_number != NULL) {
1213 object *x;
1214 if (coerce(&v, &w) != 0)
1215 return NULL;
1216 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1217 DECREF(v);
1218 DECREF(w);
1219 return x;
1220 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 if (tp->tp_as_sequence != NULL) {
1222 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001223 err_setstr(TypeError,
1224 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 return NULL;
1226 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001227 return (*tp->tp_as_sequence->sq_repeat)
1228 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001230 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 return NULL;
1232}
1233
1234static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001235divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236 object *v, *w;
1237{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001238 if (v->ob_type->tp_as_number != NULL) {
1239 object *x;
1240 if (coerce(&v, &w) != 0)
1241 return NULL;
1242 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1243 DECREF(v);
1244 DECREF(w);
1245 return x;
1246 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001247 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 return NULL;
1249}
1250
1251static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001252rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 object *v, *w;
1254{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001255 if (v->ob_type->tp_as_number != NULL) {
1256 object *x;
1257 if (coerce(&v, &w) != 0)
1258 return NULL;
1259 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1260 DECREF(v);
1261 DECREF(w);
1262 return x;
1263 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001264 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 return NULL;
1266}
1267
1268static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001269neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 object *v;
1271{
1272 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001273 return (*v->ob_type->tp_as_number->nb_negative)(v);
1274 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275 return NULL;
1276}
1277
1278static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001280 object *v;
1281{
1282 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001283 return (*v->ob_type->tp_as_number->nb_positive)(v);
1284 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001285 return NULL;
1286}
1287
1288static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001289invert(v)
1290 object *v;
1291{
1292 object * (*f) FPROTO((object *, object *));
1293 if (v->ob_type->tp_as_number != NULL &&
1294 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1295 return (*f)(v);
1296 err_setstr(TypeError, "bad operand type(s) for unary ~");
1297 return NULL;
1298}
1299
1300static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302 object *v;
1303{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304 int outcome = testbool(v);
1305 object *w = outcome == 0 ? True : False;
1306 INCREF(w);
1307 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001309/* External interface to call any callable object. The arg may be NULL. */
1310
1311object *
1312call_object(func, arg)
1313 object *func;
1314 object *arg;
1315{
1316 if (is_instancemethodobject(func) || is_funcobject(func))
1317 return call_function(func, arg);
1318 else
1319 return call_builtin(func, arg);
1320}
1321
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001322static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001324 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001325 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001326{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001327 if (is_methodobject(func)) {
1328 method meth = getmethod(func);
1329 object *self = getself(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001330 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001331 }
1332 if (is_classobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001333 if (arg != NULL) {
1334 err_setstr(TypeError,
1335 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 return NULL;
1337 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001340 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341 return NULL;
1342}
1343
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001344static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001345call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001349 object *newarg = NULL;
1350 object *newlocals, *newglobals;
1351 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352
Guido van Rossume8122f11991-05-05 20:03:07 +00001353 if (is_instancemethodobject(func)) {
1354 object *self = instancemethodgetself(func);
1355 func = instancemethodgetfunc(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001356 if (arg == NULL) {
1357 arg = self;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 }
1359 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001360 newarg = newtupleobject(2);
1361 if (newarg == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 return NULL;
1363 INCREF(self);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001364 INCREF(arg);
1365 settupleitem(newarg, 0, self);
1366 settupleitem(newarg, 1, arg);
1367 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 }
1369 }
1370 else {
1371 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001372 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 return NULL;
1374 }
1375 }
1376
Guido van Rossum3f5da241990-12-20 15:06:42 +00001377 co = getfunccode(func);
1378 if (co == NULL) {
1379 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380 return NULL;
1381 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001382 if (!is_codeobject(co)) {
1383 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384 abort();
1385 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001386 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001387 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001388 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001389 return NULL;
1390 }
1391
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392 newglobals = getfuncglobals(func);
1393 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394
Guido van Rossum3f5da241990-12-20 15:06:42 +00001395 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396
Guido van Rossum3f5da241990-12-20 15:06:42 +00001397 DECREF(newlocals);
1398 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399
Guido van Rossum3f5da241990-12-20 15:06:42 +00001400 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001401
1402 return v;
1403}
1404
1405static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001406apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 object *v, *w;
1408{
1409 typeobject *tp = v->ob_type;
1410 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001411 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 return NULL;
1413 }
1414 if (tp->tp_as_sequence != NULL) {
1415 int i;
1416 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001417 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 return NULL;
1419 }
1420 i = getintvalue(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001423 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424}
1425
1426static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 object *v, *w;
1429{
1430 sequence_methods *sq = v->ob_type->tp_as_sequence;
1431 int i, n;
1432 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001433 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 return NULL;
1435 }
1436 i = getintvalue(w);
1437 n = (*sq->sq_length)(v);
1438 if (i >= n)
1439 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441}
1442
1443static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 object *v;
1446 int isize;
1447 int *pi;
1448{
1449 if (v != NULL) {
1450 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001451 err_setstr(TypeError, "slice index must be int");
1452 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 }
1454 *pi = getintvalue(v);
1455 if (*pi < 0)
1456 *pi += isize;
1457 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001458 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459}
1460
1461static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001462apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 object *u, *v, *w;
1464{
1465 typeobject *tp = u->ob_type;
1466 int ilow, ihigh, isize;
1467 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001468 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 return NULL;
1470 }
1471 ilow = 0;
1472 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001475 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001479
1480static int
1481assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 object *w;
1483 object *key;
1484 object *v;
1485{
1486 typeobject *tp = w->ob_type;
1487 sequence_methods *sq;
1488 mapping_methods *mp;
1489 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490 if ((sq = tp->tp_as_sequence) != NULL &&
1491 (func = sq->sq_ass_item) != NULL) {
1492 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001493 err_setstr(TypeError,
1494 "sequence subscript must be integer");
1495 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001496 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001497 else
1498 return (*func)(w, (int)getintvalue(key), v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499 }
1500 else if ((mp = tp->tp_as_mapping) != NULL &&
1501 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001502 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001503 }
1504 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001505 err_setstr(TypeError,
1506 "can't assign to this subscripted object");
1507 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509}
1510
Guido van Rossum3f5da241990-12-20 15:06:42 +00001511static int
1512assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513 object *u, *v, *w, *x;
1514{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001515 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001517 if (sq == NULL) {
1518 err_setstr(TypeError, "assign to slice of non-sequence");
1519 return -1;
1520 }
1521 if (sq == NULL || sq->sq_ass_slice == NULL) {
1522 err_setstr(TypeError, "unassignable slice");
1523 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 }
1525 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526 isize = ihigh = (*sq->sq_length)(u);
1527 if (slice_index(v, isize, &ilow) != 0)
1528 return -1;
1529 if (slice_index(w, isize, &ihigh) != 0)
1530 return -1;
1531 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532}
1533
1534static int
1535cmp_exception(err, v)
1536 object *err, *v;
1537{
1538 if (is_tupleobject(v)) {
1539 int i, n;
1540 n = gettuplesize(v);
1541 for (i = 0; i < n; i++) {
1542 if (err == gettupleitem(v, i))
1543 return 1;
1544 }
1545 return 0;
1546 }
1547 return err == v;
1548}
1549
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550static int
1551cmp_member(v, w)
1552 object *v, *w;
1553{
1554 int i, n, cmp;
1555 object *x;
1556 sequence_methods *sq;
1557 /* Special case for char in string */
1558 if (is_stringobject(w)) {
1559 register char *s, *end;
1560 register char c;
1561 if (!is_stringobject(v) || getstringsize(v) != 1) {
1562 err_setstr(TypeError,
1563 "string member test needs char left operand");
1564 return -1;
1565 }
1566 c = getstringvalue(v)[0];
1567 s = getstringvalue(w);
1568 end = s + getstringsize(w);
1569 while (s < end) {
1570 if (c == *s++)
1571 return 1;
1572 }
1573 return 0;
1574 }
1575 sq = w->ob_type->tp_as_sequence;
1576 if (sq == NULL) {
1577 err_setstr(TypeError,
1578 "'in' or 'not in' needs sequence right argument");
1579 return -1;
1580 }
1581 n = (*sq->sq_length)(w);
1582 for (i = 0; i < n; i++) {
1583 x = (*sq->sq_item)(w, i);
1584 cmp = cmpobject(v, x);
1585 XDECREF(x);
1586 if (cmp == 0)
1587 return 1;
1588 }
1589 return 0;
1590}
1591
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 enum cmp_op op;
1595 register object *v;
1596 register object *w;
1597{
1598 register int cmp;
1599 register int res = 0;
1600 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 case IS:
1602 case IS_NOT:
1603 res = (v == w);
1604 if (op == IS_NOT)
1605 res = !res;
1606 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 case IN:
1608 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609 res = cmp_member(v, w);
1610 if (res < 0)
1611 return NULL;
1612 if (op == NOT_IN)
1613 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 break;
1615 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001616 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 break;
1618 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001619 cmp = cmpobject(v, w);
1620 switch (op) {
1621 case LT: res = cmp < 0; break;
1622 case LE: res = cmp <= 0; break;
1623 case EQ: res = cmp == 0; break;
1624 case NE: res = cmp != 0; break;
1625 case GT: res = cmp > 0; break;
1626 case GE: res = cmp >= 0; break;
1627 /* XXX no default? (res is initialized to 0 though) */
1628 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 }
1630 v = res ? True : False;
1631 INCREF(v);
1632 return v;
1633}
1634
Guido van Rossum374a9221991-04-04 10:40:29 +00001635/* XXX This function should use dict2 variants (change interface!) */
1636
Guido van Rossum3f5da241990-12-20 15:06:42 +00001637static int
1638import_from(locals, v, name)
1639 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001640 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001641 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001642{
1643 object *w, *x;
1644 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001645 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001646 int i;
1647 int n = getdictsize(w);
1648 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001649 name = getdict2key(w, i);
1650 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001651 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001652 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001653 if (x == NULL) {
1654 /* XXX can't happen? */
Guido van Rossumdf62e441991-08-16 08:56:04 +00001655 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001656 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001657 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001658 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001660 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001661 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001662 }
1663 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001664 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001665 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001666 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001667 return -1;
1668 }
1669 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001670 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001671 }
1672}
1673
1674static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001675build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001676 object *v; /* None or tuple containing base classes */
1677 object *w; /* dictionary */
1678{
1679 if (is_tupleobject(v)) {
1680 int i;
1681 for (i = gettuplesize(v); --i >= 0; ) {
1682 object *x = gettupleitem(v, i);
1683 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001684 err_setstr(TypeError,
1685 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001686 return NULL;
1687 }
1688 }
1689 }
1690 else {
1691 v = NULL;
1692 }
1693 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001695 return NULL;
1696 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001697 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001698}