blob: 6aedc47a3e06826765b083a15fe3a4af0fdd19ff [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();
54static object *call_builtin();
55static object *call_function();
56static object *apply_subscript();
57static object *loop_subscript();
58static object *apply_slice();
59static object *cmp_outcome();
60static object *build_class();
61static int testbool();
62static int assign_subscript PROTO((object *, object *, object *));
63static int assign_slice PROTO((object *, object *, object *, object *));
64static int import_from PROTO((object *, object *, char *));
65
66
67static frameobject *current_frame;
68
69
70/* Status code for main loop (reason for stack unwind) */
71
72enum why_code {
73 WHY_NOT, /* No error */
74 WHY_EXCEPTION, /* Exception occurred */
75 WHY_RERAISE, /* Exception re-raised by 'finally' */
76 WHY_RETURN, /* 'return' statement */
77 WHY_BREAK /* 'break' statement */
78};
79
80
81/* Interpreter main loop */
82
83object *
84eval_code(co, globals, locals, arg)
85 codeobject *co;
86 object *globals;
87 object *locals;
88 object *arg;
89{
90 register unsigned char *next_instr;
91 register int opcode; /* Current opcode */
92 register int oparg; /* Current opcode argument, if any */
93 register object **stack_pointer;
94 register enum why_code why; /* Reason for block stack unwind */
95 register int err; /* Error status -- nonzero if error */
96 register object *x; /* Result object -- NULL if error */
97 register object *v; /* Temporary objects popped off stack */
98 register object *w;
99 register object *u;
100 register object *t;
101 register frameobject *f; /* Current frame */
102 int lineno; /* Current line number */
103 object *retval; /* Return value iff why == WHY_RETURN */
104 char *name; /* Name used by some instructions */
105 FILE *fp; /* Used by print operations */
106#ifdef TRACE
107 int trace = dictlookup(globals, "__trace__") != NULL;
108#endif
109
110/* Code access macros */
111
112#define GETCONST(i) Getconst(f, i)
113#define GETNAME(i) Getname(f, i)
114#define GETNAMEV(i) Getnamev(f, i)
115#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
116#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
117#define NEXTOP() (*next_instr++)
118#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
119#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
120#define JUMPBY(x) (next_instr += (x))
121
122/* Stack manipulation macros */
123
124#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
125#define EMPTY() (STACK_LEVEL() == 0)
126#define TOP() (stack_pointer[-1])
127#define BASIC_PUSH(v) (*stack_pointer++ = (v))
128#define BASIC_POP() (*--stack_pointer)
129
130#ifdef TRACE
131#define PUSH(v) (BASIC_PUSH(v), trace && prtrace(TOP(), "push"))
132#define POP() (trace && prtrace(TOP(), "pop"), BASIC_POP())
133#else
134#define PUSH(v) BASIC_PUSH(v)
135#define POP() BASIC_POP()
136#endif
137
138 f = newframeobject(
139 current_frame, /*back*/
140 co, /*code*/
141 globals, /*globals*/
142 locals, /*locals*/
143 50, /*nvalues*/
144 20); /*nblocks*/
145 if (f == NULL)
146 return NULL;
147
148 current_frame = f;
149
150 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
151
152 stack_pointer = f->f_valuestack;
153
154 if (arg != NULL) {
155 INCREF(arg);
156 PUSH(arg);
157 }
158
159 why = WHY_NOT;
160 err = 0;
161 x = None; /* Not a reference, just anything non-NULL */
162 lineno = -1;
163
164 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000165 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000166
167 /* Do periodic things */
168
169 if (--ticker < 0) {
170 ticker = 100;
171 if (intrcheck()) {
172 err_set(KeyboardInterrupt);
173 why = WHY_EXCEPTION;
174 tb_here(f, INSTR_OFFSET(), lineno);
175 goto on_error;
176 }
177 }
178
179 /* Extract opcode and argument */
180
181 opcode = NEXTOP();
182 if (HAS_ARG(opcode))
183 oparg = NEXTARG();
184
185#ifdef TRACE
186 /* Instruction tracing */
187
188 if (trace) {
189 if (HAS_ARG(opcode)) {
190 printf("%d: %d, %d\n",
191 (int) (INSTR_OFFSET() - 3),
192 opcode, oparg);
193 }
194 else {
195 printf("%d: %d\n",
196 (int) (INSTR_OFFSET() - 1), opcode);
197 }
198 }
199#endif
200
201 /* Main switch on opcode */
202
203 switch (opcode) {
204
205 /* BEWARE!
206 It is essential that any operation that fails sets either
207 x to NULL, err to nonzero, or why to anything but WHY_NOT,
208 and that no operation that succeeds does this! */
209
210 /* case STOP_CODE: this is an error! */
211
212 case POP_TOP:
213 v = POP();
214 DECREF(v);
215 break;
216
217 case ROT_TWO:
218 v = POP();
219 w = POP();
220 PUSH(v);
221 PUSH(w);
222 break;
223
224 case ROT_THREE:
225 v = POP();
226 w = POP();
227 x = POP();
228 PUSH(v);
229 PUSH(x);
230 PUSH(w);
231 break;
232
233 case DUP_TOP:
234 v = TOP();
235 INCREF(v);
236 PUSH(v);
237 break;
238
239 case UNARY_POSITIVE:
240 v = POP();
241 x = pos(v);
242 DECREF(v);
243 PUSH(x);
244 break;
245
246 case UNARY_NEGATIVE:
247 v = POP();
248 x = neg(v);
249 DECREF(v);
250 PUSH(x);
251 break;
252
253 case UNARY_NOT:
254 v = POP();
255 x = not(v);
256 DECREF(v);
257 PUSH(x);
258 break;
259
260 case UNARY_CONVERT:
261 v = POP();
262 x = reprobject(v);
263 DECREF(v);
264 PUSH(x);
265 break;
266
267 case UNARY_CALL:
268 v = POP();
Guido van Rossume8122f11991-05-05 20:03:07 +0000269 if (is_instancemethodobject(v) || is_funcobject(v))
Guido van Rossum374a9221991-04-04 10:40:29 +0000270 x = call_function(v, (object *)NULL);
271 else
272 x = call_builtin(v, (object *)NULL);
273 DECREF(v);
274 PUSH(x);
275 break;
276
277 case BINARY_MULTIPLY:
278 w = POP();
279 v = POP();
280 x = mul(v, w);
281 DECREF(v);
282 DECREF(w);
283 PUSH(x);
284 break;
285
286 case BINARY_DIVIDE:
287 w = POP();
288 v = POP();
289 x = divide(v, w);
290 DECREF(v);
291 DECREF(w);
292 PUSH(x);
293 break;
294
295 case BINARY_MODULO:
296 w = POP();
297 v = POP();
298 x = rem(v, w);
299 DECREF(v);
300 DECREF(w);
301 PUSH(x);
302 break;
303
304 case BINARY_ADD:
305 w = POP();
306 v = POP();
307 x = add(v, w);
308 DECREF(v);
309 DECREF(w);
310 PUSH(x);
311 break;
312
313 case BINARY_SUBTRACT:
314 w = POP();
315 v = POP();
316 x = sub(v, w);
317 DECREF(v);
318 DECREF(w);
319 PUSH(x);
320 break;
321
322 case BINARY_SUBSCR:
323 w = POP();
324 v = POP();
325 x = apply_subscript(v, w);
326 DECREF(v);
327 DECREF(w);
328 PUSH(x);
329 break;
330
331 case BINARY_CALL:
332 w = POP();
333 v = POP();
Guido van Rossume8122f11991-05-05 20:03:07 +0000334 if (is_instancemethodobject(v) || is_funcobject(v))
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 x = call_function(v, w);
336 else
337 x = call_builtin(v, w);
338 DECREF(v);
339 DECREF(w);
340 PUSH(x);
341 break;
342
343 case SLICE+0:
344 case SLICE+1:
345 case SLICE+2:
346 case SLICE+3:
347 if ((opcode-SLICE) & 2)
348 w = POP();
349 else
350 w = NULL;
351 if ((opcode-SLICE) & 1)
352 v = POP();
353 else
354 v = NULL;
355 u = POP();
356 x = apply_slice(u, v, w);
357 DECREF(u);
358 XDECREF(v);
359 XDECREF(w);
360 PUSH(x);
361 break;
362
363 case STORE_SLICE+0:
364 case STORE_SLICE+1:
365 case STORE_SLICE+2:
366 case STORE_SLICE+3:
367 if ((opcode-STORE_SLICE) & 2)
368 w = POP();
369 else
370 w = NULL;
371 if ((opcode-STORE_SLICE) & 1)
372 v = POP();
373 else
374 v = NULL;
375 u = POP();
376 t = POP();
377 err = assign_slice(u, v, w, t); /* u[v:w] = t */
378 DECREF(t);
379 DECREF(u);
380 XDECREF(v);
381 XDECREF(w);
382 break;
383
384 case DELETE_SLICE+0:
385 case DELETE_SLICE+1:
386 case DELETE_SLICE+2:
387 case DELETE_SLICE+3:
388 if ((opcode-DELETE_SLICE) & 2)
389 w = POP();
390 else
391 w = NULL;
392 if ((opcode-DELETE_SLICE) & 1)
393 v = POP();
394 else
395 v = NULL;
396 u = POP();
397 err = assign_slice(u, v, w, (object *)NULL);
398 /* del u[v:w] */
399 DECREF(u);
400 XDECREF(v);
401 XDECREF(w);
402 break;
403
404 case STORE_SUBSCR:
405 w = POP();
406 v = POP();
407 u = POP();
408 /* v[w] = u */
409 err = assign_subscript(v, w, u);
410 DECREF(u);
411 DECREF(v);
412 DECREF(w);
413 break;
414
415 case DELETE_SUBSCR:
416 w = POP();
417 v = POP();
418 /* del v[w] */
419 err = assign_subscript(v, w, (object *)NULL);
420 DECREF(v);
421 DECREF(w);
422 break;
423
424 case PRINT_EXPR:
425 v = POP();
426 fp = sysgetfile("stdout", stdout);
427 /* Print value except if procedure result */
428 if (v != None) {
429 flushline();
430 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000431 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 flushline();
433 }
434 DECREF(v);
435 break;
436
437 case PRINT_ITEM:
438 v = POP();
439 fp = sysgetfile("stdout", stdout);
440 if (softspace(sysget("stdout"), 1))
441 fprintf(fp, " ");
442 if (is_stringobject(v)) {
443 char *s = getstringvalue(v);
444 int len = getstringsize(v);
Guido van Rossuma6081091991-07-22 11:48:07 +0000445 err = printobject(v, fp, PRINT_RAW);
446 if (err == 0 && len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000447 softspace(sysget("stdout"), 0);
448 }
449 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000450 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000451 }
452 DECREF(v);
453 break;
454
455 case PRINT_NEWLINE:
456 fp = sysgetfile("stdout", stdout);
457 fprintf(fp, "\n");
458 softspace(sysget("stdout"), 0);
459 break;
460
461 case BREAK_LOOP:
462 why = WHY_BREAK;
463 break;
464
465 case RAISE_EXCEPTION:
466 v = POP();
467 w = POP();
468 if (!is_stringobject(w))
469 err_setstr(TypeError,
470 "exceptions must be strings");
471 else
472 err_setval(w, v);
473 DECREF(v);
474 DECREF(w);
475 why = WHY_EXCEPTION;
476 break;
477
478 case LOAD_LOCALS:
479 v = f->f_locals;
480 INCREF(v);
481 PUSH(v);
482 break;
483
484 case RETURN_VALUE:
485 retval = POP();
486 why = WHY_RETURN;
487 break;
488
489 case REQUIRE_ARGS:
490 if (EMPTY()) {
491 err_setstr(TypeError,
492 "function expects argument(s)");
493 why = WHY_EXCEPTION;
494 }
495 break;
496
497 case REFUSE_ARGS:
498 if (!EMPTY()) {
499 err_setstr(TypeError,
500 "function expects no argument(s)");
501 why = WHY_EXCEPTION;
502 }
503 break;
504
505 case BUILD_FUNCTION:
506 v = POP();
507 x = newfuncobject(v, f->f_globals);
508 DECREF(v);
509 PUSH(x);
510 break;
511
512 case POP_BLOCK:
513 {
514 block *b = pop_block(f);
515 while (STACK_LEVEL() > b->b_level) {
516 v = POP();
517 DECREF(v);
518 }
519 }
520 break;
521
522 case END_FINALLY:
523 v = POP();
524 if (is_intobject(v)) {
525 why = (enum why_code) getintvalue(v);
526 if (why == WHY_RETURN)
527 retval = POP();
528 }
529 else if (is_stringobject(v)) {
530 w = POP();
531 err_setval(v, w);
532 DECREF(w);
533 w = POP();
534 tb_store(w);
535 DECREF(w);
536 why = WHY_RERAISE;
537 }
538 else if (v != None) {
539 err_setstr(SystemError,
540 "'finally' pops bad exception");
541 why = WHY_EXCEPTION;
542 }
543 DECREF(v);
544 break;
545
546 case BUILD_CLASS:
547 w = POP();
548 v = POP();
549 x = build_class(v, w);
550 PUSH(x);
551 DECREF(v);
552 DECREF(w);
553 break;
554
555 case STORE_NAME:
556 w = GETNAMEV(oparg);
557 v = POP();
558 err = dict2insert(f->f_locals, w, v);
559 DECREF(v);
560 break;
561
562 case DELETE_NAME:
563 name = GETNAME(oparg);
564 if ((err = dictremove(f->f_locals, name)) != 0)
565 err_setstr(NameError, name);
566 break;
567
568 case UNPACK_TUPLE:
569 v = POP();
570 if (!is_tupleobject(v)) {
571 err_setstr(TypeError, "unpack non-tuple");
572 why = WHY_EXCEPTION;
573 }
574 else if (gettuplesize(v) != oparg) {
575 err_setstr(RuntimeError,
576 "unpack tuple of wrong size");
577 why = WHY_EXCEPTION;
578 }
579 else {
580 for (; --oparg >= 0; ) {
581 w = gettupleitem(v, oparg);
582 INCREF(w);
583 PUSH(w);
584 }
585 }
586 DECREF(v);
587 break;
588
589 case UNPACK_LIST:
590 v = POP();
591 if (!is_listobject(v)) {
592 err_setstr(TypeError, "unpack non-list");
593 why = WHY_EXCEPTION;
594 }
595 else if (getlistsize(v) != oparg) {
596 err_setstr(RuntimeError,
597 "unpack list of wrong size");
598 why = WHY_EXCEPTION;
599 }
600 else {
601 for (; --oparg >= 0; ) {
602 w = getlistitem(v, oparg);
603 INCREF(w);
604 PUSH(w);
605 }
606 }
607 DECREF(v);
608 break;
609
610 case STORE_ATTR:
611 name = GETNAME(oparg);
612 v = POP();
613 u = POP();
614 err = setattr(v, name, u); /* v.name = u */
615 DECREF(v);
616 DECREF(u);
617 break;
618
619 case DELETE_ATTR:
620 name = GETNAME(oparg);
621 v = POP();
622 err = setattr(v, name, (object *)NULL);
623 /* del v.name */
624 DECREF(v);
625 break;
626
627 case LOAD_CONST:
628 x = GETCONST(oparg);
629 INCREF(x);
630 PUSH(x);
631 break;
632
633 case LOAD_NAME:
634 name = GETNAME(oparg);
635 x = dictlookup(f->f_locals, name);
636 if (x == NULL) {
637 x = dictlookup(f->f_globals, name);
638 if (x == NULL) {
639 x = getbuiltin(name);
640 if (x == NULL) {
641 err_setstr(NameError, name);
642 break;
643 }
644 }
645 }
646 INCREF(x);
647 PUSH(x);
648 break;
649
650 case LOAD_GLOBAL:
651 name = GETNAME(oparg);
652 x = dictlookup(f->f_globals, name);
653 if (x == NULL) {
654 x = getbuiltin(name);
655 if (x == NULL) {
656 err_setstr(NameError, name);
657 break;
658 }
659 }
660 INCREF(x);
661 PUSH(x);
662 break;
663
664 case LOAD_LOCAL:
665 name = GETNAME(oparg);
666 x = dictlookup(f->f_locals, name);
667 if (x == NULL) {
668 err_setstr(NameError, name);
669 break;
670 }
671 INCREF(x);
672 PUSH(x);
673 break;
674
675 case BUILD_TUPLE:
676 x = newtupleobject(oparg);
677 if (x != NULL) {
678 for (; --oparg >= 0;) {
679 w = POP();
680 err = settupleitem(x, oparg, w);
681 if (err != 0)
682 break;
683 }
684 PUSH(x);
685 }
686 break;
687
688 case BUILD_LIST:
689 x = newlistobject(oparg);
690 if (x != NULL) {
691 for (; --oparg >= 0;) {
692 w = POP();
693 err = setlistitem(x, oparg, w);
694 if (err != 0)
695 break;
696 }
697 PUSH(x);
698 }
699 break;
700
701 case BUILD_MAP:
702 x = newdictobject();
703 PUSH(x);
704 break;
705
706 case LOAD_ATTR:
707 name = GETNAME(oparg);
708 v = POP();
709 x = getattr(v, name);
710 DECREF(v);
711 PUSH(x);
712 break;
713
714 case COMPARE_OP:
715 w = POP();
716 v = POP();
717 x = cmp_outcome((enum cmp_op)oparg, v, w);
718 DECREF(v);
719 DECREF(w);
720 PUSH(x);
721 break;
722
723 case IMPORT_NAME:
724 name = GETNAME(oparg);
725 x = import_module(name);
726 XINCREF(x);
727 PUSH(x);
728 break;
729
730 case IMPORT_FROM:
731 name = GETNAME(oparg);
732 v = TOP();
733 err = import_from(f->f_locals, v, name);
734 break;
735
736 case JUMP_FORWARD:
737 JUMPBY(oparg);
738 break;
739
740 case JUMP_IF_FALSE:
741 if (!testbool(TOP()))
742 JUMPBY(oparg);
743 break;
744
745 case JUMP_IF_TRUE:
746 if (testbool(TOP()))
747 JUMPBY(oparg);
748 break;
749
750 case JUMP_ABSOLUTE:
751 JUMPTO(oparg);
752 break;
753
754 case FOR_LOOP:
755 /* for v in s: ...
756 On entry: stack contains s, i.
757 On exit: stack contains s, i+1, s[i];
758 but if loop exhausted:
759 s, i are popped, and we jump */
760 w = POP(); /* Loop index */
761 v = POP(); /* Sequence object */
762 u = loop_subscript(v, w);
763 if (u != NULL) {
764 PUSH(v);
765 x = newintobject(getintvalue(w)+1);
766 PUSH(x);
767 DECREF(w);
768 PUSH(u);
769 }
770 else {
771 DECREF(v);
772 DECREF(w);
773 /* A NULL can mean "s exhausted"
774 but also an error: */
775 if (err_occurred())
776 why = WHY_EXCEPTION;
777 else
778 JUMPBY(oparg);
779 }
780 break;
781
782 case SETUP_LOOP:
783 case SETUP_EXCEPT:
784 case SETUP_FINALLY:
785 setup_block(f, opcode, INSTR_OFFSET() + oparg,
786 STACK_LEVEL());
787 break;
788
789 case SET_LINENO:
790#ifdef TRACE
791 if (trace)
792 printf("--- Line %d ---\n", oparg);
793#endif
794 lineno = oparg;
795 break;
796
797 default:
798 fprintf(stderr,
799 "XXX lineno: %d, opcode: %d\n",
800 lineno, opcode);
801 err_setstr(SystemError, "eval_code: unknown opcode");
802 why = WHY_EXCEPTION;
803 break;
804
805 } /* switch */
806
807 on_error:
808
809 /* Quickly continue if no error occurred */
810
811 if (why == WHY_NOT) {
812 if (err == 0 && x != NULL)
813 continue; /* Normal, fast path */
814 why = WHY_EXCEPTION;
815 x = None;
816 err = 0;
817 }
818
819#ifndef NDEBUG
820 /* Double-check exception status */
821
822 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
823 if (!err_occurred()) {
824 fprintf(stderr, "XXX ghost error\n");
825 err_setstr(SystemError, "ghost error");
826 why = WHY_EXCEPTION;
827 }
828 }
829 else {
830 if (err_occurred()) {
831 fprintf(stderr, "XXX undetected error\n");
832 why = WHY_EXCEPTION;
833 }
834 }
835#endif
836
837 /* Log traceback info if this is a real exception */
838
839 if (why == WHY_EXCEPTION) {
840 int lasti = INSTR_OFFSET() - 1;
841 if (HAS_ARG(opcode))
842 lasti -= 2;
843 tb_here(f, lasti, lineno);
844 }
845
846 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
847
848 if (why == WHY_RERAISE)
849 why = WHY_EXCEPTION;
850
851 /* Unwind stacks if a (pseudo) exception occurred */
852
853 while (why != WHY_NOT && f->f_iblock > 0) {
854 block *b = pop_block(f);
855 while (STACK_LEVEL() > b->b_level) {
856 v = POP();
857 XDECREF(v);
858 }
859 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
860 why = WHY_NOT;
861 JUMPTO(b->b_handler);
862 break;
863 }
864 if (b->b_type == SETUP_FINALLY ||
865 b->b_type == SETUP_EXCEPT &&
866 why == WHY_EXCEPTION) {
867 if (why == WHY_EXCEPTION) {
868 object *exc, *val;
869 err_get(&exc, &val);
870 if (val == NULL) {
871 val = None;
872 INCREF(val);
873 }
874 v = tb_fetch();
875 /* Make the raw exception data
876 available to the handler,
877 so a program can emulate the
878 Python main loop. Don't do
879 this for 'finally'. */
880 if (b->b_type == SETUP_EXCEPT) {
881#if 0 /* Oops, this breaks too many things */
882 sysset("exc_traceback", v);
883#endif
884 sysset("exc_value", val);
885 sysset("exc_type", exc);
886 err_clear();
887 }
888 PUSH(v);
889 PUSH(val);
890 PUSH(exc);
891 }
892 else {
893 if (why == WHY_RETURN)
894 PUSH(retval);
895 v = newintobject((long)why);
896 PUSH(v);
897 }
898 why = WHY_NOT;
899 JUMPTO(b->b_handler);
900 break;
901 }
902 } /* unwind stack */
903
904 /* End the loop if we still have an error (or return) */
905
906 if (why != WHY_NOT)
907 break;
908
909 } /* main loop */
910
911 /* Pop remaining stack entries */
912
913 while (!EMPTY()) {
914 v = POP();
915 XDECREF(v);
916 }
917
918 /* Restore previous frame and release the current one */
919
920 current_frame = f->f_back;
921 DECREF(f);
922
923 if (why == WHY_RETURN)
924 return retval;
925 else
926 return NULL;
927}
928
Guido van Rossum3f5da241990-12-20 15:06:42 +0000929#ifdef TRACE
930static int
931prtrace(v, str)
932 object *v;
933 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000934{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000935 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +0000936 if (printobject(v, stdout, 0) != 0)
937 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000938 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000940#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941
Guido van Rossum3f5da241990-12-20 15:06:42 +0000942object *
943getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000945 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000946 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000947 else
948 return current_frame->f_locals;
949}
950
951object *
952getglobals()
953{
954 if (current_frame == NULL)
955 return NULL;
956 else
957 return current_frame->f_globals;
958}
959
960void
961printtraceback(fp)
962 FILE *fp;
963{
964 object *v = tb_fetch();
965 if (v != NULL) {
966 fprintf(fp, "Stack backtrace (innermost last):\n");
967 tb_print(v, fp);
968 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000970}
971
972
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000973void
974flushline()
975{
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 if (softspace(sysget("stdout"), 0))
977 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978}
979
Guido van Rossum3f5da241990-12-20 15:06:42 +0000980
981/* Test a value used as condition, e.g., in a for or if statement */
982
983static int
984testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 object *v;
986{
Guido van Rossum4965bc81991-05-14 11:51:49 +0000987 if (v == None)
988 return 0;
989 if (v->ob_type->tp_as_number != NULL)
990 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000991 if (v->ob_type->tp_as_sequence != NULL)
992 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
993 if (v->ob_type->tp_as_mapping != NULL)
994 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000995 /* All other objects are 'true' */
996 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000997}
998
999static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001000add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001001 object *v, *w;
1002{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001003 if (v->ob_type->tp_as_number != NULL) {
1004 object *x;
1005 if (coerce(&v, &w) != 0)
1006 return NULL;
1007 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1008 DECREF(v);
1009 DECREF(w);
1010 return x;
1011 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001012 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001013 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001015 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001016 return NULL;
1017 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001018}
1019
1020static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001021sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022 object *v, *w;
1023{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001024 if (v->ob_type->tp_as_number != NULL) {
1025 object *x;
1026 if (coerce(&v, &w) != 0)
1027 return NULL;
1028 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1029 DECREF(v);
1030 DECREF(w);
1031 return x;
1032 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 return NULL;
1035}
1036
1037static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001039 object *v, *w;
1040{
1041 typeobject *tp;
1042 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1043 /* int*sequence -- swap v and w */
1044 object *tmp = v;
1045 v = w;
1046 w = tmp;
1047 }
1048 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001049 if (tp->tp_as_number != NULL) {
1050 object *x;
1051 if (coerce(&v, &w) != 0)
1052 return NULL;
1053 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1054 DECREF(v);
1055 DECREF(w);
1056 return x;
1057 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058 if (tp->tp_as_sequence != NULL) {
1059 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001060 err_setstr(TypeError,
1061 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062 return NULL;
1063 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001064 return (*tp->tp_as_sequence->sq_repeat)
1065 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001067 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 return NULL;
1069}
1070
1071static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001072divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 object *v, *w;
1074{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001075 if (v->ob_type->tp_as_number != NULL) {
1076 object *x;
1077 if (coerce(&v, &w) != 0)
1078 return NULL;
1079 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1080 DECREF(v);
1081 DECREF(w);
1082 return x;
1083 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001084 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001085 return NULL;
1086}
1087
1088static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001089rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 object *v, *w;
1091{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001092 if (v->ob_type->tp_as_number != NULL) {
1093 object *x;
1094 if (coerce(&v, &w) != 0)
1095 return NULL;
1096 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1097 DECREF(v);
1098 DECREF(w);
1099 return x;
1100 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001101 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001102 return NULL;
1103}
1104
1105static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001106neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107 object *v;
1108{
1109 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001110 return (*v->ob_type->tp_as_number->nb_negative)(v);
1111 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 return NULL;
1113}
1114
1115static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001116pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 object *v;
1118{
1119 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001120 return (*v->ob_type->tp_as_number->nb_positive)(v);
1121 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 return NULL;
1123}
1124
1125static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001126not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 object *v;
1128{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001129 int outcome = testbool(v);
1130 object *w = outcome == 0 ? True : False;
1131 INCREF(w);
1132 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133}
1134
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001135/* External interface to call any callable object. The arg may be NULL. */
1136
1137object *
1138call_object(func, arg)
1139 object *func;
1140 object *arg;
1141{
1142 if (is_instancemethodobject(func) || is_funcobject(func))
1143 return call_function(func, arg);
1144 else
1145 return call_builtin(func, arg);
1146}
1147
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001149call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 if (is_methodobject(func)) {
1154 method meth = getmethod(func);
1155 object *self = getself(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001156 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 }
1158 if (is_classobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001159 if (arg != NULL) {
1160 err_setstr(TypeError,
1161 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001162 return NULL;
1163 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001166 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001167 return NULL;
1168}
1169
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001170static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001171call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001173 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001175 object *newarg = NULL;
1176 object *newlocals, *newglobals;
1177 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178
Guido van Rossume8122f11991-05-05 20:03:07 +00001179 if (is_instancemethodobject(func)) {
1180 object *self = instancemethodgetself(func);
1181 func = instancemethodgetfunc(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182 if (arg == NULL) {
1183 arg = self;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 }
1185 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001186 newarg = newtupleobject(2);
1187 if (newarg == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188 return NULL;
1189 INCREF(self);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001190 INCREF(arg);
1191 settupleitem(newarg, 0, self);
1192 settupleitem(newarg, 1, arg);
1193 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001194 }
1195 }
1196 else {
1197 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001198 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001199 return NULL;
1200 }
1201 }
1202
Guido van Rossum3f5da241990-12-20 15:06:42 +00001203 co = getfunccode(func);
1204 if (co == NULL) {
1205 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001206 return NULL;
1207 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001208 if (!is_codeobject(co)) {
1209 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 abort();
1211 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001212 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001213 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001214 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215 return NULL;
1216 }
1217
Guido van Rossum3f5da241990-12-20 15:06:42 +00001218 newglobals = getfuncglobals(func);
1219 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220
Guido van Rossum3f5da241990-12-20 15:06:42 +00001221 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222
Guido van Rossum3f5da241990-12-20 15:06:42 +00001223 DECREF(newlocals);
1224 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225
Guido van Rossum3f5da241990-12-20 15:06:42 +00001226 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001227
1228 return v;
1229}
1230
1231static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001232apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233 object *v, *w;
1234{
1235 typeobject *tp = v->ob_type;
1236 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001237 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001238 return NULL;
1239 }
1240 if (tp->tp_as_sequence != NULL) {
1241 int i;
1242 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001243 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 return NULL;
1245 }
1246 i = getintvalue(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001247 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001249 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250}
1251
1252static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001253loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254 object *v, *w;
1255{
1256 sequence_methods *sq = v->ob_type->tp_as_sequence;
1257 int i, n;
1258 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001259 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001260 return NULL;
1261 }
1262 i = getintvalue(w);
1263 n = (*sq->sq_length)(v);
1264 if (i >= n)
1265 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001266 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001267}
1268
1269static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271 object *v;
1272 int isize;
1273 int *pi;
1274{
1275 if (v != NULL) {
1276 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277 err_setstr(TypeError, "slice index must be int");
1278 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 }
1280 *pi = getintvalue(v);
1281 if (*pi < 0)
1282 *pi += isize;
1283 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001284 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001285}
1286
1287static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001288apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 object *u, *v, *w;
1290{
1291 typeobject *tp = u->ob_type;
1292 int ilow, ihigh, isize;
1293 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001294 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001295 return NULL;
1296 }
1297 ilow = 0;
1298 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001299 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001303 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001305
1306static int
1307assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308 object *w;
1309 object *key;
1310 object *v;
1311{
1312 typeobject *tp = w->ob_type;
1313 sequence_methods *sq;
1314 mapping_methods *mp;
1315 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316 if ((sq = tp->tp_as_sequence) != NULL &&
1317 (func = sq->sq_ass_item) != NULL) {
1318 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001319 err_setstr(TypeError,
1320 "sequence subscript must be integer");
1321 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001322 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323 else
1324 return (*func)(w, (int)getintvalue(key), v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001325 }
1326 else if ((mp = tp->tp_as_mapping) != NULL &&
1327 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001328 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329 }
1330 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001331 err_setstr(TypeError,
1332 "can't assign to this subscripted object");
1333 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001335}
1336
Guido van Rossum3f5da241990-12-20 15:06:42 +00001337static int
1338assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339 object *u, *v, *w, *x;
1340{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001341 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001343 if (sq == NULL) {
1344 err_setstr(TypeError, "assign to slice of non-sequence");
1345 return -1;
1346 }
1347 if (sq == NULL || sq->sq_ass_slice == NULL) {
1348 err_setstr(TypeError, "unassignable slice");
1349 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 }
1351 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352 isize = ihigh = (*sq->sq_length)(u);
1353 if (slice_index(v, isize, &ilow) != 0)
1354 return -1;
1355 if (slice_index(w, isize, &ihigh) != 0)
1356 return -1;
1357 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358}
1359
1360static int
1361cmp_exception(err, v)
1362 object *err, *v;
1363{
1364 if (is_tupleobject(v)) {
1365 int i, n;
1366 n = gettuplesize(v);
1367 for (i = 0; i < n; i++) {
1368 if (err == gettupleitem(v, i))
1369 return 1;
1370 }
1371 return 0;
1372 }
1373 return err == v;
1374}
1375
Guido van Rossum3f5da241990-12-20 15:06:42 +00001376static int
1377cmp_member(v, w)
1378 object *v, *w;
1379{
1380 int i, n, cmp;
1381 object *x;
1382 sequence_methods *sq;
1383 /* Special case for char in string */
1384 if (is_stringobject(w)) {
1385 register char *s, *end;
1386 register char c;
1387 if (!is_stringobject(v) || getstringsize(v) != 1) {
1388 err_setstr(TypeError,
1389 "string member test needs char left operand");
1390 return -1;
1391 }
1392 c = getstringvalue(v)[0];
1393 s = getstringvalue(w);
1394 end = s + getstringsize(w);
1395 while (s < end) {
1396 if (c == *s++)
1397 return 1;
1398 }
1399 return 0;
1400 }
1401 sq = w->ob_type->tp_as_sequence;
1402 if (sq == NULL) {
1403 err_setstr(TypeError,
1404 "'in' or 'not in' needs sequence right argument");
1405 return -1;
1406 }
1407 n = (*sq->sq_length)(w);
1408 for (i = 0; i < n; i++) {
1409 x = (*sq->sq_item)(w, i);
1410 cmp = cmpobject(v, x);
1411 XDECREF(x);
1412 if (cmp == 0)
1413 return 1;
1414 }
1415 return 0;
1416}
1417
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001419cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 enum cmp_op op;
1421 register object *v;
1422 register object *w;
1423{
1424 register int cmp;
1425 register int res = 0;
1426 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427 case IS:
1428 case IS_NOT:
1429 res = (v == w);
1430 if (op == IS_NOT)
1431 res = !res;
1432 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 case IN:
1434 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001435 res = cmp_member(v, w);
1436 if (res < 0)
1437 return NULL;
1438 if (op == NOT_IN)
1439 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 break;
1441 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001442 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 break;
1444 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001445 cmp = cmpobject(v, w);
1446 switch (op) {
1447 case LT: res = cmp < 0; break;
1448 case LE: res = cmp <= 0; break;
1449 case EQ: res = cmp == 0; break;
1450 case NE: res = cmp != 0; break;
1451 case GT: res = cmp > 0; break;
1452 case GE: res = cmp >= 0; break;
1453 /* XXX no default? (res is initialized to 0 though) */
1454 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 }
1456 v = res ? True : False;
1457 INCREF(v);
1458 return v;
1459}
1460
Guido van Rossum374a9221991-04-04 10:40:29 +00001461/* XXX This function should use dict2 variants (change interface!) */
1462
Guido van Rossum3f5da241990-12-20 15:06:42 +00001463static int
1464import_from(locals, v, name)
1465 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001466 object *v;
1467 char *name;
1468{
1469 object *w, *x;
1470 w = getmoduledict(v);
1471 if (name[0] == '*') {
1472 int i;
1473 int n = getdictsize(w);
1474 for (i = 0; i < n; i++) {
1475 name = getdictkey(w, i);
1476 if (name == NULL || name[0] == '_')
1477 continue;
1478 x = dictlookup(w, name);
1479 if (x == NULL) {
1480 /* XXX can't happen? */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001481 err_setstr(NameError, name);
1482 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001483 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001484 if (dictinsert(locals, name, x) != 0)
1485 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001486 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001487 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001488 }
1489 else {
1490 x = dictlookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001491 if (x == NULL) {
1492 err_setstr(NameError, name);
1493 return -1;
1494 }
1495 else
1496 return dictinsert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001497 }
1498}
1499
1500static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001501build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001502 object *v; /* None or tuple containing base classes */
1503 object *w; /* dictionary */
1504{
1505 if (is_tupleobject(v)) {
1506 int i;
1507 for (i = gettuplesize(v); --i >= 0; ) {
1508 object *x = gettupleitem(v, i);
1509 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001510 err_setstr(TypeError,
1511 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001512 return NULL;
1513 }
1514 }
1515 }
1516 else {
1517 v = NULL;
1518 }
1519 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001520 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001521 return NULL;
1522 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001523 return newclassobject(v, w);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001524}