blob: 1c3a6102d6af1ef0e9eee1cf1750882e0e918440 [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
Guido van Rossum96a42c81992-01-12 02:29:51 +000039/* For debugging the interpreter: */
40#define LLTRACE 1 /* Low-level trace feature */
41#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#endif
43
Guido van Rossum374a9221991-04-04 10:40:29 +000044/* Forward declarations */
45/* XXX Need prototypes */
46
47void flushline();
48static object *add();
49static object *sub();
50static object *mul();
51static object *divide();
52static object *rem();
53static object *neg();
54static object *pos();
55static object *not();
Guido van Rossum7928cd71991-10-24 14:59:31 +000056static object *invert();
57static object *lshift();
58static object *rshift();
59static object *and();
60static object *xor();
61static object *or();
Guido van Rossum374a9221991-04-04 10:40:29 +000062static object *call_builtin();
63static object *call_function();
Guido van Rossum9c7b8611991-12-16 13:04:47 +000064object *call_object();
Guido van Rossum374a9221991-04-04 10:40:29 +000065static object *apply_subscript();
66static object *loop_subscript();
67static object *apply_slice();
68static object *cmp_outcome();
69static object *build_class();
70static int testbool();
71static int assign_subscript PROTO((object *, object *, object *));
72static int assign_slice PROTO((object *, object *, object *, object *));
Guido van Rossumdf62e441991-08-16 08:56:04 +000073static int import_from PROTO((object *, object *, object *));
Guido van Rossum96a42c81992-01-12 02:29:51 +000074static object *call_trace PROTO((object *, frameobject *, char *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000075
76
77static frameobject *current_frame;
78
79
80/* Status code for main loop (reason for stack unwind) */
81
82enum why_code {
83 WHY_NOT, /* No error */
84 WHY_EXCEPTION, /* Exception occurred */
85 WHY_RERAISE, /* Exception re-raised by 'finally' */
86 WHY_RETURN, /* 'return' statement */
87 WHY_BREAK /* 'break' statement */
88};
89
90
91/* Interpreter main loop */
92
93object *
94eval_code(co, globals, locals, arg)
95 codeobject *co;
96 object *globals;
97 object *locals;
98 object *arg;
99{
100 register unsigned char *next_instr;
101 register int opcode; /* Current opcode */
102 register int oparg; /* Current opcode argument, if any */
103 register object **stack_pointer;
104 register enum why_code why; /* Reason for block stack unwind */
105 register int err; /* Error status -- nonzero if error */
106 register object *x; /* Result object -- NULL if error */
107 register object *v; /* Temporary objects popped off stack */
108 register object *w;
109 register object *u;
110 register object *t;
111 register frameobject *f; /* Current frame */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000112 object *trace; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000113 object *retval; /* Return value iff why == WHY_RETURN */
114 char *name; /* Name used by some instructions */
115 FILE *fp; /* Used by print operations */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000116#ifdef LLTRACE
117 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000118#endif
119
120/* Code access macros */
121
122#define GETCONST(i) Getconst(f, i)
123#define GETNAME(i) Getname(f, i)
124#define GETNAMEV(i) Getnamev(f, i)
125#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
126#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
127#define NEXTOP() (*next_instr++)
128#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
129#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
130#define JUMPBY(x) (next_instr += (x))
131
132/* Stack manipulation macros */
133
134#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
135#define EMPTY() (STACK_LEVEL() == 0)
136#define TOP() (stack_pointer[-1])
137#define BASIC_PUSH(v) (*stack_pointer++ = (v))
138#define BASIC_POP() (*--stack_pointer)
139
Guido van Rossum96a42c81992-01-12 02:29:51 +0000140#ifdef LLTRACE
141#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
142#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000143#else
144#define PUSH(v) BASIC_PUSH(v)
145#define POP() BASIC_POP()
146#endif
147
148 f = newframeobject(
149 current_frame, /*back*/
150 co, /*code*/
151 globals, /*globals*/
152 locals, /*locals*/
153 50, /*nvalues*/
154 20); /*nblocks*/
155 if (f == NULL)
156 return NULL;
157
158 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000159
160 trace = sysget("trace");
161 if (trace != NULL) {
Guido van Rossum8ec25b41992-01-19 16:26:13 +0000162 if (trace == None) {
163 trace = NULL;
164 }
165 else {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000166 /* sys.trace, if defined, is a function that will
167 be called on *every* entry to a code block.
168 Its return value, if not None, is a function that
169 will be called at the start of each executed line
170 of code. (Actually, the function must return
171 itself in order to continue tracing.)
172 The trace functions are called with three arguments:
173 a pointer to the current frame, a string indicating
174 why the function is called, and an argument which
175 depends on the situation. The global trace function
176 (sys.trace) is also called whenever an exception
177 is detected. */
178 trace = call_trace(trace, f, "call", arg);
179 if (trace == NULL) {
180 /* Trace function raised an error */
181 sysset("trace", (object *)NULL);
182 current_frame = f->f_back;
183 DECREF(f);
184 return NULL;
185 }
186 if (trace == None) {
187 /* No need to trace this code block */
188 DECREF(trace);
189 trace = NULL;
190 }
Guido van Rossum8ec25b41992-01-19 16:26:13 +0000191 }
Guido van Rossum96a42c81992-01-12 02:29:51 +0000192 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000193
194 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000195 stack_pointer = f->f_valuestack;
196
197 if (arg != NULL) {
198 INCREF(arg);
199 PUSH(arg);
200 }
201
202 why = WHY_NOT;
203 err = 0;
204 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000205
206 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000207 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000208
209 /* Do periodic things */
210
211 if (--ticker < 0) {
212 ticker = 100;
213 if (intrcheck()) {
214 err_set(KeyboardInterrupt);
215 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000216 goto on_error;
217 }
218 }
219
220 /* Extract opcode and argument */
221
222 opcode = NEXTOP();
223 if (HAS_ARG(opcode))
224 oparg = NEXTARG();
225
Guido van Rossum96a42c81992-01-12 02:29:51 +0000226#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000227 /* Instruction tracing */
228
Guido van Rossum96a42c81992-01-12 02:29:51 +0000229 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000230 if (HAS_ARG(opcode)) {
231 printf("%d: %d, %d\n",
232 (int) (INSTR_OFFSET() - 3),
233 opcode, oparg);
234 }
235 else {
236 printf("%d: %d\n",
237 (int) (INSTR_OFFSET() - 1), opcode);
238 }
239 }
240#endif
241
242 /* Main switch on opcode */
243
244 switch (opcode) {
245
246 /* BEWARE!
247 It is essential that any operation that fails sets either
248 x to NULL, err to nonzero, or why to anything but WHY_NOT,
249 and that no operation that succeeds does this! */
250
251 /* case STOP_CODE: this is an error! */
252
253 case POP_TOP:
254 v = POP();
255 DECREF(v);
256 break;
257
258 case ROT_TWO:
259 v = POP();
260 w = POP();
261 PUSH(v);
262 PUSH(w);
263 break;
264
265 case ROT_THREE:
266 v = POP();
267 w = POP();
268 x = POP();
269 PUSH(v);
270 PUSH(x);
271 PUSH(w);
272 break;
273
274 case DUP_TOP:
275 v = TOP();
276 INCREF(v);
277 PUSH(v);
278 break;
279
280 case UNARY_POSITIVE:
281 v = POP();
282 x = pos(v);
283 DECREF(v);
284 PUSH(x);
285 break;
286
287 case UNARY_NEGATIVE:
288 v = POP();
289 x = neg(v);
290 DECREF(v);
291 PUSH(x);
292 break;
293
294 case UNARY_NOT:
295 v = POP();
296 x = not(v);
297 DECREF(v);
298 PUSH(x);
299 break;
300
301 case UNARY_CONVERT:
302 v = POP();
303 x = reprobject(v);
304 DECREF(v);
305 PUSH(x);
306 break;
307
308 case UNARY_CALL:
309 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000310 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000311 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000312 DECREF(v);
313 PUSH(x);
314 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000315
316 case UNARY_INVERT:
317 v = POP();
318 x = invert(v);
319 DECREF(v);
320 PUSH(x);
321 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000322
323 case BINARY_MULTIPLY:
324 w = POP();
325 v = POP();
326 x = mul(v, w);
327 DECREF(v);
328 DECREF(w);
329 PUSH(x);
330 break;
331
332 case BINARY_DIVIDE:
333 w = POP();
334 v = POP();
335 x = divide(v, w);
336 DECREF(v);
337 DECREF(w);
338 PUSH(x);
339 break;
340
341 case BINARY_MODULO:
342 w = POP();
343 v = POP();
344 x = rem(v, w);
345 DECREF(v);
346 DECREF(w);
347 PUSH(x);
348 break;
349
350 case BINARY_ADD:
351 w = POP();
352 v = POP();
353 x = add(v, w);
354 DECREF(v);
355 DECREF(w);
356 PUSH(x);
357 break;
358
359 case BINARY_SUBTRACT:
360 w = POP();
361 v = POP();
362 x = sub(v, w);
363 DECREF(v);
364 DECREF(w);
365 PUSH(x);
366 break;
367
368 case BINARY_SUBSCR:
369 w = POP();
370 v = POP();
371 x = apply_subscript(v, w);
372 DECREF(v);
373 DECREF(w);
374 PUSH(x);
375 break;
376
377 case BINARY_CALL:
378 w = POP();
379 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000380 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000381 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000382 DECREF(v);
383 DECREF(w);
384 PUSH(x);
385 break;
386
Guido van Rossum7928cd71991-10-24 14:59:31 +0000387 case BINARY_LSHIFT:
388 w = POP();
389 v = POP();
390 x = lshift(v, w);
391 DECREF(v);
392 DECREF(w);
393 PUSH(x);
394 break;
395
396 case BINARY_RSHIFT:
397 w = POP();
398 v = POP();
399 x = rshift(v, w);
400 DECREF(v);
401 DECREF(w);
402 PUSH(x);
403 break;
404
405 case BINARY_AND:
406 w = POP();
407 v = POP();
408 x = and(v, w);
409 DECREF(v);
410 DECREF(w);
411 PUSH(x);
412 break;
413
414 case BINARY_XOR:
415 w = POP();
416 v = POP();
417 x = xor(v, w);
418 DECREF(v);
419 DECREF(w);
420 PUSH(x);
421 break;
422
423 case BINARY_OR:
424 w = POP();
425 v = POP();
426 x = or(v, w);
427 DECREF(v);
428 DECREF(w);
429 PUSH(x);
430 break;
431
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 case SLICE+0:
433 case SLICE+1:
434 case SLICE+2:
435 case SLICE+3:
436 if ((opcode-SLICE) & 2)
437 w = POP();
438 else
439 w = NULL;
440 if ((opcode-SLICE) & 1)
441 v = POP();
442 else
443 v = NULL;
444 u = POP();
445 x = apply_slice(u, v, w);
446 DECREF(u);
447 XDECREF(v);
448 XDECREF(w);
449 PUSH(x);
450 break;
451
452 case STORE_SLICE+0:
453 case STORE_SLICE+1:
454 case STORE_SLICE+2:
455 case STORE_SLICE+3:
456 if ((opcode-STORE_SLICE) & 2)
457 w = POP();
458 else
459 w = NULL;
460 if ((opcode-STORE_SLICE) & 1)
461 v = POP();
462 else
463 v = NULL;
464 u = POP();
465 t = POP();
466 err = assign_slice(u, v, w, t); /* u[v:w] = t */
467 DECREF(t);
468 DECREF(u);
469 XDECREF(v);
470 XDECREF(w);
471 break;
472
473 case DELETE_SLICE+0:
474 case DELETE_SLICE+1:
475 case DELETE_SLICE+2:
476 case DELETE_SLICE+3:
477 if ((opcode-DELETE_SLICE) & 2)
478 w = POP();
479 else
480 w = NULL;
481 if ((opcode-DELETE_SLICE) & 1)
482 v = POP();
483 else
484 v = NULL;
485 u = POP();
486 err = assign_slice(u, v, w, (object *)NULL);
487 /* del u[v:w] */
488 DECREF(u);
489 XDECREF(v);
490 XDECREF(w);
491 break;
492
493 case STORE_SUBSCR:
494 w = POP();
495 v = POP();
496 u = POP();
497 /* v[w] = u */
498 err = assign_subscript(v, w, u);
499 DECREF(u);
500 DECREF(v);
501 DECREF(w);
502 break;
503
504 case DELETE_SUBSCR:
505 w = POP();
506 v = POP();
507 /* del v[w] */
508 err = assign_subscript(v, w, (object *)NULL);
509 DECREF(v);
510 DECREF(w);
511 break;
512
513 case PRINT_EXPR:
514 v = POP();
515 fp = sysgetfile("stdout", stdout);
516 /* Print value except if procedure result */
517 if (v != None) {
518 flushline();
519 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000520 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000521 flushline();
522 }
523 DECREF(v);
524 break;
525
526 case PRINT_ITEM:
527 v = POP();
528 fp = sysgetfile("stdout", stdout);
529 if (softspace(sysget("stdout"), 1))
530 fprintf(fp, " ");
531 if (is_stringobject(v)) {
532 char *s = getstringvalue(v);
533 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000534 fwrite(s, 1, len, fp);
535 if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000536 softspace(sysget("stdout"), 0);
537 }
538 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000539 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000540 }
541 DECREF(v);
542 break;
543
544 case PRINT_NEWLINE:
545 fp = sysgetfile("stdout", stdout);
546 fprintf(fp, "\n");
547 softspace(sysget("stdout"), 0);
548 break;
549
550 case BREAK_LOOP:
551 why = WHY_BREAK;
552 break;
553
554 case RAISE_EXCEPTION:
555 v = POP();
556 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000557 /* A tuple is equivalent to its first element here */
558 while (is_tupleobject(w)) {
559 u = w;
560 w = gettupleitem(u, 0);
561 DECREF(u);
562 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000563 if (!is_stringobject(w))
564 err_setstr(TypeError,
565 "exceptions must be strings");
566 else
567 err_setval(w, v);
568 DECREF(v);
569 DECREF(w);
570 why = WHY_EXCEPTION;
571 break;
572
573 case LOAD_LOCALS:
574 v = f->f_locals;
575 INCREF(v);
576 PUSH(v);
577 break;
578
579 case RETURN_VALUE:
580 retval = POP();
581 why = WHY_RETURN;
582 break;
583
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 case BUILD_FUNCTION:
585 v = POP();
586 x = newfuncobject(v, f->f_globals);
587 DECREF(v);
588 PUSH(x);
589 break;
590
591 case POP_BLOCK:
592 {
593 block *b = pop_block(f);
594 while (STACK_LEVEL() > b->b_level) {
595 v = POP();
596 DECREF(v);
597 }
598 }
599 break;
600
601 case END_FINALLY:
602 v = POP();
603 if (is_intobject(v)) {
604 why = (enum why_code) getintvalue(v);
605 if (why == WHY_RETURN)
606 retval = POP();
607 }
608 else if (is_stringobject(v)) {
609 w = POP();
610 err_setval(v, w);
611 DECREF(w);
612 w = POP();
613 tb_store(w);
614 DECREF(w);
615 why = WHY_RERAISE;
616 }
617 else if (v != None) {
618 err_setstr(SystemError,
619 "'finally' pops bad exception");
620 why = WHY_EXCEPTION;
621 }
622 DECREF(v);
623 break;
624
625 case BUILD_CLASS:
626 w = POP();
627 v = POP();
628 x = build_class(v, w);
629 PUSH(x);
630 DECREF(v);
631 DECREF(w);
632 break;
633
634 case STORE_NAME:
635 w = GETNAMEV(oparg);
636 v = POP();
637 err = dict2insert(f->f_locals, w, v);
638 DECREF(v);
639 break;
640
641 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000642 w = GETNAMEV(oparg);
643 if ((err = dict2remove(f->f_locals, w)) != 0)
644 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 break;
646
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000647 case UNPACK_VARARG:
648 if (EMPTY()) {
649 err_setstr(TypeError,
650 "no argument list");
651 why = WHY_EXCEPTION;
652 break;
653 }
654 v = POP();
655 if (!is_tupleobject(v)) {
656 err_setstr(TypeError,
657 "bad argument list");
658 why = WHY_EXCEPTION;
659 }
660 else if (gettuplesize(v) < oparg) {
661 err_setstr(TypeError,
662 "not enough arguments");
663 why = WHY_EXCEPTION;
664 }
665 else if (oparg == 0) {
666 PUSH(v);
667 break;
668 }
669 else {
670 x = gettupleslice(v, oparg, gettuplesize(v));
671 if (x != NULL) {
672 PUSH(x);
673 for (; --oparg >= 0; ) {
674 w = gettupleitem(v, oparg);
675 INCREF(w);
676 PUSH(w);
677 }
678 }
679 }
680 DECREF(v);
681 break;
682
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000683 case UNPACK_ARG:
684 /* Implement various compatibility hacks:
685 (a) f(a,b,...) should accept f((1,2,...))
686 (b) f((a,b,...)) should accept f(1,2,...)
687 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
688 */
689 {
690 int n;
691 if (EMPTY()) {
692 err_setstr(TypeError,
693 "no argument list");
694 why = WHY_EXCEPTION;
695 break;
696 }
697 v = POP();
698 if (!is_tupleobject(v)) {
699 err_setstr(TypeError,
700 "bad argument list");
701 why = WHY_EXCEPTION;
702 break;
703 }
704 n = gettuplesize(v);
705 if (n == 1 && oparg != 1) {
706 /* Rule (a) */
707 w = gettupleitem(v, 0);
708 if (is_tupleobject(w)) {
709 INCREF(w);
710 DECREF(v);
711 v = w;
712 n = gettuplesize(v);
713 }
714 }
715 else if (n != 1 && oparg == 1) {
716 /* Rule (b) */
717 PUSH(v);
718 break;
719 /* Don't fall through */
720 }
721 else if (n > 2 && oparg == 2) {
722 /* Rule (c) */
723 int i;
724 w = newtupleobject(n-1);
725 u = newtupleobject(2);
726 if (u == NULL || w == NULL) {
727 XDECREF(w);
728 XDECREF(u);
729 DECREF(v);
730 why = WHY_EXCEPTION;
731 break;
732 }
733 t = gettupleitem(v, 0);
734 INCREF(t);
735 settupleitem(u, 0, t);
736 for (i = 1; i < n; i++) {
737 t = gettupleitem(v, i);
738 INCREF(t);
739 settupleitem(w, i-1, t);
740 }
741 settupleitem(u, 1, w);
742 DECREF(v);
743 v = u;
744 n = 2;
745 }
746 if (n != oparg) {
747 err_setstr(TypeError,
748 "arg count mismatch");
749 why = WHY_EXCEPTION;
750 DECREF(v);
751 break;
752 }
753 PUSH(v);
754 }
755 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 case UNPACK_TUPLE:
757 v = POP();
758 if (!is_tupleobject(v)) {
759 err_setstr(TypeError, "unpack non-tuple");
760 why = WHY_EXCEPTION;
761 }
762 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000763 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 "unpack tuple of wrong size");
765 why = WHY_EXCEPTION;
766 }
767 else {
768 for (; --oparg >= 0; ) {
769 w = gettupleitem(v, oparg);
770 INCREF(w);
771 PUSH(w);
772 }
773 }
774 DECREF(v);
775 break;
776
777 case UNPACK_LIST:
778 v = POP();
779 if (!is_listobject(v)) {
780 err_setstr(TypeError, "unpack non-list");
781 why = WHY_EXCEPTION;
782 }
783 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000784 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 "unpack list of wrong size");
786 why = WHY_EXCEPTION;
787 }
788 else {
789 for (; --oparg >= 0; ) {
790 w = getlistitem(v, oparg);
791 INCREF(w);
792 PUSH(w);
793 }
794 }
795 DECREF(v);
796 break;
797
798 case STORE_ATTR:
799 name = GETNAME(oparg);
800 v = POP();
801 u = POP();
802 err = setattr(v, name, u); /* v.name = u */
803 DECREF(v);
804 DECREF(u);
805 break;
806
807 case DELETE_ATTR:
808 name = GETNAME(oparg);
809 v = POP();
810 err = setattr(v, name, (object *)NULL);
811 /* del v.name */
812 DECREF(v);
813 break;
814
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000815 case STORE_GLOBAL:
816 w = GETNAMEV(oparg);
817 v = POP();
818 err = dict2insert(f->f_globals, w, v);
819 DECREF(v);
820 break;
821
822 case DELETE_GLOBAL:
823 w = GETNAMEV(oparg);
824 if ((err = dict2remove(f->f_globals, w)) != 0)
825 err_setstr(NameError, getstringvalue(w));
826 break;
827
Guido van Rossum374a9221991-04-04 10:40:29 +0000828 case LOAD_CONST:
829 x = GETCONST(oparg);
830 INCREF(x);
831 PUSH(x);
832 break;
833
834 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000835 w = GETNAMEV(oparg);
836 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000838 err_clear();
839 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000841 err_clear();
842 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000844 err_setstr(NameError,
845 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 break;
847 }
848 }
849 }
850 INCREF(x);
851 PUSH(x);
852 break;
853
854 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000855 w = GETNAMEV(oparg);
856 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000858 err_clear();
859 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000861 err_setstr(NameError,
862 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 break;
864 }
865 }
866 INCREF(x);
867 PUSH(x);
868 break;
869
870 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000871 w = GETNAMEV(oparg);
872 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000874 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 break;
876 }
877 INCREF(x);
878 PUSH(x);
879 break;
880
881 case BUILD_TUPLE:
882 x = newtupleobject(oparg);
883 if (x != NULL) {
884 for (; --oparg >= 0;) {
885 w = POP();
886 err = settupleitem(x, oparg, w);
887 if (err != 0)
888 break;
889 }
890 PUSH(x);
891 }
892 break;
893
894 case BUILD_LIST:
895 x = newlistobject(oparg);
896 if (x != NULL) {
897 for (; --oparg >= 0;) {
898 w = POP();
899 err = setlistitem(x, oparg, w);
900 if (err != 0)
901 break;
902 }
903 PUSH(x);
904 }
905 break;
906
907 case BUILD_MAP:
908 x = newdictobject();
909 PUSH(x);
910 break;
911
912 case LOAD_ATTR:
913 name = GETNAME(oparg);
914 v = POP();
915 x = getattr(v, name);
916 DECREF(v);
917 PUSH(x);
918 break;
919
920 case COMPARE_OP:
921 w = POP();
922 v = POP();
923 x = cmp_outcome((enum cmp_op)oparg, v, w);
924 DECREF(v);
925 DECREF(w);
926 PUSH(x);
927 break;
928
929 case IMPORT_NAME:
930 name = GETNAME(oparg);
931 x = import_module(name);
932 XINCREF(x);
933 PUSH(x);
934 break;
935
936 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000937 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000939 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 break;
941
942 case JUMP_FORWARD:
943 JUMPBY(oparg);
944 break;
945
946 case JUMP_IF_FALSE:
947 if (!testbool(TOP()))
948 JUMPBY(oparg);
949 break;
950
951 case JUMP_IF_TRUE:
952 if (testbool(TOP()))
953 JUMPBY(oparg);
954 break;
955
956 case JUMP_ABSOLUTE:
957 JUMPTO(oparg);
958 break;
959
960 case FOR_LOOP:
961 /* for v in s: ...
962 On entry: stack contains s, i.
963 On exit: stack contains s, i+1, s[i];
964 but if loop exhausted:
965 s, i are popped, and we jump */
966 w = POP(); /* Loop index */
967 v = POP(); /* Sequence object */
968 u = loop_subscript(v, w);
969 if (u != NULL) {
970 PUSH(v);
971 x = newintobject(getintvalue(w)+1);
972 PUSH(x);
973 DECREF(w);
974 PUSH(u);
975 }
976 else {
977 DECREF(v);
978 DECREF(w);
979 /* A NULL can mean "s exhausted"
980 but also an error: */
981 if (err_occurred())
982 why = WHY_EXCEPTION;
983 else
984 JUMPBY(oparg);
985 }
986 break;
987
988 case SETUP_LOOP:
989 case SETUP_EXCEPT:
990 case SETUP_FINALLY:
991 setup_block(f, opcode, INSTR_OFFSET() + oparg,
992 STACK_LEVEL());
993 break;
994
995 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +0000996#ifdef LLTRACE
997 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 printf("--- Line %d ---\n", oparg);
999#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001000 f->f_lineno = oparg;
1001 if (trace != NULL) {
1002 /* Trace each line of code reached */
1003 f->f_lasti = INSTR_OFFSET();
1004 x = call_trace(trace, f, "line", None);
1005 /* The trace function must return itself
1006 in order to continue tracing */
1007 DECREF(trace);
1008 if (x == None) {
1009 DECREF(x);
1010 trace = NULL;
1011 }
1012 else
1013 trace = x;
1014 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 break;
1016
1017 default:
1018 fprintf(stderr,
1019 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001020 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 err_setstr(SystemError, "eval_code: unknown opcode");
1022 why = WHY_EXCEPTION;
1023 break;
1024
1025 } /* switch */
1026
1027 on_error:
1028
1029 /* Quickly continue if no error occurred */
1030
1031 if (why == WHY_NOT) {
1032 if (err == 0 && x != NULL)
1033 continue; /* Normal, fast path */
1034 why = WHY_EXCEPTION;
1035 x = None;
1036 err = 0;
1037 }
1038
Guido van Rossum96a42c81992-01-12 02:29:51 +00001039#ifndef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 /* Double-check exception status */
1041
1042 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1043 if (!err_occurred()) {
1044 fprintf(stderr, "XXX ghost error\n");
1045 err_setstr(SystemError, "ghost error");
1046 why = WHY_EXCEPTION;
1047 }
1048 }
1049 else {
1050 if (err_occurred()) {
1051 fprintf(stderr, "XXX undetected error\n");
1052 why = WHY_EXCEPTION;
1053 }
1054 }
1055#endif
1056
1057 /* Log traceback info if this is a real exception */
1058
1059 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001060 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001062 f->f_lasti -= 2;
1063 tb_here(f);
1064
Guido van Rossum8ec25b41992-01-19 16:26:13 +00001065 if (trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001066 object *type, *value, *traceback, *arg;
1067 err_get(&type, &value);
1068 traceback = tb_fetch();
1069 arg = newtupleobject(3);
1070 if (arg == NULL)
1071 err_clear();
1072 else {
1073 settupleitem(arg, 0, type);
1074 settupleitem(arg, 1, value);
1075 settupleitem(arg, 2, traceback);
1076 }
Guido van Rossum8ec25b41992-01-19 16:26:13 +00001077 v = call_trace(trace, f, "exception", arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001078 if (v == NULL) {
1079 /* Trace function raised error */
1080 tb_here(f);
1081 sysset("trace", (object *)NULL);
1082 XDECREF(trace);
1083 trace = NULL;
1084 }
1085 else {
1086 /* Restore original exception */
1087 err_setval(type, value);
1088 tb_store(traceback);
1089 if (v == None)
1090 DECREF(v);
1091 else {
1092 /* Set trace function */
1093 XDECREF(trace);
1094 trace = v;
1095 }
1096 }
1097 XDECREF(arg);
1098 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 }
1100
1101 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1102
1103 if (why == WHY_RERAISE)
1104 why = WHY_EXCEPTION;
1105
1106 /* Unwind stacks if a (pseudo) exception occurred */
1107
1108 while (why != WHY_NOT && f->f_iblock > 0) {
1109 block *b = pop_block(f);
1110 while (STACK_LEVEL() > b->b_level) {
1111 v = POP();
1112 XDECREF(v);
1113 }
1114 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1115 why = WHY_NOT;
1116 JUMPTO(b->b_handler);
1117 break;
1118 }
1119 if (b->b_type == SETUP_FINALLY ||
1120 b->b_type == SETUP_EXCEPT &&
1121 why == WHY_EXCEPTION) {
1122 if (why == WHY_EXCEPTION) {
1123 object *exc, *val;
1124 err_get(&exc, &val);
1125 if (val == NULL) {
1126 val = None;
1127 INCREF(val);
1128 }
1129 v = tb_fetch();
1130 /* Make the raw exception data
1131 available to the handler,
1132 so a program can emulate the
1133 Python main loop. Don't do
1134 this for 'finally'. */
1135 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 sysset("exc_value", val);
1138 sysset("exc_type", exc);
1139 err_clear();
1140 }
1141 PUSH(v);
1142 PUSH(val);
1143 PUSH(exc);
1144 }
1145 else {
1146 if (why == WHY_RETURN)
1147 PUSH(retval);
1148 v = newintobject((long)why);
1149 PUSH(v);
1150 }
1151 why = WHY_NOT;
1152 JUMPTO(b->b_handler);
1153 break;
1154 }
1155 } /* unwind stack */
1156
1157 /* End the loop if we still have an error (or return) */
1158
1159 if (why != WHY_NOT)
1160 break;
1161
1162 } /* main loop */
1163
1164 /* Pop remaining stack entries */
1165
1166 while (!EMPTY()) {
1167 v = POP();
1168 XDECREF(v);
1169 }
1170
Guido van Rossum96a42c81992-01-12 02:29:51 +00001171 if (why != WHY_RETURN)
1172 retval = NULL;
1173
1174 if (trace) {
1175 if (why == WHY_RETURN) {
1176 x = call_trace(trace, f, "return", retval);
1177 if (x == NULL) {
1178 XDECREF(retval);
1179 retval = NULL;
1180 }
1181 else
1182 DECREF(x);
1183 }
1184 DECREF(trace);
1185 }
1186
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 /* Restore previous frame and release the current one */
1188
1189 current_frame = f->f_back;
1190 DECREF(f);
1191
Guido van Rossum96a42c81992-01-12 02:29:51 +00001192 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001193}
1194
Guido van Rossum96a42c81992-01-12 02:29:51 +00001195#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001196static int
1197prtrace(v, str)
1198 object *v;
1199 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001200{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001201 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001202 if (printobject(v, stdout, 0) != 0)
1203 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001204 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001205}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001206#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207
Guido van Rossum96a42c81992-01-12 02:29:51 +00001208static object *
1209call_trace(trace, f, msg, arg)
1210 object *trace;
1211 frameobject *f;
1212 char *msg;
1213 object *arg;
1214{
1215 object *arglist, *what, *res;
1216 static int tracing = 0;
1217
1218 if (tracing) {
1219 /* Don't trace the trace code! */
1220 INCREF(None);
1221 return None;
1222 }
1223
1224 arglist = newtupleobject(3);
1225 if (arglist == NULL)
1226 return NULL;
1227 what = newstringobject(msg);
1228 if (what == NULL) {
1229 DECREF(arglist);
1230 return NULL;
1231 }
1232 INCREF(f);
1233 if (arg == NULL)
1234 arg = None;
1235 INCREF(arg);
1236 settupleitem(arglist, 0, (object *)f);
1237 settupleitem(arglist, 1, what);
1238 settupleitem(arglist, 2, arg);
1239 tracing++;
1240 res = call_object(trace, arglist);
1241 tracing--;
1242 if (res == NULL)
1243 tb_here(f);
1244 DECREF(arglist);
1245 return res;
1246}
1247
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248object *
1249getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001253 else
1254 return current_frame->f_locals;
1255}
1256
1257object *
1258getglobals()
1259{
1260 if (current_frame == NULL)
1261 return NULL;
1262 else
1263 return current_frame->f_globals;
1264}
1265
1266void
1267printtraceback(fp)
1268 FILE *fp;
1269{
1270 object *v = tb_fetch();
1271 if (v != NULL) {
1272 fprintf(fp, "Stack backtrace (innermost last):\n");
1273 tb_print(v, fp);
1274 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001276}
1277
1278
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279void
1280flushline()
1281{
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 if (softspace(sysget("stdout"), 0))
1283 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284}
1285
Guido van Rossum3f5da241990-12-20 15:06:42 +00001286
1287/* Test a value used as condition, e.g., in a for or if statement */
1288
1289static int
1290testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001291 object *v;
1292{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001293 if (v == None)
1294 return 0;
1295 if (v->ob_type->tp_as_number != NULL)
1296 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001297 if (v->ob_type->tp_as_sequence != NULL)
1298 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1299 if (v->ob_type->tp_as_mapping != NULL)
1300 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301 /* All other objects are 'true' */
1302 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001303}
1304
1305static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001306or(v, w)
1307 object *v, *w;
1308{
1309 if (v->ob_type->tp_as_number != NULL) {
1310 object *x;
1311 object * (*f) FPROTO((object *, object *));
1312 if (coerce(&v, &w) != 0)
1313 return NULL;
1314 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1315 x = (*f)(v, w);
1316 DECREF(v);
1317 DECREF(w);
1318 if (f != NULL)
1319 return x;
1320 }
1321 err_setstr(TypeError, "bad operand type(s) for |");
1322 return NULL;
1323}
1324
1325static object *
1326xor(v, w)
1327 object *v, *w;
1328{
1329 if (v->ob_type->tp_as_number != NULL) {
1330 object *x;
1331 object * (*f) FPROTO((object *, object *));
1332 if (coerce(&v, &w) != 0)
1333 return NULL;
1334 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1335 x = (*f)(v, w);
1336 DECREF(v);
1337 DECREF(w);
1338 if (f != NULL)
1339 return x;
1340 }
1341 err_setstr(TypeError, "bad operand type(s) for ^");
1342 return NULL;
1343}
1344
1345static object *
1346and(v, w)
1347 object *v, *w;
1348{
1349 if (v->ob_type->tp_as_number != NULL) {
1350 object *x;
1351 object * (*f) FPROTO((object *, object *));
1352 if (coerce(&v, &w) != 0)
1353 return NULL;
1354 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1355 x = (*f)(v, w);
1356 DECREF(v);
1357 DECREF(w);
1358 if (f != NULL)
1359 return x;
1360 }
1361 err_setstr(TypeError, "bad operand type(s) for &");
1362 return NULL;
1363}
1364
1365static object *
1366lshift(v, w)
1367 object *v, *w;
1368{
1369 if (v->ob_type->tp_as_number != NULL) {
1370 object *x;
1371 object * (*f) FPROTO((object *, object *));
1372 if (coerce(&v, &w) != 0)
1373 return NULL;
1374 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1375 x = (*f)(v, w);
1376 DECREF(v);
1377 DECREF(w);
1378 if (f != NULL)
1379 return x;
1380 }
1381 err_setstr(TypeError, "bad operand type(s) for <<");
1382 return NULL;
1383}
1384
1385static object *
1386rshift(v, w)
1387 object *v, *w;
1388{
1389 if (v->ob_type->tp_as_number != NULL) {
1390 object *x;
1391 object * (*f) FPROTO((object *, object *));
1392 if (coerce(&v, &w) != 0)
1393 return NULL;
1394 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1395 x = (*f)(v, w);
1396 DECREF(v);
1397 DECREF(w);
1398 if (f != NULL)
1399 return x;
1400 }
1401 err_setstr(TypeError, "bad operand type(s) for >>");
1402 return NULL;
1403}
1404
1405static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001406add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407 object *v, *w;
1408{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001409 if (v->ob_type->tp_as_number != NULL) {
1410 object *x;
1411 if (coerce(&v, &w) != 0)
1412 return NULL;
1413 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1414 DECREF(v);
1415 DECREF(w);
1416 return x;
1417 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001419 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 return NULL;
1423 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424}
1425
1426static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428 object *v, *w;
1429{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001430 if (v->ob_type->tp_as_number != NULL) {
1431 object *x;
1432 if (coerce(&v, &w) != 0)
1433 return NULL;
1434 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1435 DECREF(v);
1436 DECREF(w);
1437 return x;
1438 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 return NULL;
1441}
1442
1443static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 object *v, *w;
1446{
1447 typeobject *tp;
1448 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1449 /* int*sequence -- swap v and w */
1450 object *tmp = v;
1451 v = w;
1452 w = tmp;
1453 }
1454 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001455 if (tp->tp_as_number != NULL) {
1456 object *x;
1457 if (coerce(&v, &w) != 0)
1458 return NULL;
1459 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1460 DECREF(v);
1461 DECREF(w);
1462 return x;
1463 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001464 if (tp->tp_as_sequence != NULL) {
1465 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001466 err_setstr(TypeError,
1467 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 return NULL;
1469 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 return (*tp->tp_as_sequence->sq_repeat)
1471 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 return NULL;
1475}
1476
1477static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001478divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001479 object *v, *w;
1480{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001481 if (v->ob_type->tp_as_number != NULL) {
1482 object *x;
1483 if (coerce(&v, &w) != 0)
1484 return NULL;
1485 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1486 DECREF(v);
1487 DECREF(w);
1488 return x;
1489 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001490 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001491 return NULL;
1492}
1493
1494static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001495rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001496 object *v, *w;
1497{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001498 if (v->ob_type->tp_as_number != NULL) {
1499 object *x;
1500 if (coerce(&v, &w) != 0)
1501 return NULL;
1502 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1503 DECREF(v);
1504 DECREF(w);
1505 return x;
1506 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001507 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 return NULL;
1509}
1510
1511static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001512neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513 object *v;
1514{
1515 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001516 return (*v->ob_type->tp_as_number->nb_negative)(v);
1517 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 return NULL;
1519}
1520
1521static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001522pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 object *v;
1524{
1525 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526 return (*v->ob_type->tp_as_number->nb_positive)(v);
1527 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528 return NULL;
1529}
1530
1531static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001532invert(v)
1533 object *v;
1534{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001535 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001536 if (v->ob_type->tp_as_number != NULL &&
1537 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1538 return (*f)(v);
1539 err_setstr(TypeError, "bad operand type(s) for unary ~");
1540 return NULL;
1541}
1542
1543static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545 object *v;
1546{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001547 int outcome = testbool(v);
1548 object *w = outcome == 0 ? True : False;
1549 INCREF(w);
1550 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001552/* External interface to call any callable object. The arg may be NULL. */
1553
1554object *
1555call_object(func, arg)
1556 object *func;
1557 object *arg;
1558{
1559 if (is_instancemethodobject(func) || is_funcobject(func))
1560 return call_function(func, arg);
1561 else
1562 return call_builtin(func, arg);
1563}
1564
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001566call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001568 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570 if (is_methodobject(func)) {
1571 method meth = getmethod(func);
1572 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001573 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1574 int size = gettuplesize(arg);
1575 if (size == 1)
1576 arg = gettupleitem(arg, 0);
1577 else if (size == 0)
1578 arg = NULL;
1579 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001580 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 }
1582 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001583 if (arg != NULL &&
1584 !(is_tupleobject(arg) &&
1585 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001586 err_setstr(TypeError,
1587 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 return NULL;
1589 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001592 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 return NULL;
1594}
1595
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001597call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001599 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 object *newarg = NULL;
1602 object *newlocals, *newglobals;
1603 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604
Guido van Rossume8122f11991-05-05 20:03:07 +00001605 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001606 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001607 object *self = instancemethodgetself(func);
1608 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001609 if (arg == NULL)
1610 argcount = 0;
1611 else if (is_tupleobject(arg))
1612 argcount = gettuplesize(arg);
1613 else
1614 argcount = 1;
1615 newarg = newtupleobject(argcount + 1);
1616 if (newarg == NULL)
1617 return NULL;
1618 INCREF(self);
1619 settupleitem(newarg, 0, self);
1620 if (arg != NULL && !is_tupleobject(arg)) {
1621 INCREF(arg);
1622 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001623 }
1624 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001625 int i;
1626 object *v;
1627 for (i = 0; i < argcount; i++) {
1628 v = gettupleitem(arg, i);
1629 XINCREF(v);
1630 settupleitem(newarg, i+1, v);
1631 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001633 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 }
1635 else {
1636 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001637 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 return NULL;
1639 }
1640 }
1641
Guido van Rossum3f5da241990-12-20 15:06:42 +00001642 co = getfunccode(func);
1643 if (co == NULL) {
1644 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 return NULL;
1646 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001647 if (!is_codeobject(co)) {
1648 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 abort();
1650 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001651 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001653 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 return NULL;
1655 }
1656
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657 newglobals = getfuncglobals(func);
1658 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659
Guido van Rossum3f5da241990-12-20 15:06:42 +00001660 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661
Guido van Rossum3f5da241990-12-20 15:06:42 +00001662 DECREF(newlocals);
1663 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664
Guido van Rossum3f5da241990-12-20 15:06:42 +00001665 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001666
1667 return v;
1668}
1669
1670static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001671apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 object *v, *w;
1673{
1674 typeobject *tp = v->ob_type;
1675 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001677 return NULL;
1678 }
1679 if (tp->tp_as_sequence != NULL) {
1680 int i;
1681 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001682 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 return NULL;
1684 }
1685 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001686 if (i < 0)
1687 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001688 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001690 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001691}
1692
1693static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 object *v, *w;
1696{
1697 sequence_methods *sq = v->ob_type->tp_as_sequence;
1698 int i, n;
1699 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 return NULL;
1702 }
1703 i = getintvalue(w);
1704 n = (*sq->sq_length)(v);
1705 if (i >= n)
1706 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001707 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708}
1709
1710static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 object *v;
1713 int isize;
1714 int *pi;
1715{
1716 if (v != NULL) {
1717 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001718 err_setstr(TypeError, "slice index must be int");
1719 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 }
1721 *pi = getintvalue(v);
1722 if (*pi < 0)
1723 *pi += isize;
1724 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001725 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726}
1727
1728static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 object *u, *v, *w;
1731{
1732 typeobject *tp = u->ob_type;
1733 int ilow, ihigh, isize;
1734 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001735 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 return NULL;
1737 }
1738 ilow = 0;
1739 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001742 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001746
1747static int
1748assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 object *w;
1750 object *key;
1751 object *v;
1752{
1753 typeobject *tp = w->ob_type;
1754 sequence_methods *sq;
1755 mapping_methods *mp;
1756 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 if ((sq = tp->tp_as_sequence) != NULL &&
1758 (func = sq->sq_ass_item) != NULL) {
1759 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001760 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001761 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001764 else {
1765 int i = getintvalue(key);
1766 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001767 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001768 return (*func)(w, i, v);
1769 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 }
1771 else if ((mp = tp->tp_as_mapping) != NULL &&
1772 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001773 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 }
1775 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001776 err_setstr(TypeError,
1777 "can't assign to this subscripted object");
1778 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780}
1781
Guido van Rossum3f5da241990-12-20 15:06:42 +00001782static int
1783assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784 object *u, *v, *w, *x;
1785{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001786 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001788 if (sq == NULL) {
1789 err_setstr(TypeError, "assign to slice of non-sequence");
1790 return -1;
1791 }
1792 if (sq == NULL || sq->sq_ass_slice == NULL) {
1793 err_setstr(TypeError, "unassignable slice");
1794 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795 }
1796 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001797 isize = ihigh = (*sq->sq_length)(u);
1798 if (slice_index(v, isize, &ilow) != 0)
1799 return -1;
1800 if (slice_index(w, isize, &ihigh) != 0)
1801 return -1;
1802 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803}
1804
1805static int
1806cmp_exception(err, v)
1807 object *err, *v;
1808{
1809 if (is_tupleobject(v)) {
1810 int i, n;
1811 n = gettuplesize(v);
1812 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001813 /* Test recursively */
1814 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 return 1;
1816 }
1817 return 0;
1818 }
1819 return err == v;
1820}
1821
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822static int
1823cmp_member(v, w)
1824 object *v, *w;
1825{
1826 int i, n, cmp;
1827 object *x;
1828 sequence_methods *sq;
1829 /* Special case for char in string */
1830 if (is_stringobject(w)) {
1831 register char *s, *end;
1832 register char c;
1833 if (!is_stringobject(v) || getstringsize(v) != 1) {
1834 err_setstr(TypeError,
1835 "string member test needs char left operand");
1836 return -1;
1837 }
1838 c = getstringvalue(v)[0];
1839 s = getstringvalue(w);
1840 end = s + getstringsize(w);
1841 while (s < end) {
1842 if (c == *s++)
1843 return 1;
1844 }
1845 return 0;
1846 }
1847 sq = w->ob_type->tp_as_sequence;
1848 if (sq == NULL) {
1849 err_setstr(TypeError,
1850 "'in' or 'not in' needs sequence right argument");
1851 return -1;
1852 }
1853 n = (*sq->sq_length)(w);
1854 for (i = 0; i < n; i++) {
1855 x = (*sq->sq_item)(w, i);
1856 cmp = cmpobject(v, x);
1857 XDECREF(x);
1858 if (cmp == 0)
1859 return 1;
1860 }
1861 return 0;
1862}
1863
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001865cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 enum cmp_op op;
1867 register object *v;
1868 register object *w;
1869{
1870 register int cmp;
1871 register int res = 0;
1872 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001873 case IS:
1874 case IS_NOT:
1875 res = (v == w);
1876 if (op == IS_NOT)
1877 res = !res;
1878 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 case IN:
1880 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001881 res = cmp_member(v, w);
1882 if (res < 0)
1883 return NULL;
1884 if (op == NOT_IN)
1885 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 break;
1887 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001888 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 break;
1890 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001891 cmp = cmpobject(v, w);
1892 switch (op) {
1893 case LT: res = cmp < 0; break;
1894 case LE: res = cmp <= 0; break;
1895 case EQ: res = cmp == 0; break;
1896 case NE: res = cmp != 0; break;
1897 case GT: res = cmp > 0; break;
1898 case GE: res = cmp >= 0; break;
1899 /* XXX no default? (res is initialized to 0 though) */
1900 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 }
1902 v = res ? True : False;
1903 INCREF(v);
1904 return v;
1905}
1906
Guido van Rossum3f5da241990-12-20 15:06:42 +00001907static int
1908import_from(locals, v, name)
1909 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001910 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001911 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001912{
1913 object *w, *x;
1914 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001915 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001916 int i;
1917 int n = getdictsize(w);
1918 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001919 name = getdict2key(w, i);
1920 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001921 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001922 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001923 if (x == NULL) {
1924 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001925 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001926 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001927 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001928 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001929 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001930 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001931 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001932 }
1933 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001934 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001935 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001936 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00001937 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00001938 getstringvalue(name));
1939 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001940 return -1;
1941 }
1942 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001943 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001944 }
1945}
1946
1947static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001948build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001949 object *v; /* None or tuple containing base classes */
1950 object *w; /* dictionary */
1951{
1952 if (is_tupleobject(v)) {
1953 int i;
1954 for (i = gettuplesize(v); --i >= 0; ) {
1955 object *x = gettupleitem(v, i);
1956 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001957 err_setstr(TypeError,
1958 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001959 return NULL;
1960 }
1961 }
1962 }
1963 else {
1964 v = NULL;
1965 }
1966 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001967 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001968 return NULL;
1969 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001970 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001971}