blob: 76869ff7d9fbd5d34279ca26dc220faaaf125c3b [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "import.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "sysmodule.h"
31#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "frameobject.h"
33#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000035#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "traceback.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#ifndef NDEBUG
39#define TRACE
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#endif
41
Guido van Rossum374a9221991-04-04 10:40:29 +000042/* Forward declarations */
43/* XXX Need prototypes */
44
45void flushline();
46static object *add();
47static object *sub();
48static object *mul();
49static object *divide();
50static object *rem();
51static object *neg();
52static object *pos();
53static object *not();
54static object *call_builtin();
55static object *call_function();
56static object *apply_subscript();
57static object *loop_subscript();
58static object *apply_slice();
59static object *cmp_outcome();
60static object *build_class();
61static int testbool();
62static int assign_subscript PROTO((object *, object *, object *));
63static int assign_slice PROTO((object *, object *, object *, object *));
Guido van Rossumdf62e441991-08-16 08:56:04 +000064static int import_from PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000065
66
67static frameobject *current_frame;
68
69
70/* Status code for main loop (reason for stack unwind) */
71
72enum why_code {
73 WHY_NOT, /* No error */
74 WHY_EXCEPTION, /* Exception occurred */
75 WHY_RERAISE, /* Exception re-raised by 'finally' */
76 WHY_RETURN, /* 'return' statement */
77 WHY_BREAK /* 'break' statement */
78};
79
80
81/* Interpreter main loop */
82
83object *
84eval_code(co, globals, locals, arg)
85 codeobject *co;
86 object *globals;
87 object *locals;
88 object *arg;
89{
90 register unsigned char *next_instr;
91 register int opcode; /* Current opcode */
92 register int oparg; /* Current opcode argument, if any */
93 register object **stack_pointer;
94 register enum why_code why; /* Reason for block stack unwind */
95 register int err; /* Error status -- nonzero if error */
96 register object *x; /* Result object -- NULL if error */
97 register object *v; /* Temporary objects popped off stack */
98 register object *w;
99 register object *u;
100 register object *t;
101 register frameobject *f; /* Current frame */
102 int lineno; /* Current line number */
103 object *retval; /* Return value iff why == WHY_RETURN */
104 char *name; /* Name used by some instructions */
105 FILE *fp; /* Used by print operations */
106#ifdef TRACE
107 int trace = dictlookup(globals, "__trace__") != NULL;
108#endif
109
110/* Code access macros */
111
112#define GETCONST(i) Getconst(f, i)
113#define GETNAME(i) Getname(f, i)
114#define GETNAMEV(i) Getnamev(f, i)
115#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
116#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
117#define NEXTOP() (*next_instr++)
118#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
119#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
120#define JUMPBY(x) (next_instr += (x))
121
122/* Stack manipulation macros */
123
124#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
125#define EMPTY() (STACK_LEVEL() == 0)
126#define TOP() (stack_pointer[-1])
127#define BASIC_PUSH(v) (*stack_pointer++ = (v))
128#define BASIC_POP() (*--stack_pointer)
129
130#ifdef TRACE
131#define PUSH(v) (BASIC_PUSH(v), trace && prtrace(TOP(), "push"))
132#define POP() (trace && prtrace(TOP(), "pop"), BASIC_POP())
133#else
134#define PUSH(v) BASIC_PUSH(v)
135#define POP() BASIC_POP()
136#endif
137
138 f = newframeobject(
139 current_frame, /*back*/
140 co, /*code*/
141 globals, /*globals*/
142 locals, /*locals*/
143 50, /*nvalues*/
144 20); /*nblocks*/
145 if (f == NULL)
146 return NULL;
147
148 current_frame = f;
149
150 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
151
152 stack_pointer = f->f_valuestack;
153
154 if (arg != NULL) {
155 INCREF(arg);
156 PUSH(arg);
157 }
158
159 why = WHY_NOT;
160 err = 0;
161 x = None; /* Not a reference, just anything non-NULL */
162 lineno = -1;
163
164 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000165 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000166
167 /* Do periodic things */
168
169 if (--ticker < 0) {
170 ticker = 100;
171 if (intrcheck()) {
172 err_set(KeyboardInterrupt);
173 why = WHY_EXCEPTION;
174 tb_here(f, INSTR_OFFSET(), lineno);
175 goto on_error;
176 }
177 }
178
179 /* Extract opcode and argument */
180
181 opcode = NEXTOP();
182 if (HAS_ARG(opcode))
183 oparg = NEXTARG();
184
185#ifdef TRACE
186 /* Instruction tracing */
187
188 if (trace) {
189 if (HAS_ARG(opcode)) {
190 printf("%d: %d, %d\n",
191 (int) (INSTR_OFFSET() - 3),
192 opcode, oparg);
193 }
194 else {
195 printf("%d: %d\n",
196 (int) (INSTR_OFFSET() - 1), opcode);
197 }
198 }
199#endif
200
201 /* Main switch on opcode */
202
203 switch (opcode) {
204
205 /* BEWARE!
206 It is essential that any operation that fails sets either
207 x to NULL, err to nonzero, or why to anything but WHY_NOT,
208 and that no operation that succeeds does this! */
209
210 /* case STOP_CODE: this is an error! */
211
212 case POP_TOP:
213 v = POP();
214 DECREF(v);
215 break;
216
217 case ROT_TWO:
218 v = POP();
219 w = POP();
220 PUSH(v);
221 PUSH(w);
222 break;
223
224 case ROT_THREE:
225 v = POP();
226 w = POP();
227 x = POP();
228 PUSH(v);
229 PUSH(x);
230 PUSH(w);
231 break;
232
233 case DUP_TOP:
234 v = TOP();
235 INCREF(v);
236 PUSH(v);
237 break;
238
239 case UNARY_POSITIVE:
240 v = POP();
241 x = pos(v);
242 DECREF(v);
243 PUSH(x);
244 break;
245
246 case UNARY_NEGATIVE:
247 v = POP();
248 x = neg(v);
249 DECREF(v);
250 PUSH(x);
251 break;
252
253 case UNARY_NOT:
254 v = POP();
255 x = not(v);
256 DECREF(v);
257 PUSH(x);
258 break;
259
260 case UNARY_CONVERT:
261 v = POP();
262 x = reprobject(v);
263 DECREF(v);
264 PUSH(x);
265 break;
266
267 case UNARY_CALL:
268 v = POP();
Guido van Rossume8122f11991-05-05 20:03:07 +0000269 if (is_instancemethodobject(v) || is_funcobject(v))
Guido van Rossum374a9221991-04-04 10:40:29 +0000270 x = call_function(v, (object *)NULL);
271 else
272 x = call_builtin(v, (object *)NULL);
273 DECREF(v);
274 PUSH(x);
275 break;
276
277 case BINARY_MULTIPLY:
278 w = POP();
279 v = POP();
280 x = mul(v, w);
281 DECREF(v);
282 DECREF(w);
283 PUSH(x);
284 break;
285
286 case BINARY_DIVIDE:
287 w = POP();
288 v = POP();
289 x = divide(v, w);
290 DECREF(v);
291 DECREF(w);
292 PUSH(x);
293 break;
294
295 case BINARY_MODULO:
296 w = POP();
297 v = POP();
298 x = rem(v, w);
299 DECREF(v);
300 DECREF(w);
301 PUSH(x);
302 break;
303
304 case BINARY_ADD:
305 w = POP();
306 v = POP();
307 x = add(v, w);
308 DECREF(v);
309 DECREF(w);
310 PUSH(x);
311 break;
312
313 case BINARY_SUBTRACT:
314 w = POP();
315 v = POP();
316 x = sub(v, w);
317 DECREF(v);
318 DECREF(w);
319 PUSH(x);
320 break;
321
322 case BINARY_SUBSCR:
323 w = POP();
324 v = POP();
325 x = apply_subscript(v, w);
326 DECREF(v);
327 DECREF(w);
328 PUSH(x);
329 break;
330
331 case BINARY_CALL:
332 w = POP();
333 v = POP();
Guido van Rossume8122f11991-05-05 20:03:07 +0000334 if (is_instancemethodobject(v) || is_funcobject(v))
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 x = call_function(v, w);
336 else
337 x = call_builtin(v, w);
338 DECREF(v);
339 DECREF(w);
340 PUSH(x);
341 break;
342
343 case SLICE+0:
344 case SLICE+1:
345 case SLICE+2:
346 case SLICE+3:
347 if ((opcode-SLICE) & 2)
348 w = POP();
349 else
350 w = NULL;
351 if ((opcode-SLICE) & 1)
352 v = POP();
353 else
354 v = NULL;
355 u = POP();
356 x = apply_slice(u, v, w);
357 DECREF(u);
358 XDECREF(v);
359 XDECREF(w);
360 PUSH(x);
361 break;
362
363 case STORE_SLICE+0:
364 case STORE_SLICE+1:
365 case STORE_SLICE+2:
366 case STORE_SLICE+3:
367 if ((opcode-STORE_SLICE) & 2)
368 w = POP();
369 else
370 w = NULL;
371 if ((opcode-STORE_SLICE) & 1)
372 v = POP();
373 else
374 v = NULL;
375 u = POP();
376 t = POP();
377 err = assign_slice(u, v, w, t); /* u[v:w] = t */
378 DECREF(t);
379 DECREF(u);
380 XDECREF(v);
381 XDECREF(w);
382 break;
383
384 case DELETE_SLICE+0:
385 case DELETE_SLICE+1:
386 case DELETE_SLICE+2:
387 case DELETE_SLICE+3:
388 if ((opcode-DELETE_SLICE) & 2)
389 w = POP();
390 else
391 w = NULL;
392 if ((opcode-DELETE_SLICE) & 1)
393 v = POP();
394 else
395 v = NULL;
396 u = POP();
397 err = assign_slice(u, v, w, (object *)NULL);
398 /* del u[v:w] */
399 DECREF(u);
400 XDECREF(v);
401 XDECREF(w);
402 break;
403
404 case STORE_SUBSCR:
405 w = POP();
406 v = POP();
407 u = POP();
408 /* v[w] = u */
409 err = assign_subscript(v, w, u);
410 DECREF(u);
411 DECREF(v);
412 DECREF(w);
413 break;
414
415 case DELETE_SUBSCR:
416 w = POP();
417 v = POP();
418 /* del v[w] */
419 err = assign_subscript(v, w, (object *)NULL);
420 DECREF(v);
421 DECREF(w);
422 break;
423
424 case PRINT_EXPR:
425 v = POP();
426 fp = sysgetfile("stdout", stdout);
427 /* Print value except if procedure result */
428 if (v != None) {
429 flushline();
430 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000431 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 flushline();
433 }
434 DECREF(v);
435 break;
436
437 case PRINT_ITEM:
438 v = POP();
439 fp = sysgetfile("stdout", stdout);
440 if (softspace(sysget("stdout"), 1))
441 fprintf(fp, " ");
442 if (is_stringobject(v)) {
443 char *s = getstringvalue(v);
444 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000445 fwrite(s, 1, len, fp);
446 if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000447 softspace(sysget("stdout"), 0);
448 }
449 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000450 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000451 }
452 DECREF(v);
453 break;
454
455 case PRINT_NEWLINE:
456 fp = sysgetfile("stdout", stdout);
457 fprintf(fp, "\n");
458 softspace(sysget("stdout"), 0);
459 break;
460
461 case BREAK_LOOP:
462 why = WHY_BREAK;
463 break;
464
465 case RAISE_EXCEPTION:
466 v = POP();
467 w = POP();
468 if (!is_stringobject(w))
469 err_setstr(TypeError,
470 "exceptions must be strings");
471 else
472 err_setval(w, v);
473 DECREF(v);
474 DECREF(w);
475 why = WHY_EXCEPTION;
476 break;
477
478 case LOAD_LOCALS:
479 v = f->f_locals;
480 INCREF(v);
481 PUSH(v);
482 break;
483
484 case RETURN_VALUE:
485 retval = POP();
486 why = WHY_RETURN;
487 break;
488
489 case REQUIRE_ARGS:
490 if (EMPTY()) {
491 err_setstr(TypeError,
492 "function expects argument(s)");
493 why = WHY_EXCEPTION;
494 }
495 break;
496
497 case REFUSE_ARGS:
498 if (!EMPTY()) {
499 err_setstr(TypeError,
500 "function expects no argument(s)");
501 why = WHY_EXCEPTION;
502 }
503 break;
504
505 case BUILD_FUNCTION:
506 v = POP();
507 x = newfuncobject(v, f->f_globals);
508 DECREF(v);
509 PUSH(x);
510 break;
511
512 case POP_BLOCK:
513 {
514 block *b = pop_block(f);
515 while (STACK_LEVEL() > b->b_level) {
516 v = POP();
517 DECREF(v);
518 }
519 }
520 break;
521
522 case END_FINALLY:
523 v = POP();
524 if (is_intobject(v)) {
525 why = (enum why_code) getintvalue(v);
526 if (why == WHY_RETURN)
527 retval = POP();
528 }
529 else if (is_stringobject(v)) {
530 w = POP();
531 err_setval(v, w);
532 DECREF(w);
533 w = POP();
534 tb_store(w);
535 DECREF(w);
536 why = WHY_RERAISE;
537 }
538 else if (v != None) {
539 err_setstr(SystemError,
540 "'finally' pops bad exception");
541 why = WHY_EXCEPTION;
542 }
543 DECREF(v);
544 break;
545
546 case BUILD_CLASS:
547 w = POP();
548 v = POP();
549 x = build_class(v, w);
550 PUSH(x);
551 DECREF(v);
552 DECREF(w);
553 break;
554
555 case STORE_NAME:
556 w = GETNAMEV(oparg);
557 v = POP();
558 err = dict2insert(f->f_locals, w, v);
559 DECREF(v);
560 break;
561
562 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000563 w = GETNAMEV(oparg);
564 if ((err = dict2remove(f->f_locals, w)) != 0)
565 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000566 break;
567
568 case UNPACK_TUPLE:
569 v = POP();
570 if (!is_tupleobject(v)) {
571 err_setstr(TypeError, "unpack non-tuple");
572 why = WHY_EXCEPTION;
573 }
574 else if (gettuplesize(v) != oparg) {
575 err_setstr(RuntimeError,
576 "unpack tuple of wrong size");
577 why = WHY_EXCEPTION;
578 }
579 else {
580 for (; --oparg >= 0; ) {
581 w = gettupleitem(v, oparg);
582 INCREF(w);
583 PUSH(w);
584 }
585 }
586 DECREF(v);
587 break;
588
589 case UNPACK_LIST:
590 v = POP();
591 if (!is_listobject(v)) {
592 err_setstr(TypeError, "unpack non-list");
593 why = WHY_EXCEPTION;
594 }
595 else if (getlistsize(v) != oparg) {
596 err_setstr(RuntimeError,
597 "unpack list of wrong size");
598 why = WHY_EXCEPTION;
599 }
600 else {
601 for (; --oparg >= 0; ) {
602 w = getlistitem(v, oparg);
603 INCREF(w);
604 PUSH(w);
605 }
606 }
607 DECREF(v);
608 break;
609
610 case STORE_ATTR:
611 name = GETNAME(oparg);
612 v = POP();
613 u = POP();
614 err = setattr(v, name, u); /* v.name = u */
615 DECREF(v);
616 DECREF(u);
617 break;
618
619 case DELETE_ATTR:
620 name = GETNAME(oparg);
621 v = POP();
622 err = setattr(v, name, (object *)NULL);
623 /* del v.name */
624 DECREF(v);
625 break;
626
627 case LOAD_CONST:
628 x = GETCONST(oparg);
629 INCREF(x);
630 PUSH(x);
631 break;
632
633 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000634 w = GETNAMEV(oparg);
635 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000637 err_clear();
638 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000639 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000640 err_clear();
641 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000642 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000643 err_setstr(NameError,
644 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 break;
646 }
647 }
648 }
649 INCREF(x);
650 PUSH(x);
651 break;
652
653 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000654 w = GETNAMEV(oparg);
655 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000657 err_clear();
658 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000659 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000660 err_setstr(NameError,
661 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 break;
663 }
664 }
665 INCREF(x);
666 PUSH(x);
667 break;
668
669 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000670 w = GETNAMEV(oparg);
671 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000672 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000673 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000674 break;
675 }
676 INCREF(x);
677 PUSH(x);
678 break;
679
680 case BUILD_TUPLE:
681 x = newtupleobject(oparg);
682 if (x != NULL) {
683 for (; --oparg >= 0;) {
684 w = POP();
685 err = settupleitem(x, oparg, w);
686 if (err != 0)
687 break;
688 }
689 PUSH(x);
690 }
691 break;
692
693 case BUILD_LIST:
694 x = newlistobject(oparg);
695 if (x != NULL) {
696 for (; --oparg >= 0;) {
697 w = POP();
698 err = setlistitem(x, oparg, w);
699 if (err != 0)
700 break;
701 }
702 PUSH(x);
703 }
704 break;
705
706 case BUILD_MAP:
707 x = newdictobject();
708 PUSH(x);
709 break;
710
711 case LOAD_ATTR:
712 name = GETNAME(oparg);
713 v = POP();
714 x = getattr(v, name);
715 DECREF(v);
716 PUSH(x);
717 break;
718
719 case COMPARE_OP:
720 w = POP();
721 v = POP();
722 x = cmp_outcome((enum cmp_op)oparg, v, w);
723 DECREF(v);
724 DECREF(w);
725 PUSH(x);
726 break;
727
728 case IMPORT_NAME:
729 name = GETNAME(oparg);
730 x = import_module(name);
731 XINCREF(x);
732 PUSH(x);
733 break;
734
735 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000736 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000738 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 break;
740
741 case JUMP_FORWARD:
742 JUMPBY(oparg);
743 break;
744
745 case JUMP_IF_FALSE:
746 if (!testbool(TOP()))
747 JUMPBY(oparg);
748 break;
749
750 case JUMP_IF_TRUE:
751 if (testbool(TOP()))
752 JUMPBY(oparg);
753 break;
754
755 case JUMP_ABSOLUTE:
756 JUMPTO(oparg);
757 break;
758
759 case FOR_LOOP:
760 /* for v in s: ...
761 On entry: stack contains s, i.
762 On exit: stack contains s, i+1, s[i];
763 but if loop exhausted:
764 s, i are popped, and we jump */
765 w = POP(); /* Loop index */
766 v = POP(); /* Sequence object */
767 u = loop_subscript(v, w);
768 if (u != NULL) {
769 PUSH(v);
770 x = newintobject(getintvalue(w)+1);
771 PUSH(x);
772 DECREF(w);
773 PUSH(u);
774 }
775 else {
776 DECREF(v);
777 DECREF(w);
778 /* A NULL can mean "s exhausted"
779 but also an error: */
780 if (err_occurred())
781 why = WHY_EXCEPTION;
782 else
783 JUMPBY(oparg);
784 }
785 break;
786
787 case SETUP_LOOP:
788 case SETUP_EXCEPT:
789 case SETUP_FINALLY:
790 setup_block(f, opcode, INSTR_OFFSET() + oparg,
791 STACK_LEVEL());
792 break;
793
794 case SET_LINENO:
795#ifdef TRACE
796 if (trace)
797 printf("--- Line %d ---\n", oparg);
798#endif
799 lineno = oparg;
800 break;
801
802 default:
803 fprintf(stderr,
804 "XXX lineno: %d, opcode: %d\n",
805 lineno, opcode);
806 err_setstr(SystemError, "eval_code: unknown opcode");
807 why = WHY_EXCEPTION;
808 break;
809
810 } /* switch */
811
812 on_error:
813
814 /* Quickly continue if no error occurred */
815
816 if (why == WHY_NOT) {
817 if (err == 0 && x != NULL)
818 continue; /* Normal, fast path */
819 why = WHY_EXCEPTION;
820 x = None;
821 err = 0;
822 }
823
824#ifndef NDEBUG
825 /* Double-check exception status */
826
827 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
828 if (!err_occurred()) {
829 fprintf(stderr, "XXX ghost error\n");
830 err_setstr(SystemError, "ghost error");
831 why = WHY_EXCEPTION;
832 }
833 }
834 else {
835 if (err_occurred()) {
836 fprintf(stderr, "XXX undetected error\n");
837 why = WHY_EXCEPTION;
838 }
839 }
840#endif
841
842 /* Log traceback info if this is a real exception */
843
844 if (why == WHY_EXCEPTION) {
845 int lasti = INSTR_OFFSET() - 1;
846 if (HAS_ARG(opcode))
847 lasti -= 2;
848 tb_here(f, lasti, lineno);
849 }
850
851 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
852
853 if (why == WHY_RERAISE)
854 why = WHY_EXCEPTION;
855
856 /* Unwind stacks if a (pseudo) exception occurred */
857
858 while (why != WHY_NOT && f->f_iblock > 0) {
859 block *b = pop_block(f);
860 while (STACK_LEVEL() > b->b_level) {
861 v = POP();
862 XDECREF(v);
863 }
864 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
865 why = WHY_NOT;
866 JUMPTO(b->b_handler);
867 break;
868 }
869 if (b->b_type == SETUP_FINALLY ||
870 b->b_type == SETUP_EXCEPT &&
871 why == WHY_EXCEPTION) {
872 if (why == WHY_EXCEPTION) {
873 object *exc, *val;
874 err_get(&exc, &val);
875 if (val == NULL) {
876 val = None;
877 INCREF(val);
878 }
879 v = tb_fetch();
880 /* Make the raw exception data
881 available to the handler,
882 so a program can emulate the
883 Python main loop. Don't do
884 this for 'finally'. */
885 if (b->b_type == SETUP_EXCEPT) {
886#if 0 /* Oops, this breaks too many things */
887 sysset("exc_traceback", v);
888#endif
889 sysset("exc_value", val);
890 sysset("exc_type", exc);
891 err_clear();
892 }
893 PUSH(v);
894 PUSH(val);
895 PUSH(exc);
896 }
897 else {
898 if (why == WHY_RETURN)
899 PUSH(retval);
900 v = newintobject((long)why);
901 PUSH(v);
902 }
903 why = WHY_NOT;
904 JUMPTO(b->b_handler);
905 break;
906 }
907 } /* unwind stack */
908
909 /* End the loop if we still have an error (or return) */
910
911 if (why != WHY_NOT)
912 break;
913
914 } /* main loop */
915
916 /* Pop remaining stack entries */
917
918 while (!EMPTY()) {
919 v = POP();
920 XDECREF(v);
921 }
922
923 /* Restore previous frame and release the current one */
924
925 current_frame = f->f_back;
926 DECREF(f);
927
928 if (why == WHY_RETURN)
929 return retval;
930 else
931 return NULL;
932}
933
Guido van Rossum3f5da241990-12-20 15:06:42 +0000934#ifdef TRACE
935static int
936prtrace(v, str)
937 object *v;
938 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000939{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000940 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +0000941 if (printobject(v, stdout, 0) != 0)
942 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000943 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000944}
Guido van Rossum3f5da241990-12-20 15:06:42 +0000945#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000946
Guido van Rossum3f5da241990-12-20 15:06:42 +0000947object *
948getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000949{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000950 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000951 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000952 else
953 return current_frame->f_locals;
954}
955
956object *
957getglobals()
958{
959 if (current_frame == NULL)
960 return NULL;
961 else
962 return current_frame->f_globals;
963}
964
965void
966printtraceback(fp)
967 FILE *fp;
968{
969 object *v = tb_fetch();
970 if (v != NULL) {
971 fprintf(fp, "Stack backtrace (innermost last):\n");
972 tb_print(v, fp);
973 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975}
976
977
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000978void
979flushline()
980{
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 if (softspace(sysget("stdout"), 0))
982 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983}
984
Guido van Rossum3f5da241990-12-20 15:06:42 +0000985
986/* Test a value used as condition, e.g., in a for or if statement */
987
988static int
989testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990 object *v;
991{
Guido van Rossum4965bc81991-05-14 11:51:49 +0000992 if (v == None)
993 return 0;
994 if (v->ob_type->tp_as_number != NULL)
995 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000996 if (v->ob_type->tp_as_sequence != NULL)
997 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
998 if (v->ob_type->tp_as_mapping != NULL)
999 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001000 /* All other objects are 'true' */
1001 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001002}
1003
1004static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001006 object *v, *w;
1007{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001008 if (v->ob_type->tp_as_number != NULL) {
1009 object *x;
1010 if (coerce(&v, &w) != 0)
1011 return NULL;
1012 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1013 DECREF(v);
1014 DECREF(w);
1015 return x;
1016 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001018 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001019 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001020 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 return NULL;
1022 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023}
1024
1025static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001026sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001027 object *v, *w;
1028{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001029 if (v->ob_type->tp_as_number != NULL) {
1030 object *x;
1031 if (coerce(&v, &w) != 0)
1032 return NULL;
1033 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1034 DECREF(v);
1035 DECREF(w);
1036 return x;
1037 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001039 return NULL;
1040}
1041
1042static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001043mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044 object *v, *w;
1045{
1046 typeobject *tp;
1047 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1048 /* int*sequence -- swap v and w */
1049 object *tmp = v;
1050 v = w;
1051 w = tmp;
1052 }
1053 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001054 if (tp->tp_as_number != NULL) {
1055 object *x;
1056 if (coerce(&v, &w) != 0)
1057 return NULL;
1058 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1059 DECREF(v);
1060 DECREF(w);
1061 return x;
1062 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001063 if (tp->tp_as_sequence != NULL) {
1064 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001065 err_setstr(TypeError,
1066 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 return NULL;
1068 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069 return (*tp->tp_as_sequence->sq_repeat)
1070 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001072 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001073 return NULL;
1074}
1075
1076static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001077divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001078 object *v, *w;
1079{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001080 if (v->ob_type->tp_as_number != NULL) {
1081 object *x;
1082 if (coerce(&v, &w) != 0)
1083 return NULL;
1084 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1085 DECREF(v);
1086 DECREF(w);
1087 return x;
1088 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001089 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090 return NULL;
1091}
1092
1093static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001094rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095 object *v, *w;
1096{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001097 if (v->ob_type->tp_as_number != NULL) {
1098 object *x;
1099 if (coerce(&v, &w) != 0)
1100 return NULL;
1101 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1102 DECREF(v);
1103 DECREF(w);
1104 return x;
1105 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001106 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107 return NULL;
1108}
1109
1110static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001111neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112 object *v;
1113{
1114 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001115 return (*v->ob_type->tp_as_number->nb_negative)(v);
1116 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117 return NULL;
1118}
1119
1120static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001121pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122 object *v;
1123{
1124 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001125 return (*v->ob_type->tp_as_number->nb_positive)(v);
1126 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127 return NULL;
1128}
1129
1130static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001131not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001132 object *v;
1133{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001134 int outcome = testbool(v);
1135 object *w = outcome == 0 ? True : False;
1136 INCREF(w);
1137 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001139/* External interface to call any callable object. The arg may be NULL. */
1140
1141object *
1142call_object(func, arg)
1143 object *func;
1144 object *arg;
1145{
1146 if (is_instancemethodobject(func) || is_funcobject(func))
1147 return call_function(func, arg);
1148 else
1149 return call_builtin(func, arg);
1150}
1151
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001153call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001155 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 if (is_methodobject(func)) {
1158 method meth = getmethod(func);
1159 object *self = getself(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001160 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 }
1162 if (is_classobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001163 if (arg != NULL) {
1164 err_setstr(TypeError,
1165 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001166 return NULL;
1167 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001170 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001171 return NULL;
1172}
1173
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001175call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001177 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001178{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001179 object *newarg = NULL;
1180 object *newlocals, *newglobals;
1181 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182
Guido van Rossume8122f11991-05-05 20:03:07 +00001183 if (is_instancemethodobject(func)) {
1184 object *self = instancemethodgetself(func);
1185 func = instancemethodgetfunc(func);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001186 if (arg == NULL) {
1187 arg = self;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188 }
1189 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001190 newarg = newtupleobject(2);
1191 if (newarg == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 return NULL;
1193 INCREF(self);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001194 INCREF(arg);
1195 settupleitem(newarg, 0, self);
1196 settupleitem(newarg, 1, arg);
1197 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 }
1199 }
1200 else {
1201 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001202 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001203 return NULL;
1204 }
1205 }
1206
Guido van Rossum3f5da241990-12-20 15:06:42 +00001207 co = getfunccode(func);
1208 if (co == NULL) {
1209 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 return NULL;
1211 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001212 if (!is_codeobject(co)) {
1213 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214 abort();
1215 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001216 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001218 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001219 return NULL;
1220 }
1221
Guido van Rossum3f5da241990-12-20 15:06:42 +00001222 newglobals = getfuncglobals(func);
1223 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224
Guido van Rossum3f5da241990-12-20 15:06:42 +00001225 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226
Guido van Rossum3f5da241990-12-20 15:06:42 +00001227 DECREF(newlocals);
1228 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229
Guido van Rossum3f5da241990-12-20 15:06:42 +00001230 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231
1232 return v;
1233}
1234
1235static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001236apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237 object *v, *w;
1238{
1239 typeobject *tp = v->ob_type;
1240 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001241 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001242 return NULL;
1243 }
1244 if (tp->tp_as_sequence != NULL) {
1245 int i;
1246 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001247 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 return NULL;
1249 }
1250 i = getintvalue(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001253 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254}
1255
1256static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001257loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001258 object *v, *w;
1259{
1260 sequence_methods *sq = v->ob_type->tp_as_sequence;
1261 int i, n;
1262 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001263 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001264 return NULL;
1265 }
1266 i = getintvalue(w);
1267 n = (*sq->sq_length)(v);
1268 if (i >= n)
1269 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271}
1272
1273static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001274slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275 object *v;
1276 int isize;
1277 int *pi;
1278{
1279 if (v != NULL) {
1280 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001281 err_setstr(TypeError, "slice index must be int");
1282 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001283 }
1284 *pi = getintvalue(v);
1285 if (*pi < 0)
1286 *pi += isize;
1287 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001288 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289}
1290
1291static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001292apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 object *u, *v, *w;
1294{
1295 typeobject *tp = u->ob_type;
1296 int ilow, ihigh, isize;
1297 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001298 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001299 return NULL;
1300 }
1301 ilow = 0;
1302 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001303 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001305 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001307 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001309
1310static int
1311assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312 object *w;
1313 object *key;
1314 object *v;
1315{
1316 typeobject *tp = w->ob_type;
1317 sequence_methods *sq;
1318 mapping_methods *mp;
1319 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320 if ((sq = tp->tp_as_sequence) != NULL &&
1321 (func = sq->sq_ass_item) != NULL) {
1322 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323 err_setstr(TypeError,
1324 "sequence subscript must be integer");
1325 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001326 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001327 else
1328 return (*func)(w, (int)getintvalue(key), v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329 }
1330 else if ((mp = tp->tp_as_mapping) != NULL &&
1331 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001332 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001333 }
1334 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335 err_setstr(TypeError,
1336 "can't assign to this subscripted object");
1337 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001338 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339}
1340
Guido van Rossum3f5da241990-12-20 15:06:42 +00001341static int
1342assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343 object *u, *v, *w, *x;
1344{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001345 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001347 if (sq == NULL) {
1348 err_setstr(TypeError, "assign to slice of non-sequence");
1349 return -1;
1350 }
1351 if (sq == NULL || sq->sq_ass_slice == NULL) {
1352 err_setstr(TypeError, "unassignable slice");
1353 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354 }
1355 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001356 isize = ihigh = (*sq->sq_length)(u);
1357 if (slice_index(v, isize, &ilow) != 0)
1358 return -1;
1359 if (slice_index(w, isize, &ihigh) != 0)
1360 return -1;
1361 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362}
1363
1364static int
1365cmp_exception(err, v)
1366 object *err, *v;
1367{
1368 if (is_tupleobject(v)) {
1369 int i, n;
1370 n = gettuplesize(v);
1371 for (i = 0; i < n; i++) {
1372 if (err == gettupleitem(v, i))
1373 return 1;
1374 }
1375 return 0;
1376 }
1377 return err == v;
1378}
1379
Guido van Rossum3f5da241990-12-20 15:06:42 +00001380static int
1381cmp_member(v, w)
1382 object *v, *w;
1383{
1384 int i, n, cmp;
1385 object *x;
1386 sequence_methods *sq;
1387 /* Special case for char in string */
1388 if (is_stringobject(w)) {
1389 register char *s, *end;
1390 register char c;
1391 if (!is_stringobject(v) || getstringsize(v) != 1) {
1392 err_setstr(TypeError,
1393 "string member test needs char left operand");
1394 return -1;
1395 }
1396 c = getstringvalue(v)[0];
1397 s = getstringvalue(w);
1398 end = s + getstringsize(w);
1399 while (s < end) {
1400 if (c == *s++)
1401 return 1;
1402 }
1403 return 0;
1404 }
1405 sq = w->ob_type->tp_as_sequence;
1406 if (sq == NULL) {
1407 err_setstr(TypeError,
1408 "'in' or 'not in' needs sequence right argument");
1409 return -1;
1410 }
1411 n = (*sq->sq_length)(w);
1412 for (i = 0; i < n; i++) {
1413 x = (*sq->sq_item)(w, i);
1414 cmp = cmpobject(v, x);
1415 XDECREF(x);
1416 if (cmp == 0)
1417 return 1;
1418 }
1419 return 0;
1420}
1421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001423cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 enum cmp_op op;
1425 register object *v;
1426 register object *w;
1427{
1428 register int cmp;
1429 register int res = 0;
1430 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001431 case IS:
1432 case IS_NOT:
1433 res = (v == w);
1434 if (op == IS_NOT)
1435 res = !res;
1436 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437 case IN:
1438 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439 res = cmp_member(v, w);
1440 if (res < 0)
1441 return NULL;
1442 if (op == NOT_IN)
1443 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 break;
1445 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001446 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 break;
1448 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001449 cmp = cmpobject(v, w);
1450 switch (op) {
1451 case LT: res = cmp < 0; break;
1452 case LE: res = cmp <= 0; break;
1453 case EQ: res = cmp == 0; break;
1454 case NE: res = cmp != 0; break;
1455 case GT: res = cmp > 0; break;
1456 case GE: res = cmp >= 0; break;
1457 /* XXX no default? (res is initialized to 0 though) */
1458 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 }
1460 v = res ? True : False;
1461 INCREF(v);
1462 return v;
1463}
1464
Guido van Rossum374a9221991-04-04 10:40:29 +00001465/* XXX This function should use dict2 variants (change interface!) */
1466
Guido van Rossum3f5da241990-12-20 15:06:42 +00001467static int
1468import_from(locals, v, name)
1469 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001470 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001471 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001472{
1473 object *w, *x;
1474 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001475 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001476 int i;
1477 int n = getdictsize(w);
1478 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001479 name = getdict2key(w, i);
1480 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001481 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001482 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001483 if (x == NULL) {
1484 /* XXX can't happen? */
Guido van Rossumdf62e441991-08-16 08:56:04 +00001485 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001486 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001487 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001488 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001489 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001490 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001491 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001492 }
1493 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001494 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001495 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001496 err_setstr(NameError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001497 return -1;
1498 }
1499 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001500 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001501 }
1502}
1503
1504static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001505build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001506 object *v; /* None or tuple containing base classes */
1507 object *w; /* dictionary */
1508{
1509 if (is_tupleobject(v)) {
1510 int i;
1511 for (i = gettuplesize(v); --i >= 0; ) {
1512 object *x = gettupleitem(v, i);
1513 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001514 err_setstr(TypeError,
1515 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001516 return NULL;
1517 }
1518 }
1519 }
1520 else {
1521 v = NULL;
1522 }
1523 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001524 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001525 return NULL;
1526 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001527 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001528}