blob: 3e0c76a5e507d11b67c4c82d71c517c6e4cc585e [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);
Guido van Rossum299a7341992-03-04 16:39:08 +0000535 if (ferror(fp)) {
536 err_errno(IOError);
537 err = -1;
538 }
539 else if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000540 softspace(sysget("stdout"), 0);
541 }
542 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000543 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000544 }
545 DECREF(v);
546 break;
547
548 case PRINT_NEWLINE:
549 fp = sysgetfile("stdout", stdout);
550 fprintf(fp, "\n");
551 softspace(sysget("stdout"), 0);
552 break;
553
554 case BREAK_LOOP:
555 why = WHY_BREAK;
556 break;
557
558 case RAISE_EXCEPTION:
559 v = POP();
560 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000561 /* A tuple is equivalent to its first element here */
562 while (is_tupleobject(w)) {
563 u = w;
564 w = gettupleitem(u, 0);
565 DECREF(u);
566 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000567 if (!is_stringobject(w))
568 err_setstr(TypeError,
569 "exceptions must be strings");
570 else
571 err_setval(w, v);
572 DECREF(v);
573 DECREF(w);
574 why = WHY_EXCEPTION;
575 break;
576
577 case LOAD_LOCALS:
578 v = f->f_locals;
579 INCREF(v);
580 PUSH(v);
581 break;
582
583 case RETURN_VALUE:
584 retval = POP();
585 why = WHY_RETURN;
586 break;
587
Guido van Rossum374a9221991-04-04 10:40:29 +0000588 case BUILD_FUNCTION:
589 v = POP();
590 x = newfuncobject(v, f->f_globals);
591 DECREF(v);
592 PUSH(x);
593 break;
594
595 case POP_BLOCK:
596 {
597 block *b = pop_block(f);
598 while (STACK_LEVEL() > b->b_level) {
599 v = POP();
600 DECREF(v);
601 }
602 }
603 break;
604
605 case END_FINALLY:
606 v = POP();
607 if (is_intobject(v)) {
608 why = (enum why_code) getintvalue(v);
609 if (why == WHY_RETURN)
610 retval = POP();
611 }
612 else if (is_stringobject(v)) {
613 w = POP();
614 err_setval(v, w);
615 DECREF(w);
616 w = POP();
617 tb_store(w);
618 DECREF(w);
619 why = WHY_RERAISE;
620 }
621 else if (v != None) {
622 err_setstr(SystemError,
623 "'finally' pops bad exception");
624 why = WHY_EXCEPTION;
625 }
626 DECREF(v);
627 break;
628
629 case BUILD_CLASS:
630 w = POP();
631 v = POP();
632 x = build_class(v, w);
633 PUSH(x);
634 DECREF(v);
635 DECREF(w);
636 break;
637
638 case STORE_NAME:
639 w = GETNAMEV(oparg);
640 v = POP();
641 err = dict2insert(f->f_locals, w, v);
642 DECREF(v);
643 break;
644
645 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000646 w = GETNAMEV(oparg);
647 if ((err = dict2remove(f->f_locals, w)) != 0)
648 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000649 break;
650
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000651 case UNPACK_VARARG:
652 if (EMPTY()) {
653 err_setstr(TypeError,
654 "no argument list");
655 why = WHY_EXCEPTION;
656 break;
657 }
658 v = POP();
659 if (!is_tupleobject(v)) {
660 err_setstr(TypeError,
661 "bad argument list");
662 why = WHY_EXCEPTION;
663 }
664 else if (gettuplesize(v) < oparg) {
665 err_setstr(TypeError,
666 "not enough arguments");
667 why = WHY_EXCEPTION;
668 }
669 else if (oparg == 0) {
670 PUSH(v);
671 break;
672 }
673 else {
674 x = gettupleslice(v, oparg, gettuplesize(v));
675 if (x != NULL) {
676 PUSH(x);
677 for (; --oparg >= 0; ) {
678 w = gettupleitem(v, oparg);
679 INCREF(w);
680 PUSH(w);
681 }
682 }
683 }
684 DECREF(v);
685 break;
686
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000687 case UNPACK_ARG:
688 /* Implement various compatibility hacks:
689 (a) f(a,b,...) should accept f((1,2,...))
690 (b) f((a,b,...)) should accept f(1,2,...)
691 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
692 */
693 {
694 int n;
695 if (EMPTY()) {
696 err_setstr(TypeError,
697 "no argument list");
698 why = WHY_EXCEPTION;
699 break;
700 }
701 v = POP();
702 if (!is_tupleobject(v)) {
703 err_setstr(TypeError,
704 "bad argument list");
705 why = WHY_EXCEPTION;
706 break;
707 }
708 n = gettuplesize(v);
709 if (n == 1 && oparg != 1) {
710 /* Rule (a) */
711 w = gettupleitem(v, 0);
712 if (is_tupleobject(w)) {
713 INCREF(w);
714 DECREF(v);
715 v = w;
716 n = gettuplesize(v);
717 }
718 }
719 else if (n != 1 && oparg == 1) {
720 /* Rule (b) */
721 PUSH(v);
722 break;
723 /* Don't fall through */
724 }
725 else if (n > 2 && oparg == 2) {
726 /* Rule (c) */
727 int i;
728 w = newtupleobject(n-1);
729 u = newtupleobject(2);
730 if (u == NULL || w == NULL) {
731 XDECREF(w);
732 XDECREF(u);
733 DECREF(v);
734 why = WHY_EXCEPTION;
735 break;
736 }
737 t = gettupleitem(v, 0);
738 INCREF(t);
739 settupleitem(u, 0, t);
740 for (i = 1; i < n; i++) {
741 t = gettupleitem(v, i);
742 INCREF(t);
743 settupleitem(w, i-1, t);
744 }
745 settupleitem(u, 1, w);
746 DECREF(v);
747 v = u;
748 n = 2;
749 }
750 if (n != oparg) {
751 err_setstr(TypeError,
752 "arg count mismatch");
753 why = WHY_EXCEPTION;
754 DECREF(v);
755 break;
756 }
757 PUSH(v);
758 }
759 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 case UNPACK_TUPLE:
761 v = POP();
762 if (!is_tupleobject(v)) {
763 err_setstr(TypeError, "unpack non-tuple");
764 why = WHY_EXCEPTION;
765 }
766 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000767 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 "unpack tuple of wrong size");
769 why = WHY_EXCEPTION;
770 }
771 else {
772 for (; --oparg >= 0; ) {
773 w = gettupleitem(v, oparg);
774 INCREF(w);
775 PUSH(w);
776 }
777 }
778 DECREF(v);
779 break;
780
781 case UNPACK_LIST:
782 v = POP();
783 if (!is_listobject(v)) {
784 err_setstr(TypeError, "unpack non-list");
785 why = WHY_EXCEPTION;
786 }
787 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000788 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000789 "unpack list of wrong size");
790 why = WHY_EXCEPTION;
791 }
792 else {
793 for (; --oparg >= 0; ) {
794 w = getlistitem(v, oparg);
795 INCREF(w);
796 PUSH(w);
797 }
798 }
799 DECREF(v);
800 break;
801
802 case STORE_ATTR:
803 name = GETNAME(oparg);
804 v = POP();
805 u = POP();
806 err = setattr(v, name, u); /* v.name = u */
807 DECREF(v);
808 DECREF(u);
809 break;
810
811 case DELETE_ATTR:
812 name = GETNAME(oparg);
813 v = POP();
814 err = setattr(v, name, (object *)NULL);
815 /* del v.name */
816 DECREF(v);
817 break;
818
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000819 case STORE_GLOBAL:
820 w = GETNAMEV(oparg);
821 v = POP();
822 err = dict2insert(f->f_globals, w, v);
823 DECREF(v);
824 break;
825
826 case DELETE_GLOBAL:
827 w = GETNAMEV(oparg);
828 if ((err = dict2remove(f->f_globals, w)) != 0)
829 err_setstr(NameError, getstringvalue(w));
830 break;
831
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 case LOAD_CONST:
833 x = GETCONST(oparg);
834 INCREF(x);
835 PUSH(x);
836 break;
837
838 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000839 w = GETNAMEV(oparg);
840 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000842 err_clear();
843 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000845 err_clear();
846 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000847 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000848 err_setstr(NameError,
849 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
851 }
852 }
853 }
854 INCREF(x);
855 PUSH(x);
856 break;
857
858 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000859 w = GETNAMEV(oparg);
860 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000862 err_clear();
863 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000864 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000865 err_setstr(NameError,
866 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 break;
868 }
869 }
870 INCREF(x);
871 PUSH(x);
872 break;
873
874 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000875 w = GETNAMEV(oparg);
876 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000878 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 break;
880 }
881 INCREF(x);
882 PUSH(x);
883 break;
884
885 case BUILD_TUPLE:
886 x = newtupleobject(oparg);
887 if (x != NULL) {
888 for (; --oparg >= 0;) {
889 w = POP();
890 err = settupleitem(x, oparg, w);
891 if (err != 0)
892 break;
893 }
894 PUSH(x);
895 }
896 break;
897
898 case BUILD_LIST:
899 x = newlistobject(oparg);
900 if (x != NULL) {
901 for (; --oparg >= 0;) {
902 w = POP();
903 err = setlistitem(x, oparg, w);
904 if (err != 0)
905 break;
906 }
907 PUSH(x);
908 }
909 break;
910
911 case BUILD_MAP:
912 x = newdictobject();
913 PUSH(x);
914 break;
915
916 case LOAD_ATTR:
917 name = GETNAME(oparg);
918 v = POP();
919 x = getattr(v, name);
920 DECREF(v);
921 PUSH(x);
922 break;
923
924 case COMPARE_OP:
925 w = POP();
926 v = POP();
927 x = cmp_outcome((enum cmp_op)oparg, v, w);
928 DECREF(v);
929 DECREF(w);
930 PUSH(x);
931 break;
932
933 case IMPORT_NAME:
934 name = GETNAME(oparg);
935 x = import_module(name);
936 XINCREF(x);
937 PUSH(x);
938 break;
939
940 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000941 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000943 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 break;
945
946 case JUMP_FORWARD:
947 JUMPBY(oparg);
948 break;
949
950 case JUMP_IF_FALSE:
951 if (!testbool(TOP()))
952 JUMPBY(oparg);
953 break;
954
955 case JUMP_IF_TRUE:
956 if (testbool(TOP()))
957 JUMPBY(oparg);
958 break;
959
960 case JUMP_ABSOLUTE:
961 JUMPTO(oparg);
962 break;
963
964 case FOR_LOOP:
965 /* for v in s: ...
966 On entry: stack contains s, i.
967 On exit: stack contains s, i+1, s[i];
968 but if loop exhausted:
969 s, i are popped, and we jump */
970 w = POP(); /* Loop index */
971 v = POP(); /* Sequence object */
972 u = loop_subscript(v, w);
973 if (u != NULL) {
974 PUSH(v);
975 x = newintobject(getintvalue(w)+1);
976 PUSH(x);
977 DECREF(w);
978 PUSH(u);
979 }
980 else {
981 DECREF(v);
982 DECREF(w);
983 /* A NULL can mean "s exhausted"
984 but also an error: */
985 if (err_occurred())
986 why = WHY_EXCEPTION;
987 else
988 JUMPBY(oparg);
989 }
990 break;
991
992 case SETUP_LOOP:
993 case SETUP_EXCEPT:
994 case SETUP_FINALLY:
995 setup_block(f, opcode, INSTR_OFFSET() + oparg,
996 STACK_LEVEL());
997 break;
998
999 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001000#ifdef LLTRACE
1001 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001002 printf("--- Line %d ---\n", oparg);
1003#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001004 f->f_lineno = oparg;
1005 if (trace != NULL) {
1006 /* Trace each line of code reached */
1007 f->f_lasti = INSTR_OFFSET();
1008 x = call_trace(trace, f, "line", None);
1009 /* The trace function must return itself
1010 in order to continue tracing */
1011 DECREF(trace);
1012 if (x == None) {
1013 DECREF(x);
1014 trace = NULL;
1015 }
1016 else
1017 trace = x;
1018 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
1020
1021 default:
1022 fprintf(stderr,
1023 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001024 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 err_setstr(SystemError, "eval_code: unknown opcode");
1026 why = WHY_EXCEPTION;
1027 break;
1028
1029 } /* switch */
1030
1031 on_error:
1032
1033 /* Quickly continue if no error occurred */
1034
1035 if (why == WHY_NOT) {
1036 if (err == 0 && x != NULL)
1037 continue; /* Normal, fast path */
1038 why = WHY_EXCEPTION;
1039 x = None;
1040 err = 0;
1041 }
1042
Guido van Rossum96a42c81992-01-12 02:29:51 +00001043#ifndef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 /* Double-check exception status */
1045
1046 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1047 if (!err_occurred()) {
1048 fprintf(stderr, "XXX ghost error\n");
1049 err_setstr(SystemError, "ghost error");
1050 why = WHY_EXCEPTION;
1051 }
1052 }
1053 else {
1054 if (err_occurred()) {
1055 fprintf(stderr, "XXX undetected error\n");
1056 why = WHY_EXCEPTION;
1057 }
1058 }
1059#endif
1060
1061 /* Log traceback info if this is a real exception */
1062
1063 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001064 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001065 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001066 f->f_lasti -= 2;
1067 tb_here(f);
1068
Guido van Rossum8ec25b41992-01-19 16:26:13 +00001069 if (trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001070 object *type, *value, *traceback, *arg;
1071 err_get(&type, &value);
1072 traceback = tb_fetch();
1073 arg = newtupleobject(3);
1074 if (arg == NULL)
1075 err_clear();
1076 else {
1077 settupleitem(arg, 0, type);
1078 settupleitem(arg, 1, value);
1079 settupleitem(arg, 2, traceback);
1080 }
Guido van Rossum8ec25b41992-01-19 16:26:13 +00001081 v = call_trace(trace, f, "exception", arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001082 if (v == NULL) {
1083 /* Trace function raised error */
1084 tb_here(f);
1085 sysset("trace", (object *)NULL);
1086 XDECREF(trace);
1087 trace = NULL;
1088 }
1089 else {
1090 /* Restore original exception */
1091 err_setval(type, value);
1092 tb_store(traceback);
1093 if (v == None)
1094 DECREF(v);
1095 else {
1096 /* Set trace function */
1097 XDECREF(trace);
1098 trace = v;
1099 }
1100 }
1101 XDECREF(arg);
1102 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 }
1104
1105 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1106
1107 if (why == WHY_RERAISE)
1108 why = WHY_EXCEPTION;
1109
1110 /* Unwind stacks if a (pseudo) exception occurred */
1111
1112 while (why != WHY_NOT && f->f_iblock > 0) {
1113 block *b = pop_block(f);
1114 while (STACK_LEVEL() > b->b_level) {
1115 v = POP();
1116 XDECREF(v);
1117 }
1118 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1119 why = WHY_NOT;
1120 JUMPTO(b->b_handler);
1121 break;
1122 }
1123 if (b->b_type == SETUP_FINALLY ||
1124 b->b_type == SETUP_EXCEPT &&
1125 why == WHY_EXCEPTION) {
1126 if (why == WHY_EXCEPTION) {
1127 object *exc, *val;
1128 err_get(&exc, &val);
1129 if (val == NULL) {
1130 val = None;
1131 INCREF(val);
1132 }
1133 v = tb_fetch();
1134 /* Make the raw exception data
1135 available to the handler,
1136 so a program can emulate the
1137 Python main loop. Don't do
1138 this for 'finally'. */
1139 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001141 sysset("exc_value", val);
1142 sysset("exc_type", exc);
1143 err_clear();
1144 }
1145 PUSH(v);
1146 PUSH(val);
1147 PUSH(exc);
1148 }
1149 else {
1150 if (why == WHY_RETURN)
1151 PUSH(retval);
1152 v = newintobject((long)why);
1153 PUSH(v);
1154 }
1155 why = WHY_NOT;
1156 JUMPTO(b->b_handler);
1157 break;
1158 }
1159 } /* unwind stack */
1160
1161 /* End the loop if we still have an error (or return) */
1162
1163 if (why != WHY_NOT)
1164 break;
1165
1166 } /* main loop */
1167
1168 /* Pop remaining stack entries */
1169
1170 while (!EMPTY()) {
1171 v = POP();
1172 XDECREF(v);
1173 }
1174
Guido van Rossum96a42c81992-01-12 02:29:51 +00001175 if (why != WHY_RETURN)
1176 retval = NULL;
1177
1178 if (trace) {
1179 if (why == WHY_RETURN) {
1180 x = call_trace(trace, f, "return", retval);
1181 if (x == NULL) {
1182 XDECREF(retval);
1183 retval = NULL;
1184 }
1185 else
1186 DECREF(x);
1187 }
1188 DECREF(trace);
1189 }
1190
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 /* Restore previous frame and release the current one */
1192
1193 current_frame = f->f_back;
1194 DECREF(f);
1195
Guido van Rossum96a42c81992-01-12 02:29:51 +00001196 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001197}
1198
Guido van Rossum96a42c81992-01-12 02:29:51 +00001199#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001200static int
1201prtrace(v, str)
1202 object *v;
1203 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001205 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001206 if (printobject(v, stdout, 0) != 0)
1207 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001208 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001210#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001211
Guido van Rossum96a42c81992-01-12 02:29:51 +00001212static object *
1213call_trace(trace, f, msg, arg)
1214 object *trace;
1215 frameobject *f;
1216 char *msg;
1217 object *arg;
1218{
1219 object *arglist, *what, *res;
1220 static int tracing = 0;
1221
1222 if (tracing) {
1223 /* Don't trace the trace code! */
1224 INCREF(None);
1225 return None;
1226 }
1227
1228 arglist = newtupleobject(3);
1229 if (arglist == NULL)
1230 return NULL;
1231 what = newstringobject(msg);
1232 if (what == NULL) {
1233 DECREF(arglist);
1234 return NULL;
1235 }
1236 INCREF(f);
1237 if (arg == NULL)
1238 arg = None;
1239 INCREF(arg);
1240 settupleitem(arglist, 0, (object *)f);
1241 settupleitem(arglist, 1, what);
1242 settupleitem(arglist, 2, arg);
1243 tracing++;
1244 res = call_object(trace, arglist);
1245 tracing--;
1246 if (res == NULL)
1247 tb_here(f);
1248 DECREF(arglist);
1249 return res;
1250}
1251
Guido van Rossum3f5da241990-12-20 15:06:42 +00001252object *
1253getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001255 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001257 else
1258 return current_frame->f_locals;
1259}
1260
1261object *
1262getglobals()
1263{
1264 if (current_frame == NULL)
1265 return NULL;
1266 else
1267 return current_frame->f_globals;
1268}
1269
1270void
1271printtraceback(fp)
1272 FILE *fp;
1273{
1274 object *v = tb_fetch();
1275 if (v != NULL) {
1276 fprintf(fp, "Stack backtrace (innermost last):\n");
1277 tb_print(v, fp);
1278 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001280}
1281
1282
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001283void
1284flushline()
1285{
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 if (softspace(sysget("stdout"), 0))
1287 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288}
1289
Guido van Rossum3f5da241990-12-20 15:06:42 +00001290
1291/* Test a value used as condition, e.g., in a for or if statement */
1292
1293static int
1294testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001295 object *v;
1296{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001297 if (v == None)
1298 return 0;
1299 if (v->ob_type->tp_as_number != NULL)
1300 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301 if (v->ob_type->tp_as_sequence != NULL)
1302 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1303 if (v->ob_type->tp_as_mapping != NULL)
1304 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001305 /* All other objects are 'true' */
1306 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307}
1308
1309static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001310or(v, w)
1311 object *v, *w;
1312{
1313 if (v->ob_type->tp_as_number != NULL) {
1314 object *x;
1315 object * (*f) FPROTO((object *, object *));
1316 if (coerce(&v, &w) != 0)
1317 return NULL;
1318 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1319 x = (*f)(v, w);
1320 DECREF(v);
1321 DECREF(w);
1322 if (f != NULL)
1323 return x;
1324 }
1325 err_setstr(TypeError, "bad operand type(s) for |");
1326 return NULL;
1327}
1328
1329static object *
1330xor(v, w)
1331 object *v, *w;
1332{
1333 if (v->ob_type->tp_as_number != NULL) {
1334 object *x;
1335 object * (*f) FPROTO((object *, object *));
1336 if (coerce(&v, &w) != 0)
1337 return NULL;
1338 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1339 x = (*f)(v, w);
1340 DECREF(v);
1341 DECREF(w);
1342 if (f != NULL)
1343 return x;
1344 }
1345 err_setstr(TypeError, "bad operand type(s) for ^");
1346 return NULL;
1347}
1348
1349static object *
1350and(v, w)
1351 object *v, *w;
1352{
1353 if (v->ob_type->tp_as_number != NULL) {
1354 object *x;
1355 object * (*f) FPROTO((object *, object *));
1356 if (coerce(&v, &w) != 0)
1357 return NULL;
1358 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1359 x = (*f)(v, w);
1360 DECREF(v);
1361 DECREF(w);
1362 if (f != NULL)
1363 return x;
1364 }
1365 err_setstr(TypeError, "bad operand type(s) for &");
1366 return NULL;
1367}
1368
1369static object *
1370lshift(v, w)
1371 object *v, *w;
1372{
1373 if (v->ob_type->tp_as_number != NULL) {
1374 object *x;
1375 object * (*f) FPROTO((object *, object *));
1376 if (coerce(&v, &w) != 0)
1377 return NULL;
1378 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1379 x = (*f)(v, w);
1380 DECREF(v);
1381 DECREF(w);
1382 if (f != NULL)
1383 return x;
1384 }
1385 err_setstr(TypeError, "bad operand type(s) for <<");
1386 return NULL;
1387}
1388
1389static object *
1390rshift(v, w)
1391 object *v, *w;
1392{
1393 if (v->ob_type->tp_as_number != NULL) {
1394 object *x;
1395 object * (*f) FPROTO((object *, object *));
1396 if (coerce(&v, &w) != 0)
1397 return NULL;
1398 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1399 x = (*f)(v, w);
1400 DECREF(v);
1401 DECREF(w);
1402 if (f != NULL)
1403 return x;
1404 }
1405 err_setstr(TypeError, "bad operand type(s) for >>");
1406 return NULL;
1407}
1408
1409static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001410add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411 object *v, *w;
1412{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001413 if (v->ob_type->tp_as_number != NULL) {
1414 object *x;
1415 if (coerce(&v, &w) != 0)
1416 return NULL;
1417 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1418 DECREF(v);
1419 DECREF(w);
1420 return x;
1421 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001423 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001425 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426 return NULL;
1427 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428}
1429
1430static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001431sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 object *v, *w;
1433{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001434 if (v->ob_type->tp_as_number != NULL) {
1435 object *x;
1436 if (coerce(&v, &w) != 0)
1437 return NULL;
1438 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1439 DECREF(v);
1440 DECREF(w);
1441 return x;
1442 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001443 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 return NULL;
1445}
1446
1447static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001448mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 object *v, *w;
1450{
1451 typeobject *tp;
1452 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1453 /* int*sequence -- swap v and w */
1454 object *tmp = v;
1455 v = w;
1456 w = tmp;
1457 }
1458 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001459 if (tp->tp_as_number != NULL) {
1460 object *x;
1461 if (coerce(&v, &w) != 0)
1462 return NULL;
1463 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1464 DECREF(v);
1465 DECREF(w);
1466 return x;
1467 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 if (tp->tp_as_sequence != NULL) {
1469 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001470 err_setstr(TypeError,
1471 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 return NULL;
1473 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001474 return (*tp->tp_as_sequence->sq_repeat)
1475 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 return NULL;
1479}
1480
1481static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001482divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 object *v, *w;
1484{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001485 if (v->ob_type->tp_as_number != NULL) {
1486 object *x;
1487 if (coerce(&v, &w) != 0)
1488 return NULL;
1489 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1490 DECREF(v);
1491 DECREF(w);
1492 return x;
1493 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001494 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 return NULL;
1496}
1497
1498static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001500 object *v, *w;
1501{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001502 if (v->ob_type->tp_as_number != NULL) {
1503 object *x;
1504 if (coerce(&v, &w) != 0)
1505 return NULL;
1506 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1507 DECREF(v);
1508 DECREF(w);
1509 return x;
1510 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001511 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001512 return NULL;
1513}
1514
1515static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001516neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 object *v;
1518{
1519 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001520 return (*v->ob_type->tp_as_number->nb_negative)(v);
1521 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 return NULL;
1523}
1524
1525static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527 object *v;
1528{
1529 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001530 return (*v->ob_type->tp_as_number->nb_positive)(v);
1531 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 return NULL;
1533}
1534
1535static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001536invert(v)
1537 object *v;
1538{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001539 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001540 if (v->ob_type->tp_as_number != NULL &&
1541 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1542 return (*f)(v);
1543 err_setstr(TypeError, "bad operand type(s) for unary ~");
1544 return NULL;
1545}
1546
1547static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001548not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 object *v;
1550{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001551 int outcome = testbool(v);
1552 object *w = outcome == 0 ? True : False;
1553 INCREF(w);
1554 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001555}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001556/* External interface to call any callable object. The arg may be NULL. */
1557
1558object *
1559call_object(func, arg)
1560 object *func;
1561 object *arg;
1562{
1563 if (is_instancemethodobject(func) || is_funcobject(func))
1564 return call_function(func, arg);
1565 else
1566 return call_builtin(func, arg);
1567}
1568
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001573{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 if (is_methodobject(func)) {
1575 method meth = getmethod(func);
1576 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001577 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1578 int size = gettuplesize(arg);
1579 if (size == 1)
1580 arg = gettupleitem(arg, 0);
1581 else if (size == 0)
1582 arg = NULL;
1583 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001584 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585 }
1586 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001587 if (arg != NULL &&
1588 !(is_tupleobject(arg) &&
1589 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590 err_setstr(TypeError,
1591 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592 return NULL;
1593 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 return NULL;
1598}
1599
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001603 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605 object *newarg = NULL;
1606 object *newlocals, *newglobals;
1607 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608
Guido van Rossume8122f11991-05-05 20:03:07 +00001609 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001610 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001611 object *self = instancemethodgetself(func);
1612 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001613 if (arg == NULL)
1614 argcount = 0;
1615 else if (is_tupleobject(arg))
1616 argcount = gettuplesize(arg);
1617 else
1618 argcount = 1;
1619 newarg = newtupleobject(argcount + 1);
1620 if (newarg == NULL)
1621 return NULL;
1622 INCREF(self);
1623 settupleitem(newarg, 0, self);
1624 if (arg != NULL && !is_tupleobject(arg)) {
1625 INCREF(arg);
1626 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 }
1628 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001629 int i;
1630 object *v;
1631 for (i = 0; i < argcount; i++) {
1632 v = gettupleitem(arg, i);
1633 XINCREF(v);
1634 settupleitem(newarg, i+1, v);
1635 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001637 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 }
1639 else {
1640 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001641 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 return NULL;
1643 }
1644 }
1645
Guido van Rossum3f5da241990-12-20 15:06:42 +00001646 co = getfunccode(func);
1647 if (co == NULL) {
1648 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 return NULL;
1650 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001651 if (!is_codeobject(co)) {
1652 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653 abort();
1654 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001655 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 return NULL;
1659 }
1660
Guido van Rossum3f5da241990-12-20 15:06:42 +00001661 newglobals = getfuncglobals(func);
1662 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663
Guido van Rossum3f5da241990-12-20 15:06:42 +00001664 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665
Guido van Rossum3f5da241990-12-20 15:06:42 +00001666 DECREF(newlocals);
1667 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668
Guido van Rossum3f5da241990-12-20 15:06:42 +00001669 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670
1671 return v;
1672}
1673
1674static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001675apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 object *v, *w;
1677{
1678 typeobject *tp = v->ob_type;
1679 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001680 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 return NULL;
1682 }
1683 if (tp->tp_as_sequence != NULL) {
1684 int i;
1685 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001686 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687 return NULL;
1688 }
1689 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001690 if (i < 0)
1691 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001692 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695}
1696
1697static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 object *v, *w;
1700{
1701 sequence_methods *sq = v->ob_type->tp_as_sequence;
1702 int i, n;
1703 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001704 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 return NULL;
1706 }
1707 i = getintvalue(w);
1708 n = (*sq->sq_length)(v);
1709 if (i >= n)
1710 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712}
1713
1714static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 object *v;
1717 int isize;
1718 int *pi;
1719{
1720 if (v != NULL) {
1721 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001722 err_setstr(TypeError, "slice index must be int");
1723 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 }
1725 *pi = getintvalue(v);
1726 if (*pi < 0)
1727 *pi += isize;
1728 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730}
1731
1732static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 object *u, *v, *w;
1735{
1736 typeobject *tp = u->ob_type;
1737 int ilow, ihigh, isize;
1738 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 return NULL;
1741 }
1742 ilow = 0;
1743 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001746 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001748 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750
1751static int
1752assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753 object *w;
1754 object *key;
1755 object *v;
1756{
1757 typeobject *tp = w->ob_type;
1758 sequence_methods *sq;
1759 mapping_methods *mp;
1760 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761 if ((sq = tp->tp_as_sequence) != NULL &&
1762 (func = sq->sq_ass_item) != NULL) {
1763 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001764 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001765 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001766 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001768 else {
1769 int i = getintvalue(key);
1770 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001771 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001772 return (*func)(w, i, v);
1773 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 }
1775 else if ((mp = tp->tp_as_mapping) != NULL &&
1776 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001777 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 }
1779 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001780 err_setstr(TypeError,
1781 "can't assign to this subscripted object");
1782 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784}
1785
Guido van Rossum3f5da241990-12-20 15:06:42 +00001786static int
1787assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 object *u, *v, *w, *x;
1789{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001790 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001792 if (sq == NULL) {
1793 err_setstr(TypeError, "assign to slice of non-sequence");
1794 return -1;
1795 }
1796 if (sq == NULL || sq->sq_ass_slice == NULL) {
1797 err_setstr(TypeError, "unassignable slice");
1798 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 }
1800 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001801 isize = ihigh = (*sq->sq_length)(u);
1802 if (slice_index(v, isize, &ilow) != 0)
1803 return -1;
1804 if (slice_index(w, isize, &ihigh) != 0)
1805 return -1;
1806 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807}
1808
1809static int
1810cmp_exception(err, v)
1811 object *err, *v;
1812{
1813 if (is_tupleobject(v)) {
1814 int i, n;
1815 n = gettuplesize(v);
1816 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001817 /* Test recursively */
1818 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819 return 1;
1820 }
1821 return 0;
1822 }
1823 return err == v;
1824}
1825
Guido van Rossum3f5da241990-12-20 15:06:42 +00001826static int
1827cmp_member(v, w)
1828 object *v, *w;
1829{
1830 int i, n, cmp;
1831 object *x;
1832 sequence_methods *sq;
1833 /* Special case for char in string */
1834 if (is_stringobject(w)) {
1835 register char *s, *end;
1836 register char c;
1837 if (!is_stringobject(v) || getstringsize(v) != 1) {
1838 err_setstr(TypeError,
1839 "string member test needs char left operand");
1840 return -1;
1841 }
1842 c = getstringvalue(v)[0];
1843 s = getstringvalue(w);
1844 end = s + getstringsize(w);
1845 while (s < end) {
1846 if (c == *s++)
1847 return 1;
1848 }
1849 return 0;
1850 }
1851 sq = w->ob_type->tp_as_sequence;
1852 if (sq == NULL) {
1853 err_setstr(TypeError,
1854 "'in' or 'not in' needs sequence right argument");
1855 return -1;
1856 }
1857 n = (*sq->sq_length)(w);
1858 for (i = 0; i < n; i++) {
1859 x = (*sq->sq_item)(w, i);
1860 cmp = cmpobject(v, x);
1861 XDECREF(x);
1862 if (cmp == 0)
1863 return 1;
1864 }
1865 return 0;
1866}
1867
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001869cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 enum cmp_op op;
1871 register object *v;
1872 register object *w;
1873{
1874 register int cmp;
1875 register int res = 0;
1876 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001877 case IS:
1878 case IS_NOT:
1879 res = (v == w);
1880 if (op == IS_NOT)
1881 res = !res;
1882 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 case IN:
1884 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001885 res = cmp_member(v, w);
1886 if (res < 0)
1887 return NULL;
1888 if (op == NOT_IN)
1889 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 break;
1891 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 break;
1894 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001895 cmp = cmpobject(v, w);
1896 switch (op) {
1897 case LT: res = cmp < 0; break;
1898 case LE: res = cmp <= 0; break;
1899 case EQ: res = cmp == 0; break;
1900 case NE: res = cmp != 0; break;
1901 case GT: res = cmp > 0; break;
1902 case GE: res = cmp >= 0; break;
1903 /* XXX no default? (res is initialized to 0 though) */
1904 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 }
1906 v = res ? True : False;
1907 INCREF(v);
1908 return v;
1909}
1910
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911static int
1912import_from(locals, v, name)
1913 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001914 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001915 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001916{
1917 object *w, *x;
1918 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001919 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001920 int i;
1921 int n = getdictsize(w);
1922 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001923 name = getdict2key(w, i);
1924 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001925 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001926 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001927 if (x == NULL) {
1928 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001929 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001931 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001932 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001934 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001935 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001936 }
1937 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001938 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001939 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001940 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00001941 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00001942 getstringvalue(name));
1943 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001944 return -1;
1945 }
1946 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001947 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001948 }
1949}
1950
1951static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001953 object *v; /* None or tuple containing base classes */
1954 object *w; /* dictionary */
1955{
1956 if (is_tupleobject(v)) {
1957 int i;
1958 for (i = gettuplesize(v); --i >= 0; ) {
1959 object *x = gettupleitem(v, i);
1960 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 err_setstr(TypeError,
1962 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001963 return NULL;
1964 }
1965 }
1966 }
1967 else {
1968 v = NULL;
1969 }
1970 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001971 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001972 return NULL;
1973 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001974 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001975}