blob: 46da00bae99a1e43837cf88b0634aaaf01c065bf [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();
Guido van Rossum9c7b8611991-12-16 13:04:47 +000062object *call_object();
Guido van Rossum374a9221991-04-04 10:40:29 +000063static object *apply_subscript();
64static object *loop_subscript();
65static object *apply_slice();
66static object *cmp_outcome();
67static object *build_class();
68static int testbool();
69static int assign_subscript PROTO((object *, object *, object *));
70static int assign_slice PROTO((object *, object *, object *, object *));
Guido van Rossumdf62e441991-08-16 08:56:04 +000071static int import_from PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000072
73
74static frameobject *current_frame;
75
76
77/* Status code for main loop (reason for stack unwind) */
78
79enum why_code {
80 WHY_NOT, /* No error */
81 WHY_EXCEPTION, /* Exception occurred */
82 WHY_RERAISE, /* Exception re-raised by 'finally' */
83 WHY_RETURN, /* 'return' statement */
84 WHY_BREAK /* 'break' statement */
85};
86
87
88/* Interpreter main loop */
89
90object *
91eval_code(co, globals, locals, arg)
92 codeobject *co;
93 object *globals;
94 object *locals;
95 object *arg;
96{
97 register unsigned char *next_instr;
98 register int opcode; /* Current opcode */
99 register int oparg; /* Current opcode argument, if any */
100 register object **stack_pointer;
101 register enum why_code why; /* Reason for block stack unwind */
102 register int err; /* Error status -- nonzero if error */
103 register object *x; /* Result object -- NULL if error */
104 register object *v; /* Temporary objects popped off stack */
105 register object *w;
106 register object *u;
107 register object *t;
108 register frameobject *f; /* Current frame */
109 int lineno; /* Current line number */
110 object *retval; /* Return value iff why == WHY_RETURN */
111 char *name; /* Name used by some instructions */
112 FILE *fp; /* Used by print operations */
113#ifdef TRACE
114 int trace = dictlookup(globals, "__trace__") != NULL;
115#endif
116
117/* Code access macros */
118
119#define GETCONST(i) Getconst(f, i)
120#define GETNAME(i) Getname(f, i)
121#define GETNAMEV(i) Getnamev(f, i)
122#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
123#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
124#define NEXTOP() (*next_instr++)
125#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
126#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
127#define JUMPBY(x) (next_instr += (x))
128
129/* Stack manipulation macros */
130
131#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
132#define EMPTY() (STACK_LEVEL() == 0)
133#define TOP() (stack_pointer[-1])
134#define BASIC_PUSH(v) (*stack_pointer++ = (v))
135#define BASIC_POP() (*--stack_pointer)
136
137#ifdef TRACE
138#define PUSH(v) (BASIC_PUSH(v), trace && prtrace(TOP(), "push"))
139#define POP() (trace && prtrace(TOP(), "pop"), BASIC_POP())
140#else
141#define PUSH(v) BASIC_PUSH(v)
142#define POP() BASIC_POP()
143#endif
144
145 f = newframeobject(
146 current_frame, /*back*/
147 co, /*code*/
148 globals, /*globals*/
149 locals, /*locals*/
150 50, /*nvalues*/
151 20); /*nblocks*/
152 if (f == NULL)
153 return NULL;
154
155 current_frame = f;
156
157 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
158
159 stack_pointer = f->f_valuestack;
160
161 if (arg != NULL) {
162 INCREF(arg);
163 PUSH(arg);
164 }
165
166 why = WHY_NOT;
167 err = 0;
168 x = None; /* Not a reference, just anything non-NULL */
169 lineno = -1;
170
171 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000172 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000173
174 /* Do periodic things */
175
176 if (--ticker < 0) {
177 ticker = 100;
178 if (intrcheck()) {
179 err_set(KeyboardInterrupt);
180 why = WHY_EXCEPTION;
181 tb_here(f, INSTR_OFFSET(), lineno);
182 goto on_error;
183 }
184 }
185
186 /* Extract opcode and argument */
187
188 opcode = NEXTOP();
189 if (HAS_ARG(opcode))
190 oparg = NEXTARG();
191
192#ifdef TRACE
193 /* Instruction tracing */
194
195 if (trace) {
196 if (HAS_ARG(opcode)) {
197 printf("%d: %d, %d\n",
198 (int) (INSTR_OFFSET() - 3),
199 opcode, oparg);
200 }
201 else {
202 printf("%d: %d\n",
203 (int) (INSTR_OFFSET() - 1), opcode);
204 }
205 }
206#endif
207
208 /* Main switch on opcode */
209
210 switch (opcode) {
211
212 /* BEWARE!
213 It is essential that any operation that fails sets either
214 x to NULL, err to nonzero, or why to anything but WHY_NOT,
215 and that no operation that succeeds does this! */
216
217 /* case STOP_CODE: this is an error! */
218
219 case POP_TOP:
220 v = POP();
221 DECREF(v);
222 break;
223
224 case ROT_TWO:
225 v = POP();
226 w = POP();
227 PUSH(v);
228 PUSH(w);
229 break;
230
231 case ROT_THREE:
232 v = POP();
233 w = POP();
234 x = POP();
235 PUSH(v);
236 PUSH(x);
237 PUSH(w);
238 break;
239
240 case DUP_TOP:
241 v = TOP();
242 INCREF(v);
243 PUSH(v);
244 break;
245
246 case UNARY_POSITIVE:
247 v = POP();
248 x = pos(v);
249 DECREF(v);
250 PUSH(x);
251 break;
252
253 case UNARY_NEGATIVE:
254 v = POP();
255 x = neg(v);
256 DECREF(v);
257 PUSH(x);
258 break;
259
260 case UNARY_NOT:
261 v = POP();
262 x = not(v);
263 DECREF(v);
264 PUSH(x);
265 break;
266
267 case UNARY_CONVERT:
268 v = POP();
269 x = reprobject(v);
270 DECREF(v);
271 PUSH(x);
272 break;
273
274 case UNARY_CALL:
275 v = POP();
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000276 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000277 DECREF(v);
278 PUSH(x);
279 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000280
281 case UNARY_INVERT:
282 v = POP();
283 x = invert(v);
284 DECREF(v);
285 PUSH(x);
286 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000287
288 case BINARY_MULTIPLY:
289 w = POP();
290 v = POP();
291 x = mul(v, w);
292 DECREF(v);
293 DECREF(w);
294 PUSH(x);
295 break;
296
297 case BINARY_DIVIDE:
298 w = POP();
299 v = POP();
300 x = divide(v, w);
301 DECREF(v);
302 DECREF(w);
303 PUSH(x);
304 break;
305
306 case BINARY_MODULO:
307 w = POP();
308 v = POP();
309 x = rem(v, w);
310 DECREF(v);
311 DECREF(w);
312 PUSH(x);
313 break;
314
315 case BINARY_ADD:
316 w = POP();
317 v = POP();
318 x = add(v, w);
319 DECREF(v);
320 DECREF(w);
321 PUSH(x);
322 break;
323
324 case BINARY_SUBTRACT:
325 w = POP();
326 v = POP();
327 x = sub(v, w);
328 DECREF(v);
329 DECREF(w);
330 PUSH(x);
331 break;
332
333 case BINARY_SUBSCR:
334 w = POP();
335 v = POP();
336 x = apply_subscript(v, w);
337 DECREF(v);
338 DECREF(w);
339 PUSH(x);
340 break;
341
342 case BINARY_CALL:
343 w = POP();
344 v = POP();
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000345 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000346 DECREF(v);
347 DECREF(w);
348 PUSH(x);
349 break;
350
Guido van Rossum7928cd71991-10-24 14:59:31 +0000351 case BINARY_LSHIFT:
352 w = POP();
353 v = POP();
354 x = lshift(v, w);
355 DECREF(v);
356 DECREF(w);
357 PUSH(x);
358 break;
359
360 case BINARY_RSHIFT:
361 w = POP();
362 v = POP();
363 x = rshift(v, w);
364 DECREF(v);
365 DECREF(w);
366 PUSH(x);
367 break;
368
369 case BINARY_AND:
370 w = POP();
371 v = POP();
372 x = and(v, w);
373 DECREF(v);
374 DECREF(w);
375 PUSH(x);
376 break;
377
378 case BINARY_XOR:
379 w = POP();
380 v = POP();
381 x = xor(v, w);
382 DECREF(v);
383 DECREF(w);
384 PUSH(x);
385 break;
386
387 case BINARY_OR:
388 w = POP();
389 v = POP();
390 x = or(v, w);
391 DECREF(v);
392 DECREF(w);
393 PUSH(x);
394 break;
395
Guido van Rossum374a9221991-04-04 10:40:29 +0000396 case SLICE+0:
397 case SLICE+1:
398 case SLICE+2:
399 case SLICE+3:
400 if ((opcode-SLICE) & 2)
401 w = POP();
402 else
403 w = NULL;
404 if ((opcode-SLICE) & 1)
405 v = POP();
406 else
407 v = NULL;
408 u = POP();
409 x = apply_slice(u, v, w);
410 DECREF(u);
411 XDECREF(v);
412 XDECREF(w);
413 PUSH(x);
414 break;
415
416 case STORE_SLICE+0:
417 case STORE_SLICE+1:
418 case STORE_SLICE+2:
419 case STORE_SLICE+3:
420 if ((opcode-STORE_SLICE) & 2)
421 w = POP();
422 else
423 w = NULL;
424 if ((opcode-STORE_SLICE) & 1)
425 v = POP();
426 else
427 v = NULL;
428 u = POP();
429 t = POP();
430 err = assign_slice(u, v, w, t); /* u[v:w] = t */
431 DECREF(t);
432 DECREF(u);
433 XDECREF(v);
434 XDECREF(w);
435 break;
436
437 case DELETE_SLICE+0:
438 case DELETE_SLICE+1:
439 case DELETE_SLICE+2:
440 case DELETE_SLICE+3:
441 if ((opcode-DELETE_SLICE) & 2)
442 w = POP();
443 else
444 w = NULL;
445 if ((opcode-DELETE_SLICE) & 1)
446 v = POP();
447 else
448 v = NULL;
449 u = POP();
450 err = assign_slice(u, v, w, (object *)NULL);
451 /* del u[v:w] */
452 DECREF(u);
453 XDECREF(v);
454 XDECREF(w);
455 break;
456
457 case STORE_SUBSCR:
458 w = POP();
459 v = POP();
460 u = POP();
461 /* v[w] = u */
462 err = assign_subscript(v, w, u);
463 DECREF(u);
464 DECREF(v);
465 DECREF(w);
466 break;
467
468 case DELETE_SUBSCR:
469 w = POP();
470 v = POP();
471 /* del v[w] */
472 err = assign_subscript(v, w, (object *)NULL);
473 DECREF(v);
474 DECREF(w);
475 break;
476
477 case PRINT_EXPR:
478 v = POP();
479 fp = sysgetfile("stdout", stdout);
480 /* Print value except if procedure result */
481 if (v != None) {
482 flushline();
483 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000484 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000485 flushline();
486 }
487 DECREF(v);
488 break;
489
490 case PRINT_ITEM:
491 v = POP();
492 fp = sysgetfile("stdout", stdout);
493 if (softspace(sysget("stdout"), 1))
494 fprintf(fp, " ");
495 if (is_stringobject(v)) {
496 char *s = getstringvalue(v);
497 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000498 fwrite(s, 1, len, fp);
499 if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000500 softspace(sysget("stdout"), 0);
501 }
502 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000503 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000504 }
505 DECREF(v);
506 break;
507
508 case PRINT_NEWLINE:
509 fp = sysgetfile("stdout", stdout);
510 fprintf(fp, "\n");
511 softspace(sysget("stdout"), 0);
512 break;
513
514 case BREAK_LOOP:
515 why = WHY_BREAK;
516 break;
517
518 case RAISE_EXCEPTION:
519 v = POP();
520 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000521 /* A tuple is equivalent to its first element here */
522 while (is_tupleobject(w)) {
523 u = w;
524 w = gettupleitem(u, 0);
525 DECREF(u);
526 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000527 if (!is_stringobject(w))
528 err_setstr(TypeError,
529 "exceptions must be strings");
530 else
531 err_setval(w, v);
532 DECREF(v);
533 DECREF(w);
534 why = WHY_EXCEPTION;
535 break;
536
537 case LOAD_LOCALS:
538 v = f->f_locals;
539 INCREF(v);
540 PUSH(v);
541 break;
542
543 case RETURN_VALUE:
544 retval = POP();
545 why = WHY_RETURN;
546 break;
547
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 case BUILD_FUNCTION:
549 v = POP();
550 x = newfuncobject(v, f->f_globals);
551 DECREF(v);
552 PUSH(x);
553 break;
554
555 case POP_BLOCK:
556 {
557 block *b = pop_block(f);
558 while (STACK_LEVEL() > b->b_level) {
559 v = POP();
560 DECREF(v);
561 }
562 }
563 break;
564
565 case END_FINALLY:
566 v = POP();
567 if (is_intobject(v)) {
568 why = (enum why_code) getintvalue(v);
569 if (why == WHY_RETURN)
570 retval = POP();
571 }
572 else if (is_stringobject(v)) {
573 w = POP();
574 err_setval(v, w);
575 DECREF(w);
576 w = POP();
577 tb_store(w);
578 DECREF(w);
579 why = WHY_RERAISE;
580 }
581 else if (v != None) {
582 err_setstr(SystemError,
583 "'finally' pops bad exception");
584 why = WHY_EXCEPTION;
585 }
586 DECREF(v);
587 break;
588
589 case BUILD_CLASS:
590 w = POP();
591 v = POP();
592 x = build_class(v, w);
593 PUSH(x);
594 DECREF(v);
595 DECREF(w);
596 break;
597
598 case STORE_NAME:
599 w = GETNAMEV(oparg);
600 v = POP();
601 err = dict2insert(f->f_locals, w, v);
602 DECREF(v);
603 break;
604
605 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000606 w = GETNAMEV(oparg);
607 if ((err = dict2remove(f->f_locals, w)) != 0)
608 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000609 break;
610
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000611 case UNPACK_ARG:
612 /* Implement various compatibility hacks:
613 (a) f(a,b,...) should accept f((1,2,...))
614 (b) f((a,b,...)) should accept f(1,2,...)
615 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
616 */
617 {
618 int n;
619 if (EMPTY()) {
620 err_setstr(TypeError,
621 "no argument list");
622 why = WHY_EXCEPTION;
623 break;
624 }
625 v = POP();
626 if (!is_tupleobject(v)) {
627 err_setstr(TypeError,
628 "bad argument list");
629 why = WHY_EXCEPTION;
630 break;
631 }
632 n = gettuplesize(v);
633 if (n == 1 && oparg != 1) {
634 /* Rule (a) */
635 w = gettupleitem(v, 0);
636 if (is_tupleobject(w)) {
637 INCREF(w);
638 DECREF(v);
639 v = w;
640 n = gettuplesize(v);
641 }
642 }
643 else if (n != 1 && oparg == 1) {
644 /* Rule (b) */
645 PUSH(v);
646 break;
647 /* Don't fall through */
648 }
649 else if (n > 2 && oparg == 2) {
650 /* Rule (c) */
651 int i;
652 w = newtupleobject(n-1);
653 u = newtupleobject(2);
654 if (u == NULL || w == NULL) {
655 XDECREF(w);
656 XDECREF(u);
657 DECREF(v);
658 why = WHY_EXCEPTION;
659 break;
660 }
661 t = gettupleitem(v, 0);
662 INCREF(t);
663 settupleitem(u, 0, t);
664 for (i = 1; i < n; i++) {
665 t = gettupleitem(v, i);
666 INCREF(t);
667 settupleitem(w, i-1, t);
668 }
669 settupleitem(u, 1, w);
670 DECREF(v);
671 v = u;
672 n = 2;
673 }
674 if (n != oparg) {
675 err_setstr(TypeError,
676 "arg count mismatch");
677 why = WHY_EXCEPTION;
678 DECREF(v);
679 break;
680 }
681 PUSH(v);
682 }
683 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 case UNPACK_TUPLE:
685 v = POP();
686 if (!is_tupleobject(v)) {
687 err_setstr(TypeError, "unpack non-tuple");
688 why = WHY_EXCEPTION;
689 }
690 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000691 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 "unpack tuple of wrong size");
693 why = WHY_EXCEPTION;
694 }
695 else {
696 for (; --oparg >= 0; ) {
697 w = gettupleitem(v, oparg);
698 INCREF(w);
699 PUSH(w);
700 }
701 }
702 DECREF(v);
703 break;
704
705 case UNPACK_LIST:
706 v = POP();
707 if (!is_listobject(v)) {
708 err_setstr(TypeError, "unpack non-list");
709 why = WHY_EXCEPTION;
710 }
711 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000712 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 "unpack list of wrong size");
714 why = WHY_EXCEPTION;
715 }
716 else {
717 for (; --oparg >= 0; ) {
718 w = getlistitem(v, oparg);
719 INCREF(w);
720 PUSH(w);
721 }
722 }
723 DECREF(v);
724 break;
725
726 case STORE_ATTR:
727 name = GETNAME(oparg);
728 v = POP();
729 u = POP();
730 err = setattr(v, name, u); /* v.name = u */
731 DECREF(v);
732 DECREF(u);
733 break;
734
735 case DELETE_ATTR:
736 name = GETNAME(oparg);
737 v = POP();
738 err = setattr(v, name, (object *)NULL);
739 /* del v.name */
740 DECREF(v);
741 break;
742
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000743 case STORE_GLOBAL:
744 w = GETNAMEV(oparg);
745 v = POP();
746 err = dict2insert(f->f_globals, w, v);
747 DECREF(v);
748 break;
749
750 case DELETE_GLOBAL:
751 w = GETNAMEV(oparg);
752 if ((err = dict2remove(f->f_globals, w)) != 0)
753 err_setstr(NameError, getstringvalue(w));
754 break;
755
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 case LOAD_CONST:
757 x = GETCONST(oparg);
758 INCREF(x);
759 PUSH(x);
760 break;
761
762 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000763 w = GETNAMEV(oparg);
764 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000766 err_clear();
767 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000769 err_clear();
770 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000772 err_setstr(NameError,
773 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 break;
775 }
776 }
777 }
778 INCREF(x);
779 PUSH(x);
780 break;
781
782 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000783 w = GETNAMEV(oparg);
784 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000786 err_clear();
787 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000789 err_setstr(NameError,
790 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000791 break;
792 }
793 }
794 INCREF(x);
795 PUSH(x);
796 break;
797
798 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000799 w = GETNAMEV(oparg);
800 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000801 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000802 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000803 break;
804 }
805 INCREF(x);
806 PUSH(x);
807 break;
808
809 case BUILD_TUPLE:
810 x = newtupleobject(oparg);
811 if (x != NULL) {
812 for (; --oparg >= 0;) {
813 w = POP();
814 err = settupleitem(x, oparg, w);
815 if (err != 0)
816 break;
817 }
818 PUSH(x);
819 }
820 break;
821
822 case BUILD_LIST:
823 x = newlistobject(oparg);
824 if (x != NULL) {
825 for (; --oparg >= 0;) {
826 w = POP();
827 err = setlistitem(x, oparg, w);
828 if (err != 0)
829 break;
830 }
831 PUSH(x);
832 }
833 break;
834
835 case BUILD_MAP:
836 x = newdictobject();
837 PUSH(x);
838 break;
839
840 case LOAD_ATTR:
841 name = GETNAME(oparg);
842 v = POP();
843 x = getattr(v, name);
844 DECREF(v);
845 PUSH(x);
846 break;
847
848 case COMPARE_OP:
849 w = POP();
850 v = POP();
851 x = cmp_outcome((enum cmp_op)oparg, v, w);
852 DECREF(v);
853 DECREF(w);
854 PUSH(x);
855 break;
856
857 case IMPORT_NAME:
858 name = GETNAME(oparg);
859 x = import_module(name);
860 XINCREF(x);
861 PUSH(x);
862 break;
863
864 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000865 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000866 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000867 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 break;
869
870 case JUMP_FORWARD:
871 JUMPBY(oparg);
872 break;
873
874 case JUMP_IF_FALSE:
875 if (!testbool(TOP()))
876 JUMPBY(oparg);
877 break;
878
879 case JUMP_IF_TRUE:
880 if (testbool(TOP()))
881 JUMPBY(oparg);
882 break;
883
884 case JUMP_ABSOLUTE:
885 JUMPTO(oparg);
886 break;
887
888 case FOR_LOOP:
889 /* for v in s: ...
890 On entry: stack contains s, i.
891 On exit: stack contains s, i+1, s[i];
892 but if loop exhausted:
893 s, i are popped, and we jump */
894 w = POP(); /* Loop index */
895 v = POP(); /* Sequence object */
896 u = loop_subscript(v, w);
897 if (u != NULL) {
898 PUSH(v);
899 x = newintobject(getintvalue(w)+1);
900 PUSH(x);
901 DECREF(w);
902 PUSH(u);
903 }
904 else {
905 DECREF(v);
906 DECREF(w);
907 /* A NULL can mean "s exhausted"
908 but also an error: */
909 if (err_occurred())
910 why = WHY_EXCEPTION;
911 else
912 JUMPBY(oparg);
913 }
914 break;
915
916 case SETUP_LOOP:
917 case SETUP_EXCEPT:
918 case SETUP_FINALLY:
919 setup_block(f, opcode, INSTR_OFFSET() + oparg,
920 STACK_LEVEL());
921 break;
922
923 case SET_LINENO:
924#ifdef TRACE
925 if (trace)
926 printf("--- Line %d ---\n", oparg);
927#endif
928 lineno = oparg;
929 break;
930
931 default:
932 fprintf(stderr,
933 "XXX lineno: %d, opcode: %d\n",
934 lineno, opcode);
935 err_setstr(SystemError, "eval_code: unknown opcode");
936 why = WHY_EXCEPTION;
937 break;
938
939 } /* switch */
940
941 on_error:
942
943 /* Quickly continue if no error occurred */
944
945 if (why == WHY_NOT) {
946 if (err == 0 && x != NULL)
947 continue; /* Normal, fast path */
948 why = WHY_EXCEPTION;
949 x = None;
950 err = 0;
951 }
952
953#ifndef NDEBUG
954 /* Double-check exception status */
955
956 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
957 if (!err_occurred()) {
958 fprintf(stderr, "XXX ghost error\n");
959 err_setstr(SystemError, "ghost error");
960 why = WHY_EXCEPTION;
961 }
962 }
963 else {
964 if (err_occurred()) {
965 fprintf(stderr, "XXX undetected error\n");
966 why = WHY_EXCEPTION;
967 }
968 }
969#endif
970
971 /* Log traceback info if this is a real exception */
972
973 if (why == WHY_EXCEPTION) {
974 int lasti = INSTR_OFFSET() - 1;
975 if (HAS_ARG(opcode))
976 lasti -= 2;
977 tb_here(f, lasti, lineno);
978 }
979
980 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
981
982 if (why == WHY_RERAISE)
983 why = WHY_EXCEPTION;
984
985 /* Unwind stacks if a (pseudo) exception occurred */
986
987 while (why != WHY_NOT && f->f_iblock > 0) {
988 block *b = pop_block(f);
989 while (STACK_LEVEL() > b->b_level) {
990 v = POP();
991 XDECREF(v);
992 }
993 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
994 why = WHY_NOT;
995 JUMPTO(b->b_handler);
996 break;
997 }
998 if (b->b_type == SETUP_FINALLY ||
999 b->b_type == SETUP_EXCEPT &&
1000 why == WHY_EXCEPTION) {
1001 if (why == WHY_EXCEPTION) {
1002 object *exc, *val;
1003 err_get(&exc, &val);
1004 if (val == NULL) {
1005 val = None;
1006 INCREF(val);
1007 }
1008 v = tb_fetch();
1009 /* Make the raw exception data
1010 available to the handler,
1011 so a program can emulate the
1012 Python main loop. Don't do
1013 this for 'finally'. */
1014 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001015#if 1 /* Oops, this breaks too many things */
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 sysset("exc_traceback", v);
1017#endif
1018 sysset("exc_value", val);
1019 sysset("exc_type", exc);
1020 err_clear();
1021 }
1022 PUSH(v);
1023 PUSH(val);
1024 PUSH(exc);
1025 }
1026 else {
1027 if (why == WHY_RETURN)
1028 PUSH(retval);
1029 v = newintobject((long)why);
1030 PUSH(v);
1031 }
1032 why = WHY_NOT;
1033 JUMPTO(b->b_handler);
1034 break;
1035 }
1036 } /* unwind stack */
1037
1038 /* End the loop if we still have an error (or return) */
1039
1040 if (why != WHY_NOT)
1041 break;
1042
1043 } /* main loop */
1044
1045 /* Pop remaining stack entries */
1046
1047 while (!EMPTY()) {
1048 v = POP();
1049 XDECREF(v);
1050 }
1051
1052 /* Restore previous frame and release the current one */
1053
1054 current_frame = f->f_back;
1055 DECREF(f);
1056
1057 if (why == WHY_RETURN)
1058 return retval;
1059 else
1060 return NULL;
1061}
1062
Guido van Rossum3f5da241990-12-20 15:06:42 +00001063#ifdef TRACE
1064static int
1065prtrace(v, str)
1066 object *v;
1067 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001070 if (printobject(v, stdout, 0) != 0)
1071 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001072 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001074#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001075
Guido van Rossum3f5da241990-12-20 15:06:42 +00001076object *
1077getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001079 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001081 else
1082 return current_frame->f_locals;
1083}
1084
1085object *
1086getglobals()
1087{
1088 if (current_frame == NULL)
1089 return NULL;
1090 else
1091 return current_frame->f_globals;
1092}
1093
1094void
1095printtraceback(fp)
1096 FILE *fp;
1097{
1098 object *v = tb_fetch();
1099 if (v != NULL) {
1100 fprintf(fp, "Stack backtrace (innermost last):\n");
1101 tb_print(v, fp);
1102 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001103 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104}
1105
1106
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107void
1108flushline()
1109{
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 if (softspace(sysget("stdout"), 0))
1111 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112}
1113
Guido van Rossum3f5da241990-12-20 15:06:42 +00001114
1115/* Test a value used as condition, e.g., in a for or if statement */
1116
1117static int
1118testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 object *v;
1120{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001121 if (v == None)
1122 return 0;
1123 if (v->ob_type->tp_as_number != NULL)
1124 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001125 if (v->ob_type->tp_as_sequence != NULL)
1126 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1127 if (v->ob_type->tp_as_mapping != NULL)
1128 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001129 /* All other objects are 'true' */
1130 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131}
1132
1133static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001134or(v, w)
1135 object *v, *w;
1136{
1137 if (v->ob_type->tp_as_number != NULL) {
1138 object *x;
1139 object * (*f) FPROTO((object *, object *));
1140 if (coerce(&v, &w) != 0)
1141 return NULL;
1142 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1143 x = (*f)(v, w);
1144 DECREF(v);
1145 DECREF(w);
1146 if (f != NULL)
1147 return x;
1148 }
1149 err_setstr(TypeError, "bad operand type(s) for |");
1150 return NULL;
1151}
1152
1153static object *
1154xor(v, w)
1155 object *v, *w;
1156{
1157 if (v->ob_type->tp_as_number != NULL) {
1158 object *x;
1159 object * (*f) FPROTO((object *, object *));
1160 if (coerce(&v, &w) != 0)
1161 return NULL;
1162 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1163 x = (*f)(v, w);
1164 DECREF(v);
1165 DECREF(w);
1166 if (f != NULL)
1167 return x;
1168 }
1169 err_setstr(TypeError, "bad operand type(s) for ^");
1170 return NULL;
1171}
1172
1173static object *
1174and(v, w)
1175 object *v, *w;
1176{
1177 if (v->ob_type->tp_as_number != NULL) {
1178 object *x;
1179 object * (*f) FPROTO((object *, object *));
1180 if (coerce(&v, &w) != 0)
1181 return NULL;
1182 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1183 x = (*f)(v, w);
1184 DECREF(v);
1185 DECREF(w);
1186 if (f != NULL)
1187 return x;
1188 }
1189 err_setstr(TypeError, "bad operand type(s) for &");
1190 return NULL;
1191}
1192
1193static object *
1194lshift(v, w)
1195 object *v, *w;
1196{
1197 if (v->ob_type->tp_as_number != NULL) {
1198 object *x;
1199 object * (*f) FPROTO((object *, object *));
1200 if (coerce(&v, &w) != 0)
1201 return NULL;
1202 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1203 x = (*f)(v, w);
1204 DECREF(v);
1205 DECREF(w);
1206 if (f != NULL)
1207 return x;
1208 }
1209 err_setstr(TypeError, "bad operand type(s) for <<");
1210 return NULL;
1211}
1212
1213static object *
1214rshift(v, w)
1215 object *v, *w;
1216{
1217 if (v->ob_type->tp_as_number != NULL) {
1218 object *x;
1219 object * (*f) FPROTO((object *, object *));
1220 if (coerce(&v, &w) != 0)
1221 return NULL;
1222 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1223 x = (*f)(v, w);
1224 DECREF(v);
1225 DECREF(w);
1226 if (f != NULL)
1227 return x;
1228 }
1229 err_setstr(TypeError, "bad operand type(s) for >>");
1230 return NULL;
1231}
1232
1233static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001234add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235 object *v, *w;
1236{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001237 if (v->ob_type->tp_as_number != NULL) {
1238 object *x;
1239 if (coerce(&v, &w) != 0)
1240 return NULL;
1241 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1242 DECREF(v);
1243 DECREF(w);
1244 return x;
1245 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001246 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001247 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001249 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250 return NULL;
1251 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252}
1253
1254static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001255sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 object *v, *w;
1257{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001258 if (v->ob_type->tp_as_number != NULL) {
1259 object *x;
1260 if (coerce(&v, &w) != 0)
1261 return NULL;
1262 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1263 DECREF(v);
1264 DECREF(w);
1265 return x;
1266 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001267 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 return NULL;
1269}
1270
1271static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273 object *v, *w;
1274{
1275 typeobject *tp;
1276 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1277 /* int*sequence -- swap v and w */
1278 object *tmp = v;
1279 v = w;
1280 w = tmp;
1281 }
1282 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001283 if (tp->tp_as_number != NULL) {
1284 object *x;
1285 if (coerce(&v, &w) != 0)
1286 return NULL;
1287 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1288 DECREF(v);
1289 DECREF(w);
1290 return x;
1291 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001292 if (tp->tp_as_sequence != NULL) {
1293 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001294 err_setstr(TypeError,
1295 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001296 return NULL;
1297 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001298 return (*tp->tp_as_sequence->sq_repeat)
1299 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302 return NULL;
1303}
1304
1305static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001306divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307 object *v, *w;
1308{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001309 if (v->ob_type->tp_as_number != NULL) {
1310 object *x;
1311 if (coerce(&v, &w) != 0)
1312 return NULL;
1313 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1314 DECREF(v);
1315 DECREF(w);
1316 return x;
1317 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001318 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001319 return NULL;
1320}
1321
1322static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001324 object *v, *w;
1325{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001326 if (v->ob_type->tp_as_number != NULL) {
1327 object *x;
1328 if (coerce(&v, &w) != 0)
1329 return NULL;
1330 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1331 DECREF(v);
1332 DECREF(w);
1333 return x;
1334 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 return NULL;
1337}
1338
1339static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001340neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341 object *v;
1342{
1343 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001344 return (*v->ob_type->tp_as_number->nb_negative)(v);
1345 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 return NULL;
1347}
1348
1349static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001350pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351 object *v;
1352{
1353 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001354 return (*v->ob_type->tp_as_number->nb_positive)(v);
1355 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356 return NULL;
1357}
1358
1359static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001360invert(v)
1361 object *v;
1362{
1363 object * (*f) FPROTO((object *, object *));
1364 if (v->ob_type->tp_as_number != NULL &&
1365 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1366 return (*f)(v);
1367 err_setstr(TypeError, "bad operand type(s) for unary ~");
1368 return NULL;
1369}
1370
1371static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001372not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 object *v;
1374{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001375 int outcome = testbool(v);
1376 object *w = outcome == 0 ? True : False;
1377 INCREF(w);
1378 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001380/* External interface to call any callable object. The arg may be NULL. */
1381
1382object *
1383call_object(func, arg)
1384 object *func;
1385 object *arg;
1386{
1387 if (is_instancemethodobject(func) || is_funcobject(func))
1388 return call_function(func, arg);
1389 else
1390 return call_builtin(func, arg);
1391}
1392
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001393static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001394call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001396 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 if (is_methodobject(func)) {
1399 method meth = getmethod(func);
1400 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001401 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1402 int size = gettuplesize(arg);
1403 if (size == 1)
1404 arg = gettupleitem(arg, 0);
1405 else if (size == 0)
1406 arg = NULL;
1407 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001408 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409 }
1410 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001411 if (arg != NULL &&
1412 !(is_tupleobject(arg) &&
1413 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001414 err_setstr(TypeError,
1415 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416 return NULL;
1417 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 return NULL;
1422}
1423
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001425call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001429 object *newarg = NULL;
1430 object *newlocals, *newglobals;
1431 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432
Guido van Rossume8122f11991-05-05 20:03:07 +00001433 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001434 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001435 object *self = instancemethodgetself(func);
1436 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001437 if (arg == NULL)
1438 argcount = 0;
1439 else if (is_tupleobject(arg))
1440 argcount = gettuplesize(arg);
1441 else
1442 argcount = 1;
1443 newarg = newtupleobject(argcount + 1);
1444 if (newarg == NULL)
1445 return NULL;
1446 INCREF(self);
1447 settupleitem(newarg, 0, self);
1448 if (arg != NULL && !is_tupleobject(arg)) {
1449 INCREF(arg);
1450 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 }
1452 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001453 int i;
1454 object *v;
1455 for (i = 0; i < argcount; i++) {
1456 v = gettupleitem(arg, i);
1457 XINCREF(v);
1458 settupleitem(newarg, i+1, v);
1459 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001461 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 }
1463 else {
1464 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001465 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001466 return NULL;
1467 }
1468 }
1469
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 co = getfunccode(func);
1471 if (co == NULL) {
1472 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 return NULL;
1474 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001475 if (!is_codeobject(co)) {
1476 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 abort();
1478 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001479 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001480 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001481 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 return NULL;
1483 }
1484
Guido van Rossum3f5da241990-12-20 15:06:42 +00001485 newglobals = getfuncglobals(func);
1486 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487
Guido van Rossum3f5da241990-12-20 15:06:42 +00001488 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489
Guido van Rossum3f5da241990-12-20 15:06:42 +00001490 DECREF(newlocals);
1491 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492
Guido van Rossum3f5da241990-12-20 15:06:42 +00001493 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494
1495 return v;
1496}
1497
1498static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001500 object *v, *w;
1501{
1502 typeobject *tp = v->ob_type;
1503 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001504 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001505 return NULL;
1506 }
1507 if (tp->tp_as_sequence != NULL) {
1508 int i;
1509 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001510 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511 return NULL;
1512 }
1513 i = getintvalue(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001514 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001516 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517}
1518
1519static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001520loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 object *v, *w;
1522{
1523 sequence_methods *sq = v->ob_type->tp_as_sequence;
1524 int i, n;
1525 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 return NULL;
1528 }
1529 i = getintvalue(w);
1530 n = (*sq->sq_length)(v);
1531 if (i >= n)
1532 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001533 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534}
1535
1536static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001538 object *v;
1539 int isize;
1540 int *pi;
1541{
1542 if (v != NULL) {
1543 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544 err_setstr(TypeError, "slice index must be int");
1545 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546 }
1547 *pi = getintvalue(v);
1548 if (*pi < 0)
1549 *pi += isize;
1550 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001551 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552}
1553
1554static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556 object *u, *v, *w;
1557{
1558 typeobject *tp = u->ob_type;
1559 int ilow, ihigh, isize;
1560 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001561 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 return NULL;
1563 }
1564 ilow = 0;
1565 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001566 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001568 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572
1573static int
1574assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 object *w;
1576 object *key;
1577 object *v;
1578{
1579 typeobject *tp = w->ob_type;
1580 sequence_methods *sq;
1581 mapping_methods *mp;
1582 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 if ((sq = tp->tp_as_sequence) != NULL &&
1584 (func = sq->sq_ass_item) != NULL) {
1585 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001586 err_setstr(TypeError,
1587 "sequence subscript must be integer");
1588 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590 else
1591 return (*func)(w, (int)getintvalue(key), v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 }
1593 else if ((mp = tp->tp_as_mapping) != NULL &&
1594 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001595 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 }
1597 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001598 err_setstr(TypeError,
1599 "can't assign to this subscripted object");
1600 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602}
1603
Guido van Rossum3f5da241990-12-20 15:06:42 +00001604static int
1605assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 object *u, *v, *w, *x;
1607{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001608 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610 if (sq == NULL) {
1611 err_setstr(TypeError, "assign to slice of non-sequence");
1612 return -1;
1613 }
1614 if (sq == NULL || sq->sq_ass_slice == NULL) {
1615 err_setstr(TypeError, "unassignable slice");
1616 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 }
1618 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001619 isize = ihigh = (*sq->sq_length)(u);
1620 if (slice_index(v, isize, &ilow) != 0)
1621 return -1;
1622 if (slice_index(w, isize, &ihigh) != 0)
1623 return -1;
1624 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625}
1626
1627static int
1628cmp_exception(err, v)
1629 object *err, *v;
1630{
1631 if (is_tupleobject(v)) {
1632 int i, n;
1633 n = gettuplesize(v);
1634 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001635 /* Test recursively */
1636 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 return 1;
1638 }
1639 return 0;
1640 }
1641 return err == v;
1642}
1643
Guido van Rossum3f5da241990-12-20 15:06:42 +00001644static int
1645cmp_member(v, w)
1646 object *v, *w;
1647{
1648 int i, n, cmp;
1649 object *x;
1650 sequence_methods *sq;
1651 /* Special case for char in string */
1652 if (is_stringobject(w)) {
1653 register char *s, *end;
1654 register char c;
1655 if (!is_stringobject(v) || getstringsize(v) != 1) {
1656 err_setstr(TypeError,
1657 "string member test needs char left operand");
1658 return -1;
1659 }
1660 c = getstringvalue(v)[0];
1661 s = getstringvalue(w);
1662 end = s + getstringsize(w);
1663 while (s < end) {
1664 if (c == *s++)
1665 return 1;
1666 }
1667 return 0;
1668 }
1669 sq = w->ob_type->tp_as_sequence;
1670 if (sq == NULL) {
1671 err_setstr(TypeError,
1672 "'in' or 'not in' needs sequence right argument");
1673 return -1;
1674 }
1675 n = (*sq->sq_length)(w);
1676 for (i = 0; i < n; i++) {
1677 x = (*sq->sq_item)(w, i);
1678 cmp = cmpobject(v, x);
1679 XDECREF(x);
1680 if (cmp == 0)
1681 return 1;
1682 }
1683 return 0;
1684}
1685
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001687cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 enum cmp_op op;
1689 register object *v;
1690 register object *w;
1691{
1692 register int cmp;
1693 register int res = 0;
1694 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001695 case IS:
1696 case IS_NOT:
1697 res = (v == w);
1698 if (op == IS_NOT)
1699 res = !res;
1700 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 case IN:
1702 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703 res = cmp_member(v, w);
1704 if (res < 0)
1705 return NULL;
1706 if (op == NOT_IN)
1707 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708 break;
1709 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 break;
1712 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001713 cmp = cmpobject(v, w);
1714 switch (op) {
1715 case LT: res = cmp < 0; break;
1716 case LE: res = cmp <= 0; break;
1717 case EQ: res = cmp == 0; break;
1718 case NE: res = cmp != 0; break;
1719 case GT: res = cmp > 0; break;
1720 case GE: res = cmp >= 0; break;
1721 /* XXX no default? (res is initialized to 0 though) */
1722 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
1724 v = res ? True : False;
1725 INCREF(v);
1726 return v;
1727}
1728
Guido van Rossum374a9221991-04-04 10:40:29 +00001729/* XXX This function should use dict2 variants (change interface!) */
1730
Guido van Rossum3f5da241990-12-20 15:06:42 +00001731static int
1732import_from(locals, v, name)
1733 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001734 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001735 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001736{
1737 object *w, *x;
1738 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001739 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001740 int i;
1741 int n = getdictsize(w);
1742 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001743 name = getdict2key(w, i);
1744 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001745 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001746 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001747 if (x == NULL) {
1748 /* XXX can't happen? */
Guido van Rossumdf62e441991-08-16 08:56:04 +00001749 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001751 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001752 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001753 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001754 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001755 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001756 }
1757 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001758 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001760 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001761 return -1;
1762 }
1763 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001764 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001765 }
1766}
1767
1768static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001770 object *v; /* None or tuple containing base classes */
1771 object *w; /* dictionary */
1772{
1773 if (is_tupleobject(v)) {
1774 int i;
1775 for (i = gettuplesize(v); --i >= 0; ) {
1776 object *x = gettupleitem(v, i);
1777 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001778 err_setstr(TypeError,
1779 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001780 return NULL;
1781 }
1782 }
1783 }
1784 else {
1785 v = NULL;
1786 }
1787 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001788 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001789 return NULL;
1790 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001791 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001792}