blob: 64f2429a74bc18eb1ee14615c7a0d52b7af917de [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum34679b71993-01-26 13:33:44 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
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"
Guido van Rossumff4949e1992-08-05 19:58:53 +000033#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000035#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000036#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "traceback.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000038
Guido van Rossum04691fc1992-08-12 15:35:34 +000039/* Turn this on if your compiler chokes on the big switch: */
40/* #define CASE_TOO_BIG 1 /**/
41
Guido van Rossum3f5da241990-12-20 15:06:42 +000042#ifndef NDEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000043/* For debugging the interpreter: */
44#define LLTRACE 1 /* Low-level trace feature */
45#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000046#endif
47
Guido van Rossum374a9221991-04-04 10:40:29 +000048/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000049
Guido van Rossum0a066c01992-03-27 17:29:15 +000050#ifdef LLTRACE
51static int prtrace PROTO((object *, char *));
52#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000053static void call_exc_trace PROTO((object **, object**, frameobject *));
54static int call_trace
55 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000056static int testbool PROTO((object *));
57static object *add PROTO((object *, object *));
58static object *sub PROTO((object *, object *));
59static object *mul PROTO((object *, object *));
60static object *divide PROTO((object *, object *));
61static object *rem PROTO((object *, object *));
62static object *neg PROTO((object *));
63static object *pos PROTO((object *));
64static object *not PROTO((object *));
65static object *invert PROTO((object *));
66static object *lshift PROTO((object *, object *));
67static object *rshift PROTO((object *, object *));
68static object *and PROTO((object *, object *));
69static object *xor PROTO((object *, object *));
70static object *or PROTO((object *, object *));
71static object *call_builtin PROTO((object *, object *));
72static object *call_function PROTO((object *, object *));
73static object *apply_subscript PROTO((object *, object *));
74static object *loop_subscript PROTO((object *, object *));
75static int slice_index PROTO((object *, int, int *));
76static object *apply_slice PROTO((object *, object *, object *));
77static int assign_subscript PROTO((object *, object *, object *));
78static int assign_slice PROTO((object *, object *, object *, object *));
79static int cmp_exception PROTO((object *, object *));
80static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000081static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000082static int import_from PROTO((object *, object *, object *));
83static object *build_class PROTO((object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000084
85
Guido van Rossum0a066c01992-03-27 17:29:15 +000086/* Pointer to current frame, used to link new frames to */
87
Guido van Rossum374a9221991-04-04 10:40:29 +000088static frameobject *current_frame;
89
Guido van Rossum1984f1e1992-08-04 12:41:02 +000090#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000091
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092#include <errno.h>
93#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000094
Guido van Rossum1984f1e1992-08-04 12:41:02 +000095static type_lock interpreter_lock;
96
97void
98init_save_thread()
99{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000100 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000101 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102 interpreter_lock = allocate_lock();
103 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000105
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000106#endif
107
Guido van Rossumff4949e1992-08-05 19:58:53 +0000108/* Functions save_thread and restore_thread are always defined so
109 dynamically loaded modules needn't be compiled separately for use
110 with and without threads: */
111
Guido van Rossum04691fc1992-08-12 15:35:34 +0000112object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113save_thread()
114{
115#ifdef USE_THREAD
116 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000117 object *res;
118 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119 current_frame = NULL;
120 release_lock(interpreter_lock);
121 return res;
122 }
123 else
124 return NULL;
125#endif
126}
127
128void
129restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000130 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131{
132#ifdef USE_THREAD
133 if (interpreter_lock) {
134 int err;
135 err = errno;
136 acquire_lock(interpreter_lock, 1);
137 errno = err;
138 current_frame = (frameobject *)x;
139 }
140#endif
141}
142
143
Guido van Rossum374a9221991-04-04 10:40:29 +0000144/* Status code for main loop (reason for stack unwind) */
145
146enum why_code {
147 WHY_NOT, /* No error */
148 WHY_EXCEPTION, /* Exception occurred */
149 WHY_RERAISE, /* Exception re-raised by 'finally' */
150 WHY_RETURN, /* 'return' statement */
151 WHY_BREAK /* 'break' statement */
152};
153
154
155/* Interpreter main loop */
156
157object *
158eval_code(co, globals, locals, arg)
159 codeobject *co;
160 object *globals;
161 object *locals;
162 object *arg;
163{
164 register unsigned char *next_instr;
165 register int opcode; /* Current opcode */
166 register int oparg; /* Current opcode argument, if any */
167 register object **stack_pointer;
168 register enum why_code why; /* Reason for block stack unwind */
169 register int err; /* Error status -- nonzero if error */
170 register object *x; /* Result object -- NULL if error */
171 register object *v; /* Temporary objects popped off stack */
172 register object *w;
173 register object *u;
174 register object *t;
175 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000176 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000177 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000178 object *retval; /* Return value iff why == WHY_RETURN */
179 char *name; /* Name used by some instructions */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000180#ifdef LLTRACE
181 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000182#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000183#ifdef DEBUG
184 /* Make it easier to find out where we are with dbx */
185 char *filename = getstringvalue(co->co_filename);
186#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000187
188/* Code access macros */
189
190#define GETCONST(i) Getconst(f, i)
191#define GETNAME(i) Getname(f, i)
192#define GETNAMEV(i) Getnamev(f, i)
193#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
194#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
195#define NEXTOP() (*next_instr++)
196#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
197#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
198#define JUMPBY(x) (next_instr += (x))
199
200/* Stack manipulation macros */
201
202#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
203#define EMPTY() (STACK_LEVEL() == 0)
204#define TOP() (stack_pointer[-1])
205#define BASIC_PUSH(v) (*stack_pointer++ = (v))
206#define BASIC_POP() (*--stack_pointer)
207
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000208#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
209 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
210
Guido van Rossum96a42c81992-01-12 02:29:51 +0000211#ifdef LLTRACE
212#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
213#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000214#else
215#define PUSH(v) BASIC_PUSH(v)
216#define POP() BASIC_POP()
217#endif
218
219 f = newframeobject(
220 current_frame, /*back*/
221 co, /*code*/
222 globals, /*globals*/
223 locals, /*locals*/
224 50, /*nvalues*/
225 20); /*nblocks*/
226 if (f == NULL)
227 return NULL;
228
229 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000230
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000231 if (sys_trace != NULL) {
232 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000233 be called on *every* entry to a code block.
234 Its return value, if not None, is a function that
235 will be called at the start of each executed line
236 of code. (Actually, the function must return
237 itself in order to continue tracing.)
238 The trace functions are called with three arguments:
239 a pointer to the current frame, a string indicating
240 why the function is called, and an argument which
241 depends on the situation. The global trace function
242 (sys.trace) is also called whenever an exception
243 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000244 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000245 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000246 current_frame = f->f_back;
247 DECREF(f);
248 return NULL;
249 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000250 }
251
252 if (sys_profile != NULL) {
253 /* Similar for sys_profile, except it needn't return
254 itself and isn't called for "line" events */
255 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
256 current_frame = f->f_back;
257 DECREF(f);
258 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000259 }
260 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000261
262 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000263 stack_pointer = f->f_valuestack;
264
265 if (arg != NULL) {
266 INCREF(arg);
267 PUSH(arg);
268 }
269
270 why = WHY_NOT;
271 err = 0;
272 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000273
274 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000275 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000276
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000277 /* Do periodic things.
278 Doing this every time through the loop would add
279 too much overhead (a function call per instruction).
280 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000281
282 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000283 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000284 if (intrcheck()) {
285 err_set(KeyboardInterrupt);
286 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000287 goto on_error;
288 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000289
290#ifdef USE_THREAD
291 if (interpreter_lock) {
292 /* Give another thread a chance */
293
294 current_frame = NULL;
295 release_lock(interpreter_lock);
296
297 /* Other threads may run now */
298
299 acquire_lock(interpreter_lock, 1);
300 current_frame = f;
301 }
302#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000303 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000304
Guido van Rossum374a9221991-04-04 10:40:29 +0000305 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000306
307#ifdef DEBUG
308 f->f_lasti = INSTR_OFFSET();
309#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000310
311 opcode = NEXTOP();
312 if (HAS_ARG(opcode))
313 oparg = NEXTARG();
314
Guido van Rossum96a42c81992-01-12 02:29:51 +0000315#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000316 /* Instruction tracing */
317
Guido van Rossum96a42c81992-01-12 02:29:51 +0000318 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000319 if (HAS_ARG(opcode)) {
320 printf("%d: %d, %d\n",
321 (int) (INSTR_OFFSET() - 3),
322 opcode, oparg);
323 }
324 else {
325 printf("%d: %d\n",
326 (int) (INSTR_OFFSET() - 1), opcode);
327 }
328 }
329#endif
330
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000331 if (!CHECK_STACK(3)) {
332 x = NULL;
333 break;
334 }
335
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 /* 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();
Guido van Rossum374a9221991-04-04 10:40:29 +0000609 /* Print value except if procedure result */
610 if (v != None) {
611 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000612 x = sysget("stdout");
613 softspace(x, 1);
614 err = writeobject(v, x, 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();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000622 w = sysget("stdout");
623 if (softspace(w, 1))
624 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 if (is_stringobject(v)) {
626 char *s = getstringvalue(v);
627 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000628 err = writeobject(v, w, PRINT_RAW);
629 if (err == 0 && len > 0 && s[len-1] == '\n')
630 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000631 }
632 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000633 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 }
635 DECREF(v);
636 break;
637
638 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000639 x = sysget("stdout");
640 if (x == NULL)
641 err_setstr(RuntimeError, "lost sys.stdout");
642 else {
643 writestring("\n", x);
644 softspace(x, 0);
645 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000646 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;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000744
745#ifdef CASE_TOO_BIG
746 default: switch (opcode) {
747#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000748
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000749 case UNPACK_VARARG:
750 if (EMPTY()) {
751 err_setstr(TypeError,
752 "no argument list");
753 why = WHY_EXCEPTION;
754 break;
755 }
756 v = POP();
757 if (!is_tupleobject(v)) {
758 err_setstr(TypeError,
759 "bad argument list");
760 why = WHY_EXCEPTION;
761 }
762 else if (gettuplesize(v) < oparg) {
763 err_setstr(TypeError,
764 "not enough arguments");
765 why = WHY_EXCEPTION;
766 }
767 else if (oparg == 0) {
768 PUSH(v);
769 break;
770 }
771 else {
772 x = gettupleslice(v, oparg, gettuplesize(v));
773 if (x != NULL) {
774 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000775 if (!CHECK_STACK(oparg)) {
776 x = NULL;
777 break;
778 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000779 for (; --oparg >= 0; ) {
780 w = gettupleitem(v, oparg);
781 INCREF(w);
782 PUSH(w);
783 }
784 }
785 }
786 DECREF(v);
787 break;
788
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000789 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000790 {
791 int n;
792 if (EMPTY()) {
793 err_setstr(TypeError,
794 "no argument list");
795 why = WHY_EXCEPTION;
796 break;
797 }
798 v = POP();
799 if (!is_tupleobject(v)) {
800 err_setstr(TypeError,
801 "bad argument list");
802 why = WHY_EXCEPTION;
803 break;
804 }
805 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000806#ifdef COMPAT_HACKS
807/* Implement various compatibility hacks (for 0.9.4 or earlier):
808 (a) f(a,b,...) accepts f((1,2,...))
809 (b) f((a,b,...)) accepts f(1,2,...)
810 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
811*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000812 if (n == 1 && oparg != 1) {
813 /* Rule (a) */
814 w = gettupleitem(v, 0);
815 if (is_tupleobject(w)) {
816 INCREF(w);
817 DECREF(v);
818 v = w;
819 n = gettuplesize(v);
820 }
821 }
822 else if (n != 1 && oparg == 1) {
823 /* Rule (b) */
824 PUSH(v);
825 break;
826 /* Don't fall through */
827 }
828 else if (n > 2 && oparg == 2) {
829 /* Rule (c) */
830 int i;
831 w = newtupleobject(n-1);
832 u = newtupleobject(2);
833 if (u == NULL || w == NULL) {
834 XDECREF(w);
835 XDECREF(u);
836 DECREF(v);
837 why = WHY_EXCEPTION;
838 break;
839 }
840 t = gettupleitem(v, 0);
841 INCREF(t);
842 settupleitem(u, 0, t);
843 for (i = 1; i < n; i++) {
844 t = gettupleitem(v, i);
845 INCREF(t);
846 settupleitem(w, i-1, t);
847 }
848 settupleitem(u, 1, w);
849 DECREF(v);
850 v = u;
851 n = 2;
852 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000853#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000854 if (n != oparg) {
855 err_setstr(TypeError,
856 "arg count mismatch");
857 why = WHY_EXCEPTION;
858 DECREF(v);
859 break;
860 }
861 PUSH(v);
862 }
863 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000864 case UNPACK_TUPLE:
865 v = POP();
866 if (!is_tupleobject(v)) {
867 err_setstr(TypeError, "unpack non-tuple");
868 why = WHY_EXCEPTION;
869 }
870 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000871 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 "unpack tuple of wrong size");
873 why = WHY_EXCEPTION;
874 }
875 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000876 if (!CHECK_STACK(oparg)) {
877 x = NULL;
878 break;
879 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 for (; --oparg >= 0; ) {
881 w = gettupleitem(v, oparg);
882 INCREF(w);
883 PUSH(w);
884 }
885 }
886 DECREF(v);
887 break;
888
889 case UNPACK_LIST:
890 v = POP();
891 if (!is_listobject(v)) {
892 err_setstr(TypeError, "unpack non-list");
893 why = WHY_EXCEPTION;
894 }
895 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000896 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 "unpack list of wrong size");
898 why = WHY_EXCEPTION;
899 }
900 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000901 if (!CHECK_STACK(oparg)) {
902 x = NULL;
903 break;
904 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 for (; --oparg >= 0; ) {
906 w = getlistitem(v, oparg);
907 INCREF(w);
908 PUSH(w);
909 }
910 }
911 DECREF(v);
912 break;
913
914 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000915 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 v = POP();
917 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000918 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 DECREF(v);
920 DECREF(u);
921 break;
922
923 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000924 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000926 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 DECREF(v);
928 break;
929
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000930 case STORE_GLOBAL:
931 w = GETNAMEV(oparg);
932 v = POP();
933 err = dict2insert(f->f_globals, w, v);
934 DECREF(v);
935 break;
936
937 case DELETE_GLOBAL:
938 w = GETNAMEV(oparg);
939 if ((err = dict2remove(f->f_globals, w)) != 0)
940 err_setstr(NameError, getstringvalue(w));
941 break;
942
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 case LOAD_CONST:
944 x = GETCONST(oparg);
945 INCREF(x);
946 PUSH(x);
947 break;
948
949 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000950 w = GETNAMEV(oparg);
951 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000953 err_clear();
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 }
965 INCREF(x);
966 PUSH(x);
967 break;
968
969 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000970 w = GETNAMEV(oparg);
971 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000973 err_clear();
974 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000975 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000976 err_setstr(NameError,
977 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 break;
979 }
980 }
981 INCREF(x);
982 PUSH(x);
983 break;
984
985 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000986 w = GETNAMEV(oparg);
987 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000989 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
991 }
992 INCREF(x);
993 PUSH(x);
994 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000995
996 case RESERVE_FAST:
997 if (oparg > 0) {
998 XDECREF(fastlocals);
999 x = newlistobject(oparg);
1000 fastlocals = (listobject *) x;
1001 }
1002 break;
1003
1004 case LOAD_FAST:
1005 /* NYI */
1006 break;
1007
1008 case STORE_FAST:
1009 /* NYI */
1010 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001011
1012 case BUILD_TUPLE:
1013 x = newtupleobject(oparg);
1014 if (x != NULL) {
1015 for (; --oparg >= 0;) {
1016 w = POP();
1017 err = settupleitem(x, oparg, w);
1018 if (err != 0)
1019 break;
1020 }
1021 PUSH(x);
1022 }
1023 break;
1024
1025 case BUILD_LIST:
1026 x = newlistobject(oparg);
1027 if (x != NULL) {
1028 for (; --oparg >= 0;) {
1029 w = POP();
1030 err = setlistitem(x, oparg, w);
1031 if (err != 0)
1032 break;
1033 }
1034 PUSH(x);
1035 }
1036 break;
1037
1038 case BUILD_MAP:
1039 x = newdictobject();
1040 PUSH(x);
1041 break;
1042
1043 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001044 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001046 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 DECREF(v);
1048 PUSH(x);
1049 break;
1050
1051 case COMPARE_OP:
1052 w = POP();
1053 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001054 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 DECREF(v);
1056 DECREF(w);
1057 PUSH(x);
1058 break;
1059
1060 case IMPORT_NAME:
1061 name = GETNAME(oparg);
1062 x = import_module(name);
1063 XINCREF(x);
1064 PUSH(x);
1065 break;
1066
1067 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001068 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001070 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 break;
1072
1073 case JUMP_FORWARD:
1074 JUMPBY(oparg);
1075 break;
1076
1077 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001078 err = testbool(TOP());
1079 if (err > 0)
1080 err = 0;
1081 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001082 JUMPBY(oparg);
1083 break;
1084
1085 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001086 err = testbool(TOP());
1087 if (err > 0) {
1088 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001089 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001090 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001091 break;
1092
1093 case JUMP_ABSOLUTE:
1094 JUMPTO(oparg);
1095 break;
1096
1097 case FOR_LOOP:
1098 /* for v in s: ...
1099 On entry: stack contains s, i.
1100 On exit: stack contains s, i+1, s[i];
1101 but if loop exhausted:
1102 s, i are popped, and we jump */
1103 w = POP(); /* Loop index */
1104 v = POP(); /* Sequence object */
1105 u = loop_subscript(v, w);
1106 if (u != NULL) {
1107 PUSH(v);
1108 x = newintobject(getintvalue(w)+1);
1109 PUSH(x);
1110 DECREF(w);
1111 PUSH(u);
1112 }
1113 else {
1114 DECREF(v);
1115 DECREF(w);
1116 /* A NULL can mean "s exhausted"
1117 but also an error: */
1118 if (err_occurred())
1119 why = WHY_EXCEPTION;
1120 else
1121 JUMPBY(oparg);
1122 }
1123 break;
1124
1125 case SETUP_LOOP:
1126 case SETUP_EXCEPT:
1127 case SETUP_FINALLY:
1128 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1129 STACK_LEVEL());
1130 break;
1131
1132 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001133#ifdef LLTRACE
1134 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 printf("--- Line %d ---\n", oparg);
1136#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001137 f->f_lineno = oparg;
1138 if (trace != NULL) {
1139 /* Trace each line of code reached */
1140 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001141 err = call_trace(&trace, &trace,
1142 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001143 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 break;
1145
1146 default:
1147 fprintf(stderr,
1148 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001149 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 err_setstr(SystemError, "eval_code: unknown opcode");
1151 why = WHY_EXCEPTION;
1152 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001153
1154#ifdef CASE_TOO_BIG
1155 }
1156#endif
1157
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 } /* switch */
1159
1160 on_error:
1161
1162 /* Quickly continue if no error occurred */
1163
1164 if (why == WHY_NOT) {
1165 if (err == 0 && x != NULL)
1166 continue; /* Normal, fast path */
1167 why = WHY_EXCEPTION;
1168 x = None;
1169 err = 0;
1170 }
1171
Guido van Rossum801dcae1992-04-08 11:32:32 +00001172#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 /* Double-check exception status */
1174
1175 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1176 if (!err_occurred()) {
1177 fprintf(stderr, "XXX ghost error\n");
1178 err_setstr(SystemError, "ghost error");
1179 why = WHY_EXCEPTION;
1180 }
1181 }
1182 else {
1183 if (err_occurred()) {
1184 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001185 abort();
1186 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 why = WHY_EXCEPTION;
1188 }
1189 }
1190#endif
1191
1192 /* Log traceback info if this is a real exception */
1193
1194 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001195 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001197 f->f_lasti -= 2;
1198 tb_here(f);
1199
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001200 if (trace)
1201 call_exc_trace(&trace, &trace, f);
1202 if (sys_profile)
1203 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 }
1205
1206 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1207
1208 if (why == WHY_RERAISE)
1209 why = WHY_EXCEPTION;
1210
1211 /* Unwind stacks if a (pseudo) exception occurred */
1212
1213 while (why != WHY_NOT && f->f_iblock > 0) {
1214 block *b = pop_block(f);
1215 while (STACK_LEVEL() > b->b_level) {
1216 v = POP();
1217 XDECREF(v);
1218 }
1219 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1220 why = WHY_NOT;
1221 JUMPTO(b->b_handler);
1222 break;
1223 }
1224 if (b->b_type == SETUP_FINALLY ||
1225 b->b_type == SETUP_EXCEPT &&
1226 why == WHY_EXCEPTION) {
1227 if (why == WHY_EXCEPTION) {
1228 object *exc, *val;
1229 err_get(&exc, &val);
1230 if (val == NULL) {
1231 val = None;
1232 INCREF(val);
1233 }
1234 v = tb_fetch();
1235 /* Make the raw exception data
1236 available to the handler,
1237 so a program can emulate the
1238 Python main loop. Don't do
1239 this for 'finally'. */
1240 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 sysset("exc_value", val);
1243 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 }
1245 PUSH(v);
1246 PUSH(val);
1247 PUSH(exc);
1248 }
1249 else {
1250 if (why == WHY_RETURN)
1251 PUSH(retval);
1252 v = newintobject((long)why);
1253 PUSH(v);
1254 }
1255 why = WHY_NOT;
1256 JUMPTO(b->b_handler);
1257 break;
1258 }
1259 } /* unwind stack */
1260
1261 /* End the loop if we still have an error (or return) */
1262
1263 if (why != WHY_NOT)
1264 break;
1265
1266 } /* main loop */
1267
1268 /* Pop remaining stack entries */
1269
1270 while (!EMPTY()) {
1271 v = POP();
1272 XDECREF(v);
1273 }
1274
Guido van Rossum96a42c81992-01-12 02:29:51 +00001275 if (why != WHY_RETURN)
1276 retval = NULL;
1277
1278 if (trace) {
1279 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001280 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001281 XDECREF(retval);
1282 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001283 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001284 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001285 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001286 XDECREF(trace);
1287 }
1288
1289 if (sys_profile && why == WHY_RETURN) {
1290 if (call_trace(&sys_profile, (object**)0,
1291 f, "return", retval)) {
1292 XDECREF(retval);
1293 retval = NULL;
1294 why = WHY_EXCEPTION;
1295 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001296 }
1297
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 /* Restore previous frame and release the current one */
1299
1300 current_frame = f->f_back;
1301 DECREF(f);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001302
1303 XDECREF(fastlocals);
Guido van Rossum374a9221991-04-04 10:40:29 +00001304
Guido van Rossum96a42c81992-01-12 02:29:51 +00001305 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001306}
1307
Guido van Rossum96a42c81992-01-12 02:29:51 +00001308#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001309static int
1310prtrace(v, str)
1311 object *v;
1312 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001314 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001315 if (printobject(v, stdout, 0) != 0)
1316 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001317 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001319#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001321static void
1322call_exc_trace(p_trace, p_newtrace, f)
1323 object **p_trace, **p_newtrace;
1324 frameobject *f;
1325{
1326 object *type, *value, *traceback, *arg;
1327 int err;
1328 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001329 if (value == NULL) {
1330 value = None;
1331 INCREF(value);
1332 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001333 traceback = tb_fetch();
1334 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001335 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001336 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001337 settupleitem(arg, 0, type);
1338 settupleitem(arg, 1, value);
1339 settupleitem(arg, 2, traceback);
1340 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001341 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001342 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001343 /* Restore original exception */
1344 err_setval(type, value);
1345 tb_store(traceback);
1346 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001347 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001348}
1349
1350static int
1351call_trace(p_trace, p_newtrace, f, msg, arg)
1352 object **p_trace; /* in/out; may not be NULL;
1353 may not point to NULL variable initially */
1354 object **p_newtrace; /* in/out; may be NULL;
1355 may point to NULL variable;
1356 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001357 frameobject *f;
1358 char *msg;
1359 object *arg;
1360{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001361 object *arglist, *what;
1362 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001363 static int tracing = 0;
1364
1365 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001366 /* Don't do recursive traces */
1367 if (p_newtrace) {
1368 XDECREF(*p_newtrace);
1369 *p_newtrace = NULL;
1370 }
1371 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001372 }
1373
1374 arglist = newtupleobject(3);
1375 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001376 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001377 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001378 if (what == NULL)
1379 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001380 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001381 settupleitem(arglist, 0, (object *)f);
1382 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001383 if (arg == NULL)
1384 arg = None;
1385 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001386 settupleitem(arglist, 2, arg);
1387 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001388 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001389 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001390 cleanup:
1391 XDECREF(arglist);
1392 if (res == NULL) {
1393 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001394 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001395 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001396 *p_trace = NULL;
1397 if (p_newtrace) {
1398 XDECREF(*p_newtrace);
1399 *p_newtrace = NULL;
1400 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001401 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001402 }
1403 else {
1404 if (p_newtrace) {
1405 XDECREF(*p_newtrace);
1406 if (res == None)
1407 *p_newtrace = NULL;
1408 else {
1409 INCREF(res);
1410 *p_newtrace = res;
1411 }
1412 }
1413 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001414 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001415 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001416}
1417
Guido van Rossum3f5da241990-12-20 15:06:42 +00001418object *
1419getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001423 else
1424 return current_frame->f_locals;
1425}
1426
1427object *
1428getglobals()
1429{
1430 if (current_frame == NULL)
1431 return NULL;
1432 else
1433 return current_frame->f_globals;
1434}
1435
1436void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001437printtraceback(f)
1438 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439{
1440 object *v = tb_fetch();
1441 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001442 writestring("Stack backtrace (innermost last):\n", f);
1443 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446}
1447
1448
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449void
1450flushline()
1451{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001452 object *f = sysget("stdout");
1453 if (softspace(f, 0))
1454 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455}
1456
Guido van Rossum3f5da241990-12-20 15:06:42 +00001457
Guido van Rossum04691fc1992-08-12 15:35:34 +00001458/* Test a value used as condition, e.g., in a for or if statement.
1459 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001460
1461static int
1462testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 object *v;
1464{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001465 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001466 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001467 res = 0;
1468 else if (v->ob_type->tp_as_number != NULL)
1469 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1470 else if (v->ob_type->tp_as_mapping != NULL)
1471 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1472 else if (v->ob_type->tp_as_sequence != NULL)
1473 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1474 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001475 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001476 if (res > 0)
1477 res = 1;
1478 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001479}
1480
1481static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001482or(v, w)
1483 object *v, *w;
1484{
1485 if (v->ob_type->tp_as_number != NULL) {
1486 object *x;
1487 object * (*f) FPROTO((object *, object *));
1488 if (coerce(&v, &w) != 0)
1489 return NULL;
1490 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1491 x = (*f)(v, w);
1492 DECREF(v);
1493 DECREF(w);
1494 if (f != NULL)
1495 return x;
1496 }
1497 err_setstr(TypeError, "bad operand type(s) for |");
1498 return NULL;
1499}
1500
1501static object *
1502xor(v, w)
1503 object *v, *w;
1504{
1505 if (v->ob_type->tp_as_number != NULL) {
1506 object *x;
1507 object * (*f) FPROTO((object *, object *));
1508 if (coerce(&v, &w) != 0)
1509 return NULL;
1510 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1511 x = (*f)(v, w);
1512 DECREF(v);
1513 DECREF(w);
1514 if (f != NULL)
1515 return x;
1516 }
1517 err_setstr(TypeError, "bad operand type(s) for ^");
1518 return NULL;
1519}
1520
1521static object *
1522and(v, w)
1523 object *v, *w;
1524{
1525 if (v->ob_type->tp_as_number != NULL) {
1526 object *x;
1527 object * (*f) FPROTO((object *, object *));
1528 if (coerce(&v, &w) != 0)
1529 return NULL;
1530 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1531 x = (*f)(v, w);
1532 DECREF(v);
1533 DECREF(w);
1534 if (f != NULL)
1535 return x;
1536 }
1537 err_setstr(TypeError, "bad operand type(s) for &");
1538 return NULL;
1539}
1540
1541static object *
1542lshift(v, w)
1543 object *v, *w;
1544{
1545 if (v->ob_type->tp_as_number != NULL) {
1546 object *x;
1547 object * (*f) FPROTO((object *, object *));
1548 if (coerce(&v, &w) != 0)
1549 return NULL;
1550 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1551 x = (*f)(v, w);
1552 DECREF(v);
1553 DECREF(w);
1554 if (f != NULL)
1555 return x;
1556 }
1557 err_setstr(TypeError, "bad operand type(s) for <<");
1558 return NULL;
1559}
1560
1561static object *
1562rshift(v, w)
1563 object *v, *w;
1564{
1565 if (v->ob_type->tp_as_number != NULL) {
1566 object *x;
1567 object * (*f) FPROTO((object *, object *));
1568 if (coerce(&v, &w) != 0)
1569 return NULL;
1570 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1571 x = (*f)(v, w);
1572 DECREF(v);
1573 DECREF(w);
1574 if (f != NULL)
1575 return x;
1576 }
1577 err_setstr(TypeError, "bad operand type(s) for >>");
1578 return NULL;
1579}
1580
1581static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001582add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 object *v, *w;
1584{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001585 if (v->ob_type->tp_as_sequence != NULL)
1586 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1587 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001588 object *x;
1589 if (coerce(&v, &w) != 0)
1590 return NULL;
1591 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1592 DECREF(v);
1593 DECREF(w);
1594 return x;
1595 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001596 err_setstr(TypeError, "bad operand type(s) for +");
1597 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598}
1599
1600static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601sub(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_subtract)(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 +00001618mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 object *v, *w;
1620{
1621 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001622 tp = v->ob_type;
1623 if (tp->tp_as_number != NULL &&
1624 w->ob_type->tp_as_sequence != NULL &&
1625 !is_instanceobject(v)) {
1626 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 object *tmp = v;
1628 v = w;
1629 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001630 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001632 if (tp->tp_as_number != NULL) {
1633 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001634 if (is_instanceobject(v)) {
1635 /* Instances of user-defined classes get their
1636 other argument uncoerced, so they may
1637 implement sequence*number as well as
1638 number*number. */
1639 INCREF(v);
1640 INCREF(w);
1641 }
1642 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001643 return NULL;
1644 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1645 DECREF(v);
1646 DECREF(w);
1647 return x;
1648 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 if (tp->tp_as_sequence != NULL) {
1650 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001651 err_setstr(TypeError,
1652 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653 return NULL;
1654 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001655 return (*tp->tp_as_sequence->sq_repeat)
1656 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001658 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659 return NULL;
1660}
1661
1662static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001663divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 object *v, *w;
1665{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001666 if (v->ob_type->tp_as_number != NULL) {
1667 object *x;
1668 if (coerce(&v, &w) != 0)
1669 return NULL;
1670 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1671 DECREF(v);
1672 DECREF(w);
1673 return x;
1674 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001675 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676 return NULL;
1677}
1678
1679static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001680rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001681 object *v, *w;
1682{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001683 if (v->ob_type->tp_as_number != NULL) {
1684 object *x;
1685 if (coerce(&v, &w) != 0)
1686 return NULL;
1687 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1688 DECREF(v);
1689 DECREF(w);
1690 return x;
1691 }
Guido van Rossume5372401993-03-16 12:15:04 +00001692 if (is_stringobject(v)) {
1693 return formatstring(v, w);
1694 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001695 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001696 return NULL;
1697}
1698
1699static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701 object *v;
1702{
1703 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001704 return (*v->ob_type->tp_as_number->nb_negative)(v);
1705 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001706 return NULL;
1707}
1708
1709static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001710pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001711 object *v;
1712{
1713 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001714 return (*v->ob_type->tp_as_number->nb_positive)(v);
1715 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 return NULL;
1717}
1718
1719static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001720invert(v)
1721 object *v;
1722{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001723 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001724 if (v->ob_type->tp_as_number != NULL &&
1725 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1726 return (*f)(v);
1727 err_setstr(TypeError, "bad operand type(s) for unary ~");
1728 return NULL;
1729}
1730
1731static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001732not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001733 object *v;
1734{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001735 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001736 object *w;
1737 if (outcome < 0)
1738 return NULL;
1739 if (outcome == 0)
1740 w = True;
1741 else
1742 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001743 INCREF(w);
1744 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001746/* External interface to call any callable object. The arg may be NULL. */
1747
1748object *
1749call_object(func, arg)
1750 object *func;
1751 object *arg;
1752{
1753 if (is_instancemethodobject(func) || is_funcobject(func))
1754 return call_function(func, arg);
1755 else
1756 return call_builtin(func, arg);
1757}
1758
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001760call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 if (is_methodobject(func)) {
1765 method meth = getmethod(func);
1766 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001767 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1768 int size = gettuplesize(arg);
1769 if (size == 1)
1770 arg = gettupleitem(arg, 0);
1771 else if (size == 0)
1772 arg = NULL;
1773 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 }
1776 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001777 if (arg != NULL &&
1778 !(is_tupleobject(arg) &&
1779 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001780 err_setstr(TypeError,
1781 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 return NULL;
1783 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001786 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 return NULL;
1788}
1789
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001790static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001791call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001793 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001795 object *newarg = NULL;
1796 object *newlocals, *newglobals;
1797 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798
Guido van Rossume8122f11991-05-05 20:03:07 +00001799 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001800 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001801 object *self = instancemethodgetself(func);
1802 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001803 if (arg == NULL)
1804 argcount = 0;
1805 else if (is_tupleobject(arg))
1806 argcount = gettuplesize(arg);
1807 else
1808 argcount = 1;
1809 newarg = newtupleobject(argcount + 1);
1810 if (newarg == NULL)
1811 return NULL;
1812 INCREF(self);
1813 settupleitem(newarg, 0, self);
1814 if (arg != NULL && !is_tupleobject(arg)) {
1815 INCREF(arg);
1816 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 }
1818 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001819 int i;
1820 object *v;
1821 for (i = 0; i < argcount; i++) {
1822 v = gettupleitem(arg, i);
1823 XINCREF(v);
1824 settupleitem(newarg, i+1, v);
1825 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001827 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 }
1829 else {
1830 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001831 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 return NULL;
1833 }
1834 }
1835
Guido van Rossum3f5da241990-12-20 15:06:42 +00001836 co = getfunccode(func);
1837 if (co == NULL) {
1838 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 return NULL;
1840 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001841 if (!is_codeobject(co)) {
1842 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 abort();
1844 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001845 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001847 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 return NULL;
1849 }
1850
Guido van Rossum3f5da241990-12-20 15:06:42 +00001851 newglobals = getfuncglobals(func);
1852 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853
Guido van Rossum3f5da241990-12-20 15:06:42 +00001854 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001855
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 DECREF(newlocals);
1857 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858
Guido van Rossum3f5da241990-12-20 15:06:42 +00001859 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860
1861 return v;
1862}
1863
1864static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001865apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 object *v, *w;
1867{
1868 typeobject *tp = v->ob_type;
1869 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001870 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871 return NULL;
1872 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001873 if (tp->tp_as_mapping != NULL) {
1874 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1875 }
1876 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 int i;
1878 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001879 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 return NULL;
1881 }
1882 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001883 if (i < 0) {
1884 int len = (*tp->tp_as_sequence->sq_length)(v);
1885 if (len < 0)
1886 return NULL;
1887 i += len;
1888 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001889 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891}
1892
1893static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001894loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 object *v, *w;
1896{
1897 sequence_methods *sq = v->ob_type->tp_as_sequence;
1898 int i, n;
1899 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001900 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 return NULL;
1902 }
1903 i = getintvalue(w);
1904 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001905 if (n < 0)
1906 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 if (i >= n)
1908 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910}
1911
1912static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 object *v;
1915 int isize;
1916 int *pi;
1917{
1918 if (v != NULL) {
1919 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920 err_setstr(TypeError, "slice index must be int");
1921 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 }
1923 *pi = getintvalue(v);
1924 if (*pi < 0)
1925 *pi += isize;
1926 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001927 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928}
1929
1930static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001931apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 object *u, *v, *w;
1933{
1934 typeobject *tp = u->ob_type;
1935 int ilow, ihigh, isize;
1936 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001937 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 return NULL;
1939 }
1940 ilow = 0;
1941 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001942 if (isize < 0)
1943 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001944 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001946 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001948 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950
1951static int
1952assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 object *w;
1954 object *key;
1955 object *v;
1956{
1957 typeobject *tp = w->ob_type;
1958 sequence_methods *sq;
1959 mapping_methods *mp;
1960 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001961 if ((mp = tp->tp_as_mapping) != NULL &&
1962 (func = mp->mp_ass_subscript) != NULL) {
1963 return (*func)(w, key, v);
1964 }
1965 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 (func = sq->sq_ass_item) != NULL) {
1967 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001969 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001970 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001972 else {
1973 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001974 if (i < 0) {
1975 int len = (*sq->sq_length)(w);
1976 if (len < 0)
1977 return -1;
1978 i += len;
1979 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001980 return (*func)(w, i, v);
1981 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001984 err_setstr(TypeError,
1985 "can't assign to this subscripted object");
1986 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988}
1989
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990static int
1991assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001992 object *u, *v, *w, *x;
1993{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996 if (sq == NULL) {
1997 err_setstr(TypeError, "assign to slice of non-sequence");
1998 return -1;
1999 }
2000 if (sq == NULL || sq->sq_ass_slice == NULL) {
2001 err_setstr(TypeError, "unassignable slice");
2002 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 }
2004 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002006 if (isize < 0)
2007 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008 if (slice_index(v, isize, &ilow) != 0)
2009 return -1;
2010 if (slice_index(w, isize, &ihigh) != 0)
2011 return -1;
2012 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013}
2014
2015static int
2016cmp_exception(err, v)
2017 object *err, *v;
2018{
2019 if (is_tupleobject(v)) {
2020 int i, n;
2021 n = gettuplesize(v);
2022 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002023 /* Test recursively */
2024 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 return 1;
2026 }
2027 return 0;
2028 }
2029 return err == v;
2030}
2031
Guido van Rossum3f5da241990-12-20 15:06:42 +00002032static int
2033cmp_member(v, w)
2034 object *v, *w;
2035{
2036 int i, n, cmp;
2037 object *x;
2038 sequence_methods *sq;
2039 /* Special case for char in string */
2040 if (is_stringobject(w)) {
2041 register char *s, *end;
2042 register char c;
2043 if (!is_stringobject(v) || getstringsize(v) != 1) {
2044 err_setstr(TypeError,
2045 "string member test needs char left operand");
2046 return -1;
2047 }
2048 c = getstringvalue(v)[0];
2049 s = getstringvalue(w);
2050 end = s + getstringsize(w);
2051 while (s < end) {
2052 if (c == *s++)
2053 return 1;
2054 }
2055 return 0;
2056 }
2057 sq = w->ob_type->tp_as_sequence;
2058 if (sq == NULL) {
2059 err_setstr(TypeError,
2060 "'in' or 'not in' needs sequence right argument");
2061 return -1;
2062 }
2063 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002064 if (n < 0)
2065 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 for (i = 0; i < n; i++) {
2067 x = (*sq->sq_item)(w, i);
2068 cmp = cmpobject(v, x);
2069 XDECREF(x);
2070 if (cmp == 0)
2071 return 1;
2072 }
2073 return 0;
2074}
2075
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002078 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 register object *v;
2080 register object *w;
2081{
2082 register int cmp;
2083 register int res = 0;
2084 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085 case IS:
2086 case IS_NOT:
2087 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002088 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002089 res = !res;
2090 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002091 case IN:
2092 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002093 res = cmp_member(v, w);
2094 if (res < 0)
2095 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002096 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 break;
2099 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 break;
2102 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103 cmp = cmpobject(v, w);
2104 switch (op) {
2105 case LT: res = cmp < 0; break;
2106 case LE: res = cmp <= 0; break;
2107 case EQ: res = cmp == 0; break;
2108 case NE: res = cmp != 0; break;
2109 case GT: res = cmp > 0; break;
2110 case GE: res = cmp >= 0; break;
2111 /* XXX no default? (res is initialized to 0 though) */
2112 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 }
2114 v = res ? True : False;
2115 INCREF(v);
2116 return v;
2117}
2118
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119static int
2120import_from(locals, v, name)
2121 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002122 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002123 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002124{
2125 object *w, *x;
2126 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002127 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002128 int i;
2129 int n = getdictsize(w);
2130 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002131 name = getdict2key(w, i);
2132 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002133 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002134 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002135 if (x == NULL) {
2136 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002137 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002139 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002140 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002142 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002143 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002144 }
2145 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002146 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002147 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002148 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002149 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002150 getstringvalue(name));
2151 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002152 return -1;
2153 }
2154 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002155 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002156 }
2157}
2158
2159static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002160build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002161 object *v; /* None or tuple containing base classes */
2162 object *w; /* dictionary */
2163{
2164 if (is_tupleobject(v)) {
2165 int i;
2166 for (i = gettuplesize(v); --i >= 0; ) {
2167 object *x = gettupleitem(v, i);
2168 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002169 err_setstr(TypeError,
2170 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002171 return NULL;
2172 }
2173 }
2174 }
2175 else {
2176 v = NULL;
2177 }
2178 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002179 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002180 return NULL;
2181 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002182 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002183}