blob: 1d0cdb46e8b9985f6f3aecc2396e8eca985af76a [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 Rossum98256aa1991-12-24 13:25:19 +00001514 if (i < 0)
1515 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001516 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001518 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519}
1520
1521static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001522loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 object *v, *w;
1524{
1525 sequence_methods *sq = v->ob_type->tp_as_sequence;
1526 int i, n;
1527 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001528 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529 return NULL;
1530 }
1531 i = getintvalue(w);
1532 n = (*sq->sq_length)(v);
1533 if (i >= n)
1534 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001535 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536}
1537
1538static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001539slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540 object *v;
1541 int isize;
1542 int *pi;
1543{
1544 if (v != NULL) {
1545 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001546 err_setstr(TypeError, "slice index must be int");
1547 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 }
1549 *pi = getintvalue(v);
1550 if (*pi < 0)
1551 *pi += isize;
1552 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554}
1555
1556static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001557apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 object *u, *v, *w;
1559{
1560 typeobject *tp = u->ob_type;
1561 int ilow, ihigh, isize;
1562 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001563 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 return NULL;
1565 }
1566 ilow = 0;
1567 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001568 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001573}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001574
1575static int
1576assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 object *w;
1578 object *key;
1579 object *v;
1580{
1581 typeobject *tp = w->ob_type;
1582 sequence_methods *sq;
1583 mapping_methods *mp;
1584 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585 if ((sq = tp->tp_as_sequence) != NULL &&
1586 (func = sq->sq_ass_item) != NULL) {
1587 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001588 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001589 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001592 else {
1593 int i = getintvalue(key);
1594 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001595 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001596 return (*func)(w, i, v);
1597 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 }
1599 else if ((mp = tp->tp_as_mapping) != NULL &&
1600 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 }
1603 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001604 err_setstr(TypeError,
1605 "can't assign to this subscripted object");
1606 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608}
1609
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610static int
1611assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 object *u, *v, *w, *x;
1613{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001616 if (sq == NULL) {
1617 err_setstr(TypeError, "assign to slice of non-sequence");
1618 return -1;
1619 }
1620 if (sq == NULL || sq->sq_ass_slice == NULL) {
1621 err_setstr(TypeError, "unassignable slice");
1622 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 }
1624 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625 isize = ihigh = (*sq->sq_length)(u);
1626 if (slice_index(v, isize, &ilow) != 0)
1627 return -1;
1628 if (slice_index(w, isize, &ihigh) != 0)
1629 return -1;
1630 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631}
1632
1633static int
1634cmp_exception(err, v)
1635 object *err, *v;
1636{
1637 if (is_tupleobject(v)) {
1638 int i, n;
1639 n = gettuplesize(v);
1640 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001641 /* Test recursively */
1642 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 return 1;
1644 }
1645 return 0;
1646 }
1647 return err == v;
1648}
1649
Guido van Rossum3f5da241990-12-20 15:06:42 +00001650static int
1651cmp_member(v, w)
1652 object *v, *w;
1653{
1654 int i, n, cmp;
1655 object *x;
1656 sequence_methods *sq;
1657 /* Special case for char in string */
1658 if (is_stringobject(w)) {
1659 register char *s, *end;
1660 register char c;
1661 if (!is_stringobject(v) || getstringsize(v) != 1) {
1662 err_setstr(TypeError,
1663 "string member test needs char left operand");
1664 return -1;
1665 }
1666 c = getstringvalue(v)[0];
1667 s = getstringvalue(w);
1668 end = s + getstringsize(w);
1669 while (s < end) {
1670 if (c == *s++)
1671 return 1;
1672 }
1673 return 0;
1674 }
1675 sq = w->ob_type->tp_as_sequence;
1676 if (sq == NULL) {
1677 err_setstr(TypeError,
1678 "'in' or 'not in' needs sequence right argument");
1679 return -1;
1680 }
1681 n = (*sq->sq_length)(w);
1682 for (i = 0; i < n; i++) {
1683 x = (*sq->sq_item)(w, i);
1684 cmp = cmpobject(v, x);
1685 XDECREF(x);
1686 if (cmp == 0)
1687 return 1;
1688 }
1689 return 0;
1690}
1691
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 enum cmp_op op;
1695 register object *v;
1696 register object *w;
1697{
1698 register int cmp;
1699 register int res = 0;
1700 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001701 case IS:
1702 case IS_NOT:
1703 res = (v == w);
1704 if (op == IS_NOT)
1705 res = !res;
1706 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001707 case IN:
1708 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709 res = cmp_member(v, w);
1710 if (res < 0)
1711 return NULL;
1712 if (op == NOT_IN)
1713 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 break;
1715 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001716 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 break;
1718 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001719 cmp = cmpobject(v, w);
1720 switch (op) {
1721 case LT: res = cmp < 0; break;
1722 case LE: res = cmp <= 0; break;
1723 case EQ: res = cmp == 0; break;
1724 case NE: res = cmp != 0; break;
1725 case GT: res = cmp > 0; break;
1726 case GE: res = cmp >= 0; break;
1727 /* XXX no default? (res is initialized to 0 though) */
1728 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 }
1730 v = res ? True : False;
1731 INCREF(v);
1732 return v;
1733}
1734
Guido van Rossum3f5da241990-12-20 15:06:42 +00001735static int
1736import_from(locals, v, name)
1737 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001738 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001739 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001740{
1741 object *w, *x;
1742 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001743 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001744 int i;
1745 int n = getdictsize(w);
1746 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001747 name = getdict2key(w, i);
1748 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001749 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001750 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001751 if (x == NULL) {
1752 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001753 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001754 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001755 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001756 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001757 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001758 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001760 }
1761 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001762 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001763 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001764 char buf[250];
1765 sprintf(buf, "cannot import name %s",
1766 getstringvalue(name));
1767 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001768 return -1;
1769 }
1770 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001771 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001772 }
1773}
1774
1775static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001776build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001777 object *v; /* None or tuple containing base classes */
1778 object *w; /* dictionary */
1779{
1780 if (is_tupleobject(v)) {
1781 int i;
1782 for (i = gettuplesize(v); --i >= 0; ) {
1783 object *x = gettupleitem(v, i);
1784 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001785 err_setstr(TypeError,
1786 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001787 return NULL;
1788 }
1789 }
1790 }
1791 else {
1792 v = NULL;
1793 }
1794 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001795 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001796 return NULL;
1797 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001798 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001799}