blob: ed99aead39ab182493e38d41824231b5176e0aa3 [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 */
Guido van Rossum374a9221991-04-04 10:40:29 +000045
Guido van Rossum0a066c01992-03-27 17:29:15 +000046#ifdef LLTRACE
47static int prtrace PROTO((object *, char *));
48#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000049static void call_exc_trace PROTO((object **, object**, frameobject *));
50static int call_trace
51 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000052static int testbool PROTO((object *));
53static object *add PROTO((object *, object *));
54static object *sub PROTO((object *, object *));
55static object *mul PROTO((object *, object *));
56static object *divide PROTO((object *, object *));
57static object *rem PROTO((object *, object *));
58static object *neg PROTO((object *));
59static object *pos PROTO((object *));
60static object *not PROTO((object *));
61static object *invert PROTO((object *));
62static object *lshift PROTO((object *, object *));
63static object *rshift PROTO((object *, object *));
64static object *and PROTO((object *, object *));
65static object *xor PROTO((object *, object *));
66static object *or PROTO((object *, object *));
67static object *call_builtin PROTO((object *, object *));
68static object *call_function PROTO((object *, object *));
69static object *apply_subscript PROTO((object *, object *));
70static object *loop_subscript PROTO((object *, object *));
71static int slice_index PROTO((object *, int, int *));
72static object *apply_slice PROTO((object *, object *, object *));
73static int assign_subscript PROTO((object *, object *, object *));
74static int assign_slice PROTO((object *, object *, object *, object *));
75static int cmp_exception PROTO((object *, object *));
76static int cmp_member PROTO((object *, object *));
77static object *cmp_outcome PROTO((enum cmp_op, object *, object *));
78static int import_from PROTO((object *, object *, object *));
79static object *build_class PROTO((object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000080
81
Guido van Rossum0a066c01992-03-27 17:29:15 +000082/* Pointer to current frame, used to link new frames to */
83
Guido van Rossum374a9221991-04-04 10:40:29 +000084static frameobject *current_frame;
85
86
87/* Status code for main loop (reason for stack unwind) */
88
89enum why_code {
90 WHY_NOT, /* No error */
91 WHY_EXCEPTION, /* Exception occurred */
92 WHY_RERAISE, /* Exception re-raised by 'finally' */
93 WHY_RETURN, /* 'return' statement */
94 WHY_BREAK /* 'break' statement */
95};
96
97
98/* Interpreter main loop */
99
100object *
101eval_code(co, globals, locals, arg)
102 codeobject *co;
103 object *globals;
104 object *locals;
105 object *arg;
106{
107 register unsigned char *next_instr;
108 register int opcode; /* Current opcode */
109 register int oparg; /* Current opcode argument, if any */
110 register object **stack_pointer;
111 register enum why_code why; /* Reason for block stack unwind */
112 register int err; /* Error status -- nonzero if error */
113 register object *x; /* Result object -- NULL if error */
114 register object *v; /* Temporary objects popped off stack */
115 register object *w;
116 register object *u;
117 register object *t;
118 register frameobject *f; /* Current frame */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000119 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000120 object *retval; /* Return value iff why == WHY_RETURN */
121 char *name; /* Name used by some instructions */
122 FILE *fp; /* Used by print operations */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000123#ifdef LLTRACE
124 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000125#endif
126
127/* Code access macros */
128
129#define GETCONST(i) Getconst(f, i)
130#define GETNAME(i) Getname(f, i)
131#define GETNAMEV(i) Getnamev(f, i)
132#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
133#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
134#define NEXTOP() (*next_instr++)
135#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
136#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
137#define JUMPBY(x) (next_instr += (x))
138
139/* Stack manipulation macros */
140
141#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
142#define EMPTY() (STACK_LEVEL() == 0)
143#define TOP() (stack_pointer[-1])
144#define BASIC_PUSH(v) (*stack_pointer++ = (v))
145#define BASIC_POP() (*--stack_pointer)
146
Guido van Rossum96a42c81992-01-12 02:29:51 +0000147#ifdef LLTRACE
148#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
149#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000150#else
151#define PUSH(v) BASIC_PUSH(v)
152#define POP() BASIC_POP()
153#endif
154
155 f = newframeobject(
156 current_frame, /*back*/
157 co, /*code*/
158 globals, /*globals*/
159 locals, /*locals*/
160 50, /*nvalues*/
161 20); /*nblocks*/
162 if (f == NULL)
163 return NULL;
164
165 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000166
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000167 if (sys_trace != NULL) {
168 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000169 be called on *every* entry to a code block.
170 Its return value, if not None, is a function that
171 will be called at the start of each executed line
172 of code. (Actually, the function must return
173 itself in order to continue tracing.)
174 The trace functions are called with three arguments:
175 a pointer to the current frame, a string indicating
176 why the function is called, and an argument which
177 depends on the situation. The global trace function
178 (sys.trace) is also called whenever an exception
179 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000180 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000181 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000182 current_frame = f->f_back;
183 DECREF(f);
184 return NULL;
185 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000186 }
187
188 if (sys_profile != NULL) {
189 /* Similar for sys_profile, except it needn't return
190 itself and isn't called for "line" events */
191 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
192 current_frame = f->f_back;
193 DECREF(f);
194 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000195 }
196 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000197
198 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000199 stack_pointer = f->f_valuestack;
200
201 if (arg != NULL) {
202 INCREF(arg);
203 PUSH(arg);
204 }
205
206 why = WHY_NOT;
207 err = 0;
208 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000209
210 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000211 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000212
213 /* Do periodic things */
214
215 if (--ticker < 0) {
216 ticker = 100;
217 if (intrcheck()) {
218 err_set(KeyboardInterrupt);
219 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000220 goto on_error;
221 }
222 }
223
224 /* Extract opcode and argument */
225
226 opcode = NEXTOP();
227 if (HAS_ARG(opcode))
228 oparg = NEXTARG();
229
Guido van Rossum96a42c81992-01-12 02:29:51 +0000230#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000231 /* Instruction tracing */
232
Guido van Rossum96a42c81992-01-12 02:29:51 +0000233 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000234 if (HAS_ARG(opcode)) {
235 printf("%d: %d, %d\n",
236 (int) (INSTR_OFFSET() - 3),
237 opcode, oparg);
238 }
239 else {
240 printf("%d: %d\n",
241 (int) (INSTR_OFFSET() - 1), opcode);
242 }
243 }
244#endif
245
246 /* Main switch on opcode */
247
248 switch (opcode) {
249
250 /* BEWARE!
251 It is essential that any operation that fails sets either
252 x to NULL, err to nonzero, or why to anything but WHY_NOT,
253 and that no operation that succeeds does this! */
254
255 /* case STOP_CODE: this is an error! */
256
257 case POP_TOP:
258 v = POP();
259 DECREF(v);
260 break;
261
262 case ROT_TWO:
263 v = POP();
264 w = POP();
265 PUSH(v);
266 PUSH(w);
267 break;
268
269 case ROT_THREE:
270 v = POP();
271 w = POP();
272 x = POP();
273 PUSH(v);
274 PUSH(x);
275 PUSH(w);
276 break;
277
278 case DUP_TOP:
279 v = TOP();
280 INCREF(v);
281 PUSH(v);
282 break;
283
284 case UNARY_POSITIVE:
285 v = POP();
286 x = pos(v);
287 DECREF(v);
288 PUSH(x);
289 break;
290
291 case UNARY_NEGATIVE:
292 v = POP();
293 x = neg(v);
294 DECREF(v);
295 PUSH(x);
296 break;
297
298 case UNARY_NOT:
299 v = POP();
300 x = not(v);
301 DECREF(v);
302 PUSH(x);
303 break;
304
305 case UNARY_CONVERT:
306 v = POP();
307 x = reprobject(v);
308 DECREF(v);
309 PUSH(x);
310 break;
311
312 case UNARY_CALL:
313 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000314 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000315 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000316 DECREF(v);
317 PUSH(x);
318 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000319
320 case UNARY_INVERT:
321 v = POP();
322 x = invert(v);
323 DECREF(v);
324 PUSH(x);
325 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000326
327 case BINARY_MULTIPLY:
328 w = POP();
329 v = POP();
330 x = mul(v, w);
331 DECREF(v);
332 DECREF(w);
333 PUSH(x);
334 break;
335
336 case BINARY_DIVIDE:
337 w = POP();
338 v = POP();
339 x = divide(v, w);
340 DECREF(v);
341 DECREF(w);
342 PUSH(x);
343 break;
344
345 case BINARY_MODULO:
346 w = POP();
347 v = POP();
348 x = rem(v, w);
349 DECREF(v);
350 DECREF(w);
351 PUSH(x);
352 break;
353
354 case BINARY_ADD:
355 w = POP();
356 v = POP();
357 x = add(v, w);
358 DECREF(v);
359 DECREF(w);
360 PUSH(x);
361 break;
362
363 case BINARY_SUBTRACT:
364 w = POP();
365 v = POP();
366 x = sub(v, w);
367 DECREF(v);
368 DECREF(w);
369 PUSH(x);
370 break;
371
372 case BINARY_SUBSCR:
373 w = POP();
374 v = POP();
375 x = apply_subscript(v, w);
376 DECREF(v);
377 DECREF(w);
378 PUSH(x);
379 break;
380
381 case BINARY_CALL:
382 w = POP();
383 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000384 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000385 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000386 DECREF(v);
387 DECREF(w);
388 PUSH(x);
389 break;
390
Guido van Rossum7928cd71991-10-24 14:59:31 +0000391 case BINARY_LSHIFT:
392 w = POP();
393 v = POP();
394 x = lshift(v, w);
395 DECREF(v);
396 DECREF(w);
397 PUSH(x);
398 break;
399
400 case BINARY_RSHIFT:
401 w = POP();
402 v = POP();
403 x = rshift(v, w);
404 DECREF(v);
405 DECREF(w);
406 PUSH(x);
407 break;
408
409 case BINARY_AND:
410 w = POP();
411 v = POP();
412 x = and(v, w);
413 DECREF(v);
414 DECREF(w);
415 PUSH(x);
416 break;
417
418 case BINARY_XOR:
419 w = POP();
420 v = POP();
421 x = xor(v, w);
422 DECREF(v);
423 DECREF(w);
424 PUSH(x);
425 break;
426
427 case BINARY_OR:
428 w = POP();
429 v = POP();
430 x = or(v, w);
431 DECREF(v);
432 DECREF(w);
433 PUSH(x);
434 break;
435
Guido van Rossum374a9221991-04-04 10:40:29 +0000436 case SLICE+0:
437 case SLICE+1:
438 case SLICE+2:
439 case SLICE+3:
440 if ((opcode-SLICE) & 2)
441 w = POP();
442 else
443 w = NULL;
444 if ((opcode-SLICE) & 1)
445 v = POP();
446 else
447 v = NULL;
448 u = POP();
449 x = apply_slice(u, v, w);
450 DECREF(u);
451 XDECREF(v);
452 XDECREF(w);
453 PUSH(x);
454 break;
455
456 case STORE_SLICE+0:
457 case STORE_SLICE+1:
458 case STORE_SLICE+2:
459 case STORE_SLICE+3:
460 if ((opcode-STORE_SLICE) & 2)
461 w = POP();
462 else
463 w = NULL;
464 if ((opcode-STORE_SLICE) & 1)
465 v = POP();
466 else
467 v = NULL;
468 u = POP();
469 t = POP();
470 err = assign_slice(u, v, w, t); /* u[v:w] = t */
471 DECREF(t);
472 DECREF(u);
473 XDECREF(v);
474 XDECREF(w);
475 break;
476
477 case DELETE_SLICE+0:
478 case DELETE_SLICE+1:
479 case DELETE_SLICE+2:
480 case DELETE_SLICE+3:
481 if ((opcode-DELETE_SLICE) & 2)
482 w = POP();
483 else
484 w = NULL;
485 if ((opcode-DELETE_SLICE) & 1)
486 v = POP();
487 else
488 v = NULL;
489 u = POP();
490 err = assign_slice(u, v, w, (object *)NULL);
491 /* del u[v:w] */
492 DECREF(u);
493 XDECREF(v);
494 XDECREF(w);
495 break;
496
497 case STORE_SUBSCR:
498 w = POP();
499 v = POP();
500 u = POP();
501 /* v[w] = u */
502 err = assign_subscript(v, w, u);
503 DECREF(u);
504 DECREF(v);
505 DECREF(w);
506 break;
507
508 case DELETE_SUBSCR:
509 w = POP();
510 v = POP();
511 /* del v[w] */
512 err = assign_subscript(v, w, (object *)NULL);
513 DECREF(v);
514 DECREF(w);
515 break;
516
517 case PRINT_EXPR:
518 v = POP();
519 fp = sysgetfile("stdout", stdout);
520 /* Print value except if procedure result */
521 if (v != None) {
522 flushline();
523 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000524 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000525 flushline();
526 }
527 DECREF(v);
528 break;
529
530 case PRINT_ITEM:
531 v = POP();
532 fp = sysgetfile("stdout", stdout);
533 if (softspace(sysget("stdout"), 1))
534 fprintf(fp, " ");
535 if (is_stringobject(v)) {
536 char *s = getstringvalue(v);
537 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000538 fwrite(s, 1, len, fp);
Guido van Rossum299a7341992-03-04 16:39:08 +0000539 if (ferror(fp)) {
540 err_errno(IOError);
541 err = -1;
542 }
543 else if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000544 softspace(sysget("stdout"), 0);
545 }
546 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000547 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 }
549 DECREF(v);
550 break;
551
552 case PRINT_NEWLINE:
553 fp = sysgetfile("stdout", stdout);
554 fprintf(fp, "\n");
555 softspace(sysget("stdout"), 0);
556 break;
557
558 case BREAK_LOOP:
559 why = WHY_BREAK;
560 break;
561
562 case RAISE_EXCEPTION:
563 v = POP();
564 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000565 /* A tuple is equivalent to its first element here */
566 while (is_tupleobject(w)) {
567 u = w;
568 w = gettupleitem(u, 0);
569 DECREF(u);
570 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000571 if (!is_stringobject(w))
572 err_setstr(TypeError,
573 "exceptions must be strings");
574 else
575 err_setval(w, v);
576 DECREF(v);
577 DECREF(w);
578 why = WHY_EXCEPTION;
579 break;
580
581 case LOAD_LOCALS:
582 v = f->f_locals;
583 INCREF(v);
584 PUSH(v);
585 break;
586
587 case RETURN_VALUE:
588 retval = POP();
589 why = WHY_RETURN;
590 break;
591
Guido van Rossum374a9221991-04-04 10:40:29 +0000592 case BUILD_FUNCTION:
593 v = POP();
594 x = newfuncobject(v, f->f_globals);
595 DECREF(v);
596 PUSH(x);
597 break;
598
599 case POP_BLOCK:
600 {
601 block *b = pop_block(f);
602 while (STACK_LEVEL() > b->b_level) {
603 v = POP();
604 DECREF(v);
605 }
606 }
607 break;
608
609 case END_FINALLY:
610 v = POP();
611 if (is_intobject(v)) {
612 why = (enum why_code) getintvalue(v);
613 if (why == WHY_RETURN)
614 retval = POP();
615 }
616 else if (is_stringobject(v)) {
617 w = POP();
618 err_setval(v, w);
619 DECREF(w);
620 w = POP();
621 tb_store(w);
622 DECREF(w);
623 why = WHY_RERAISE;
624 }
625 else if (v != None) {
626 err_setstr(SystemError,
627 "'finally' pops bad exception");
628 why = WHY_EXCEPTION;
629 }
630 DECREF(v);
631 break;
632
633 case BUILD_CLASS:
634 w = POP();
635 v = POP();
636 x = build_class(v, w);
637 PUSH(x);
638 DECREF(v);
639 DECREF(w);
640 break;
641
642 case STORE_NAME:
643 w = GETNAMEV(oparg);
644 v = POP();
645 err = dict2insert(f->f_locals, w, v);
646 DECREF(v);
647 break;
648
649 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000650 w = GETNAMEV(oparg);
651 if ((err = dict2remove(f->f_locals, w)) != 0)
652 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 break;
654
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000655 case UNPACK_VARARG:
656 if (EMPTY()) {
657 err_setstr(TypeError,
658 "no argument list");
659 why = WHY_EXCEPTION;
660 break;
661 }
662 v = POP();
663 if (!is_tupleobject(v)) {
664 err_setstr(TypeError,
665 "bad argument list");
666 why = WHY_EXCEPTION;
667 }
668 else if (gettuplesize(v) < oparg) {
669 err_setstr(TypeError,
670 "not enough arguments");
671 why = WHY_EXCEPTION;
672 }
673 else if (oparg == 0) {
674 PUSH(v);
675 break;
676 }
677 else {
678 x = gettupleslice(v, oparg, gettuplesize(v));
679 if (x != NULL) {
680 PUSH(x);
681 for (; --oparg >= 0; ) {
682 w = gettupleitem(v, oparg);
683 INCREF(w);
684 PUSH(w);
685 }
686 }
687 }
688 DECREF(v);
689 break;
690
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000691 case UNPACK_ARG:
692 /* Implement various compatibility hacks:
693 (a) f(a,b,...) should accept f((1,2,...))
694 (b) f((a,b,...)) should accept f(1,2,...)
695 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
696 */
697 {
698 int n;
699 if (EMPTY()) {
700 err_setstr(TypeError,
701 "no argument list");
702 why = WHY_EXCEPTION;
703 break;
704 }
705 v = POP();
706 if (!is_tupleobject(v)) {
707 err_setstr(TypeError,
708 "bad argument list");
709 why = WHY_EXCEPTION;
710 break;
711 }
712 n = gettuplesize(v);
713 if (n == 1 && oparg != 1) {
714 /* Rule (a) */
715 w = gettupleitem(v, 0);
716 if (is_tupleobject(w)) {
717 INCREF(w);
718 DECREF(v);
719 v = w;
720 n = gettuplesize(v);
721 }
722 }
723 else if (n != 1 && oparg == 1) {
724 /* Rule (b) */
725 PUSH(v);
726 break;
727 /* Don't fall through */
728 }
729 else if (n > 2 && oparg == 2) {
730 /* Rule (c) */
731 int i;
732 w = newtupleobject(n-1);
733 u = newtupleobject(2);
734 if (u == NULL || w == NULL) {
735 XDECREF(w);
736 XDECREF(u);
737 DECREF(v);
738 why = WHY_EXCEPTION;
739 break;
740 }
741 t = gettupleitem(v, 0);
742 INCREF(t);
743 settupleitem(u, 0, t);
744 for (i = 1; i < n; i++) {
745 t = gettupleitem(v, i);
746 INCREF(t);
747 settupleitem(w, i-1, t);
748 }
749 settupleitem(u, 1, w);
750 DECREF(v);
751 v = u;
752 n = 2;
753 }
754 if (n != oparg) {
755 err_setstr(TypeError,
756 "arg count mismatch");
757 why = WHY_EXCEPTION;
758 DECREF(v);
759 break;
760 }
761 PUSH(v);
762 }
763 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 case UNPACK_TUPLE:
765 v = POP();
766 if (!is_tupleobject(v)) {
767 err_setstr(TypeError, "unpack non-tuple");
768 why = WHY_EXCEPTION;
769 }
770 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000771 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 "unpack tuple of wrong size");
773 why = WHY_EXCEPTION;
774 }
775 else {
776 for (; --oparg >= 0; ) {
777 w = gettupleitem(v, oparg);
778 INCREF(w);
779 PUSH(w);
780 }
781 }
782 DECREF(v);
783 break;
784
785 case UNPACK_LIST:
786 v = POP();
787 if (!is_listobject(v)) {
788 err_setstr(TypeError, "unpack non-list");
789 why = WHY_EXCEPTION;
790 }
791 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000792 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000793 "unpack list of wrong size");
794 why = WHY_EXCEPTION;
795 }
796 else {
797 for (; --oparg >= 0; ) {
798 w = getlistitem(v, oparg);
799 INCREF(w);
800 PUSH(w);
801 }
802 }
803 DECREF(v);
804 break;
805
806 case STORE_ATTR:
807 name = GETNAME(oparg);
808 v = POP();
809 u = POP();
810 err = setattr(v, name, u); /* v.name = u */
811 DECREF(v);
812 DECREF(u);
813 break;
814
815 case DELETE_ATTR:
816 name = GETNAME(oparg);
817 v = POP();
818 err = setattr(v, name, (object *)NULL);
819 /* del v.name */
820 DECREF(v);
821 break;
822
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000823 case STORE_GLOBAL:
824 w = GETNAMEV(oparg);
825 v = POP();
826 err = dict2insert(f->f_globals, w, v);
827 DECREF(v);
828 break;
829
830 case DELETE_GLOBAL:
831 w = GETNAMEV(oparg);
832 if ((err = dict2remove(f->f_globals, w)) != 0)
833 err_setstr(NameError, getstringvalue(w));
834 break;
835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case LOAD_CONST:
837 x = GETCONST(oparg);
838 INCREF(x);
839 PUSH(x);
840 break;
841
842 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000843 w = GETNAMEV(oparg);
844 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000846 err_clear();
847 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000849 err_clear();
850 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000852 err_setstr(NameError,
853 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 break;
855 }
856 }
857 }
858 INCREF(x);
859 PUSH(x);
860 break;
861
862 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000863 w = GETNAMEV(oparg);
864 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000866 err_clear();
867 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000869 err_setstr(NameError,
870 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 break;
872 }
873 }
874 INCREF(x);
875 PUSH(x);
876 break;
877
878 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000879 w = GETNAMEV(oparg);
880 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000882 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 break;
884 }
885 INCREF(x);
886 PUSH(x);
887 break;
888
889 case BUILD_TUPLE:
890 x = newtupleobject(oparg);
891 if (x != NULL) {
892 for (; --oparg >= 0;) {
893 w = POP();
894 err = settupleitem(x, oparg, w);
895 if (err != 0)
896 break;
897 }
898 PUSH(x);
899 }
900 break;
901
902 case BUILD_LIST:
903 x = newlistobject(oparg);
904 if (x != NULL) {
905 for (; --oparg >= 0;) {
906 w = POP();
907 err = setlistitem(x, oparg, w);
908 if (err != 0)
909 break;
910 }
911 PUSH(x);
912 }
913 break;
914
915 case BUILD_MAP:
916 x = newdictobject();
917 PUSH(x);
918 break;
919
920 case LOAD_ATTR:
921 name = GETNAME(oparg);
922 v = POP();
923 x = getattr(v, name);
924 DECREF(v);
925 PUSH(x);
926 break;
927
928 case COMPARE_OP:
929 w = POP();
930 v = POP();
931 x = cmp_outcome((enum cmp_op)oparg, v, w);
932 DECREF(v);
933 DECREF(w);
934 PUSH(x);
935 break;
936
937 case IMPORT_NAME:
938 name = GETNAME(oparg);
939 x = import_module(name);
940 XINCREF(x);
941 PUSH(x);
942 break;
943
944 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000945 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +0000947 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 break;
949
950 case JUMP_FORWARD:
951 JUMPBY(oparg);
952 break;
953
954 case JUMP_IF_FALSE:
955 if (!testbool(TOP()))
956 JUMPBY(oparg);
957 break;
958
959 case JUMP_IF_TRUE:
960 if (testbool(TOP()))
961 JUMPBY(oparg);
962 break;
963
964 case JUMP_ABSOLUTE:
965 JUMPTO(oparg);
966 break;
967
968 case FOR_LOOP:
969 /* for v in s: ...
970 On entry: stack contains s, i.
971 On exit: stack contains s, i+1, s[i];
972 but if loop exhausted:
973 s, i are popped, and we jump */
974 w = POP(); /* Loop index */
975 v = POP(); /* Sequence object */
976 u = loop_subscript(v, w);
977 if (u != NULL) {
978 PUSH(v);
979 x = newintobject(getintvalue(w)+1);
980 PUSH(x);
981 DECREF(w);
982 PUSH(u);
983 }
984 else {
985 DECREF(v);
986 DECREF(w);
987 /* A NULL can mean "s exhausted"
988 but also an error: */
989 if (err_occurred())
990 why = WHY_EXCEPTION;
991 else
992 JUMPBY(oparg);
993 }
994 break;
995
996 case SETUP_LOOP:
997 case SETUP_EXCEPT:
998 case SETUP_FINALLY:
999 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1000 STACK_LEVEL());
1001 break;
1002
1003 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001004#ifdef LLTRACE
1005 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 printf("--- Line %d ---\n", oparg);
1007#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001008 f->f_lineno = oparg;
1009 if (trace != NULL) {
1010 /* Trace each line of code reached */
1011 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001012 err = call_trace(&trace, &trace,
1013 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001014 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 break;
1016
1017 default:
1018 fprintf(stderr,
1019 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001020 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 err_setstr(SystemError, "eval_code: unknown opcode");
1022 why = WHY_EXCEPTION;
1023 break;
1024
1025 } /* switch */
1026
1027 on_error:
1028
1029 /* Quickly continue if no error occurred */
1030
1031 if (why == WHY_NOT) {
1032 if (err == 0 && x != NULL)
1033 continue; /* Normal, fast path */
1034 why = WHY_EXCEPTION;
1035 x = None;
1036 err = 0;
1037 }
1038
Guido van Rossum96a42c81992-01-12 02:29:51 +00001039#ifndef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 /* Double-check exception status */
1041
1042 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1043 if (!err_occurred()) {
1044 fprintf(stderr, "XXX ghost error\n");
1045 err_setstr(SystemError, "ghost error");
1046 why = WHY_EXCEPTION;
1047 }
1048 }
1049 else {
1050 if (err_occurred()) {
1051 fprintf(stderr, "XXX undetected error\n");
1052 why = WHY_EXCEPTION;
1053 }
1054 }
1055#endif
1056
1057 /* Log traceback info if this is a real exception */
1058
1059 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001060 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001062 f->f_lasti -= 2;
1063 tb_here(f);
1064
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001065 if (trace)
1066 call_exc_trace(&trace, &trace, f);
1067 if (sys_profile)
1068 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 }
1070
1071 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1072
1073 if (why == WHY_RERAISE)
1074 why = WHY_EXCEPTION;
1075
1076 /* Unwind stacks if a (pseudo) exception occurred */
1077
1078 while (why != WHY_NOT && f->f_iblock > 0) {
1079 block *b = pop_block(f);
1080 while (STACK_LEVEL() > b->b_level) {
1081 v = POP();
1082 XDECREF(v);
1083 }
1084 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1085 why = WHY_NOT;
1086 JUMPTO(b->b_handler);
1087 break;
1088 }
1089 if (b->b_type == SETUP_FINALLY ||
1090 b->b_type == SETUP_EXCEPT &&
1091 why == WHY_EXCEPTION) {
1092 if (why == WHY_EXCEPTION) {
1093 object *exc, *val;
1094 err_get(&exc, &val);
1095 if (val == NULL) {
1096 val = None;
1097 INCREF(val);
1098 }
1099 v = tb_fetch();
1100 /* Make the raw exception data
1101 available to the handler,
1102 so a program can emulate the
1103 Python main loop. Don't do
1104 this for 'finally'. */
1105 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 sysset("exc_value", val);
1108 sysset("exc_type", exc);
1109 err_clear();
1110 }
1111 PUSH(v);
1112 PUSH(val);
1113 PUSH(exc);
1114 }
1115 else {
1116 if (why == WHY_RETURN)
1117 PUSH(retval);
1118 v = newintobject((long)why);
1119 PUSH(v);
1120 }
1121 why = WHY_NOT;
1122 JUMPTO(b->b_handler);
1123 break;
1124 }
1125 } /* unwind stack */
1126
1127 /* End the loop if we still have an error (or return) */
1128
1129 if (why != WHY_NOT)
1130 break;
1131
1132 } /* main loop */
1133
1134 /* Pop remaining stack entries */
1135
1136 while (!EMPTY()) {
1137 v = POP();
1138 XDECREF(v);
1139 }
1140
Guido van Rossum96a42c81992-01-12 02:29:51 +00001141 if (why != WHY_RETURN)
1142 retval = NULL;
1143
1144 if (trace) {
1145 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001146 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001147 XDECREF(retval);
1148 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001149 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001150 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001151 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001152 XDECREF(trace);
1153 }
1154
1155 if (sys_profile && why == WHY_RETURN) {
1156 if (call_trace(&sys_profile, (object**)0,
1157 f, "return", retval)) {
1158 XDECREF(retval);
1159 retval = NULL;
1160 why = WHY_EXCEPTION;
1161 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001162 }
1163
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 /* Restore previous frame and release the current one */
1165
1166 current_frame = f->f_back;
1167 DECREF(f);
1168
Guido van Rossum96a42c81992-01-12 02:29:51 +00001169 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001170}
1171
Guido van Rossum96a42c81992-01-12 02:29:51 +00001172#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001173static int
1174prtrace(v, str)
1175 object *v;
1176 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001178 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001179 if (printobject(v, stdout, 0) != 0)
1180 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001181 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001183#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001185static void
1186call_exc_trace(p_trace, p_newtrace, f)
1187 object **p_trace, **p_newtrace;
1188 frameobject *f;
1189{
1190 object *type, *value, *traceback, *arg;
1191 int err;
1192 err_get(&type, &value);
1193 traceback = tb_fetch();
1194 arg = newtupleobject(3);
1195 if (arg == NULL) {
1196 err = -1;
1197 goto cleanup;
1198 }
1199 settupleitem(arg, 0, type);
1200 settupleitem(arg, 1, value);
1201 settupleitem(arg, 2, traceback);
1202 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1203 XDECREF(arg);
1204 cleanup:
1205 if (!err) {
1206 /* Restore original exception */
1207 err_setval(type, value);
1208 tb_store(traceback);
1209 }
1210}
1211
1212static int
1213call_trace(p_trace, p_newtrace, f, msg, arg)
1214 object **p_trace; /* in/out; may not be NULL;
1215 may not point to NULL variable initially */
1216 object **p_newtrace; /* in/out; may be NULL;
1217 may point to NULL variable;
1218 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001219 frameobject *f;
1220 char *msg;
1221 object *arg;
1222{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001223 object *arglist, *what;
1224 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001225 static int tracing = 0;
1226
1227 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001228 /* Don't do recursive traces */
1229 if (p_newtrace) {
1230 XDECREF(*p_newtrace);
1231 *p_newtrace = NULL;
1232 }
1233 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001234 }
1235
1236 arglist = newtupleobject(3);
1237 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001238 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001239 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001240 if (what == NULL)
1241 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001242 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001243 settupleitem(arglist, 0, (object *)f);
1244 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001245 if (arg == NULL)
1246 arg = None;
1247 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001248 settupleitem(arglist, 2, arg);
1249 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001250 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001251 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001252 cleanup:
1253 XDECREF(arglist);
1254 if (res == NULL) {
1255 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001256 tb_here(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001257 XDECREF(*p_trace);
1258 *p_trace = NULL;
1259 if (p_newtrace) {
1260 XDECREF(*p_newtrace);
1261 *p_newtrace = NULL;
1262 }
1263 }
1264 else {
1265 if (p_newtrace) {
1266 XDECREF(*p_newtrace);
1267 if (res == None)
1268 *p_newtrace = NULL;
1269 else {
1270 INCREF(res);
1271 *p_newtrace = res;
1272 }
1273 }
1274 DECREF(res);
1275 }
1276 if (res == NULL)
1277 return -1;
1278 else
1279 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001280}
1281
Guido van Rossum3f5da241990-12-20 15:06:42 +00001282object *
1283getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001285 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001286 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001287 else
1288 return current_frame->f_locals;
1289}
1290
1291object *
1292getglobals()
1293{
1294 if (current_frame == NULL)
1295 return NULL;
1296 else
1297 return current_frame->f_globals;
1298}
1299
1300void
1301printtraceback(fp)
1302 FILE *fp;
1303{
1304 object *v = tb_fetch();
1305 if (v != NULL) {
1306 fprintf(fp, "Stack backtrace (innermost last):\n");
1307 tb_print(v, fp);
1308 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001310}
1311
1312
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313void
1314flushline()
1315{
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 if (softspace(sysget("stdout"), 0))
1317 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318}
1319
Guido van Rossum3f5da241990-12-20 15:06:42 +00001320
1321/* Test a value used as condition, e.g., in a for or if statement */
1322
1323static int
1324testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001325 object *v;
1326{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001327 if (v == None)
1328 return 0;
1329 if (v->ob_type->tp_as_number != NULL)
1330 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001331 if (v->ob_type->tp_as_sequence != NULL)
1332 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1333 if (v->ob_type->tp_as_mapping != NULL)
1334 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335 /* All other objects are 'true' */
1336 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
1339static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001340or(v, w)
1341 object *v, *w;
1342{
1343 if (v->ob_type->tp_as_number != NULL) {
1344 object *x;
1345 object * (*f) FPROTO((object *, object *));
1346 if (coerce(&v, &w) != 0)
1347 return NULL;
1348 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1349 x = (*f)(v, w);
1350 DECREF(v);
1351 DECREF(w);
1352 if (f != NULL)
1353 return x;
1354 }
1355 err_setstr(TypeError, "bad operand type(s) for |");
1356 return NULL;
1357}
1358
1359static object *
1360xor(v, w)
1361 object *v, *w;
1362{
1363 if (v->ob_type->tp_as_number != NULL) {
1364 object *x;
1365 object * (*f) FPROTO((object *, object *));
1366 if (coerce(&v, &w) != 0)
1367 return NULL;
1368 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1369 x = (*f)(v, w);
1370 DECREF(v);
1371 DECREF(w);
1372 if (f != NULL)
1373 return x;
1374 }
1375 err_setstr(TypeError, "bad operand type(s) for ^");
1376 return NULL;
1377}
1378
1379static object *
1380and(v, w)
1381 object *v, *w;
1382{
1383 if (v->ob_type->tp_as_number != NULL) {
1384 object *x;
1385 object * (*f) FPROTO((object *, object *));
1386 if (coerce(&v, &w) != 0)
1387 return NULL;
1388 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1389 x = (*f)(v, w);
1390 DECREF(v);
1391 DECREF(w);
1392 if (f != NULL)
1393 return x;
1394 }
1395 err_setstr(TypeError, "bad operand type(s) for &");
1396 return NULL;
1397}
1398
1399static object *
1400lshift(v, w)
1401 object *v, *w;
1402{
1403 if (v->ob_type->tp_as_number != NULL) {
1404 object *x;
1405 object * (*f) FPROTO((object *, object *));
1406 if (coerce(&v, &w) != 0)
1407 return NULL;
1408 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1409 x = (*f)(v, w);
1410 DECREF(v);
1411 DECREF(w);
1412 if (f != NULL)
1413 return x;
1414 }
1415 err_setstr(TypeError, "bad operand type(s) for <<");
1416 return NULL;
1417}
1418
1419static object *
1420rshift(v, w)
1421 object *v, *w;
1422{
1423 if (v->ob_type->tp_as_number != NULL) {
1424 object *x;
1425 object * (*f) FPROTO((object *, object *));
1426 if (coerce(&v, &w) != 0)
1427 return NULL;
1428 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1429 x = (*f)(v, w);
1430 DECREF(v);
1431 DECREF(w);
1432 if (f != NULL)
1433 return x;
1434 }
1435 err_setstr(TypeError, "bad operand type(s) for >>");
1436 return NULL;
1437}
1438
1439static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 object *v, *w;
1442{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001443 if (v->ob_type->tp_as_number != NULL) {
1444 object *x;
1445 if (coerce(&v, &w) != 0)
1446 return NULL;
1447 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1448 DECREF(v);
1449 DECREF(w);
1450 return x;
1451 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001453 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001455 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 return NULL;
1457 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458}
1459
1460static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001461sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 object *v, *w;
1463{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001464 if (v->ob_type->tp_as_number != NULL) {
1465 object *x;
1466 if (coerce(&v, &w) != 0)
1467 return NULL;
1468 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1469 DECREF(v);
1470 DECREF(w);
1471 return x;
1472 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001473 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 return NULL;
1475}
1476
1477static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001478mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001479 object *v, *w;
1480{
1481 typeobject *tp;
1482 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1483 /* int*sequence -- swap v and w */
1484 object *tmp = v;
1485 v = w;
1486 w = tmp;
1487 }
1488 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001489 if (tp->tp_as_number != NULL) {
1490 object *x;
1491 if (coerce(&v, &w) != 0)
1492 return NULL;
1493 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1494 DECREF(v);
1495 DECREF(w);
1496 return x;
1497 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 if (tp->tp_as_sequence != NULL) {
1499 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001500 err_setstr(TypeError,
1501 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502 return NULL;
1503 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001504 return (*tp->tp_as_sequence->sq_repeat)
1505 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001506 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001507 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001508 return NULL;
1509}
1510
1511static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001512divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513 object *v, *w;
1514{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001515 if (v->ob_type->tp_as_number != NULL) {
1516 object *x;
1517 if (coerce(&v, &w) != 0)
1518 return NULL;
1519 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1520 DECREF(v);
1521 DECREF(w);
1522 return x;
1523 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001524 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001525 return NULL;
1526}
1527
1528static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530 object *v, *w;
1531{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001532 if (v->ob_type->tp_as_number != NULL) {
1533 object *x;
1534 if (coerce(&v, &w) != 0)
1535 return NULL;
1536 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1537 DECREF(v);
1538 DECREF(w);
1539 return x;
1540 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001541 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542 return NULL;
1543}
1544
1545static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001546neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 object *v;
1548{
1549 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550 return (*v->ob_type->tp_as_number->nb_negative)(v);
1551 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 return NULL;
1553}
1554
1555static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001556pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557 object *v;
1558{
1559 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001560 return (*v->ob_type->tp_as_number->nb_positive)(v);
1561 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 return NULL;
1563}
1564
1565static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001566invert(v)
1567 object *v;
1568{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001569 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001570 if (v->ob_type->tp_as_number != NULL &&
1571 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1572 return (*f)(v);
1573 err_setstr(TypeError, "bad operand type(s) for unary ~");
1574 return NULL;
1575}
1576
1577static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001578not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 object *v;
1580{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001581 int outcome = testbool(v);
1582 object *w = outcome == 0 ? True : False;
1583 INCREF(w);
1584 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001585}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001586/* External interface to call any callable object. The arg may be NULL. */
1587
1588object *
1589call_object(func, arg)
1590 object *func;
1591 object *arg;
1592{
1593 if (is_instancemethodobject(func) || is_funcobject(func))
1594 return call_function(func, arg);
1595 else
1596 return call_builtin(func, arg);
1597}
1598
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001599static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001602 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604 if (is_methodobject(func)) {
1605 method meth = getmethod(func);
1606 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001607 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1608 int size = gettuplesize(arg);
1609 if (size == 1)
1610 arg = gettupleitem(arg, 0);
1611 else if (size == 0)
1612 arg = NULL;
1613 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 }
1616 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001617 if (arg != NULL &&
1618 !(is_tupleobject(arg) &&
1619 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620 err_setstr(TypeError,
1621 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 return NULL;
1623 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001624 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 return NULL;
1628}
1629
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001631call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635 object *newarg = NULL;
1636 object *newlocals, *newglobals;
1637 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638
Guido van Rossume8122f11991-05-05 20:03:07 +00001639 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001640 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001641 object *self = instancemethodgetself(func);
1642 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001643 if (arg == NULL)
1644 argcount = 0;
1645 else if (is_tupleobject(arg))
1646 argcount = gettuplesize(arg);
1647 else
1648 argcount = 1;
1649 newarg = newtupleobject(argcount + 1);
1650 if (newarg == NULL)
1651 return NULL;
1652 INCREF(self);
1653 settupleitem(newarg, 0, self);
1654 if (arg != NULL && !is_tupleobject(arg)) {
1655 INCREF(arg);
1656 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 }
1658 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001659 int i;
1660 object *v;
1661 for (i = 0; i < argcount; i++) {
1662 v = gettupleitem(arg, i);
1663 XINCREF(v);
1664 settupleitem(newarg, i+1, v);
1665 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001666 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001667 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 }
1669 else {
1670 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001671 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672 return NULL;
1673 }
1674 }
1675
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676 co = getfunccode(func);
1677 if (co == NULL) {
1678 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679 return NULL;
1680 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681 if (!is_codeobject(co)) {
1682 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 abort();
1684 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001685 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001686 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001687 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 return NULL;
1689 }
1690
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691 newglobals = getfuncglobals(func);
1692 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696 DECREF(newlocals);
1697 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698
Guido van Rossum3f5da241990-12-20 15:06:42 +00001699 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700
1701 return v;
1702}
1703
1704static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001705apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 object *v, *w;
1707{
1708 typeobject *tp = v->ob_type;
1709 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 return NULL;
1712 }
1713 if (tp->tp_as_sequence != NULL) {
1714 int i;
1715 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001716 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 return NULL;
1718 }
1719 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001720 if (i < 0)
1721 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001722 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001724 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725}
1726
1727static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001728loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729 object *v, *w;
1730{
1731 sequence_methods *sq = v->ob_type->tp_as_sequence;
1732 int i, n;
1733 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001734 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 return NULL;
1736 }
1737 i = getintvalue(w);
1738 n = (*sq->sq_length)(v);
1739 if (i >= n)
1740 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001741 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742}
1743
1744static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001745slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 object *v;
1747 int isize;
1748 int *pi;
1749{
1750 if (v != NULL) {
1751 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001752 err_setstr(TypeError, "slice index must be int");
1753 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754 }
1755 *pi = getintvalue(v);
1756 if (*pi < 0)
1757 *pi += isize;
1758 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001760}
1761
1762static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001763apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 object *u, *v, *w;
1765{
1766 typeobject *tp = u->ob_type;
1767 int ilow, ihigh, isize;
1768 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 return NULL;
1771 }
1772 ilow = 0;
1773 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001776 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001778 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001780
1781static int
1782assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001783 object *w;
1784 object *key;
1785 object *v;
1786{
1787 typeobject *tp = w->ob_type;
1788 sequence_methods *sq;
1789 mapping_methods *mp;
1790 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 if ((sq = tp->tp_as_sequence) != NULL &&
1792 (func = sq->sq_ass_item) != NULL) {
1793 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001794 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001795 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001796 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001798 else {
1799 int i = getintvalue(key);
1800 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001801 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001802 return (*func)(w, i, v);
1803 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 }
1805 else if ((mp = tp->tp_as_mapping) != NULL &&
1806 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001807 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 }
1809 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001810 err_setstr(TypeError,
1811 "can't assign to this subscripted object");
1812 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814}
1815
Guido van Rossum3f5da241990-12-20 15:06:42 +00001816static int
1817assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 object *u, *v, *w, *x;
1819{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001820 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822 if (sq == NULL) {
1823 err_setstr(TypeError, "assign to slice of non-sequence");
1824 return -1;
1825 }
1826 if (sq == NULL || sq->sq_ass_slice == NULL) {
1827 err_setstr(TypeError, "unassignable slice");
1828 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 }
1830 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001831 isize = ihigh = (*sq->sq_length)(u);
1832 if (slice_index(v, isize, &ilow) != 0)
1833 return -1;
1834 if (slice_index(w, isize, &ihigh) != 0)
1835 return -1;
1836 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837}
1838
1839static int
1840cmp_exception(err, v)
1841 object *err, *v;
1842{
1843 if (is_tupleobject(v)) {
1844 int i, n;
1845 n = gettuplesize(v);
1846 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001847 /* Test recursively */
1848 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 return 1;
1850 }
1851 return 0;
1852 }
1853 return err == v;
1854}
1855
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856static int
1857cmp_member(v, w)
1858 object *v, *w;
1859{
1860 int i, n, cmp;
1861 object *x;
1862 sequence_methods *sq;
1863 /* Special case for char in string */
1864 if (is_stringobject(w)) {
1865 register char *s, *end;
1866 register char c;
1867 if (!is_stringobject(v) || getstringsize(v) != 1) {
1868 err_setstr(TypeError,
1869 "string member test needs char left operand");
1870 return -1;
1871 }
1872 c = getstringvalue(v)[0];
1873 s = getstringvalue(w);
1874 end = s + getstringsize(w);
1875 while (s < end) {
1876 if (c == *s++)
1877 return 1;
1878 }
1879 return 0;
1880 }
1881 sq = w->ob_type->tp_as_sequence;
1882 if (sq == NULL) {
1883 err_setstr(TypeError,
1884 "'in' or 'not in' needs sequence right argument");
1885 return -1;
1886 }
1887 n = (*sq->sq_length)(w);
1888 for (i = 0; i < n; i++) {
1889 x = (*sq->sq_item)(w, i);
1890 cmp = cmpobject(v, x);
1891 XDECREF(x);
1892 if (cmp == 0)
1893 return 1;
1894 }
1895 return 0;
1896}
1897
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001899cmp_outcome(op, v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 enum cmp_op op;
1901 register object *v;
1902 register object *w;
1903{
1904 register int cmp;
1905 register int res = 0;
1906 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001907 case IS:
1908 case IS_NOT:
1909 res = (v == w);
1910 if (op == IS_NOT)
1911 res = !res;
1912 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 case IN:
1914 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915 res = cmp_member(v, w);
1916 if (res < 0)
1917 return NULL;
1918 if (op == NOT_IN)
1919 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 break;
1921 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001922 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 break;
1924 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925 cmp = cmpobject(v, w);
1926 switch (op) {
1927 case LT: res = cmp < 0; break;
1928 case LE: res = cmp <= 0; break;
1929 case EQ: res = cmp == 0; break;
1930 case NE: res = cmp != 0; break;
1931 case GT: res = cmp > 0; break;
1932 case GE: res = cmp >= 0; break;
1933 /* XXX no default? (res is initialized to 0 though) */
1934 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 }
1936 v = res ? True : False;
1937 INCREF(v);
1938 return v;
1939}
1940
Guido van Rossum3f5da241990-12-20 15:06:42 +00001941static int
1942import_from(locals, v, name)
1943 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001944 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001945 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001946{
1947 object *w, *x;
1948 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001949 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001950 int i;
1951 int n = getdictsize(w);
1952 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001953 name = getdict2key(w, i);
1954 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001955 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001956 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001957 if (x == NULL) {
1958 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001959 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001960 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001961 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001962 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001964 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001966 }
1967 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001968 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001969 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001970 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00001971 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00001972 getstringvalue(name));
1973 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001974 return -1;
1975 }
1976 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001977 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001978 }
1979}
1980
1981static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001983 object *v; /* None or tuple containing base classes */
1984 object *w; /* dictionary */
1985{
1986 if (is_tupleobject(v)) {
1987 int i;
1988 for (i = gettuplesize(v); --i >= 0; ) {
1989 object *x = gettupleitem(v, i);
1990 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001991 err_setstr(TypeError,
1992 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001993 return NULL;
1994 }
1995 }
1996 }
1997 else {
1998 v = NULL;
1999 }
2000 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002001 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002002 return NULL;
2003 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002004 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002005}