blob: 4637d35f7efc58049115d4216764314ee5d99e29 [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"
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)
101 fatal("2nd call to init_save_thread");
102 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 Rossum9c8d70d1992-03-23 18:19:28 +0000176 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000177 object *retval; /* Return value iff why == WHY_RETURN */
178 char *name; /* Name used by some instructions */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000179#ifdef LLTRACE
180 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000181#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000182#ifdef DEBUG
183 /* Make it easier to find out where we are with dbx */
184 char *filename = getstringvalue(co->co_filename);
185#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000186
187/* Code access macros */
188
189#define GETCONST(i) Getconst(f, i)
190#define GETNAME(i) Getname(f, i)
191#define GETNAMEV(i) Getnamev(f, i)
192#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
193#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
194#define NEXTOP() (*next_instr++)
195#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
196#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
197#define JUMPBY(x) (next_instr += (x))
198
199/* Stack manipulation macros */
200
201#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
202#define EMPTY() (STACK_LEVEL() == 0)
203#define TOP() (stack_pointer[-1])
204#define BASIC_PUSH(v) (*stack_pointer++ = (v))
205#define BASIC_POP() (*--stack_pointer)
206
Guido van Rossum96a42c81992-01-12 02:29:51 +0000207#ifdef LLTRACE
208#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
209#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000210#else
211#define PUSH(v) BASIC_PUSH(v)
212#define POP() BASIC_POP()
213#endif
214
215 f = newframeobject(
216 current_frame, /*back*/
217 co, /*code*/
218 globals, /*globals*/
219 locals, /*locals*/
220 50, /*nvalues*/
221 20); /*nblocks*/
222 if (f == NULL)
223 return NULL;
224
225 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000226
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000227 if (sys_trace != NULL) {
228 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000229 be called on *every* entry to a code block.
230 Its return value, if not None, is a function that
231 will be called at the start of each executed line
232 of code. (Actually, the function must return
233 itself in order to continue tracing.)
234 The trace functions are called with three arguments:
235 a pointer to the current frame, a string indicating
236 why the function is called, and an argument which
237 depends on the situation. The global trace function
238 (sys.trace) is also called whenever an exception
239 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000240 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000241 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000242 current_frame = f->f_back;
243 DECREF(f);
244 return NULL;
245 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000246 }
247
248 if (sys_profile != NULL) {
249 /* Similar for sys_profile, except it needn't return
250 itself and isn't called for "line" events */
251 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
252 current_frame = f->f_back;
253 DECREF(f);
254 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000255 }
256 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000257
258 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000259 stack_pointer = f->f_valuestack;
260
261 if (arg != NULL) {
262 INCREF(arg);
263 PUSH(arg);
264 }
265
266 why = WHY_NOT;
267 err = 0;
268 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000269
270 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000271 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000272
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000273 /* Do periodic things.
274 Doing this every time through the loop would add
275 too much overhead (a function call per instruction).
276 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000277
278 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000279 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000280 if (intrcheck()) {
281 err_set(KeyboardInterrupt);
282 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000283 goto on_error;
284 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000285
286#ifdef USE_THREAD
287 if (interpreter_lock) {
288 /* Give another thread a chance */
289
290 current_frame = NULL;
291 release_lock(interpreter_lock);
292
293 /* Other threads may run now */
294
295 acquire_lock(interpreter_lock, 1);
296 current_frame = f;
297 }
298#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000299 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300
Guido van Rossum374a9221991-04-04 10:40:29 +0000301 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000302
303#ifdef DEBUG
304 f->f_lasti = INSTR_OFFSET();
305#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000306
307 opcode = NEXTOP();
308 if (HAS_ARG(opcode))
309 oparg = NEXTARG();
310
Guido van Rossum96a42c81992-01-12 02:29:51 +0000311#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000312 /* Instruction tracing */
313
Guido van Rossum96a42c81992-01-12 02:29:51 +0000314 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000315 if (HAS_ARG(opcode)) {
316 printf("%d: %d, %d\n",
317 (int) (INSTR_OFFSET() - 3),
318 opcode, oparg);
319 }
320 else {
321 printf("%d: %d\n",
322 (int) (INSTR_OFFSET() - 1), opcode);
323 }
324 }
325#endif
326
327 /* Main switch on opcode */
328
329 switch (opcode) {
330
331 /* BEWARE!
332 It is essential that any operation that fails sets either
333 x to NULL, err to nonzero, or why to anything but WHY_NOT,
334 and that no operation that succeeds does this! */
335
336 /* case STOP_CODE: this is an error! */
337
338 case POP_TOP:
339 v = POP();
340 DECREF(v);
341 break;
342
343 case ROT_TWO:
344 v = POP();
345 w = POP();
346 PUSH(v);
347 PUSH(w);
348 break;
349
350 case ROT_THREE:
351 v = POP();
352 w = POP();
353 x = POP();
354 PUSH(v);
355 PUSH(x);
356 PUSH(w);
357 break;
358
359 case DUP_TOP:
360 v = TOP();
361 INCREF(v);
362 PUSH(v);
363 break;
364
365 case UNARY_POSITIVE:
366 v = POP();
367 x = pos(v);
368 DECREF(v);
369 PUSH(x);
370 break;
371
372 case UNARY_NEGATIVE:
373 v = POP();
374 x = neg(v);
375 DECREF(v);
376 PUSH(x);
377 break;
378
379 case UNARY_NOT:
380 v = POP();
381 x = not(v);
382 DECREF(v);
383 PUSH(x);
384 break;
385
386 case UNARY_CONVERT:
387 v = POP();
388 x = reprobject(v);
389 DECREF(v);
390 PUSH(x);
391 break;
392
393 case UNARY_CALL:
394 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000395 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000396 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000397 DECREF(v);
398 PUSH(x);
399 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000400
401 case UNARY_INVERT:
402 v = POP();
403 x = invert(v);
404 DECREF(v);
405 PUSH(x);
406 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000407
408 case BINARY_MULTIPLY:
409 w = POP();
410 v = POP();
411 x = mul(v, w);
412 DECREF(v);
413 DECREF(w);
414 PUSH(x);
415 break;
416
417 case BINARY_DIVIDE:
418 w = POP();
419 v = POP();
420 x = divide(v, w);
421 DECREF(v);
422 DECREF(w);
423 PUSH(x);
424 break;
425
426 case BINARY_MODULO:
427 w = POP();
428 v = POP();
429 x = rem(v, w);
430 DECREF(v);
431 DECREF(w);
432 PUSH(x);
433 break;
434
435 case BINARY_ADD:
436 w = POP();
437 v = POP();
438 x = add(v, w);
439 DECREF(v);
440 DECREF(w);
441 PUSH(x);
442 break;
443
444 case BINARY_SUBTRACT:
445 w = POP();
446 v = POP();
447 x = sub(v, w);
448 DECREF(v);
449 DECREF(w);
450 PUSH(x);
451 break;
452
453 case BINARY_SUBSCR:
454 w = POP();
455 v = POP();
456 x = apply_subscript(v, w);
457 DECREF(v);
458 DECREF(w);
459 PUSH(x);
460 break;
461
462 case BINARY_CALL:
463 w = POP();
464 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000465 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000466 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000467 DECREF(v);
468 DECREF(w);
469 PUSH(x);
470 break;
471
Guido van Rossum7928cd71991-10-24 14:59:31 +0000472 case BINARY_LSHIFT:
473 w = POP();
474 v = POP();
475 x = lshift(v, w);
476 DECREF(v);
477 DECREF(w);
478 PUSH(x);
479 break;
480
481 case BINARY_RSHIFT:
482 w = POP();
483 v = POP();
484 x = rshift(v, w);
485 DECREF(v);
486 DECREF(w);
487 PUSH(x);
488 break;
489
490 case BINARY_AND:
491 w = POP();
492 v = POP();
493 x = and(v, w);
494 DECREF(v);
495 DECREF(w);
496 PUSH(x);
497 break;
498
499 case BINARY_XOR:
500 w = POP();
501 v = POP();
502 x = xor(v, w);
503 DECREF(v);
504 DECREF(w);
505 PUSH(x);
506 break;
507
508 case BINARY_OR:
509 w = POP();
510 v = POP();
511 x = or(v, w);
512 DECREF(v);
513 DECREF(w);
514 PUSH(x);
515 break;
516
Guido van Rossum374a9221991-04-04 10:40:29 +0000517 case SLICE+0:
518 case SLICE+1:
519 case SLICE+2:
520 case SLICE+3:
521 if ((opcode-SLICE) & 2)
522 w = POP();
523 else
524 w = NULL;
525 if ((opcode-SLICE) & 1)
526 v = POP();
527 else
528 v = NULL;
529 u = POP();
530 x = apply_slice(u, v, w);
531 DECREF(u);
532 XDECREF(v);
533 XDECREF(w);
534 PUSH(x);
535 break;
536
537 case STORE_SLICE+0:
538 case STORE_SLICE+1:
539 case STORE_SLICE+2:
540 case STORE_SLICE+3:
541 if ((opcode-STORE_SLICE) & 2)
542 w = POP();
543 else
544 w = NULL;
545 if ((opcode-STORE_SLICE) & 1)
546 v = POP();
547 else
548 v = NULL;
549 u = POP();
550 t = POP();
551 err = assign_slice(u, v, w, t); /* u[v:w] = t */
552 DECREF(t);
553 DECREF(u);
554 XDECREF(v);
555 XDECREF(w);
556 break;
557
558 case DELETE_SLICE+0:
559 case DELETE_SLICE+1:
560 case DELETE_SLICE+2:
561 case DELETE_SLICE+3:
562 if ((opcode-DELETE_SLICE) & 2)
563 w = POP();
564 else
565 w = NULL;
566 if ((opcode-DELETE_SLICE) & 1)
567 v = POP();
568 else
569 v = NULL;
570 u = POP();
571 err = assign_slice(u, v, w, (object *)NULL);
572 /* del u[v:w] */
573 DECREF(u);
574 XDECREF(v);
575 XDECREF(w);
576 break;
577
578 case STORE_SUBSCR:
579 w = POP();
580 v = POP();
581 u = POP();
582 /* v[w] = u */
583 err = assign_subscript(v, w, u);
584 DECREF(u);
585 DECREF(v);
586 DECREF(w);
587 break;
588
589 case DELETE_SUBSCR:
590 w = POP();
591 v = POP();
592 /* del v[w] */
593 err = assign_subscript(v, w, (object *)NULL);
594 DECREF(v);
595 DECREF(w);
596 break;
597
598 case PRINT_EXPR:
599 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 /* Print value except if procedure result */
601 if (v != None) {
602 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000603 x = sysget("stdout");
604 softspace(x, 1);
605 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 flushline();
607 }
608 DECREF(v);
609 break;
610
611 case PRINT_ITEM:
612 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000613 w = sysget("stdout");
614 if (softspace(w, 1))
615 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 if (is_stringobject(v)) {
617 char *s = getstringvalue(v);
618 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000619 err = writeobject(v, w, PRINT_RAW);
620 if (err == 0 && len > 0 && s[len-1] == '\n')
621 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000622 }
623 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000624 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 }
626 DECREF(v);
627 break;
628
629 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000630 x = sysget("stdout");
631 if (x == NULL)
632 err_setstr(RuntimeError, "lost sys.stdout");
633 else {
634 writestring("\n", x);
635 softspace(x, 0);
636 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 break;
638
639 case BREAK_LOOP:
640 why = WHY_BREAK;
641 break;
642
643 case RAISE_EXCEPTION:
644 v = POP();
645 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000646 /* A tuple is equivalent to its first element here */
647 while (is_tupleobject(w)) {
648 u = w;
649 w = gettupleitem(u, 0);
650 DECREF(u);
651 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000652 if (!is_stringobject(w))
653 err_setstr(TypeError,
654 "exceptions must be strings");
655 else
656 err_setval(w, v);
657 DECREF(v);
658 DECREF(w);
659 why = WHY_EXCEPTION;
660 break;
661
662 case LOAD_LOCALS:
663 v = f->f_locals;
664 INCREF(v);
665 PUSH(v);
666 break;
667
668 case RETURN_VALUE:
669 retval = POP();
670 why = WHY_RETURN;
671 break;
672
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 case BUILD_FUNCTION:
674 v = POP();
675 x = newfuncobject(v, f->f_globals);
676 DECREF(v);
677 PUSH(x);
678 break;
679
680 case POP_BLOCK:
681 {
682 block *b = pop_block(f);
683 while (STACK_LEVEL() > b->b_level) {
684 v = POP();
685 DECREF(v);
686 }
687 }
688 break;
689
690 case END_FINALLY:
691 v = POP();
692 if (is_intobject(v)) {
693 why = (enum why_code) getintvalue(v);
694 if (why == WHY_RETURN)
695 retval = POP();
696 }
697 else if (is_stringobject(v)) {
698 w = POP();
699 err_setval(v, w);
700 DECREF(w);
701 w = POP();
702 tb_store(w);
703 DECREF(w);
704 why = WHY_RERAISE;
705 }
706 else if (v != None) {
707 err_setstr(SystemError,
708 "'finally' pops bad exception");
709 why = WHY_EXCEPTION;
710 }
711 DECREF(v);
712 break;
713
714 case BUILD_CLASS:
715 w = POP();
716 v = POP();
717 x = build_class(v, w);
718 PUSH(x);
719 DECREF(v);
720 DECREF(w);
721 break;
722
723 case STORE_NAME:
724 w = GETNAMEV(oparg);
725 v = POP();
726 err = dict2insert(f->f_locals, w, v);
727 DECREF(v);
728 break;
729
730 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000731 w = GETNAMEV(oparg);
732 if ((err = dict2remove(f->f_locals, w)) != 0)
733 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000735
736#ifdef CASE_TOO_BIG
737 default: switch (opcode) {
738#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000739
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000740 case UNPACK_VARARG:
741 if (EMPTY()) {
742 err_setstr(TypeError,
743 "no argument list");
744 why = WHY_EXCEPTION;
745 break;
746 }
747 v = POP();
748 if (!is_tupleobject(v)) {
749 err_setstr(TypeError,
750 "bad argument list");
751 why = WHY_EXCEPTION;
752 }
753 else if (gettuplesize(v) < oparg) {
754 err_setstr(TypeError,
755 "not enough arguments");
756 why = WHY_EXCEPTION;
757 }
758 else if (oparg == 0) {
759 PUSH(v);
760 break;
761 }
762 else {
763 x = gettupleslice(v, oparg, gettuplesize(v));
764 if (x != NULL) {
765 PUSH(x);
766 for (; --oparg >= 0; ) {
767 w = gettupleitem(v, oparg);
768 INCREF(w);
769 PUSH(w);
770 }
771 }
772 }
773 DECREF(v);
774 break;
775
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000776 case UNPACK_ARG:
777 /* Implement various compatibility hacks:
778 (a) f(a,b,...) should accept f((1,2,...))
779 (b) f((a,b,...)) should accept f(1,2,...)
780 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
781 */
782 {
783 int n;
784 if (EMPTY()) {
785 err_setstr(TypeError,
786 "no argument list");
787 why = WHY_EXCEPTION;
788 break;
789 }
790 v = POP();
791 if (!is_tupleobject(v)) {
792 err_setstr(TypeError,
793 "bad argument list");
794 why = WHY_EXCEPTION;
795 break;
796 }
797 n = gettuplesize(v);
798 if (n == 1 && oparg != 1) {
799 /* Rule (a) */
800 w = gettupleitem(v, 0);
801 if (is_tupleobject(w)) {
802 INCREF(w);
803 DECREF(v);
804 v = w;
805 n = gettuplesize(v);
806 }
807 }
808 else if (n != 1 && oparg == 1) {
809 /* Rule (b) */
810 PUSH(v);
811 break;
812 /* Don't fall through */
813 }
814 else if (n > 2 && oparg == 2) {
815 /* Rule (c) */
816 int i;
817 w = newtupleobject(n-1);
818 u = newtupleobject(2);
819 if (u == NULL || w == NULL) {
820 XDECREF(w);
821 XDECREF(u);
822 DECREF(v);
823 why = WHY_EXCEPTION;
824 break;
825 }
826 t = gettupleitem(v, 0);
827 INCREF(t);
828 settupleitem(u, 0, t);
829 for (i = 1; i < n; i++) {
830 t = gettupleitem(v, i);
831 INCREF(t);
832 settupleitem(w, i-1, t);
833 }
834 settupleitem(u, 1, w);
835 DECREF(v);
836 v = u;
837 n = 2;
838 }
839 if (n != oparg) {
840 err_setstr(TypeError,
841 "arg count mismatch");
842 why = WHY_EXCEPTION;
843 DECREF(v);
844 break;
845 }
846 PUSH(v);
847 }
848 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 case UNPACK_TUPLE:
850 v = POP();
851 if (!is_tupleobject(v)) {
852 err_setstr(TypeError, "unpack non-tuple");
853 why = WHY_EXCEPTION;
854 }
855 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000856 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 "unpack tuple of wrong size");
858 why = WHY_EXCEPTION;
859 }
860 else {
861 for (; --oparg >= 0; ) {
862 w = gettupleitem(v, oparg);
863 INCREF(w);
864 PUSH(w);
865 }
866 }
867 DECREF(v);
868 break;
869
870 case UNPACK_LIST:
871 v = POP();
872 if (!is_listobject(v)) {
873 err_setstr(TypeError, "unpack non-list");
874 why = WHY_EXCEPTION;
875 }
876 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000877 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 "unpack list of wrong size");
879 why = WHY_EXCEPTION;
880 }
881 else {
882 for (; --oparg >= 0; ) {
883 w = getlistitem(v, oparg);
884 INCREF(w);
885 PUSH(w);
886 }
887 }
888 DECREF(v);
889 break;
890
891 case STORE_ATTR:
892 name = GETNAME(oparg);
893 v = POP();
894 u = POP();
895 err = setattr(v, name, u); /* v.name = u */
896 DECREF(v);
897 DECREF(u);
898 break;
899
900 case DELETE_ATTR:
901 name = GETNAME(oparg);
902 v = POP();
903 err = setattr(v, name, (object *)NULL);
904 /* del v.name */
905 DECREF(v);
906 break;
907
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000908 case STORE_GLOBAL:
909 w = GETNAMEV(oparg);
910 v = POP();
911 err = dict2insert(f->f_globals, w, v);
912 DECREF(v);
913 break;
914
915 case DELETE_GLOBAL:
916 w = GETNAMEV(oparg);
917 if ((err = dict2remove(f->f_globals, w)) != 0)
918 err_setstr(NameError, getstringvalue(w));
919 break;
920
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 case LOAD_CONST:
922 x = GETCONST(oparg);
923 INCREF(x);
924 PUSH(x);
925 break;
926
927 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000928 w = GETNAMEV(oparg);
929 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000931 err_clear();
932 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000934 err_clear();
935 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000937 err_setstr(NameError,
938 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 break;
940 }
941 }
942 }
943 INCREF(x);
944 PUSH(x);
945 break;
946
947 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000948 w = GETNAMEV(oparg);
949 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000951 err_clear();
952 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000954 err_setstr(NameError,
955 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 break;
957 }
958 }
959 INCREF(x);
960 PUSH(x);
961 break;
962
963 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000964 w = GETNAMEV(oparg);
965 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000967 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 break;
969 }
970 INCREF(x);
971 PUSH(x);
972 break;
973
974 case BUILD_TUPLE:
975 x = newtupleobject(oparg);
976 if (x != NULL) {
977 for (; --oparg >= 0;) {
978 w = POP();
979 err = settupleitem(x, oparg, w);
980 if (err != 0)
981 break;
982 }
983 PUSH(x);
984 }
985 break;
986
987 case BUILD_LIST:
988 x = newlistobject(oparg);
989 if (x != NULL) {
990 for (; --oparg >= 0;) {
991 w = POP();
992 err = setlistitem(x, oparg, w);
993 if (err != 0)
994 break;
995 }
996 PUSH(x);
997 }
998 break;
999
1000 case BUILD_MAP:
1001 x = newdictobject();
1002 PUSH(x);
1003 break;
1004
1005 case LOAD_ATTR:
1006 name = GETNAME(oparg);
1007 v = POP();
1008 x = getattr(v, name);
1009 DECREF(v);
1010 PUSH(x);
1011 break;
1012
1013 case COMPARE_OP:
1014 w = POP();
1015 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001016 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 DECREF(v);
1018 DECREF(w);
1019 PUSH(x);
1020 break;
1021
1022 case IMPORT_NAME:
1023 name = GETNAME(oparg);
1024 x = import_module(name);
1025 XINCREF(x);
1026 PUSH(x);
1027 break;
1028
1029 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001030 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001032 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 break;
1034
1035 case JUMP_FORWARD:
1036 JUMPBY(oparg);
1037 break;
1038
1039 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001040 err = testbool(TOP());
1041 if (err > 0)
1042 err = 0;
1043 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 JUMPBY(oparg);
1045 break;
1046
1047 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001048 err = testbool(TOP());
1049 if (err > 0) {
1050 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001052 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 break;
1054
1055 case JUMP_ABSOLUTE:
1056 JUMPTO(oparg);
1057 break;
1058
1059 case FOR_LOOP:
1060 /* for v in s: ...
1061 On entry: stack contains s, i.
1062 On exit: stack contains s, i+1, s[i];
1063 but if loop exhausted:
1064 s, i are popped, and we jump */
1065 w = POP(); /* Loop index */
1066 v = POP(); /* Sequence object */
1067 u = loop_subscript(v, w);
1068 if (u != NULL) {
1069 PUSH(v);
1070 x = newintobject(getintvalue(w)+1);
1071 PUSH(x);
1072 DECREF(w);
1073 PUSH(u);
1074 }
1075 else {
1076 DECREF(v);
1077 DECREF(w);
1078 /* A NULL can mean "s exhausted"
1079 but also an error: */
1080 if (err_occurred())
1081 why = WHY_EXCEPTION;
1082 else
1083 JUMPBY(oparg);
1084 }
1085 break;
1086
1087 case SETUP_LOOP:
1088 case SETUP_EXCEPT:
1089 case SETUP_FINALLY:
1090 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1091 STACK_LEVEL());
1092 break;
1093
1094 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001095#ifdef LLTRACE
1096 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 printf("--- Line %d ---\n", oparg);
1098#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001099 f->f_lineno = oparg;
1100 if (trace != NULL) {
1101 /* Trace each line of code reached */
1102 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001103 err = call_trace(&trace, &trace,
1104 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001105 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 break;
1107
1108 default:
1109 fprintf(stderr,
1110 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001111 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001112 err_setstr(SystemError, "eval_code: unknown opcode");
1113 why = WHY_EXCEPTION;
1114 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001115
1116#ifdef CASE_TOO_BIG
1117 }
1118#endif
1119
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 } /* switch */
1121
1122 on_error:
1123
1124 /* Quickly continue if no error occurred */
1125
1126 if (why == WHY_NOT) {
1127 if (err == 0 && x != NULL)
1128 continue; /* Normal, fast path */
1129 why = WHY_EXCEPTION;
1130 x = None;
1131 err = 0;
1132 }
1133
Guido van Rossum801dcae1992-04-08 11:32:32 +00001134#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 /* Double-check exception status */
1136
1137 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1138 if (!err_occurred()) {
1139 fprintf(stderr, "XXX ghost error\n");
1140 err_setstr(SystemError, "ghost error");
1141 why = WHY_EXCEPTION;
1142 }
1143 }
1144 else {
1145 if (err_occurred()) {
1146 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001147 abort();
1148 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 why = WHY_EXCEPTION;
1150 }
1151 }
1152#endif
1153
1154 /* Log traceback info if this is a real exception */
1155
1156 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001157 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001159 f->f_lasti -= 2;
1160 tb_here(f);
1161
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001162 if (trace)
1163 call_exc_trace(&trace, &trace, f);
1164 if (sys_profile)
1165 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 }
1167
1168 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1169
1170 if (why == WHY_RERAISE)
1171 why = WHY_EXCEPTION;
1172
1173 /* Unwind stacks if a (pseudo) exception occurred */
1174
1175 while (why != WHY_NOT && f->f_iblock > 0) {
1176 block *b = pop_block(f);
1177 while (STACK_LEVEL() > b->b_level) {
1178 v = POP();
1179 XDECREF(v);
1180 }
1181 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1182 why = WHY_NOT;
1183 JUMPTO(b->b_handler);
1184 break;
1185 }
1186 if (b->b_type == SETUP_FINALLY ||
1187 b->b_type == SETUP_EXCEPT &&
1188 why == WHY_EXCEPTION) {
1189 if (why == WHY_EXCEPTION) {
1190 object *exc, *val;
1191 err_get(&exc, &val);
1192 if (val == NULL) {
1193 val = None;
1194 INCREF(val);
1195 }
1196 v = tb_fetch();
1197 /* Make the raw exception data
1198 available to the handler,
1199 so a program can emulate the
1200 Python main loop. Don't do
1201 this for 'finally'. */
1202 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 sysset("exc_value", val);
1205 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 }
1207 PUSH(v);
1208 PUSH(val);
1209 PUSH(exc);
1210 }
1211 else {
1212 if (why == WHY_RETURN)
1213 PUSH(retval);
1214 v = newintobject((long)why);
1215 PUSH(v);
1216 }
1217 why = WHY_NOT;
1218 JUMPTO(b->b_handler);
1219 break;
1220 }
1221 } /* unwind stack */
1222
1223 /* End the loop if we still have an error (or return) */
1224
1225 if (why != WHY_NOT)
1226 break;
1227
1228 } /* main loop */
1229
1230 /* Pop remaining stack entries */
1231
1232 while (!EMPTY()) {
1233 v = POP();
1234 XDECREF(v);
1235 }
1236
Guido van Rossum96a42c81992-01-12 02:29:51 +00001237 if (why != WHY_RETURN)
1238 retval = NULL;
1239
1240 if (trace) {
1241 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001242 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001243 XDECREF(retval);
1244 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001245 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001246 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001247 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001248 XDECREF(trace);
1249 }
1250
1251 if (sys_profile && why == WHY_RETURN) {
1252 if (call_trace(&sys_profile, (object**)0,
1253 f, "return", retval)) {
1254 XDECREF(retval);
1255 retval = NULL;
1256 why = WHY_EXCEPTION;
1257 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001258 }
1259
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 /* Restore previous frame and release the current one */
1261
1262 current_frame = f->f_back;
1263 DECREF(f);
1264
Guido van Rossum96a42c81992-01-12 02:29:51 +00001265 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001266}
1267
Guido van Rossum96a42c81992-01-12 02:29:51 +00001268#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001269static int
1270prtrace(v, str)
1271 object *v;
1272 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001274 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001275 if (printobject(v, stdout, 0) != 0)
1276 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001280
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001281static void
1282call_exc_trace(p_trace, p_newtrace, f)
1283 object **p_trace, **p_newtrace;
1284 frameobject *f;
1285{
1286 object *type, *value, *traceback, *arg;
1287 int err;
1288 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001289 if (value == NULL) {
1290 value = None;
1291 INCREF(value);
1292 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001293 traceback = tb_fetch();
1294 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001295 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001296 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001297 settupleitem(arg, 0, type);
1298 settupleitem(arg, 1, value);
1299 settupleitem(arg, 2, traceback);
1300 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001301 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001302 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001303 /* Restore original exception */
1304 err_setval(type, value);
1305 tb_store(traceback);
1306 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001307 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001308}
1309
1310static int
1311call_trace(p_trace, p_newtrace, f, msg, arg)
1312 object **p_trace; /* in/out; may not be NULL;
1313 may not point to NULL variable initially */
1314 object **p_newtrace; /* in/out; may be NULL;
1315 may point to NULL variable;
1316 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001317 frameobject *f;
1318 char *msg;
1319 object *arg;
1320{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001321 object *arglist, *what;
1322 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001323 static int tracing = 0;
1324
1325 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001326 /* Don't do recursive traces */
1327 if (p_newtrace) {
1328 XDECREF(*p_newtrace);
1329 *p_newtrace = NULL;
1330 }
1331 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001332 }
1333
1334 arglist = newtupleobject(3);
1335 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001336 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001337 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001338 if (what == NULL)
1339 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001340 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001341 settupleitem(arglist, 0, (object *)f);
1342 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001343 if (arg == NULL)
1344 arg = None;
1345 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001346 settupleitem(arglist, 2, arg);
1347 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001348 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001349 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001350 cleanup:
1351 XDECREF(arglist);
1352 if (res == NULL) {
1353 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001354 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001355 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001356 *p_trace = NULL;
1357 if (p_newtrace) {
1358 XDECREF(*p_newtrace);
1359 *p_newtrace = NULL;
1360 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001361 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001362 }
1363 else {
1364 if (p_newtrace) {
1365 XDECREF(*p_newtrace);
1366 if (res == None)
1367 *p_newtrace = NULL;
1368 else {
1369 INCREF(res);
1370 *p_newtrace = res;
1371 }
1372 }
1373 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001374 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001375 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001376}
1377
Guido van Rossum3f5da241990-12-20 15:06:42 +00001378object *
1379getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001381 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001382 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383 else
1384 return current_frame->f_locals;
1385}
1386
1387object *
1388getglobals()
1389{
1390 if (current_frame == NULL)
1391 return NULL;
1392 else
1393 return current_frame->f_globals;
1394}
1395
1396void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001397printtraceback(f)
1398 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001399{
1400 object *v = tb_fetch();
1401 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001402 writestring("Stack backtrace (innermost last):\n", f);
1403 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001404 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406}
1407
1408
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409void
1410flushline()
1411{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001412 object *f = sysget("stdout");
1413 if (softspace(f, 0))
1414 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415}
1416
Guido van Rossum3f5da241990-12-20 15:06:42 +00001417
Guido van Rossum04691fc1992-08-12 15:35:34 +00001418/* Test a value used as condition, e.g., in a for or if statement.
1419 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420
1421static int
1422testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 object *v;
1424{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001425 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001426 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001427 res = 0;
1428 else if (v->ob_type->tp_as_number != NULL)
1429 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1430 else if (v->ob_type->tp_as_mapping != NULL)
1431 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1432 else if (v->ob_type->tp_as_sequence != NULL)
1433 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1434 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001435 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001436 if (res > 0)
1437 res = 1;
1438 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439}
1440
1441static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001442or(v, w)
1443 object *v, *w;
1444{
1445 if (v->ob_type->tp_as_number != NULL) {
1446 object *x;
1447 object * (*f) FPROTO((object *, object *));
1448 if (coerce(&v, &w) != 0)
1449 return NULL;
1450 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1451 x = (*f)(v, w);
1452 DECREF(v);
1453 DECREF(w);
1454 if (f != NULL)
1455 return x;
1456 }
1457 err_setstr(TypeError, "bad operand type(s) for |");
1458 return NULL;
1459}
1460
1461static object *
1462xor(v, w)
1463 object *v, *w;
1464{
1465 if (v->ob_type->tp_as_number != NULL) {
1466 object *x;
1467 object * (*f) FPROTO((object *, object *));
1468 if (coerce(&v, &w) != 0)
1469 return NULL;
1470 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1471 x = (*f)(v, w);
1472 DECREF(v);
1473 DECREF(w);
1474 if (f != NULL)
1475 return x;
1476 }
1477 err_setstr(TypeError, "bad operand type(s) for ^");
1478 return NULL;
1479}
1480
1481static object *
1482and(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_and) != 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 *
1502lshift(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_lshift) != 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 *
1522rshift(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_rshift) != 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 *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001542add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001543 object *v, *w;
1544{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001545 if (v->ob_type->tp_as_sequence != NULL)
1546 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1547 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001548 object *x;
1549 if (coerce(&v, &w) != 0)
1550 return NULL;
1551 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1552 DECREF(v);
1553 DECREF(w);
1554 return x;
1555 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001557 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 return NULL;
1559 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560}
1561
1562static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001563sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 object *v, *w;
1565{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001566 if (v->ob_type->tp_as_number != NULL) {
1567 object *x;
1568 if (coerce(&v, &w) != 0)
1569 return NULL;
1570 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1571 DECREF(v);
1572 DECREF(w);
1573 return x;
1574 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001575 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 return NULL;
1577}
1578
1579static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001580mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 object *v, *w;
1582{
1583 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001584 tp = v->ob_type;
1585 if (tp->tp_as_number != NULL &&
1586 w->ob_type->tp_as_sequence != NULL &&
1587 !is_instanceobject(v)) {
1588 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001589 object *tmp = v;
1590 v = w;
1591 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001592 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001593 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001594 if (tp->tp_as_number != NULL) {
1595 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001596 if (is_instanceobject(v)) {
1597 /* Instances of user-defined classes get their
1598 other argument uncoerced, so they may
1599 implement sequence*number as well as
1600 number*number. */
1601 INCREF(v);
1602 INCREF(w);
1603 }
1604 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001605 return NULL;
1606 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1607 DECREF(v);
1608 DECREF(w);
1609 return x;
1610 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 if (tp->tp_as_sequence != NULL) {
1612 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613 err_setstr(TypeError,
1614 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615 return NULL;
1616 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617 return (*tp->tp_as_sequence->sq_repeat)
1618 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621 return NULL;
1622}
1623
1624static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001625divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626 object *v, *w;
1627{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001628 if (v->ob_type->tp_as_number != NULL) {
1629 object *x;
1630 if (coerce(&v, &w) != 0)
1631 return NULL;
1632 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1633 DECREF(v);
1634 DECREF(w);
1635 return x;
1636 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001637 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 return NULL;
1639}
1640
1641static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001642rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 object *v, *w;
1644{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001645 if (v->ob_type->tp_as_number != NULL) {
1646 object *x;
1647 if (coerce(&v, &w) != 0)
1648 return NULL;
1649 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1650 DECREF(v);
1651 DECREF(w);
1652 return x;
1653 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001654 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 return NULL;
1656}
1657
1658static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660 object *v;
1661{
1662 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663 return (*v->ob_type->tp_as_number->nb_negative)(v);
1664 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 return NULL;
1666}
1667
1668static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001669pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 object *v;
1671{
1672 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001673 return (*v->ob_type->tp_as_number->nb_positive)(v);
1674 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 return NULL;
1676}
1677
1678static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001679invert(v)
1680 object *v;
1681{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001682 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001683 if (v->ob_type->tp_as_number != NULL &&
1684 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1685 return (*f)(v);
1686 err_setstr(TypeError, "bad operand type(s) for unary ~");
1687 return NULL;
1688}
1689
1690static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 object *v;
1693{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001695 object *w;
1696 if (outcome < 0)
1697 return NULL;
1698 if (outcome == 0)
1699 w = True;
1700 else
1701 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001702 INCREF(w);
1703 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001705/* External interface to call any callable object. The arg may be NULL. */
1706
1707object *
1708call_object(func, arg)
1709 object *func;
1710 object *arg;
1711{
1712 if (is_instancemethodobject(func) || is_funcobject(func))
1713 return call_function(func, arg);
1714 else
1715 return call_builtin(func, arg);
1716}
1717
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001718static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001719call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001721 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001722{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 if (is_methodobject(func)) {
1724 method meth = getmethod(func);
1725 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001726 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1727 int size = gettuplesize(arg);
1728 if (size == 1)
1729 arg = gettupleitem(arg, 0);
1730 else if (size == 0)
1731 arg = NULL;
1732 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 }
1735 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001736 if (arg != NULL &&
1737 !(is_tupleobject(arg) &&
1738 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739 err_setstr(TypeError,
1740 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 return NULL;
1742 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001745 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 return NULL;
1747}
1748
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001752 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001754 object *newarg = NULL;
1755 object *newlocals, *newglobals;
1756 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757
Guido van Rossume8122f11991-05-05 20:03:07 +00001758 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001759 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001760 object *self = instancemethodgetself(func);
1761 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001762 if (arg == NULL)
1763 argcount = 0;
1764 else if (is_tupleobject(arg))
1765 argcount = gettuplesize(arg);
1766 else
1767 argcount = 1;
1768 newarg = newtupleobject(argcount + 1);
1769 if (newarg == NULL)
1770 return NULL;
1771 INCREF(self);
1772 settupleitem(newarg, 0, self);
1773 if (arg != NULL && !is_tupleobject(arg)) {
1774 INCREF(arg);
1775 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 }
1777 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001778 int i;
1779 object *v;
1780 for (i = 0; i < argcount; i++) {
1781 v = gettupleitem(arg, i);
1782 XINCREF(v);
1783 settupleitem(newarg, i+1, v);
1784 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001785 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001786 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 }
1788 else {
1789 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001790 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791 return NULL;
1792 }
1793 }
1794
Guido van Rossum3f5da241990-12-20 15:06:42 +00001795 co = getfunccode(func);
1796 if (co == NULL) {
1797 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798 return NULL;
1799 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001800 if (!is_codeobject(co)) {
1801 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802 abort();
1803 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001804 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001806 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 return NULL;
1808 }
1809
Guido van Rossum3f5da241990-12-20 15:06:42 +00001810 newglobals = getfuncglobals(func);
1811 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812
Guido van Rossum3f5da241990-12-20 15:06:42 +00001813 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815 DECREF(newlocals);
1816 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817
Guido van Rossum3f5da241990-12-20 15:06:42 +00001818 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819
1820 return v;
1821}
1822
1823static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001824apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 object *v, *w;
1826{
1827 typeobject *tp = v->ob_type;
1828 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001829 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 return NULL;
1831 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001832 if (tp->tp_as_mapping != NULL) {
1833 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1834 }
1835 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 int i;
1837 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 return NULL;
1840 }
1841 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001842 if (i < 0) {
1843 int len = (*tp->tp_as_sequence->sq_length)(v);
1844 if (len < 0)
1845 return NULL;
1846 i += len;
1847 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001848 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850}
1851
1852static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001853loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 object *v, *w;
1855{
1856 sequence_methods *sq = v->ob_type->tp_as_sequence;
1857 int i, n;
1858 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001859 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 return NULL;
1861 }
1862 i = getintvalue(w);
1863 n = (*sq->sq_length)(v);
1864 if (i >= n)
1865 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001866 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867}
1868
1869static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001870slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001871 object *v;
1872 int isize;
1873 int *pi;
1874{
1875 if (v != NULL) {
1876 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001877 err_setstr(TypeError, "slice index must be int");
1878 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 }
1880 *pi = getintvalue(v);
1881 if (*pi < 0)
1882 *pi += isize;
1883 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001884 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885}
1886
1887static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001888apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 object *u, *v, *w;
1890{
1891 typeobject *tp = u->ob_type;
1892 int ilow, ihigh, isize;
1893 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001894 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895 return NULL;
1896 }
1897 ilow = 0;
1898 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001899 if (isize < 0)
1900 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001901 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001903 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001905 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001906}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001907
1908static int
1909assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 object *w;
1911 object *key;
1912 object *v;
1913{
1914 typeobject *tp = w->ob_type;
1915 sequence_methods *sq;
1916 mapping_methods *mp;
1917 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001918 if ((mp = tp->tp_as_mapping) != NULL &&
1919 (func = mp->mp_ass_subscript) != NULL) {
1920 return (*func)(w, key, v);
1921 }
1922 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 (func = sq->sq_ass_item) != NULL) {
1924 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001926 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001927 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001929 else {
1930 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001931 if (i < 0) {
1932 int len = (*sq->sq_length)(w);
1933 if (len < 0)
1934 return -1;
1935 i += len;
1936 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001937 return (*func)(w, i, v);
1938 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001941 err_setstr(TypeError,
1942 "can't assign to this subscripted object");
1943 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001945}
1946
Guido van Rossum3f5da241990-12-20 15:06:42 +00001947static int
1948assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 object *u, *v, *w, *x;
1950{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001951 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 if (sq == NULL) {
1954 err_setstr(TypeError, "assign to slice of non-sequence");
1955 return -1;
1956 }
1957 if (sq == NULL || sq->sq_ass_slice == NULL) {
1958 err_setstr(TypeError, "unassignable slice");
1959 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 }
1961 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001963 if (isize < 0)
1964 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965 if (slice_index(v, isize, &ilow) != 0)
1966 return -1;
1967 if (slice_index(w, isize, &ihigh) != 0)
1968 return -1;
1969 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970}
1971
1972static int
1973cmp_exception(err, v)
1974 object *err, *v;
1975{
1976 if (is_tupleobject(v)) {
1977 int i, n;
1978 n = gettuplesize(v);
1979 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001980 /* Test recursively */
1981 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 return 1;
1983 }
1984 return 0;
1985 }
1986 return err == v;
1987}
1988
Guido van Rossum3f5da241990-12-20 15:06:42 +00001989static int
1990cmp_member(v, w)
1991 object *v, *w;
1992{
1993 int i, n, cmp;
1994 object *x;
1995 sequence_methods *sq;
1996 /* Special case for char in string */
1997 if (is_stringobject(w)) {
1998 register char *s, *end;
1999 register char c;
2000 if (!is_stringobject(v) || getstringsize(v) != 1) {
2001 err_setstr(TypeError,
2002 "string member test needs char left operand");
2003 return -1;
2004 }
2005 c = getstringvalue(v)[0];
2006 s = getstringvalue(w);
2007 end = s + getstringsize(w);
2008 while (s < end) {
2009 if (c == *s++)
2010 return 1;
2011 }
2012 return 0;
2013 }
2014 sq = w->ob_type->tp_as_sequence;
2015 if (sq == NULL) {
2016 err_setstr(TypeError,
2017 "'in' or 'not in' needs sequence right argument");
2018 return -1;
2019 }
2020 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002021 if (n < 0)
2022 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002023 for (i = 0; i < n; i++) {
2024 x = (*sq->sq_item)(w, i);
2025 cmp = cmpobject(v, x);
2026 XDECREF(x);
2027 if (cmp == 0)
2028 return 1;
2029 }
2030 return 0;
2031}
2032
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002033static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002034cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002035 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 register object *v;
2037 register object *w;
2038{
2039 register int cmp;
2040 register int res = 0;
2041 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002042 case IS:
2043 case IS_NOT:
2044 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002045 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002046 res = !res;
2047 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 case IN:
2049 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002050 res = cmp_member(v, w);
2051 if (res < 0)
2052 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002053 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002054 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 break;
2056 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002057 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 break;
2059 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002060 cmp = cmpobject(v, w);
2061 switch (op) {
2062 case LT: res = cmp < 0; break;
2063 case LE: res = cmp <= 0; break;
2064 case EQ: res = cmp == 0; break;
2065 case NE: res = cmp != 0; break;
2066 case GT: res = cmp > 0; break;
2067 case GE: res = cmp >= 0; break;
2068 /* XXX no default? (res is initialized to 0 though) */
2069 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 }
2071 v = res ? True : False;
2072 INCREF(v);
2073 return v;
2074}
2075
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076static int
2077import_from(locals, v, name)
2078 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002079 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002080 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002081{
2082 object *w, *x;
2083 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002084 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002085 int i;
2086 int n = getdictsize(w);
2087 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002088 name = getdict2key(w, i);
2089 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002090 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002091 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002092 if (x == NULL) {
2093 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002094 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002096 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002097 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002098 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002099 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002101 }
2102 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002103 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002104 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002105 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002106 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002107 getstringvalue(name));
2108 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002109 return -1;
2110 }
2111 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002112 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002113 }
2114}
2115
2116static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002118 object *v; /* None or tuple containing base classes */
2119 object *w; /* dictionary */
2120{
2121 if (is_tupleobject(v)) {
2122 int i;
2123 for (i = gettuplesize(v); --i >= 0; ) {
2124 object *x = gettupleitem(v, i);
2125 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002126 err_setstr(TypeError,
2127 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002128 return NULL;
2129 }
2130 }
2131 }
2132 else {
2133 v = NULL;
2134 }
2135 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002136 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002137 return NULL;
2138 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002139 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002140}