blob: 32c52c7352ff7f52864429242a4ff3aea259a531 [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
Guido van Rossum1984f1e1992-08-04 12:41:02 +000087/* Interface for threads.
88
89 A module that plans to do a blocking system call (or something else
90 that lasts a long time and doesn't touch Python data) can allow other
91 threads to run as follows:
92
93 void *x;
94
95 ...preparations here...
96 x = save_thread();
97 ...blocking system call here...
98 restore_thread(x);
99 ...interpretr result here...
100
101 For convenience, that the value of 'errno' is restored across the
102 the call to restore_thread().
103
104 The function init_save_thread() should be called only from
105 initthread() in "threadmodule.c".
106
107 Note that not yet all candidates have been converted to use this
108 mechanism!
109*/
110
111#ifdef USE_THREAD
112#include <errno.h>
113#include "thread.h"
114static type_lock interpreter_lock;
115
116void
117init_save_thread()
118{
119#ifdef USE_THREAD
120 if (interpreter_lock)
121 fatal("2nd call to init_save_thread");
122 interpreter_lock = allocate_lock();
123 acquire_lock(interpreter_lock, 1);
124#endif
125}
126#endif
127
128void *
129save_thread()
130{
131#ifdef USE_THREAD
132 if (interpreter_lock) {
133 void *res;
134 res = (void *)current_frame;
135 current_frame = NULL;
136 release_lock(interpreter_lock);
137 return res;
138 }
139 else
140 return NULL;
141#endif
142}
143
144void
145restore_thread(x)
146 void *x;
147{
148#ifdef USE_THREAD
149 if (interpreter_lock) {
150 int err;
151 err = errno;
152 acquire_lock(interpreter_lock, 1);
153 errno = err;
154 current_frame = (frameobject *)x;
155 }
156#endif
157}
158
159
Guido van Rossum374a9221991-04-04 10:40:29 +0000160/* Status code for main loop (reason for stack unwind) */
161
162enum why_code {
163 WHY_NOT, /* No error */
164 WHY_EXCEPTION, /* Exception occurred */
165 WHY_RERAISE, /* Exception re-raised by 'finally' */
166 WHY_RETURN, /* 'return' statement */
167 WHY_BREAK /* 'break' statement */
168};
169
170
171/* Interpreter main loop */
172
173object *
174eval_code(co, globals, locals, arg)
175 codeobject *co;
176 object *globals;
177 object *locals;
178 object *arg;
179{
180 register unsigned char *next_instr;
181 register int opcode; /* Current opcode */
182 register int oparg; /* Current opcode argument, if any */
183 register object **stack_pointer;
184 register enum why_code why; /* Reason for block stack unwind */
185 register int err; /* Error status -- nonzero if error */
186 register object *x; /* Result object -- NULL if error */
187 register object *v; /* Temporary objects popped off stack */
188 register object *w;
189 register object *u;
190 register object *t;
191 register frameobject *f; /* Current frame */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000192 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000193 object *retval; /* Return value iff why == WHY_RETURN */
194 char *name; /* Name used by some instructions */
195 FILE *fp; /* Used by print operations */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000196#ifdef LLTRACE
197 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000198#endif
199
200/* Code access macros */
201
202#define GETCONST(i) Getconst(f, i)
203#define GETNAME(i) Getname(f, i)
204#define GETNAMEV(i) Getnamev(f, i)
205#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
206#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
207#define NEXTOP() (*next_instr++)
208#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
209#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
210#define JUMPBY(x) (next_instr += (x))
211
212/* Stack manipulation macros */
213
214#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
215#define EMPTY() (STACK_LEVEL() == 0)
216#define TOP() (stack_pointer[-1])
217#define BASIC_PUSH(v) (*stack_pointer++ = (v))
218#define BASIC_POP() (*--stack_pointer)
219
Guido van Rossum96a42c81992-01-12 02:29:51 +0000220#ifdef LLTRACE
221#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
222#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000223#else
224#define PUSH(v) BASIC_PUSH(v)
225#define POP() BASIC_POP()
226#endif
227
228 f = newframeobject(
229 current_frame, /*back*/
230 co, /*code*/
231 globals, /*globals*/
232 locals, /*locals*/
233 50, /*nvalues*/
234 20); /*nblocks*/
235 if (f == NULL)
236 return NULL;
237
238 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000239
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000240 if (sys_trace != NULL) {
241 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000242 be called on *every* entry to a code block.
243 Its return value, if not None, is a function that
244 will be called at the start of each executed line
245 of code. (Actually, the function must return
246 itself in order to continue tracing.)
247 The trace functions are called with three arguments:
248 a pointer to the current frame, a string indicating
249 why the function is called, and an argument which
250 depends on the situation. The global trace function
251 (sys.trace) is also called whenever an exception
252 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000253 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000254 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000255 current_frame = f->f_back;
256 DECREF(f);
257 return NULL;
258 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000259 }
260
261 if (sys_profile != NULL) {
262 /* Similar for sys_profile, except it needn't return
263 itself and isn't called for "line" events */
264 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
265 current_frame = f->f_back;
266 DECREF(f);
267 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000268 }
269 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000270
271 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000272 stack_pointer = f->f_valuestack;
273
274 if (arg != NULL) {
275 INCREF(arg);
276 PUSH(arg);
277 }
278
279 why = WHY_NOT;
280 err = 0;
281 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000282
283 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000284 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000285
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000286 /* Do periodic things.
287 Doing this every time through the loop would add
288 too much overhead (a function call per instruction).
289 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000290
291 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000292 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000293 if (intrcheck()) {
294 err_set(KeyboardInterrupt);
295 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000296 goto on_error;
297 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000298
299#ifdef USE_THREAD
300 if (interpreter_lock) {
301 /* Give another thread a chance */
302
303 current_frame = NULL;
304 release_lock(interpreter_lock);
305
306 /* Other threads may run now */
307
308 acquire_lock(interpreter_lock, 1);
309 current_frame = f;
310 }
311#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000312 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000313
Guido van Rossum374a9221991-04-04 10:40:29 +0000314 /* Extract opcode and argument */
315
316 opcode = NEXTOP();
317 if (HAS_ARG(opcode))
318 oparg = NEXTARG();
319
Guido van Rossum96a42c81992-01-12 02:29:51 +0000320#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000321 /* Instruction tracing */
322
Guido van Rossum96a42c81992-01-12 02:29:51 +0000323 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000324 if (HAS_ARG(opcode)) {
325 printf("%d: %d, %d\n",
326 (int) (INSTR_OFFSET() - 3),
327 opcode, oparg);
328 }
329 else {
330 printf("%d: %d\n",
331 (int) (INSTR_OFFSET() - 1), opcode);
332 }
333 }
334#endif
335
336 /* Main switch on opcode */
337
338 switch (opcode) {
339
340 /* BEWARE!
341 It is essential that any operation that fails sets either
342 x to NULL, err to nonzero, or why to anything but WHY_NOT,
343 and that no operation that succeeds does this! */
344
345 /* case STOP_CODE: this is an error! */
346
347 case POP_TOP:
348 v = POP();
349 DECREF(v);
350 break;
351
352 case ROT_TWO:
353 v = POP();
354 w = POP();
355 PUSH(v);
356 PUSH(w);
357 break;
358
359 case ROT_THREE:
360 v = POP();
361 w = POP();
362 x = POP();
363 PUSH(v);
364 PUSH(x);
365 PUSH(w);
366 break;
367
368 case DUP_TOP:
369 v = TOP();
370 INCREF(v);
371 PUSH(v);
372 break;
373
374 case UNARY_POSITIVE:
375 v = POP();
376 x = pos(v);
377 DECREF(v);
378 PUSH(x);
379 break;
380
381 case UNARY_NEGATIVE:
382 v = POP();
383 x = neg(v);
384 DECREF(v);
385 PUSH(x);
386 break;
387
388 case UNARY_NOT:
389 v = POP();
390 x = not(v);
391 DECREF(v);
392 PUSH(x);
393 break;
394
395 case UNARY_CONVERT:
396 v = POP();
397 x = reprobject(v);
398 DECREF(v);
399 PUSH(x);
400 break;
401
402 case UNARY_CALL:
403 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000404 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000405 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000406 DECREF(v);
407 PUSH(x);
408 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000409
410 case UNARY_INVERT:
411 v = POP();
412 x = invert(v);
413 DECREF(v);
414 PUSH(x);
415 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000416
417 case BINARY_MULTIPLY:
418 w = POP();
419 v = POP();
420 x = mul(v, w);
421 DECREF(v);
422 DECREF(w);
423 PUSH(x);
424 break;
425
426 case BINARY_DIVIDE:
427 w = POP();
428 v = POP();
429 x = divide(v, w);
430 DECREF(v);
431 DECREF(w);
432 PUSH(x);
433 break;
434
435 case BINARY_MODULO:
436 w = POP();
437 v = POP();
438 x = rem(v, w);
439 DECREF(v);
440 DECREF(w);
441 PUSH(x);
442 break;
443
444 case BINARY_ADD:
445 w = POP();
446 v = POP();
447 x = add(v, w);
448 DECREF(v);
449 DECREF(w);
450 PUSH(x);
451 break;
452
453 case BINARY_SUBTRACT:
454 w = POP();
455 v = POP();
456 x = sub(v, w);
457 DECREF(v);
458 DECREF(w);
459 PUSH(x);
460 break;
461
462 case BINARY_SUBSCR:
463 w = POP();
464 v = POP();
465 x = apply_subscript(v, w);
466 DECREF(v);
467 DECREF(w);
468 PUSH(x);
469 break;
470
471 case BINARY_CALL:
472 w = POP();
473 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000474 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000475 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000476 DECREF(v);
477 DECREF(w);
478 PUSH(x);
479 break;
480
Guido van Rossum7928cd71991-10-24 14:59:31 +0000481 case BINARY_LSHIFT:
482 w = POP();
483 v = POP();
484 x = lshift(v, w);
485 DECREF(v);
486 DECREF(w);
487 PUSH(x);
488 break;
489
490 case BINARY_RSHIFT:
491 w = POP();
492 v = POP();
493 x = rshift(v, w);
494 DECREF(v);
495 DECREF(w);
496 PUSH(x);
497 break;
498
499 case BINARY_AND:
500 w = POP();
501 v = POP();
502 x = and(v, w);
503 DECREF(v);
504 DECREF(w);
505 PUSH(x);
506 break;
507
508 case BINARY_XOR:
509 w = POP();
510 v = POP();
511 x = xor(v, w);
512 DECREF(v);
513 DECREF(w);
514 PUSH(x);
515 break;
516
517 case BINARY_OR:
518 w = POP();
519 v = POP();
520 x = or(v, w);
521 DECREF(v);
522 DECREF(w);
523 PUSH(x);
524 break;
525
Guido van Rossum374a9221991-04-04 10:40:29 +0000526 case SLICE+0:
527 case SLICE+1:
528 case SLICE+2:
529 case SLICE+3:
530 if ((opcode-SLICE) & 2)
531 w = POP();
532 else
533 w = NULL;
534 if ((opcode-SLICE) & 1)
535 v = POP();
536 else
537 v = NULL;
538 u = POP();
539 x = apply_slice(u, v, w);
540 DECREF(u);
541 XDECREF(v);
542 XDECREF(w);
543 PUSH(x);
544 break;
545
546 case STORE_SLICE+0:
547 case STORE_SLICE+1:
548 case STORE_SLICE+2:
549 case STORE_SLICE+3:
550 if ((opcode-STORE_SLICE) & 2)
551 w = POP();
552 else
553 w = NULL;
554 if ((opcode-STORE_SLICE) & 1)
555 v = POP();
556 else
557 v = NULL;
558 u = POP();
559 t = POP();
560 err = assign_slice(u, v, w, t); /* u[v:w] = t */
561 DECREF(t);
562 DECREF(u);
563 XDECREF(v);
564 XDECREF(w);
565 break;
566
567 case DELETE_SLICE+0:
568 case DELETE_SLICE+1:
569 case DELETE_SLICE+2:
570 case DELETE_SLICE+3:
571 if ((opcode-DELETE_SLICE) & 2)
572 w = POP();
573 else
574 w = NULL;
575 if ((opcode-DELETE_SLICE) & 1)
576 v = POP();
577 else
578 v = NULL;
579 u = POP();
580 err = assign_slice(u, v, w, (object *)NULL);
581 /* del u[v:w] */
582 DECREF(u);
583 XDECREF(v);
584 XDECREF(w);
585 break;
586
587 case STORE_SUBSCR:
588 w = POP();
589 v = POP();
590 u = POP();
591 /* v[w] = u */
592 err = assign_subscript(v, w, u);
593 DECREF(u);
594 DECREF(v);
595 DECREF(w);
596 break;
597
598 case DELETE_SUBSCR:
599 w = POP();
600 v = POP();
601 /* del v[w] */
602 err = assign_subscript(v, w, (object *)NULL);
603 DECREF(v);
604 DECREF(w);
605 break;
606
607 case PRINT_EXPR:
608 v = POP();
609 fp = sysgetfile("stdout", stdout);
610 /* Print value except if procedure result */
611 if (v != None) {
612 flushline();
613 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000614 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 flushline();
616 }
617 DECREF(v);
618 break;
619
620 case PRINT_ITEM:
621 v = POP();
622 fp = sysgetfile("stdout", stdout);
623 if (softspace(sysget("stdout"), 1))
624 fprintf(fp, " ");
625 if (is_stringobject(v)) {
626 char *s = getstringvalue(v);
627 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000628 fwrite(s, 1, len, fp);
Guido van Rossum299a7341992-03-04 16:39:08 +0000629 if (ferror(fp)) {
630 err_errno(IOError);
631 err = -1;
632 }
633 else if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 softspace(sysget("stdout"), 0);
635 }
636 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000637 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 }
639 DECREF(v);
640 break;
641
642 case PRINT_NEWLINE:
643 fp = sysgetfile("stdout", stdout);
644 fprintf(fp, "\n");
645 softspace(sysget("stdout"), 0);
646 break;
647
648 case BREAK_LOOP:
649 why = WHY_BREAK;
650 break;
651
652 case RAISE_EXCEPTION:
653 v = POP();
654 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000655 /* A tuple is equivalent to its first element here */
656 while (is_tupleobject(w)) {
657 u = w;
658 w = gettupleitem(u, 0);
659 DECREF(u);
660 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 if (!is_stringobject(w))
662 err_setstr(TypeError,
663 "exceptions must be strings");
664 else
665 err_setval(w, v);
666 DECREF(v);
667 DECREF(w);
668 why = WHY_EXCEPTION;
669 break;
670
671 case LOAD_LOCALS:
672 v = f->f_locals;
673 INCREF(v);
674 PUSH(v);
675 break;
676
677 case RETURN_VALUE:
678 retval = POP();
679 why = WHY_RETURN;
680 break;
681
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 case BUILD_FUNCTION:
683 v = POP();
684 x = newfuncobject(v, f->f_globals);
685 DECREF(v);
686 PUSH(x);
687 break;
688
689 case POP_BLOCK:
690 {
691 block *b = pop_block(f);
692 while (STACK_LEVEL() > b->b_level) {
693 v = POP();
694 DECREF(v);
695 }
696 }
697 break;
698
699 case END_FINALLY:
700 v = POP();
701 if (is_intobject(v)) {
702 why = (enum why_code) getintvalue(v);
703 if (why == WHY_RETURN)
704 retval = POP();
705 }
706 else if (is_stringobject(v)) {
707 w = POP();
708 err_setval(v, w);
709 DECREF(w);
710 w = POP();
711 tb_store(w);
712 DECREF(w);
713 why = WHY_RERAISE;
714 }
715 else if (v != None) {
716 err_setstr(SystemError,
717 "'finally' pops bad exception");
718 why = WHY_EXCEPTION;
719 }
720 DECREF(v);
721 break;
722
723 case BUILD_CLASS:
724 w = POP();
725 v = POP();
726 x = build_class(v, w);
727 PUSH(x);
728 DECREF(v);
729 DECREF(w);
730 break;
731
732 case STORE_NAME:
733 w = GETNAMEV(oparg);
734 v = POP();
735 err = dict2insert(f->f_locals, w, v);
736 DECREF(v);
737 break;
738
739 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000740 w = GETNAMEV(oparg);
741 if ((err = dict2remove(f->f_locals, w)) != 0)
742 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 break;
744
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000745 case UNPACK_VARARG:
746 if (EMPTY()) {
747 err_setstr(TypeError,
748 "no argument list");
749 why = WHY_EXCEPTION;
750 break;
751 }
752 v = POP();
753 if (!is_tupleobject(v)) {
754 err_setstr(TypeError,
755 "bad argument list");
756 why = WHY_EXCEPTION;
757 }
758 else if (gettuplesize(v) < oparg) {
759 err_setstr(TypeError,
760 "not enough arguments");
761 why = WHY_EXCEPTION;
762 }
763 else if (oparg == 0) {
764 PUSH(v);
765 break;
766 }
767 else {
768 x = gettupleslice(v, oparg, gettuplesize(v));
769 if (x != NULL) {
770 PUSH(x);
771 for (; --oparg >= 0; ) {
772 w = gettupleitem(v, oparg);
773 INCREF(w);
774 PUSH(w);
775 }
776 }
777 }
778 DECREF(v);
779 break;
780
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000781 case UNPACK_ARG:
782 /* Implement various compatibility hacks:
783 (a) f(a,b,...) should accept f((1,2,...))
784 (b) f((a,b,...)) should accept f(1,2,...)
785 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
786 */
787 {
788 int n;
789 if (EMPTY()) {
790 err_setstr(TypeError,
791 "no argument list");
792 why = WHY_EXCEPTION;
793 break;
794 }
795 v = POP();
796 if (!is_tupleobject(v)) {
797 err_setstr(TypeError,
798 "bad argument list");
799 why = WHY_EXCEPTION;
800 break;
801 }
802 n = gettuplesize(v);
803 if (n == 1 && oparg != 1) {
804 /* Rule (a) */
805 w = gettupleitem(v, 0);
806 if (is_tupleobject(w)) {
807 INCREF(w);
808 DECREF(v);
809 v = w;
810 n = gettuplesize(v);
811 }
812 }
813 else if (n != 1 && oparg == 1) {
814 /* Rule (b) */
815 PUSH(v);
816 break;
817 /* Don't fall through */
818 }
819 else if (n > 2 && oparg == 2) {
820 /* Rule (c) */
821 int i;
822 w = newtupleobject(n-1);
823 u = newtupleobject(2);
824 if (u == NULL || w == NULL) {
825 XDECREF(w);
826 XDECREF(u);
827 DECREF(v);
828 why = WHY_EXCEPTION;
829 break;
830 }
831 t = gettupleitem(v, 0);
832 INCREF(t);
833 settupleitem(u, 0, t);
834 for (i = 1; i < n; i++) {
835 t = gettupleitem(v, i);
836 INCREF(t);
837 settupleitem(w, i-1, t);
838 }
839 settupleitem(u, 1, w);
840 DECREF(v);
841 v = u;
842 n = 2;
843 }
844 if (n != oparg) {
845 err_setstr(TypeError,
846 "arg count mismatch");
847 why = WHY_EXCEPTION;
848 DECREF(v);
849 break;
850 }
851 PUSH(v);
852 }
853 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000854 case UNPACK_TUPLE:
855 v = POP();
856 if (!is_tupleobject(v)) {
857 err_setstr(TypeError, "unpack non-tuple");
858 why = WHY_EXCEPTION;
859 }
860 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000861 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000862 "unpack tuple of wrong size");
863 why = WHY_EXCEPTION;
864 }
865 else {
866 for (; --oparg >= 0; ) {
867 w = gettupleitem(v, oparg);
868 INCREF(w);
869 PUSH(w);
870 }
871 }
872 DECREF(v);
873 break;
874
875 case UNPACK_LIST:
876 v = POP();
877 if (!is_listobject(v)) {
878 err_setstr(TypeError, "unpack non-list");
879 why = WHY_EXCEPTION;
880 }
881 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000882 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 "unpack list of wrong size");
884 why = WHY_EXCEPTION;
885 }
886 else {
887 for (; --oparg >= 0; ) {
888 w = getlistitem(v, oparg);
889 INCREF(w);
890 PUSH(w);
891 }
892 }
893 DECREF(v);
894 break;
895
896 case STORE_ATTR:
897 name = GETNAME(oparg);
898 v = POP();
899 u = POP();
900 err = setattr(v, name, u); /* v.name = u */
901 DECREF(v);
902 DECREF(u);
903 break;
904
905 case DELETE_ATTR:
906 name = GETNAME(oparg);
907 v = POP();
908 err = setattr(v, name, (object *)NULL);
909 /* del v.name */
910 DECREF(v);
911 break;
912
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000913 case STORE_GLOBAL:
914 w = GETNAMEV(oparg);
915 v = POP();
916 err = dict2insert(f->f_globals, w, v);
917 DECREF(v);
918 break;
919
920 case DELETE_GLOBAL:
921 w = GETNAMEV(oparg);
922 if ((err = dict2remove(f->f_globals, w)) != 0)
923 err_setstr(NameError, getstringvalue(w));
924 break;
925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 case LOAD_CONST:
927 x = GETCONST(oparg);
928 INCREF(x);
929 PUSH(x);
930 break;
931
932 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000933 w = GETNAMEV(oparg);
934 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000936 err_clear();
937 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000939 err_clear();
940 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000942 err_setstr(NameError,
943 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 break;
945 }
946 }
947 }
948 INCREF(x);
949 PUSH(x);
950 break;
951
952 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000953 w = GETNAMEV(oparg);
954 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000956 err_clear();
957 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000959 err_setstr(NameError,
960 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 break;
962 }
963 }
964 INCREF(x);
965 PUSH(x);
966 break;
967
968 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000969 w = GETNAMEV(oparg);
970 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000972 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 break;
974 }
975 INCREF(x);
976 PUSH(x);
977 break;
978
979 case BUILD_TUPLE:
980 x = newtupleobject(oparg);
981 if (x != NULL) {
982 for (; --oparg >= 0;) {
983 w = POP();
984 err = settupleitem(x, oparg, w);
985 if (err != 0)
986 break;
987 }
988 PUSH(x);
989 }
990 break;
991
992 case BUILD_LIST:
993 x = newlistobject(oparg);
994 if (x != NULL) {
995 for (; --oparg >= 0;) {
996 w = POP();
997 err = setlistitem(x, oparg, w);
998 if (err != 0)
999 break;
1000 }
1001 PUSH(x);
1002 }
1003 break;
1004
1005 case BUILD_MAP:
1006 x = newdictobject();
1007 PUSH(x);
1008 break;
1009
1010 case LOAD_ATTR:
1011 name = GETNAME(oparg);
1012 v = POP();
1013 x = getattr(v, name);
1014 DECREF(v);
1015 PUSH(x);
1016 break;
1017
1018 case COMPARE_OP:
1019 w = POP();
1020 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001021 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 DECREF(v);
1023 DECREF(w);
1024 PUSH(x);
1025 break;
1026
1027 case IMPORT_NAME:
1028 name = GETNAME(oparg);
1029 x = import_module(name);
1030 XINCREF(x);
1031 PUSH(x);
1032 break;
1033
1034 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001035 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001037 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 break;
1039
1040 case JUMP_FORWARD:
1041 JUMPBY(oparg);
1042 break;
1043
1044 case JUMP_IF_FALSE:
1045 if (!testbool(TOP()))
1046 JUMPBY(oparg);
1047 break;
1048
1049 case JUMP_IF_TRUE:
1050 if (testbool(TOP()))
1051 JUMPBY(oparg);
1052 break;
1053
1054 case JUMP_ABSOLUTE:
1055 JUMPTO(oparg);
1056 break;
1057
1058 case FOR_LOOP:
1059 /* for v in s: ...
1060 On entry: stack contains s, i.
1061 On exit: stack contains s, i+1, s[i];
1062 but if loop exhausted:
1063 s, i are popped, and we jump */
1064 w = POP(); /* Loop index */
1065 v = POP(); /* Sequence object */
1066 u = loop_subscript(v, w);
1067 if (u != NULL) {
1068 PUSH(v);
1069 x = newintobject(getintvalue(w)+1);
1070 PUSH(x);
1071 DECREF(w);
1072 PUSH(u);
1073 }
1074 else {
1075 DECREF(v);
1076 DECREF(w);
1077 /* A NULL can mean "s exhausted"
1078 but also an error: */
1079 if (err_occurred())
1080 why = WHY_EXCEPTION;
1081 else
1082 JUMPBY(oparg);
1083 }
1084 break;
1085
1086 case SETUP_LOOP:
1087 case SETUP_EXCEPT:
1088 case SETUP_FINALLY:
1089 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1090 STACK_LEVEL());
1091 break;
1092
1093 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001094#ifdef LLTRACE
1095 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 printf("--- Line %d ---\n", oparg);
1097#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001098 f->f_lineno = oparg;
1099 if (trace != NULL) {
1100 /* Trace each line of code reached */
1101 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001102 err = call_trace(&trace, &trace,
1103 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001104 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 break;
1106
1107 default:
1108 fprintf(stderr,
1109 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001110 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 err_setstr(SystemError, "eval_code: unknown opcode");
1112 why = WHY_EXCEPTION;
1113 break;
1114
1115 } /* switch */
1116
1117 on_error:
1118
1119 /* Quickly continue if no error occurred */
1120
1121 if (why == WHY_NOT) {
1122 if (err == 0 && x != NULL)
1123 continue; /* Normal, fast path */
1124 why = WHY_EXCEPTION;
1125 x = None;
1126 err = 0;
1127 }
1128
Guido van Rossum801dcae1992-04-08 11:32:32 +00001129#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 /* Double-check exception status */
1131
1132 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1133 if (!err_occurred()) {
1134 fprintf(stderr, "XXX ghost error\n");
1135 err_setstr(SystemError, "ghost error");
1136 why = WHY_EXCEPTION;
1137 }
1138 }
1139 else {
1140 if (err_occurred()) {
1141 fprintf(stderr, "XXX undetected error\n");
1142 why = WHY_EXCEPTION;
1143 }
1144 }
1145#endif
1146
1147 /* Log traceback info if this is a real exception */
1148
1149 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001150 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001152 f->f_lasti -= 2;
1153 tb_here(f);
1154
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001155 if (trace)
1156 call_exc_trace(&trace, &trace, f);
1157 if (sys_profile)
1158 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 }
1160
1161 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1162
1163 if (why == WHY_RERAISE)
1164 why = WHY_EXCEPTION;
1165
1166 /* Unwind stacks if a (pseudo) exception occurred */
1167
1168 while (why != WHY_NOT && f->f_iblock > 0) {
1169 block *b = pop_block(f);
1170 while (STACK_LEVEL() > b->b_level) {
1171 v = POP();
1172 XDECREF(v);
1173 }
1174 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1175 why = WHY_NOT;
1176 JUMPTO(b->b_handler);
1177 break;
1178 }
1179 if (b->b_type == SETUP_FINALLY ||
1180 b->b_type == SETUP_EXCEPT &&
1181 why == WHY_EXCEPTION) {
1182 if (why == WHY_EXCEPTION) {
1183 object *exc, *val;
1184 err_get(&exc, &val);
1185 if (val == NULL) {
1186 val = None;
1187 INCREF(val);
1188 }
1189 v = tb_fetch();
1190 /* Make the raw exception data
1191 available to the handler,
1192 so a program can emulate the
1193 Python main loop. Don't do
1194 this for 'finally'. */
1195 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001197 sysset("exc_value", val);
1198 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 }
1200 PUSH(v);
1201 PUSH(val);
1202 PUSH(exc);
1203 }
1204 else {
1205 if (why == WHY_RETURN)
1206 PUSH(retval);
1207 v = newintobject((long)why);
1208 PUSH(v);
1209 }
1210 why = WHY_NOT;
1211 JUMPTO(b->b_handler);
1212 break;
1213 }
1214 } /* unwind stack */
1215
1216 /* End the loop if we still have an error (or return) */
1217
1218 if (why != WHY_NOT)
1219 break;
1220
1221 } /* main loop */
1222
1223 /* Pop remaining stack entries */
1224
1225 while (!EMPTY()) {
1226 v = POP();
1227 XDECREF(v);
1228 }
1229
Guido van Rossum96a42c81992-01-12 02:29:51 +00001230 if (why != WHY_RETURN)
1231 retval = NULL;
1232
1233 if (trace) {
1234 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001235 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001236 XDECREF(retval);
1237 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001238 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001239 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001240 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001241 XDECREF(trace);
1242 }
1243
1244 if (sys_profile && why == WHY_RETURN) {
1245 if (call_trace(&sys_profile, (object**)0,
1246 f, "return", retval)) {
1247 XDECREF(retval);
1248 retval = NULL;
1249 why = WHY_EXCEPTION;
1250 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001251 }
1252
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 /* Restore previous frame and release the current one */
1254
1255 current_frame = f->f_back;
1256 DECREF(f);
1257
Guido van Rossum96a42c81992-01-12 02:29:51 +00001258 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001259}
1260
Guido van Rossum96a42c81992-01-12 02:29:51 +00001261#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001262static int
1263prtrace(v, str)
1264 object *v;
1265 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001266{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001267 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001268 if (printobject(v, stdout, 0) != 0)
1269 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001274static void
1275call_exc_trace(p_trace, p_newtrace, f)
1276 object **p_trace, **p_newtrace;
1277 frameobject *f;
1278{
1279 object *type, *value, *traceback, *arg;
1280 int err;
1281 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001282 if (value == NULL) {
1283 value = None;
1284 INCREF(value);
1285 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001286 traceback = tb_fetch();
1287 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001288 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001289 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001290 settupleitem(arg, 0, type);
1291 settupleitem(arg, 1, value);
1292 settupleitem(arg, 2, traceback);
1293 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001294 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001295 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001296 /* Restore original exception */
1297 err_setval(type, value);
1298 tb_store(traceback);
1299 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001300 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001301}
1302
1303static int
1304call_trace(p_trace, p_newtrace, f, msg, arg)
1305 object **p_trace; /* in/out; may not be NULL;
1306 may not point to NULL variable initially */
1307 object **p_newtrace; /* in/out; may be NULL;
1308 may point to NULL variable;
1309 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001310 frameobject *f;
1311 char *msg;
1312 object *arg;
1313{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001314 object *arglist, *what;
1315 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001316 static int tracing = 0;
1317
1318 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001319 /* Don't do recursive traces */
1320 if (p_newtrace) {
1321 XDECREF(*p_newtrace);
1322 *p_newtrace = NULL;
1323 }
1324 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001325 }
1326
1327 arglist = newtupleobject(3);
1328 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001329 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001330 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001331 if (what == NULL)
1332 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001333 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001334 settupleitem(arglist, 0, (object *)f);
1335 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001336 if (arg == NULL)
1337 arg = None;
1338 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001339 settupleitem(arglist, 2, arg);
1340 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001341 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001342 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001343 cleanup:
1344 XDECREF(arglist);
1345 if (res == NULL) {
1346 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001347 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001348 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001349 *p_trace = NULL;
1350 if (p_newtrace) {
1351 XDECREF(*p_newtrace);
1352 *p_newtrace = NULL;
1353 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001354 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001355 }
1356 else {
1357 if (p_newtrace) {
1358 XDECREF(*p_newtrace);
1359 if (res == None)
1360 *p_newtrace = NULL;
1361 else {
1362 INCREF(res);
1363 *p_newtrace = res;
1364 }
1365 }
1366 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001367 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001368 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001369}
1370
Guido van Rossum3f5da241990-12-20 15:06:42 +00001371object *
1372getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001374 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001375 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001376 else
1377 return current_frame->f_locals;
1378}
1379
1380object *
1381getglobals()
1382{
1383 if (current_frame == NULL)
1384 return NULL;
1385 else
1386 return current_frame->f_globals;
1387}
1388
1389void
1390printtraceback(fp)
1391 FILE *fp;
1392{
1393 object *v = tb_fetch();
1394 if (v != NULL) {
1395 fprintf(fp, "Stack backtrace (innermost last):\n");
1396 tb_print(v, fp);
1397 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399}
1400
1401
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402void
1403flushline()
1404{
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 if (softspace(sysget("stdout"), 0))
1406 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407}
1408
Guido van Rossum3f5da241990-12-20 15:06:42 +00001409
1410/* Test a value used as condition, e.g., in a for or if statement */
1411
1412static int
1413testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 object *v;
1415{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001416 if (v == None)
1417 return 0;
1418 if (v->ob_type->tp_as_number != NULL)
1419 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420 if (v->ob_type->tp_as_sequence != NULL)
1421 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1422 if (v->ob_type->tp_as_mapping != NULL)
1423 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001424 /* All other objects are 'true' */
1425 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426}
1427
1428static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001429or(v, w)
1430 object *v, *w;
1431{
1432 if (v->ob_type->tp_as_number != NULL) {
1433 object *x;
1434 object * (*f) FPROTO((object *, object *));
1435 if (coerce(&v, &w) != 0)
1436 return NULL;
1437 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1438 x = (*f)(v, w);
1439 DECREF(v);
1440 DECREF(w);
1441 if (f != NULL)
1442 return x;
1443 }
1444 err_setstr(TypeError, "bad operand type(s) for |");
1445 return NULL;
1446}
1447
1448static object *
1449xor(v, w)
1450 object *v, *w;
1451{
1452 if (v->ob_type->tp_as_number != NULL) {
1453 object *x;
1454 object * (*f) FPROTO((object *, object *));
1455 if (coerce(&v, &w) != 0)
1456 return NULL;
1457 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1458 x = (*f)(v, w);
1459 DECREF(v);
1460 DECREF(w);
1461 if (f != NULL)
1462 return x;
1463 }
1464 err_setstr(TypeError, "bad operand type(s) for ^");
1465 return NULL;
1466}
1467
1468static object *
1469and(v, w)
1470 object *v, *w;
1471{
1472 if (v->ob_type->tp_as_number != NULL) {
1473 object *x;
1474 object * (*f) FPROTO((object *, object *));
1475 if (coerce(&v, &w) != 0)
1476 return NULL;
1477 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1478 x = (*f)(v, w);
1479 DECREF(v);
1480 DECREF(w);
1481 if (f != NULL)
1482 return x;
1483 }
1484 err_setstr(TypeError, "bad operand type(s) for &");
1485 return NULL;
1486}
1487
1488static object *
1489lshift(v, w)
1490 object *v, *w;
1491{
1492 if (v->ob_type->tp_as_number != NULL) {
1493 object *x;
1494 object * (*f) FPROTO((object *, object *));
1495 if (coerce(&v, &w) != 0)
1496 return NULL;
1497 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1498 x = (*f)(v, w);
1499 DECREF(v);
1500 DECREF(w);
1501 if (f != NULL)
1502 return x;
1503 }
1504 err_setstr(TypeError, "bad operand type(s) for <<");
1505 return NULL;
1506}
1507
1508static object *
1509rshift(v, w)
1510 object *v, *w;
1511{
1512 if (v->ob_type->tp_as_number != NULL) {
1513 object *x;
1514 object * (*f) FPROTO((object *, object *));
1515 if (coerce(&v, &w) != 0)
1516 return NULL;
1517 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1518 x = (*f)(v, w);
1519 DECREF(v);
1520 DECREF(w);
1521 if (f != NULL)
1522 return x;
1523 }
1524 err_setstr(TypeError, "bad operand type(s) for >>");
1525 return NULL;
1526}
1527
1528static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001529add(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_add)(v, w);
1537 DECREF(v);
1538 DECREF(w);
1539 return x;
1540 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001541 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001542 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001543 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545 return NULL;
1546 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547}
1548
1549static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 object *v, *w;
1552{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001553 if (v->ob_type->tp_as_number != NULL) {
1554 object *x;
1555 if (coerce(&v, &w) != 0)
1556 return NULL;
1557 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1558 DECREF(v);
1559 DECREF(w);
1560 return x;
1561 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001562 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 return NULL;
1564}
1565
1566static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001567mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 object *v, *w;
1569{
1570 typeobject *tp;
1571 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1572 /* int*sequence -- swap v and w */
1573 object *tmp = v;
1574 v = w;
1575 w = tmp;
1576 }
1577 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001578 if (tp->tp_as_number != NULL) {
1579 object *x;
1580 if (coerce(&v, &w) != 0)
1581 return NULL;
1582 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1583 DECREF(v);
1584 DECREF(w);
1585 return x;
1586 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001587 if (tp->tp_as_sequence != NULL) {
1588 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001589 err_setstr(TypeError,
1590 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591 return NULL;
1592 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593 return (*tp->tp_as_sequence->sq_repeat)
1594 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597 return NULL;
1598}
1599
1600static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001601divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 object *v, *w;
1603{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001604 if (v->ob_type->tp_as_number != NULL) {
1605 object *x;
1606 if (coerce(&v, &w) != 0)
1607 return NULL;
1608 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1609 DECREF(v);
1610 DECREF(w);
1611 return x;
1612 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614 return NULL;
1615}
1616
1617static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001618rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 object *v, *w;
1620{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001621 if (v->ob_type->tp_as_number != NULL) {
1622 object *x;
1623 if (coerce(&v, &w) != 0)
1624 return NULL;
1625 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1626 DECREF(v);
1627 DECREF(w);
1628 return x;
1629 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 return NULL;
1632}
1633
1634static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 object *v;
1637{
1638 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 return (*v->ob_type->tp_as_number->nb_negative)(v);
1640 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 return NULL;
1642}
1643
1644static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001645pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 object *v;
1647{
1648 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001649 return (*v->ob_type->tp_as_number->nb_positive)(v);
1650 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001651 return NULL;
1652}
1653
1654static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001655invert(v)
1656 object *v;
1657{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001658 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001659 if (v->ob_type->tp_as_number != NULL &&
1660 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1661 return (*f)(v);
1662 err_setstr(TypeError, "bad operand type(s) for unary ~");
1663 return NULL;
1664}
1665
1666static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001667not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001668 object *v;
1669{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001670 int outcome = testbool(v);
1671 object *w = outcome == 0 ? True : False;
1672 INCREF(w);
1673 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001674}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001675/* External interface to call any callable object. The arg may be NULL. */
1676
1677object *
1678call_object(func, arg)
1679 object *func;
1680 object *arg;
1681{
1682 if (is_instancemethodobject(func) || is_funcobject(func))
1683 return call_function(func, arg);
1684 else
1685 return call_builtin(func, arg);
1686}
1687
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001689call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 if (is_methodobject(func)) {
1694 method meth = getmethod(func);
1695 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001696 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1697 int size = gettuplesize(arg);
1698 if (size == 1)
1699 arg = gettupleitem(arg, 0);
1700 else if (size == 0)
1701 arg = NULL;
1702 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704 }
1705 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001706 if (arg != NULL &&
1707 !(is_tupleobject(arg) &&
1708 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709 err_setstr(TypeError,
1710 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 return NULL;
1712 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001714 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 return NULL;
1717}
1718
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001719static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001720call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001721 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001722 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001724 object *newarg = NULL;
1725 object *newlocals, *newglobals;
1726 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727
Guido van Rossume8122f11991-05-05 20:03:07 +00001728 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001729 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001730 object *self = instancemethodgetself(func);
1731 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001732 if (arg == NULL)
1733 argcount = 0;
1734 else if (is_tupleobject(arg))
1735 argcount = gettuplesize(arg);
1736 else
1737 argcount = 1;
1738 newarg = newtupleobject(argcount + 1);
1739 if (newarg == NULL)
1740 return NULL;
1741 INCREF(self);
1742 settupleitem(newarg, 0, self);
1743 if (arg != NULL && !is_tupleobject(arg)) {
1744 INCREF(arg);
1745 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 }
1747 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001748 int i;
1749 object *v;
1750 for (i = 0; i < argcount; i++) {
1751 v = gettupleitem(arg, i);
1752 XINCREF(v);
1753 settupleitem(newarg, i+1, v);
1754 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001756 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 }
1758 else {
1759 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001760 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761 return NULL;
1762 }
1763 }
1764
Guido van Rossum3f5da241990-12-20 15:06:42 +00001765 co = getfunccode(func);
1766 if (co == NULL) {
1767 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768 return NULL;
1769 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001770 if (!is_codeobject(co)) {
1771 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772 abort();
1773 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001776 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 return NULL;
1778 }
1779
Guido van Rossum3f5da241990-12-20 15:06:42 +00001780 newglobals = getfuncglobals(func);
1781 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782
Guido van Rossum3f5da241990-12-20 15:06:42 +00001783 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784
Guido van Rossum3f5da241990-12-20 15:06:42 +00001785 DECREF(newlocals);
1786 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787
Guido van Rossum3f5da241990-12-20 15:06:42 +00001788 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789
1790 return v;
1791}
1792
1793static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001794apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795 object *v, *w;
1796{
1797 typeobject *tp = v->ob_type;
1798 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001799 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 return NULL;
1801 }
1802 if (tp->tp_as_sequence != NULL) {
1803 int i;
1804 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001805 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 return NULL;
1807 }
1808 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001809 if (i < 0)
1810 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001811 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001813 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814}
1815
1816static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001817loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 object *v, *w;
1819{
1820 sequence_methods *sq = v->ob_type->tp_as_sequence;
1821 int i, n;
1822 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001823 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 return NULL;
1825 }
1826 i = getintvalue(w);
1827 n = (*sq->sq_length)(v);
1828 if (i >= n)
1829 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001830 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831}
1832
1833static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001834slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 object *v;
1836 int isize;
1837 int *pi;
1838{
1839 if (v != NULL) {
1840 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001841 err_setstr(TypeError, "slice index must be int");
1842 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 }
1844 *pi = getintvalue(v);
1845 if (*pi < 0)
1846 *pi += isize;
1847 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001848 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849}
1850
1851static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001852apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 object *u, *v, *w;
1854{
1855 typeobject *tp = u->ob_type;
1856 int ilow, ihigh, isize;
1857 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001858 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 return NULL;
1860 }
1861 ilow = 0;
1862 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001863 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001865 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001869
1870static int
1871assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872 object *w;
1873 object *key;
1874 object *v;
1875{
1876 typeobject *tp = w->ob_type;
1877 sequence_methods *sq;
1878 mapping_methods *mp;
1879 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 if ((sq = tp->tp_as_sequence) != NULL &&
1881 (func = sq->sq_ass_item) != NULL) {
1882 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001883 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001884 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001885 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001887 else {
1888 int i = getintvalue(key);
1889 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001890 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001891 return (*func)(w, i, v);
1892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 }
1894 else if ((mp = tp->tp_as_mapping) != NULL &&
1895 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001896 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 }
1898 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001899 err_setstr(TypeError,
1900 "can't assign to this subscripted object");
1901 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903}
1904
Guido van Rossum3f5da241990-12-20 15:06:42 +00001905static int
1906assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 object *u, *v, *w, *x;
1908{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911 if (sq == NULL) {
1912 err_setstr(TypeError, "assign to slice of non-sequence");
1913 return -1;
1914 }
1915 if (sq == NULL || sq->sq_ass_slice == NULL) {
1916 err_setstr(TypeError, "unassignable slice");
1917 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 }
1919 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920 isize = ihigh = (*sq->sq_length)(u);
1921 if (slice_index(v, isize, &ilow) != 0)
1922 return -1;
1923 if (slice_index(w, isize, &ihigh) != 0)
1924 return -1;
1925 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926}
1927
1928static int
1929cmp_exception(err, v)
1930 object *err, *v;
1931{
1932 if (is_tupleobject(v)) {
1933 int i, n;
1934 n = gettuplesize(v);
1935 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001936 /* Test recursively */
1937 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 return 1;
1939 }
1940 return 0;
1941 }
1942 return err == v;
1943}
1944
Guido van Rossum3f5da241990-12-20 15:06:42 +00001945static int
1946cmp_member(v, w)
1947 object *v, *w;
1948{
1949 int i, n, cmp;
1950 object *x;
1951 sequence_methods *sq;
1952 /* Special case for char in string */
1953 if (is_stringobject(w)) {
1954 register char *s, *end;
1955 register char c;
1956 if (!is_stringobject(v) || getstringsize(v) != 1) {
1957 err_setstr(TypeError,
1958 "string member test needs char left operand");
1959 return -1;
1960 }
1961 c = getstringvalue(v)[0];
1962 s = getstringvalue(w);
1963 end = s + getstringsize(w);
1964 while (s < end) {
1965 if (c == *s++)
1966 return 1;
1967 }
1968 return 0;
1969 }
1970 sq = w->ob_type->tp_as_sequence;
1971 if (sq == NULL) {
1972 err_setstr(TypeError,
1973 "'in' or 'not in' needs sequence right argument");
1974 return -1;
1975 }
1976 n = (*sq->sq_length)(w);
1977 for (i = 0; i < n; i++) {
1978 x = (*sq->sq_item)(w, i);
1979 cmp = cmpobject(v, x);
1980 XDECREF(x);
1981 if (cmp == 0)
1982 return 1;
1983 }
1984 return 0;
1985}
1986
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001989 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 register object *v;
1991 register object *w;
1992{
1993 register int cmp;
1994 register int res = 0;
1995 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996 case IS:
1997 case IS_NOT:
1998 res = (v == w);
1999 if (op == IS_NOT)
2000 res = !res;
2001 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 case IN:
2003 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002004 res = cmp_member(v, w);
2005 if (res < 0)
2006 return NULL;
2007 if (op == NOT_IN)
2008 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 break;
2010 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002011 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 break;
2013 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014 cmp = cmpobject(v, w);
2015 switch (op) {
2016 case LT: res = cmp < 0; break;
2017 case LE: res = cmp <= 0; break;
2018 case EQ: res = cmp == 0; break;
2019 case NE: res = cmp != 0; break;
2020 case GT: res = cmp > 0; break;
2021 case GE: res = cmp >= 0; break;
2022 /* XXX no default? (res is initialized to 0 though) */
2023 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 }
2025 v = res ? True : False;
2026 INCREF(v);
2027 return v;
2028}
2029
Guido van Rossum3f5da241990-12-20 15:06:42 +00002030static int
2031import_from(locals, v, name)
2032 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002033 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002034 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002035{
2036 object *w, *x;
2037 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002038 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002039 int i;
2040 int n = getdictsize(w);
2041 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002042 name = getdict2key(w, i);
2043 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002044 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002045 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002046 if (x == NULL) {
2047 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002048 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002049 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002050 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002051 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002052 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002053 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002054 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002055 }
2056 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002057 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002058 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002059 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002060 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002061 getstringvalue(name));
2062 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002063 return -1;
2064 }
2065 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002066 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002067 }
2068}
2069
2070static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002072 object *v; /* None or tuple containing base classes */
2073 object *w; /* dictionary */
2074{
2075 if (is_tupleobject(v)) {
2076 int i;
2077 for (i = gettuplesize(v); --i >= 0; ) {
2078 object *x = gettupleitem(v, i);
2079 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080 err_setstr(TypeError,
2081 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002082 return NULL;
2083 }
2084 }
2085 }
2086 else {
2087 v = NULL;
2088 }
2089 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002091 return NULL;
2092 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002093 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002094}