blob: 2b60e57b9299c8bf8ee05454f9f4ed0b16fa63dd [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 Rossum9c8d70d1992-03-23 18:19:28 +000074static void call_exc_trace PROTO((object **, object**, frameobject *));
75static int call_trace
76 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000077
78
79static frameobject *current_frame;
80
81
82/* Status code for main loop (reason for stack unwind) */
83
84enum why_code {
85 WHY_NOT, /* No error */
86 WHY_EXCEPTION, /* Exception occurred */
87 WHY_RERAISE, /* Exception re-raised by 'finally' */
88 WHY_RETURN, /* 'return' statement */
89 WHY_BREAK /* 'break' statement */
90};
91
92
93/* Interpreter main loop */
94
95object *
96eval_code(co, globals, locals, arg)
97 codeobject *co;
98 object *globals;
99 object *locals;
100 object *arg;
101{
102 register unsigned char *next_instr;
103 register int opcode; /* Current opcode */
104 register int oparg; /* Current opcode argument, if any */
105 register object **stack_pointer;
106 register enum why_code why; /* Reason for block stack unwind */
107 register int err; /* Error status -- nonzero if error */
108 register object *x; /* Result object -- NULL if error */
109 register object *v; /* Temporary objects popped off stack */
110 register object *w;
111 register object *u;
112 register object *t;
113 register frameobject *f; /* Current frame */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000114 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000115 object *retval; /* Return value iff why == WHY_RETURN */
116 char *name; /* Name used by some instructions */
117 FILE *fp; /* Used by print operations */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000118#ifdef LLTRACE
119 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000120#endif
121
122/* Code access macros */
123
124#define GETCONST(i) Getconst(f, i)
125#define GETNAME(i) Getname(f, i)
126#define GETNAMEV(i) Getnamev(f, i)
127#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
128#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
129#define NEXTOP() (*next_instr++)
130#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
131#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
132#define JUMPBY(x) (next_instr += (x))
133
134/* Stack manipulation macros */
135
136#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
137#define EMPTY() (STACK_LEVEL() == 0)
138#define TOP() (stack_pointer[-1])
139#define BASIC_PUSH(v) (*stack_pointer++ = (v))
140#define BASIC_POP() (*--stack_pointer)
141
Guido van Rossum96a42c81992-01-12 02:29:51 +0000142#ifdef LLTRACE
143#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
144#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000145#else
146#define PUSH(v) BASIC_PUSH(v)
147#define POP() BASIC_POP()
148#endif
149
150 f = newframeobject(
151 current_frame, /*back*/
152 co, /*code*/
153 globals, /*globals*/
154 locals, /*locals*/
155 50, /*nvalues*/
156 20); /*nblocks*/
157 if (f == NULL)
158 return NULL;
159
160 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000161
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000162 if (sys_trace != NULL) {
163 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000164 be called on *every* entry to a code block.
165 Its return value, if not None, is a function that
166 will be called at the start of each executed line
167 of code. (Actually, the function must return
168 itself in order to continue tracing.)
169 The trace functions are called with three arguments:
170 a pointer to the current frame, a string indicating
171 why the function is called, and an argument which
172 depends on the situation. The global trace function
173 (sys.trace) is also called whenever an exception
174 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000175 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000176 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000177 current_frame = f->f_back;
178 DECREF(f);
179 return NULL;
180 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000181 }
182
183 if (sys_profile != NULL) {
184 /* Similar for sys_profile, except it needn't return
185 itself and isn't called for "line" events */
186 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
187 current_frame = f->f_back;
188 DECREF(f);
189 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000190 }
191 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000192
193 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000194 stack_pointer = f->f_valuestack;
195
196 if (arg != NULL) {
197 INCREF(arg);
198 PUSH(arg);
199 }
200
201 why = WHY_NOT;
202 err = 0;
203 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000204
205 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000206 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000207
208 /* Do periodic things */
209
210 if (--ticker < 0) {
211 ticker = 100;
212 if (intrcheck()) {
213 err_set(KeyboardInterrupt);
214 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000215 goto on_error;
216 }
217 }
218
219 /* Extract opcode and argument */
220
221 opcode = NEXTOP();
222 if (HAS_ARG(opcode))
223 oparg = NEXTARG();
224
Guido van Rossum96a42c81992-01-12 02:29:51 +0000225#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000226 /* Instruction tracing */
227
Guido van Rossum96a42c81992-01-12 02:29:51 +0000228 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000229 if (HAS_ARG(opcode)) {
230 printf("%d: %d, %d\n",
231 (int) (INSTR_OFFSET() - 3),
232 opcode, oparg);
233 }
234 else {
235 printf("%d: %d\n",
236 (int) (INSTR_OFFSET() - 1), opcode);
237 }
238 }
239#endif
240
241 /* Main switch on opcode */
242
243 switch (opcode) {
244
245 /* BEWARE!
246 It is essential that any operation that fails sets either
247 x to NULL, err to nonzero, or why to anything but WHY_NOT,
248 and that no operation that succeeds does this! */
249
250 /* case STOP_CODE: this is an error! */
251
252 case POP_TOP:
253 v = POP();
254 DECREF(v);
255 break;
256
257 case ROT_TWO:
258 v = POP();
259 w = POP();
260 PUSH(v);
261 PUSH(w);
262 break;
263
264 case ROT_THREE:
265 v = POP();
266 w = POP();
267 x = POP();
268 PUSH(v);
269 PUSH(x);
270 PUSH(w);
271 break;
272
273 case DUP_TOP:
274 v = TOP();
275 INCREF(v);
276 PUSH(v);
277 break;
278
279 case UNARY_POSITIVE:
280 v = POP();
281 x = pos(v);
282 DECREF(v);
283 PUSH(x);
284 break;
285
286 case UNARY_NEGATIVE:
287 v = POP();
288 x = neg(v);
289 DECREF(v);
290 PUSH(x);
291 break;
292
293 case UNARY_NOT:
294 v = POP();
295 x = not(v);
296 DECREF(v);
297 PUSH(x);
298 break;
299
300 case UNARY_CONVERT:
301 v = POP();
302 x = reprobject(v);
303 DECREF(v);
304 PUSH(x);
305 break;
306
307 case UNARY_CALL:
308 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000309 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000310 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000311 DECREF(v);
312 PUSH(x);
313 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000314
315 case UNARY_INVERT:
316 v = POP();
317 x = invert(v);
318 DECREF(v);
319 PUSH(x);
320 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000321
322 case BINARY_MULTIPLY:
323 w = POP();
324 v = POP();
325 x = mul(v, w);
326 DECREF(v);
327 DECREF(w);
328 PUSH(x);
329 break;
330
331 case BINARY_DIVIDE:
332 w = POP();
333 v = POP();
334 x = divide(v, w);
335 DECREF(v);
336 DECREF(w);
337 PUSH(x);
338 break;
339
340 case BINARY_MODULO:
341 w = POP();
342 v = POP();
343 x = rem(v, w);
344 DECREF(v);
345 DECREF(w);
346 PUSH(x);
347 break;
348
349 case BINARY_ADD:
350 w = POP();
351 v = POP();
352 x = add(v, w);
353 DECREF(v);
354 DECREF(w);
355 PUSH(x);
356 break;
357
358 case BINARY_SUBTRACT:
359 w = POP();
360 v = POP();
361 x = sub(v, w);
362 DECREF(v);
363 DECREF(w);
364 PUSH(x);
365 break;
366
367 case BINARY_SUBSCR:
368 w = POP();
369 v = POP();
370 x = apply_subscript(v, w);
371 DECREF(v);
372 DECREF(w);
373 PUSH(x);
374 break;
375
376 case BINARY_CALL:
377 w = POP();
378 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000379 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000380 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000381 DECREF(v);
382 DECREF(w);
383 PUSH(x);
384 break;
385
Guido van Rossum7928cd71991-10-24 14:59:31 +0000386 case BINARY_LSHIFT:
387 w = POP();
388 v = POP();
389 x = lshift(v, w);
390 DECREF(v);
391 DECREF(w);
392 PUSH(x);
393 break;
394
395 case BINARY_RSHIFT:
396 w = POP();
397 v = POP();
398 x = rshift(v, w);
399 DECREF(v);
400 DECREF(w);
401 PUSH(x);
402 break;
403
404 case BINARY_AND:
405 w = POP();
406 v = POP();
407 x = and(v, w);
408 DECREF(v);
409 DECREF(w);
410 PUSH(x);
411 break;
412
413 case BINARY_XOR:
414 w = POP();
415 v = POP();
416 x = xor(v, w);
417 DECREF(v);
418 DECREF(w);
419 PUSH(x);
420 break;
421
422 case BINARY_OR:
423 w = POP();
424 v = POP();
425 x = or(v, w);
426 DECREF(v);
427 DECREF(w);
428 PUSH(x);
429 break;
430
Guido van Rossum374a9221991-04-04 10:40:29 +0000431 case SLICE+0:
432 case SLICE+1:
433 case SLICE+2:
434 case SLICE+3:
435 if ((opcode-SLICE) & 2)
436 w = POP();
437 else
438 w = NULL;
439 if ((opcode-SLICE) & 1)
440 v = POP();
441 else
442 v = NULL;
443 u = POP();
444 x = apply_slice(u, v, w);
445 DECREF(u);
446 XDECREF(v);
447 XDECREF(w);
448 PUSH(x);
449 break;
450
451 case STORE_SLICE+0:
452 case STORE_SLICE+1:
453 case STORE_SLICE+2:
454 case STORE_SLICE+3:
455 if ((opcode-STORE_SLICE) & 2)
456 w = POP();
457 else
458 w = NULL;
459 if ((opcode-STORE_SLICE) & 1)
460 v = POP();
461 else
462 v = NULL;
463 u = POP();
464 t = POP();
465 err = assign_slice(u, v, w, t); /* u[v:w] = t */
466 DECREF(t);
467 DECREF(u);
468 XDECREF(v);
469 XDECREF(w);
470 break;
471
472 case DELETE_SLICE+0:
473 case DELETE_SLICE+1:
474 case DELETE_SLICE+2:
475 case DELETE_SLICE+3:
476 if ((opcode-DELETE_SLICE) & 2)
477 w = POP();
478 else
479 w = NULL;
480 if ((opcode-DELETE_SLICE) & 1)
481 v = POP();
482 else
483 v = NULL;
484 u = POP();
485 err = assign_slice(u, v, w, (object *)NULL);
486 /* del u[v:w] */
487 DECREF(u);
488 XDECREF(v);
489 XDECREF(w);
490 break;
491
492 case STORE_SUBSCR:
493 w = POP();
494 v = POP();
495 u = POP();
496 /* v[w] = u */
497 err = assign_subscript(v, w, u);
498 DECREF(u);
499 DECREF(v);
500 DECREF(w);
501 break;
502
503 case DELETE_SUBSCR:
504 w = POP();
505 v = POP();
506 /* del v[w] */
507 err = assign_subscript(v, w, (object *)NULL);
508 DECREF(v);
509 DECREF(w);
510 break;
511
512 case PRINT_EXPR:
513 v = POP();
514 fp = sysgetfile("stdout", stdout);
515 /* Print value except if procedure result */
516 if (v != None) {
517 flushline();
518 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000519 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000520 flushline();
521 }
522 DECREF(v);
523 break;
524
525 case PRINT_ITEM:
526 v = POP();
527 fp = sysgetfile("stdout", stdout);
528 if (softspace(sysget("stdout"), 1))
529 fprintf(fp, " ");
530 if (is_stringobject(v)) {
531 char *s = getstringvalue(v);
532 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000533 fwrite(s, 1, len, fp);
Guido van Rossum299a7341992-03-04 16:39:08 +0000534 if (ferror(fp)) {
535 err_errno(IOError);
536 err = -1;
537 }
538 else if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000539 softspace(sysget("stdout"), 0);
540 }
541 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000542 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000543 }
544 DECREF(v);
545 break;
546
547 case PRINT_NEWLINE:
548 fp = sysgetfile("stdout", stdout);
549 fprintf(fp, "\n");
550 softspace(sysget("stdout"), 0);
551 break;
552
553 case BREAK_LOOP:
554 why = WHY_BREAK;
555 break;
556
557 case RAISE_EXCEPTION:
558 v = POP();
559 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000560 /* A tuple is equivalent to its first element here */
561 while (is_tupleobject(w)) {
562 u = w;
563 w = gettupleitem(u, 0);
564 DECREF(u);
565 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000566 if (!is_stringobject(w))
567 err_setstr(TypeError,
568 "exceptions must be strings");
569 else
570 err_setval(w, v);
571 DECREF(v);
572 DECREF(w);
573 why = WHY_EXCEPTION;
574 break;
575
576 case LOAD_LOCALS:
577 v = f->f_locals;
578 INCREF(v);
579 PUSH(v);
580 break;
581
582 case RETURN_VALUE:
583 retval = POP();
584 why = WHY_RETURN;
585 break;
586
Guido van Rossum374a9221991-04-04 10:40:29 +0000587 case BUILD_FUNCTION:
588 v = POP();
589 x = newfuncobject(v, f->f_globals);
590 DECREF(v);
591 PUSH(x);
592 break;
593
594 case POP_BLOCK:
595 {
596 block *b = pop_block(f);
597 while (STACK_LEVEL() > b->b_level) {
598 v = POP();
599 DECREF(v);
600 }
601 }
602 break;
603
604 case END_FINALLY:
605 v = POP();
606 if (is_intobject(v)) {
607 why = (enum why_code) getintvalue(v);
608 if (why == WHY_RETURN)
609 retval = POP();
610 }
611 else if (is_stringobject(v)) {
612 w = POP();
613 err_setval(v, w);
614 DECREF(w);
615 w = POP();
616 tb_store(w);
617 DECREF(w);
618 why = WHY_RERAISE;
619 }
620 else if (v != None) {
621 err_setstr(SystemError,
622 "'finally' pops bad exception");
623 why = WHY_EXCEPTION;
624 }
625 DECREF(v);
626 break;
627
628 case BUILD_CLASS:
629 w = POP();
630 v = POP();
631 x = build_class(v, w);
632 PUSH(x);
633 DECREF(v);
634 DECREF(w);
635 break;
636
637 case STORE_NAME:
638 w = GETNAMEV(oparg);
639 v = POP();
640 err = dict2insert(f->f_locals, w, v);
641 DECREF(v);
642 break;
643
644 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000645 w = GETNAMEV(oparg);
646 if ((err = dict2remove(f->f_locals, w)) != 0)
647 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 break;
649
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000650 case UNPACK_VARARG:
651 if (EMPTY()) {
652 err_setstr(TypeError,
653 "no argument list");
654 why = WHY_EXCEPTION;
655 break;
656 }
657 v = POP();
658 if (!is_tupleobject(v)) {
659 err_setstr(TypeError,
660 "bad argument list");
661 why = WHY_EXCEPTION;
662 }
663 else if (gettuplesize(v) < oparg) {
664 err_setstr(TypeError,
665 "not enough arguments");
666 why = WHY_EXCEPTION;
667 }
668 else if (oparg == 0) {
669 PUSH(v);
670 break;
671 }
672 else {
673 x = gettupleslice(v, oparg, gettuplesize(v));
674 if (x != NULL) {
675 PUSH(x);
676 for (; --oparg >= 0; ) {
677 w = gettupleitem(v, oparg);
678 INCREF(w);
679 PUSH(w);
680 }
681 }
682 }
683 DECREF(v);
684 break;
685
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000686 case UNPACK_ARG:
687 /* Implement various compatibility hacks:
688 (a) f(a,b,...) should accept f((1,2,...))
689 (b) f((a,b,...)) should accept f(1,2,...)
690 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
691 */
692 {
693 int n;
694 if (EMPTY()) {
695 err_setstr(TypeError,
696 "no argument list");
697 why = WHY_EXCEPTION;
698 break;
699 }
700 v = POP();
701 if (!is_tupleobject(v)) {
702 err_setstr(TypeError,
703 "bad argument list");
704 why = WHY_EXCEPTION;
705 break;
706 }
707 n = gettuplesize(v);
708 if (n == 1 && oparg != 1) {
709 /* Rule (a) */
710 w = gettupleitem(v, 0);
711 if (is_tupleobject(w)) {
712 INCREF(w);
713 DECREF(v);
714 v = w;
715 n = gettuplesize(v);
716 }
717 }
718 else if (n != 1 && oparg == 1) {
719 /* Rule (b) */
720 PUSH(v);
721 break;
722 /* Don't fall through */
723 }
724 else if (n > 2 && oparg == 2) {
725 /* Rule (c) */
726 int i;
727 w = newtupleobject(n-1);
728 u = newtupleobject(2);
729 if (u == NULL || w == NULL) {
730 XDECREF(w);
731 XDECREF(u);
732 DECREF(v);
733 why = WHY_EXCEPTION;
734 break;
735 }
736 t = gettupleitem(v, 0);
737 INCREF(t);
738 settupleitem(u, 0, t);
739 for (i = 1; i < n; i++) {
740 t = gettupleitem(v, i);
741 INCREF(t);
742 settupleitem(w, i-1, t);
743 }
744 settupleitem(u, 1, w);
745 DECREF(v);
746 v = u;
747 n = 2;
748 }
749 if (n != oparg) {
750 err_setstr(TypeError,
751 "arg count mismatch");
752 why = WHY_EXCEPTION;
753 DECREF(v);
754 break;
755 }
756 PUSH(v);
757 }
758 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 case UNPACK_TUPLE:
760 v = POP();
761 if (!is_tupleobject(v)) {
762 err_setstr(TypeError, "unpack non-tuple");
763 why = WHY_EXCEPTION;
764 }
765 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000766 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 "unpack tuple of wrong size");
768 why = WHY_EXCEPTION;
769 }
770 else {
771 for (; --oparg >= 0; ) {
772 w = gettupleitem(v, oparg);
773 INCREF(w);
774 PUSH(w);
775 }
776 }
777 DECREF(v);
778 break;
779
780 case UNPACK_LIST:
781 v = POP();
782 if (!is_listobject(v)) {
783 err_setstr(TypeError, "unpack non-list");
784 why = WHY_EXCEPTION;
785 }
786 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000787 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 "unpack list of wrong size");
789 why = WHY_EXCEPTION;
790 }
791 else {
792 for (; --oparg >= 0; ) {
793 w = getlistitem(v, oparg);
794 INCREF(w);
795 PUSH(w);
796 }
797 }
798 DECREF(v);
799 break;
800
801 case STORE_ATTR:
802 name = GETNAME(oparg);
803 v = POP();
804 u = POP();
805 err = setattr(v, name, u); /* v.name = u */
806 DECREF(v);
807 DECREF(u);
808 break;
809
810 case DELETE_ATTR:
811 name = GETNAME(oparg);
812 v = POP();
813 err = setattr(v, name, (object *)NULL);
814 /* del v.name */
815 DECREF(v);
816 break;
817
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000818 case STORE_GLOBAL:
819 w = GETNAMEV(oparg);
820 v = POP();
821 err = dict2insert(f->f_globals, w, v);
822 DECREF(v);
823 break;
824
825 case DELETE_GLOBAL:
826 w = GETNAMEV(oparg);
827 if ((err = dict2remove(f->f_globals, w)) != 0)
828 err_setstr(NameError, getstringvalue(w));
829 break;
830
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 case LOAD_CONST:
832 x = GETCONST(oparg);
833 INCREF(x);
834 PUSH(x);
835 break;
836
837 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000838 w = GETNAMEV(oparg);
839 x = dict2lookup(f->f_locals, 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 = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000844 err_clear();
845 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000847 err_setstr(NameError,
848 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 break;
850 }
851 }
852 }
853 INCREF(x);
854 PUSH(x);
855 break;
856
857 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000858 w = GETNAMEV(oparg);
859 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000861 err_clear();
862 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000864 err_setstr(NameError,
865 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000866 break;
867 }
868 }
869 INCREF(x);
870 PUSH(x);
871 break;
872
873 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000874 w = GETNAMEV(oparg);
875 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000877 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 break;
879 }
880 INCREF(x);
881 PUSH(x);
882 break;
883
884 case BUILD_TUPLE:
885 x = newtupleobject(oparg);
886 if (x != NULL) {
887 for (; --oparg >= 0;) {
888 w = POP();
889 err = settupleitem(x, oparg, w);
890 if (err != 0)
891 break;
892 }
893 PUSH(x);
894 }
895 break;
896
897 case BUILD_LIST:
898 x = newlistobject(oparg);
899 if (x != NULL) {
900 for (; --oparg >= 0;) {
901 w = POP();
902 err = setlistitem(x, oparg, w);
903 if (err != 0)
904 break;
905 }
906 PUSH(x);
907 }
908 break;
909
910 case BUILD_MAP:
911 x = newdictobject();
912 PUSH(x);
913 break;
914
915 case LOAD_ATTR:
916 name = GETNAME(oparg);
917 v = POP();
918 x = getattr(v, name);
919 DECREF(v);
920 PUSH(x);
921 break;
922
923 case COMPARE_OP:
924 w = POP();
925 v = POP();
926 x = cmp_outcome((enum cmp_op)oparg, v, w);
927 DECREF(v);
928 DECREF(w);
929 PUSH(x);
930 break;
931
932 case IMPORT_NAME:
933 name = GETNAME(oparg);
934 x = import_module(name);
935 XINCREF(x);
936 PUSH(x);
937 break;
938
939 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000940 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000942 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 break;
944
945 case JUMP_FORWARD:
946 JUMPBY(oparg);
947 break;
948
949 case JUMP_IF_FALSE:
950 if (!testbool(TOP()))
951 JUMPBY(oparg);
952 break;
953
954 case JUMP_IF_TRUE:
955 if (testbool(TOP()))
956 JUMPBY(oparg);
957 break;
958
959 case JUMP_ABSOLUTE:
960 JUMPTO(oparg);
961 break;
962
963 case FOR_LOOP:
964 /* for v in s: ...
965 On entry: stack contains s, i.
966 On exit: stack contains s, i+1, s[i];
967 but if loop exhausted:
968 s, i are popped, and we jump */
969 w = POP(); /* Loop index */
970 v = POP(); /* Sequence object */
971 u = loop_subscript(v, w);
972 if (u != NULL) {
973 PUSH(v);
974 x = newintobject(getintvalue(w)+1);
975 PUSH(x);
976 DECREF(w);
977 PUSH(u);
978 }
979 else {
980 DECREF(v);
981 DECREF(w);
982 /* A NULL can mean "s exhausted"
983 but also an error: */
984 if (err_occurred())
985 why = WHY_EXCEPTION;
986 else
987 JUMPBY(oparg);
988 }
989 break;
990
991 case SETUP_LOOP:
992 case SETUP_EXCEPT:
993 case SETUP_FINALLY:
994 setup_block(f, opcode, INSTR_OFFSET() + oparg,
995 STACK_LEVEL());
996 break;
997
998 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +0000999#ifdef LLTRACE
1000 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 printf("--- Line %d ---\n", oparg);
1002#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001003 f->f_lineno = oparg;
1004 if (trace != NULL) {
1005 /* Trace each line of code reached */
1006 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001007 err = call_trace(&trace, &trace,
1008 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001009 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 break;
1011
1012 default:
1013 fprintf(stderr,
1014 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001015 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 err_setstr(SystemError, "eval_code: unknown opcode");
1017 why = WHY_EXCEPTION;
1018 break;
1019
1020 } /* switch */
1021
1022 on_error:
1023
1024 /* Quickly continue if no error occurred */
1025
1026 if (why == WHY_NOT) {
1027 if (err == 0 && x != NULL)
1028 continue; /* Normal, fast path */
1029 why = WHY_EXCEPTION;
1030 x = None;
1031 err = 0;
1032 }
1033
Guido van Rossum96a42c81992-01-12 02:29:51 +00001034#ifndef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 /* Double-check exception status */
1036
1037 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1038 if (!err_occurred()) {
1039 fprintf(stderr, "XXX ghost error\n");
1040 err_setstr(SystemError, "ghost error");
1041 why = WHY_EXCEPTION;
1042 }
1043 }
1044 else {
1045 if (err_occurred()) {
1046 fprintf(stderr, "XXX undetected error\n");
1047 why = WHY_EXCEPTION;
1048 }
1049 }
1050#endif
1051
1052 /* Log traceback info if this is a real exception */
1053
1054 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001055 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001057 f->f_lasti -= 2;
1058 tb_here(f);
1059
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001060 if (trace)
1061 call_exc_trace(&trace, &trace, f);
1062 if (sys_profile)
1063 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 }
1065
1066 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1067
1068 if (why == WHY_RERAISE)
1069 why = WHY_EXCEPTION;
1070
1071 /* Unwind stacks if a (pseudo) exception occurred */
1072
1073 while (why != WHY_NOT && f->f_iblock > 0) {
1074 block *b = pop_block(f);
1075 while (STACK_LEVEL() > b->b_level) {
1076 v = POP();
1077 XDECREF(v);
1078 }
1079 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1080 why = WHY_NOT;
1081 JUMPTO(b->b_handler);
1082 break;
1083 }
1084 if (b->b_type == SETUP_FINALLY ||
1085 b->b_type == SETUP_EXCEPT &&
1086 why == WHY_EXCEPTION) {
1087 if (why == WHY_EXCEPTION) {
1088 object *exc, *val;
1089 err_get(&exc, &val);
1090 if (val == NULL) {
1091 val = None;
1092 INCREF(val);
1093 }
1094 v = tb_fetch();
1095 /* Make the raw exception data
1096 available to the handler,
1097 so a program can emulate the
1098 Python main loop. Don't do
1099 this for 'finally'. */
1100 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 sysset("exc_value", val);
1103 sysset("exc_type", exc);
1104 err_clear();
1105 }
1106 PUSH(v);
1107 PUSH(val);
1108 PUSH(exc);
1109 }
1110 else {
1111 if (why == WHY_RETURN)
1112 PUSH(retval);
1113 v = newintobject((long)why);
1114 PUSH(v);
1115 }
1116 why = WHY_NOT;
1117 JUMPTO(b->b_handler);
1118 break;
1119 }
1120 } /* unwind stack */
1121
1122 /* End the loop if we still have an error (or return) */
1123
1124 if (why != WHY_NOT)
1125 break;
1126
1127 } /* main loop */
1128
1129 /* Pop remaining stack entries */
1130
1131 while (!EMPTY()) {
1132 v = POP();
1133 XDECREF(v);
1134 }
1135
Guido van Rossum96a42c81992-01-12 02:29:51 +00001136 if (why != WHY_RETURN)
1137 retval = NULL;
1138
1139 if (trace) {
1140 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001141 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001142 XDECREF(retval);
1143 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001144 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001145 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001146 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001147 XDECREF(trace);
1148 }
1149
1150 if (sys_profile && why == WHY_RETURN) {
1151 if (call_trace(&sys_profile, (object**)0,
1152 f, "return", retval)) {
1153 XDECREF(retval);
1154 retval = NULL;
1155 why = WHY_EXCEPTION;
1156 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001157 }
1158
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 /* Restore previous frame and release the current one */
1160
1161 current_frame = f->f_back;
1162 DECREF(f);
1163
Guido van Rossum96a42c81992-01-12 02:29:51 +00001164 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001165}
1166
Guido van Rossum96a42c81992-01-12 02:29:51 +00001167#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001168static int
1169prtrace(v, str)
1170 object *v;
1171 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001173 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001174 if (printobject(v, stdout, 0) != 0)
1175 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001176 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001180static void
1181call_exc_trace(p_trace, p_newtrace, f)
1182 object **p_trace, **p_newtrace;
1183 frameobject *f;
1184{
1185 object *type, *value, *traceback, *arg;
1186 int err;
1187 err_get(&type, &value);
1188 traceback = tb_fetch();
1189 arg = newtupleobject(3);
1190 if (arg == NULL) {
1191 err = -1;
1192 goto cleanup;
1193 }
1194 settupleitem(arg, 0, type);
1195 settupleitem(arg, 1, value);
1196 settupleitem(arg, 2, traceback);
1197 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1198 XDECREF(arg);
1199 cleanup:
1200 if (!err) {
1201 /* Restore original exception */
1202 err_setval(type, value);
1203 tb_store(traceback);
1204 }
1205}
1206
1207static int
1208call_trace(p_trace, p_newtrace, f, msg, arg)
1209 object **p_trace; /* in/out; may not be NULL;
1210 may not point to NULL variable initially */
1211 object **p_newtrace; /* in/out; may be NULL;
1212 may point to NULL variable;
1213 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001214 frameobject *f;
1215 char *msg;
1216 object *arg;
1217{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001218 object *arglist, *what;
1219 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001220 static int tracing = 0;
1221
1222 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001223 /* Don't do recursive traces */
1224 if (p_newtrace) {
1225 XDECREF(*p_newtrace);
1226 *p_newtrace = NULL;
1227 }
1228 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001229 }
1230
1231 arglist = newtupleobject(3);
1232 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001233 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001234 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001235 if (what == NULL)
1236 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001237 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001238 settupleitem(arglist, 0, (object *)f);
1239 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001240 if (arg == NULL)
1241 arg = None;
1242 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001243 settupleitem(arglist, 2, arg);
1244 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001245 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001246 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001247 cleanup:
1248 XDECREF(arglist);
1249 if (res == NULL) {
1250 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001251 tb_here(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001252 XDECREF(*p_trace);
1253 *p_trace = NULL;
1254 if (p_newtrace) {
1255 XDECREF(*p_newtrace);
1256 *p_newtrace = NULL;
1257 }
1258 }
1259 else {
1260 if (p_newtrace) {
1261 XDECREF(*p_newtrace);
1262 if (res == None)
1263 *p_newtrace = NULL;
1264 else {
1265 INCREF(res);
1266 *p_newtrace = res;
1267 }
1268 }
1269 DECREF(res);
1270 }
1271 if (res == NULL)
1272 return -1;
1273 else
1274 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001275}
1276
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277object *
1278getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001280 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001281 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001282 else
1283 return current_frame->f_locals;
1284}
1285
1286object *
1287getglobals()
1288{
1289 if (current_frame == NULL)
1290 return NULL;
1291 else
1292 return current_frame->f_globals;
1293}
1294
1295void
1296printtraceback(fp)
1297 FILE *fp;
1298{
1299 object *v = tb_fetch();
1300 if (v != NULL) {
1301 fprintf(fp, "Stack backtrace (innermost last):\n");
1302 tb_print(v, fp);
1303 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305}
1306
1307
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308void
1309flushline()
1310{
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 if (softspace(sysget("stdout"), 0))
1312 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313}
1314
Guido van Rossum3f5da241990-12-20 15:06:42 +00001315
1316/* Test a value used as condition, e.g., in a for or if statement */
1317
1318static int
1319testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320 object *v;
1321{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001322 if (v == None)
1323 return 0;
1324 if (v->ob_type->tp_as_number != NULL)
1325 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001326 if (v->ob_type->tp_as_sequence != NULL)
1327 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1328 if (v->ob_type->tp_as_mapping != NULL)
1329 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001330 /* All other objects are 'true' */
1331 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332}
1333
1334static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001335or(v, w)
1336 object *v, *w;
1337{
1338 if (v->ob_type->tp_as_number != NULL) {
1339 object *x;
1340 object * (*f) FPROTO((object *, object *));
1341 if (coerce(&v, &w) != 0)
1342 return NULL;
1343 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1344 x = (*f)(v, w);
1345 DECREF(v);
1346 DECREF(w);
1347 if (f != NULL)
1348 return x;
1349 }
1350 err_setstr(TypeError, "bad operand type(s) for |");
1351 return NULL;
1352}
1353
1354static object *
1355xor(v, w)
1356 object *v, *w;
1357{
1358 if (v->ob_type->tp_as_number != NULL) {
1359 object *x;
1360 object * (*f) FPROTO((object *, object *));
1361 if (coerce(&v, &w) != 0)
1362 return NULL;
1363 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1364 x = (*f)(v, w);
1365 DECREF(v);
1366 DECREF(w);
1367 if (f != NULL)
1368 return x;
1369 }
1370 err_setstr(TypeError, "bad operand type(s) for ^");
1371 return NULL;
1372}
1373
1374static object *
1375and(v, w)
1376 object *v, *w;
1377{
1378 if (v->ob_type->tp_as_number != NULL) {
1379 object *x;
1380 object * (*f) FPROTO((object *, object *));
1381 if (coerce(&v, &w) != 0)
1382 return NULL;
1383 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1384 x = (*f)(v, w);
1385 DECREF(v);
1386 DECREF(w);
1387 if (f != NULL)
1388 return x;
1389 }
1390 err_setstr(TypeError, "bad operand type(s) for &");
1391 return NULL;
1392}
1393
1394static object *
1395lshift(v, w)
1396 object *v, *w;
1397{
1398 if (v->ob_type->tp_as_number != NULL) {
1399 object *x;
1400 object * (*f) FPROTO((object *, object *));
1401 if (coerce(&v, &w) != 0)
1402 return NULL;
1403 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1404 x = (*f)(v, w);
1405 DECREF(v);
1406 DECREF(w);
1407 if (f != NULL)
1408 return x;
1409 }
1410 err_setstr(TypeError, "bad operand type(s) for <<");
1411 return NULL;
1412}
1413
1414static object *
1415rshift(v, w)
1416 object *v, *w;
1417{
1418 if (v->ob_type->tp_as_number != NULL) {
1419 object *x;
1420 object * (*f) FPROTO((object *, object *));
1421 if (coerce(&v, &w) != 0)
1422 return NULL;
1423 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1424 x = (*f)(v, w);
1425 DECREF(v);
1426 DECREF(w);
1427 if (f != NULL)
1428 return x;
1429 }
1430 err_setstr(TypeError, "bad operand type(s) for >>");
1431 return NULL;
1432}
1433
1434static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001435add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 object *v, *w;
1437{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001438 if (v->ob_type->tp_as_number != NULL) {
1439 object *x;
1440 if (coerce(&v, &w) != 0)
1441 return NULL;
1442 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1443 DECREF(v);
1444 DECREF(w);
1445 return x;
1446 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001448 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 return NULL;
1452 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453}
1454
1455static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001456sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 object *v, *w;
1458{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001459 if (v->ob_type->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_subtract)(v, w);
1464 DECREF(v);
1465 DECREF(w);
1466 return x;
1467 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001468 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 return NULL;
1470}
1471
1472static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 object *v, *w;
1475{
1476 typeobject *tp;
1477 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1478 /* int*sequence -- swap v and w */
1479 object *tmp = v;
1480 v = w;
1481 w = tmp;
1482 }
1483 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001484 if (tp->tp_as_number != NULL) {
1485 object *x;
1486 if (coerce(&v, &w) != 0)
1487 return NULL;
1488 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1489 DECREF(v);
1490 DECREF(w);
1491 return x;
1492 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493 if (tp->tp_as_sequence != NULL) {
1494 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001495 err_setstr(TypeError,
1496 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497 return NULL;
1498 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499 return (*tp->tp_as_sequence->sq_repeat)
1500 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001502 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001503 return NULL;
1504}
1505
1506static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001507divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 object *v, *w;
1509{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001510 if (v->ob_type->tp_as_number != NULL) {
1511 object *x;
1512 if (coerce(&v, &w) != 0)
1513 return NULL;
1514 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1515 DECREF(v);
1516 DECREF(w);
1517 return x;
1518 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001519 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520 return NULL;
1521}
1522
1523static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001524rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001525 object *v, *w;
1526{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001527 if (v->ob_type->tp_as_number != NULL) {
1528 object *x;
1529 if (coerce(&v, &w) != 0)
1530 return NULL;
1531 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1532 DECREF(v);
1533 DECREF(w);
1534 return x;
1535 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001536 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 return NULL;
1538}
1539
1540static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001541neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 object *v;
1543{
1544 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001545 return (*v->ob_type->tp_as_number->nb_negative)(v);
1546 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 return NULL;
1548}
1549
1550static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001551pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 object *v;
1553{
1554 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555 return (*v->ob_type->tp_as_number->nb_positive)(v);
1556 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 return NULL;
1558}
1559
1560static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001561invert(v)
1562 object *v;
1563{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001564 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001565 if (v->ob_type->tp_as_number != NULL &&
1566 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1567 return (*f)(v);
1568 err_setstr(TypeError, "bad operand type(s) for unary ~");
1569 return NULL;
1570}
1571
1572static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001573not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 object *v;
1575{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001576 int outcome = testbool(v);
1577 object *w = outcome == 0 ? True : False;
1578 INCREF(w);
1579 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001581/* External interface to call any callable object. The arg may be NULL. */
1582
1583object *
1584call_object(func, arg)
1585 object *func;
1586 object *arg;
1587{
1588 if (is_instancemethodobject(func) || is_funcobject(func))
1589 return call_function(func, arg);
1590 else
1591 return call_builtin(func, arg);
1592}
1593
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001595call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001597 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599 if (is_methodobject(func)) {
1600 method meth = getmethod(func);
1601 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001602 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1603 int size = gettuplesize(arg);
1604 if (size == 1)
1605 arg = gettupleitem(arg, 0);
1606 else if (size == 0)
1607 arg = NULL;
1608 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001609 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001610 }
1611 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001612 if (arg != NULL &&
1613 !(is_tupleobject(arg) &&
1614 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001615 err_setstr(TypeError,
1616 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 return NULL;
1618 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001621 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 return NULL;
1623}
1624
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001628 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630 object *newarg = NULL;
1631 object *newlocals, *newglobals;
1632 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633
Guido van Rossume8122f11991-05-05 20:03:07 +00001634 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001635 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001636 object *self = instancemethodgetself(func);
1637 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001638 if (arg == NULL)
1639 argcount = 0;
1640 else if (is_tupleobject(arg))
1641 argcount = gettuplesize(arg);
1642 else
1643 argcount = 1;
1644 newarg = newtupleobject(argcount + 1);
1645 if (newarg == NULL)
1646 return NULL;
1647 INCREF(self);
1648 settupleitem(newarg, 0, self);
1649 if (arg != NULL && !is_tupleobject(arg)) {
1650 INCREF(arg);
1651 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 }
1653 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001654 int i;
1655 object *v;
1656 for (i = 0; i < argcount; i++) {
1657 v = gettupleitem(arg, i);
1658 XINCREF(v);
1659 settupleitem(newarg, i+1, v);
1660 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001662 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 }
1664 else {
1665 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001666 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667 return NULL;
1668 }
1669 }
1670
Guido van Rossum3f5da241990-12-20 15:06:42 +00001671 co = getfunccode(func);
1672 if (co == NULL) {
1673 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001674 return NULL;
1675 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676 if (!is_codeobject(co)) {
1677 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 abort();
1679 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001680 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001682 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 return NULL;
1684 }
1685
Guido van Rossum3f5da241990-12-20 15:06:42 +00001686 newglobals = getfuncglobals(func);
1687 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688
Guido van Rossum3f5da241990-12-20 15:06:42 +00001689 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691 DECREF(newlocals);
1692 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695
1696 return v;
1697}
1698
1699static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 object *v, *w;
1702{
1703 typeobject *tp = v->ob_type;
1704 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001705 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 return NULL;
1707 }
1708 if (tp->tp_as_sequence != NULL) {
1709 int i;
1710 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 return NULL;
1713 }
1714 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001715 if (i < 0)
1716 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001717 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001718 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001719 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720}
1721
1722static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 object *v, *w;
1725{
1726 sequence_methods *sq = v->ob_type->tp_as_sequence;
1727 int i, n;
1728 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 return NULL;
1731 }
1732 i = getintvalue(w);
1733 n = (*sq->sq_length)(v);
1734 if (i >= n)
1735 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001736 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737}
1738
1739static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 object *v;
1742 int isize;
1743 int *pi;
1744{
1745 if (v != NULL) {
1746 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001747 err_setstr(TypeError, "slice index must be int");
1748 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 }
1750 *pi = getintvalue(v);
1751 if (*pi < 0)
1752 *pi += isize;
1753 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001754 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755}
1756
1757static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001758apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 object *u, *v, *w;
1760{
1761 typeobject *tp = u->ob_type;
1762 int ilow, ihigh, isize;
1763 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001764 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765 return NULL;
1766 }
1767 ilow = 0;
1768 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001771 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001773 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775
1776static int
1777assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778 object *w;
1779 object *key;
1780 object *v;
1781{
1782 typeobject *tp = w->ob_type;
1783 sequence_methods *sq;
1784 mapping_methods *mp;
1785 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 if ((sq = tp->tp_as_sequence) != NULL &&
1787 (func = sq->sq_ass_item) != NULL) {
1788 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001789 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001790 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001791 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001793 else {
1794 int i = getintvalue(key);
1795 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001796 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001797 return (*func)(w, i, v);
1798 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 }
1800 else if ((mp = tp->tp_as_mapping) != NULL &&
1801 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001802 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 }
1804 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001805 err_setstr(TypeError,
1806 "can't assign to this subscripted object");
1807 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809}
1810
Guido van Rossum3f5da241990-12-20 15:06:42 +00001811static int
1812assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 object *u, *v, *w, *x;
1814{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001817 if (sq == NULL) {
1818 err_setstr(TypeError, "assign to slice of non-sequence");
1819 return -1;
1820 }
1821 if (sq == NULL || sq->sq_ass_slice == NULL) {
1822 err_setstr(TypeError, "unassignable slice");
1823 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 }
1825 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001826 isize = ihigh = (*sq->sq_length)(u);
1827 if (slice_index(v, isize, &ilow) != 0)
1828 return -1;
1829 if (slice_index(w, isize, &ihigh) != 0)
1830 return -1;
1831 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832}
1833
1834static int
1835cmp_exception(err, v)
1836 object *err, *v;
1837{
1838 if (is_tupleobject(v)) {
1839 int i, n;
1840 n = gettuplesize(v);
1841 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001842 /* Test recursively */
1843 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 return 1;
1845 }
1846 return 0;
1847 }
1848 return err == v;
1849}
1850
Guido van Rossum3f5da241990-12-20 15:06:42 +00001851static int
1852cmp_member(v, w)
1853 object *v, *w;
1854{
1855 int i, n, cmp;
1856 object *x;
1857 sequence_methods *sq;
1858 /* Special case for char in string */
1859 if (is_stringobject(w)) {
1860 register char *s, *end;
1861 register char c;
1862 if (!is_stringobject(v) || getstringsize(v) != 1) {
1863 err_setstr(TypeError,
1864 "string member test needs char left operand");
1865 return -1;
1866 }
1867 c = getstringvalue(v)[0];
1868 s = getstringvalue(w);
1869 end = s + getstringsize(w);
1870 while (s < end) {
1871 if (c == *s++)
1872 return 1;
1873 }
1874 return 0;
1875 }
1876 sq = w->ob_type->tp_as_sequence;
1877 if (sq == NULL) {
1878 err_setstr(TypeError,
1879 "'in' or 'not in' needs sequence right argument");
1880 return -1;
1881 }
1882 n = (*sq->sq_length)(w);
1883 for (i = 0; i < n; i++) {
1884 x = (*sq->sq_item)(w, i);
1885 cmp = cmpobject(v, x);
1886 XDECREF(x);
1887 if (cmp == 0)
1888 return 1;
1889 }
1890 return 0;
1891}
1892
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001894cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 enum cmp_op op;
1896 register object *v;
1897 register object *w;
1898{
1899 register int cmp;
1900 register int res = 0;
1901 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001902 case IS:
1903 case IS_NOT:
1904 res = (v == w);
1905 if (op == IS_NOT)
1906 res = !res;
1907 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 case IN:
1909 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001910 res = cmp_member(v, w);
1911 if (res < 0)
1912 return NULL;
1913 if (op == NOT_IN)
1914 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 break;
1916 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001917 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 break;
1919 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920 cmp = cmpobject(v, w);
1921 switch (op) {
1922 case LT: res = cmp < 0; break;
1923 case LE: res = cmp <= 0; break;
1924 case EQ: res = cmp == 0; break;
1925 case NE: res = cmp != 0; break;
1926 case GT: res = cmp > 0; break;
1927 case GE: res = cmp >= 0; break;
1928 /* XXX no default? (res is initialized to 0 though) */
1929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 }
1931 v = res ? True : False;
1932 INCREF(v);
1933 return v;
1934}
1935
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936static int
1937import_from(locals, v, name)
1938 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001939 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001940 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001941{
1942 object *w, *x;
1943 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001944 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001945 int i;
1946 int n = getdictsize(w);
1947 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001948 name = getdict2key(w, i);
1949 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001950 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001951 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001952 if (x == NULL) {
1953 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001954 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001956 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001957 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001959 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001960 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001961 }
1962 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001963 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001965 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00001966 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00001967 getstringvalue(name));
1968 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001969 return -1;
1970 }
1971 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001972 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001973 }
1974}
1975
1976static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001978 object *v; /* None or tuple containing base classes */
1979 object *w; /* dictionary */
1980{
1981 if (is_tupleobject(v)) {
1982 int i;
1983 for (i = gettuplesize(v); --i >= 0; ) {
1984 object *x = gettupleitem(v, i);
1985 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986 err_setstr(TypeError,
1987 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001988 return NULL;
1989 }
1990 }
1991 }
1992 else {
1993 v = NULL;
1994 }
1995 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001997 return NULL;
1998 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00001999 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002000}