blob: 0b2f924a84d7d3bfd13dd2775391ebee2f624233 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002Copyright 1991, 1992 by Stichting Mathematisch Centrum, Amsterdam, The
Guido van Rossumf70e43a1991-02-19 12:39:46 +00003Netherlands.
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 *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000077static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000078static 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();
Guido van Rossum5b7313a1992-04-06 13:24:57 +0000931 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 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 Rossum801dcae1992-04-08 11:32:32 +00001039#ifdef 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);
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 }
1110 PUSH(v);
1111 PUSH(val);
1112 PUSH(exc);
1113 }
1114 else {
1115 if (why == WHY_RETURN)
1116 PUSH(retval);
1117 v = newintobject((long)why);
1118 PUSH(v);
1119 }
1120 why = WHY_NOT;
1121 JUMPTO(b->b_handler);
1122 break;
1123 }
1124 } /* unwind stack */
1125
1126 /* End the loop if we still have an error (or return) */
1127
1128 if (why != WHY_NOT)
1129 break;
1130
1131 } /* main loop */
1132
1133 /* Pop remaining stack entries */
1134
1135 while (!EMPTY()) {
1136 v = POP();
1137 XDECREF(v);
1138 }
1139
Guido van Rossum96a42c81992-01-12 02:29:51 +00001140 if (why != WHY_RETURN)
1141 retval = NULL;
1142
1143 if (trace) {
1144 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001145 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001146 XDECREF(retval);
1147 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001148 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001149 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001150 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001151 XDECREF(trace);
1152 }
1153
1154 if (sys_profile && why == WHY_RETURN) {
1155 if (call_trace(&sys_profile, (object**)0,
1156 f, "return", retval)) {
1157 XDECREF(retval);
1158 retval = NULL;
1159 why = WHY_EXCEPTION;
1160 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001161 }
1162
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 /* Restore previous frame and release the current one */
1164
1165 current_frame = f->f_back;
1166 DECREF(f);
1167
Guido van Rossum96a42c81992-01-12 02:29:51 +00001168 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001169}
1170
Guido van Rossum96a42c81992-01-12 02:29:51 +00001171#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001172static int
1173prtrace(v, str)
1174 object *v;
1175 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001177 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001178 if (printobject(v, stdout, 0) != 0)
1179 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001180 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001182#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001184static void
1185call_exc_trace(p_trace, p_newtrace, f)
1186 object **p_trace, **p_newtrace;
1187 frameobject *f;
1188{
1189 object *type, *value, *traceback, *arg;
1190 int err;
1191 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001192 if (value == NULL) {
1193 value = None;
1194 INCREF(value);
1195 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001196 traceback = tb_fetch();
1197 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001198 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001199 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001200 settupleitem(arg, 0, type);
1201 settupleitem(arg, 1, value);
1202 settupleitem(arg, 2, traceback);
1203 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001204 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001205 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001206 /* Restore original exception */
1207 err_setval(type, value);
1208 tb_store(traceback);
1209 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001210 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001211}
1212
1213static int
1214call_trace(p_trace, p_newtrace, f, msg, arg)
1215 object **p_trace; /* in/out; may not be NULL;
1216 may not point to NULL variable initially */
1217 object **p_newtrace; /* in/out; may be NULL;
1218 may point to NULL variable;
1219 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001220 frameobject *f;
1221 char *msg;
1222 object *arg;
1223{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001224 object *arglist, *what;
1225 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001226 static int tracing = 0;
1227
1228 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001229 /* Don't do recursive traces */
1230 if (p_newtrace) {
1231 XDECREF(*p_newtrace);
1232 *p_newtrace = NULL;
1233 }
1234 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001235 }
1236
1237 arglist = newtupleobject(3);
1238 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001239 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001240 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001241 if (what == NULL)
1242 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001243 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001244 settupleitem(arglist, 0, (object *)f);
1245 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001246 if (arg == NULL)
1247 arg = None;
1248 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001249 settupleitem(arglist, 2, arg);
1250 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001251 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001252 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001253 cleanup:
1254 XDECREF(arglist);
1255 if (res == NULL) {
1256 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001257 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001258 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001259 *p_trace = NULL;
1260 if (p_newtrace) {
1261 XDECREF(*p_newtrace);
1262 *p_newtrace = NULL;
1263 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001264 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001265 }
1266 else {
1267 if (p_newtrace) {
1268 XDECREF(*p_newtrace);
1269 if (res == None)
1270 *p_newtrace = NULL;
1271 else {
1272 INCREF(res);
1273 *p_newtrace = res;
1274 }
1275 }
1276 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001277 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001278 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001279}
1280
Guido van Rossum3f5da241990-12-20 15:06:42 +00001281object *
1282getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001283{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001284 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001285 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001286 else
1287 return current_frame->f_locals;
1288}
1289
1290object *
1291getglobals()
1292{
1293 if (current_frame == NULL)
1294 return NULL;
1295 else
1296 return current_frame->f_globals;
1297}
1298
1299void
1300printtraceback(fp)
1301 FILE *fp;
1302{
1303 object *v = tb_fetch();
1304 if (v != NULL) {
1305 fprintf(fp, "Stack backtrace (innermost last):\n");
1306 tb_print(v, fp);
1307 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001309}
1310
1311
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312void
1313flushline()
1314{
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 if (softspace(sysget("stdout"), 0))
1316 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001317}
1318
Guido van Rossum3f5da241990-12-20 15:06:42 +00001319
1320/* Test a value used as condition, e.g., in a for or if statement */
1321
1322static int
1323testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001324 object *v;
1325{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001326 if (v == None)
1327 return 0;
1328 if (v->ob_type->tp_as_number != NULL)
1329 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001330 if (v->ob_type->tp_as_sequence != NULL)
1331 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1332 if (v->ob_type->tp_as_mapping != NULL)
1333 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001334 /* All other objects are 'true' */
1335 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336}
1337
1338static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001339or(v, w)
1340 object *v, *w;
1341{
1342 if (v->ob_type->tp_as_number != NULL) {
1343 object *x;
1344 object * (*f) FPROTO((object *, object *));
1345 if (coerce(&v, &w) != 0)
1346 return NULL;
1347 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1348 x = (*f)(v, w);
1349 DECREF(v);
1350 DECREF(w);
1351 if (f != NULL)
1352 return x;
1353 }
1354 err_setstr(TypeError, "bad operand type(s) for |");
1355 return NULL;
1356}
1357
1358static object *
1359xor(v, w)
1360 object *v, *w;
1361{
1362 if (v->ob_type->tp_as_number != NULL) {
1363 object *x;
1364 object * (*f) FPROTO((object *, object *));
1365 if (coerce(&v, &w) != 0)
1366 return NULL;
1367 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1368 x = (*f)(v, w);
1369 DECREF(v);
1370 DECREF(w);
1371 if (f != NULL)
1372 return x;
1373 }
1374 err_setstr(TypeError, "bad operand type(s) for ^");
1375 return NULL;
1376}
1377
1378static object *
1379and(v, w)
1380 object *v, *w;
1381{
1382 if (v->ob_type->tp_as_number != NULL) {
1383 object *x;
1384 object * (*f) FPROTO((object *, object *));
1385 if (coerce(&v, &w) != 0)
1386 return NULL;
1387 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1388 x = (*f)(v, w);
1389 DECREF(v);
1390 DECREF(w);
1391 if (f != NULL)
1392 return x;
1393 }
1394 err_setstr(TypeError, "bad operand type(s) for &");
1395 return NULL;
1396}
1397
1398static object *
1399lshift(v, w)
1400 object *v, *w;
1401{
1402 if (v->ob_type->tp_as_number != NULL) {
1403 object *x;
1404 object * (*f) FPROTO((object *, object *));
1405 if (coerce(&v, &w) != 0)
1406 return NULL;
1407 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1408 x = (*f)(v, w);
1409 DECREF(v);
1410 DECREF(w);
1411 if (f != NULL)
1412 return x;
1413 }
1414 err_setstr(TypeError, "bad operand type(s) for <<");
1415 return NULL;
1416}
1417
1418static object *
1419rshift(v, w)
1420 object *v, *w;
1421{
1422 if (v->ob_type->tp_as_number != NULL) {
1423 object *x;
1424 object * (*f) FPROTO((object *, object *));
1425 if (coerce(&v, &w) != 0)
1426 return NULL;
1427 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1428 x = (*f)(v, w);
1429 DECREF(v);
1430 DECREF(w);
1431 if (f != NULL)
1432 return x;
1433 }
1434 err_setstr(TypeError, "bad operand type(s) for >>");
1435 return NULL;
1436}
1437
1438static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 object *v, *w;
1441{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001442 if (v->ob_type->tp_as_number != NULL) {
1443 object *x;
1444 if (coerce(&v, &w) != 0)
1445 return NULL;
1446 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1447 DECREF(v);
1448 DECREF(w);
1449 return x;
1450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001452 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001454 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 return NULL;
1456 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457}
1458
1459static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001460sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461 object *v, *w;
1462{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001463 if (v->ob_type->tp_as_number != NULL) {
1464 object *x;
1465 if (coerce(&v, &w) != 0)
1466 return NULL;
1467 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1468 DECREF(v);
1469 DECREF(w);
1470 return x;
1471 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001472 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 return NULL;
1474}
1475
1476static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 object *v, *w;
1479{
1480 typeobject *tp;
1481 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1482 /* int*sequence -- swap v and w */
1483 object *tmp = v;
1484 v = w;
1485 w = tmp;
1486 }
1487 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001488 if (tp->tp_as_number != NULL) {
1489 object *x;
1490 if (coerce(&v, &w) != 0)
1491 return NULL;
1492 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1493 DECREF(v);
1494 DECREF(w);
1495 return x;
1496 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497 if (tp->tp_as_sequence != NULL) {
1498 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499 err_setstr(TypeError,
1500 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501 return NULL;
1502 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001503 return (*tp->tp_as_sequence->sq_repeat)
1504 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001505 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001506 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 return NULL;
1508}
1509
1510static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001511divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001512 object *v, *w;
1513{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001514 if (v->ob_type->tp_as_number != NULL) {
1515 object *x;
1516 if (coerce(&v, &w) != 0)
1517 return NULL;
1518 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1519 DECREF(v);
1520 DECREF(w);
1521 return x;
1522 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001523 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 return NULL;
1525}
1526
1527static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001528rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529 object *v, *w;
1530{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001531 if (v->ob_type->tp_as_number != NULL) {
1532 object *x;
1533 if (coerce(&v, &w) != 0)
1534 return NULL;
1535 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1536 DECREF(v);
1537 DECREF(w);
1538 return x;
1539 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001540 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001541 return NULL;
1542}
1543
1544static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001545neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546 object *v;
1547{
1548 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001549 return (*v->ob_type->tp_as_number->nb_negative)(v);
1550 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 return NULL;
1552}
1553
1554static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556 object *v;
1557{
1558 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001559 return (*v->ob_type->tp_as_number->nb_positive)(v);
1560 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561 return NULL;
1562}
1563
1564static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001565invert(v)
1566 object *v;
1567{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001568 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001569 if (v->ob_type->tp_as_number != NULL &&
1570 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1571 return (*f)(v);
1572 err_setstr(TypeError, "bad operand type(s) for unary ~");
1573 return NULL;
1574}
1575
1576static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001577not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 object *v;
1579{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001580 int outcome = testbool(v);
1581 object *w = outcome == 0 ? True : False;
1582 INCREF(w);
1583 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001585/* External interface to call any callable object. The arg may be NULL. */
1586
1587object *
1588call_object(func, arg)
1589 object *func;
1590 object *arg;
1591{
1592 if (is_instancemethodobject(func) || is_funcobject(func))
1593 return call_function(func, arg);
1594 else
1595 return call_builtin(func, arg);
1596}
1597
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001599call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603 if (is_methodobject(func)) {
1604 method meth = getmethod(func);
1605 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001606 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1607 int size = gettuplesize(arg);
1608 if (size == 1)
1609 arg = gettupleitem(arg, 0);
1610 else if (size == 0)
1611 arg = NULL;
1612 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 }
1615 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001616 if (arg != NULL &&
1617 !(is_tupleobject(arg) &&
1618 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001619 err_setstr(TypeError,
1620 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 return NULL;
1622 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626 return NULL;
1627}
1628
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001634 object *newarg = NULL;
1635 object *newlocals, *newglobals;
1636 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637
Guido van Rossume8122f11991-05-05 20:03:07 +00001638 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001639 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001640 object *self = instancemethodgetself(func);
1641 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001642 if (arg == NULL)
1643 argcount = 0;
1644 else if (is_tupleobject(arg))
1645 argcount = gettuplesize(arg);
1646 else
1647 argcount = 1;
1648 newarg = newtupleobject(argcount + 1);
1649 if (newarg == NULL)
1650 return NULL;
1651 INCREF(self);
1652 settupleitem(newarg, 0, self);
1653 if (arg != NULL && !is_tupleobject(arg)) {
1654 INCREF(arg);
1655 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001656 }
1657 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001658 int i;
1659 object *v;
1660 for (i = 0; i < argcount; i++) {
1661 v = gettupleitem(arg, i);
1662 XINCREF(v);
1663 settupleitem(newarg, i+1, v);
1664 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001666 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667 }
1668 else {
1669 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001670 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671 return NULL;
1672 }
1673 }
1674
Guido van Rossum3f5da241990-12-20 15:06:42 +00001675 co = getfunccode(func);
1676 if (co == NULL) {
1677 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 return NULL;
1679 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001680 if (!is_codeobject(co)) {
1681 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682 abort();
1683 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001684 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001686 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687 return NULL;
1688 }
1689
Guido van Rossum3f5da241990-12-20 15:06:42 +00001690 newglobals = getfuncglobals(func);
1691 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694
Guido van Rossum3f5da241990-12-20 15:06:42 +00001695 DECREF(newlocals);
1696 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699
1700 return v;
1701}
1702
1703static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001704apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705 object *v, *w;
1706{
1707 typeobject *tp = v->ob_type;
1708 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 return NULL;
1711 }
1712 if (tp->tp_as_sequence != NULL) {
1713 int i;
1714 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 return NULL;
1717 }
1718 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001719 if (i < 0)
1720 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001721 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724}
1725
1726static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001727loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728 object *v, *w;
1729{
1730 sequence_methods *sq = v->ob_type->tp_as_sequence;
1731 int i, n;
1732 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 return NULL;
1735 }
1736 i = getintvalue(w);
1737 n = (*sq->sq_length)(v);
1738 if (i >= n)
1739 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741}
1742
1743static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 object *v;
1746 int isize;
1747 int *pi;
1748{
1749 if (v != NULL) {
1750 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001751 err_setstr(TypeError, "slice index must be int");
1752 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753 }
1754 *pi = getintvalue(v);
1755 if (*pi < 0)
1756 *pi += isize;
1757 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001758 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759}
1760
1761static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763 object *u, *v, *w;
1764{
1765 typeobject *tp = u->ob_type;
1766 int ilow, ihigh, isize;
1767 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001768 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769 return NULL;
1770 }
1771 ilow = 0;
1772 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001773 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001777 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001778}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001779
1780static int
1781assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 object *w;
1783 object *key;
1784 object *v;
1785{
1786 typeobject *tp = w->ob_type;
1787 sequence_methods *sq;
1788 mapping_methods *mp;
1789 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790 if ((sq = tp->tp_as_sequence) != NULL &&
1791 (func = sq->sq_ass_item) != NULL) {
1792 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001793 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001794 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001795 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001797 else {
1798 int i = getintvalue(key);
1799 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001800 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001801 return (*func)(w, i, v);
1802 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803 }
1804 else if ((mp = tp->tp_as_mapping) != NULL &&
1805 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001806 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 }
1808 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001809 err_setstr(TypeError,
1810 "can't assign to this subscripted object");
1811 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813}
1814
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815static int
1816assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 object *u, *v, *w, *x;
1818{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001819 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001821 if (sq == NULL) {
1822 err_setstr(TypeError, "assign to slice of non-sequence");
1823 return -1;
1824 }
1825 if (sq == NULL || sq->sq_ass_slice == NULL) {
1826 err_setstr(TypeError, "unassignable slice");
1827 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 }
1829 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001830 isize = ihigh = (*sq->sq_length)(u);
1831 if (slice_index(v, isize, &ilow) != 0)
1832 return -1;
1833 if (slice_index(w, isize, &ihigh) != 0)
1834 return -1;
1835 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836}
1837
1838static int
1839cmp_exception(err, v)
1840 object *err, *v;
1841{
1842 if (is_tupleobject(v)) {
1843 int i, n;
1844 n = gettuplesize(v);
1845 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001846 /* Test recursively */
1847 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 return 1;
1849 }
1850 return 0;
1851 }
1852 return err == v;
1853}
1854
Guido van Rossum3f5da241990-12-20 15:06:42 +00001855static int
1856cmp_member(v, w)
1857 object *v, *w;
1858{
1859 int i, n, cmp;
1860 object *x;
1861 sequence_methods *sq;
1862 /* Special case for char in string */
1863 if (is_stringobject(w)) {
1864 register char *s, *end;
1865 register char c;
1866 if (!is_stringobject(v) || getstringsize(v) != 1) {
1867 err_setstr(TypeError,
1868 "string member test needs char left operand");
1869 return -1;
1870 }
1871 c = getstringvalue(v)[0];
1872 s = getstringvalue(w);
1873 end = s + getstringsize(w);
1874 while (s < end) {
1875 if (c == *s++)
1876 return 1;
1877 }
1878 return 0;
1879 }
1880 sq = w->ob_type->tp_as_sequence;
1881 if (sq == NULL) {
1882 err_setstr(TypeError,
1883 "'in' or 'not in' needs sequence right argument");
1884 return -1;
1885 }
1886 n = (*sq->sq_length)(w);
1887 for (i = 0; i < n; i++) {
1888 x = (*sq->sq_item)(w, i);
1889 cmp = cmpobject(v, x);
1890 XDECREF(x);
1891 if (cmp == 0)
1892 return 1;
1893 }
1894 return 0;
1895}
1896
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001898cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001899 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 register object *v;
1901 register object *w;
1902{
1903 register int cmp;
1904 register int res = 0;
1905 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001906 case IS:
1907 case IS_NOT:
1908 res = (v == w);
1909 if (op == IS_NOT)
1910 res = !res;
1911 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 case IN:
1913 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001914 res = cmp_member(v, w);
1915 if (res < 0)
1916 return NULL;
1917 if (op == NOT_IN)
1918 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 break;
1920 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001921 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 break;
1923 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001924 cmp = cmpobject(v, w);
1925 switch (op) {
1926 case LT: res = cmp < 0; break;
1927 case LE: res = cmp <= 0; break;
1928 case EQ: res = cmp == 0; break;
1929 case NE: res = cmp != 0; break;
1930 case GT: res = cmp > 0; break;
1931 case GE: res = cmp >= 0; break;
1932 /* XXX no default? (res is initialized to 0 though) */
1933 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 }
1935 v = res ? True : False;
1936 INCREF(v);
1937 return v;
1938}
1939
Guido van Rossum3f5da241990-12-20 15:06:42 +00001940static int
1941import_from(locals, v, name)
1942 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001943 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001944 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001945{
1946 object *w, *x;
1947 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001948 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00001949 int i;
1950 int n = getdictsize(w);
1951 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001952 name = getdict2key(w, i);
1953 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00001954 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00001955 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001956 if (x == NULL) {
1957 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00001958 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001959 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001960 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00001961 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001963 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00001965 }
1966 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001967 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00001969 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00001970 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00001971 getstringvalue(name));
1972 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001973 return -1;
1974 }
1975 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00001976 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00001977 }
1978}
1979
1980static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001981build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00001982 object *v; /* None or tuple containing base classes */
1983 object *w; /* dictionary */
1984{
1985 if (is_tupleobject(v)) {
1986 int i;
1987 for (i = gettuplesize(v); --i >= 0; ) {
1988 object *x = gettupleitem(v, i);
1989 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990 err_setstr(TypeError,
1991 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00001992 return NULL;
1993 }
1994 }
1995 }
1996 else {
1997 v = NULL;
1998 }
1999 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002001 return NULL;
2002 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002003 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002004}