blob: 97f38ab0c0d7c2a3c344256bb60243c26e9f17b9 [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 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 Rossuma9e7dc11992-10-18 18:53:57 +0000207#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
208 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
209
Guido van Rossum96a42c81992-01-12 02:29:51 +0000210#ifdef LLTRACE
211#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
212#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000213#else
214#define PUSH(v) BASIC_PUSH(v)
215#define POP() BASIC_POP()
216#endif
217
218 f = newframeobject(
219 current_frame, /*back*/
220 co, /*code*/
221 globals, /*globals*/
222 locals, /*locals*/
223 50, /*nvalues*/
224 20); /*nblocks*/
225 if (f == NULL)
226 return NULL;
227
228 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000229
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000230 if (sys_trace != NULL) {
231 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000232 be called on *every* entry to a code block.
233 Its return value, if not None, is a function that
234 will be called at the start of each executed line
235 of code. (Actually, the function must return
236 itself in order to continue tracing.)
237 The trace functions are called with three arguments:
238 a pointer to the current frame, a string indicating
239 why the function is called, and an argument which
240 depends on the situation. The global trace function
241 (sys.trace) is also called whenever an exception
242 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000243 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000244 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000245 current_frame = f->f_back;
246 DECREF(f);
247 return NULL;
248 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000249 }
250
251 if (sys_profile != NULL) {
252 /* Similar for sys_profile, except it needn't return
253 itself and isn't called for "line" events */
254 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
255 current_frame = f->f_back;
256 DECREF(f);
257 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000258 }
259 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000260
261 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000262 stack_pointer = f->f_valuestack;
263
264 if (arg != NULL) {
265 INCREF(arg);
266 PUSH(arg);
267 }
268
269 why = WHY_NOT;
270 err = 0;
271 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000272
273 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000274 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000275
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000276 /* Do periodic things.
277 Doing this every time through the loop would add
278 too much overhead (a function call per instruction).
279 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000280
281 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000282 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000283 if (intrcheck()) {
284 err_set(KeyboardInterrupt);
285 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000286 goto on_error;
287 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000288
289#ifdef USE_THREAD
290 if (interpreter_lock) {
291 /* Give another thread a chance */
292
293 current_frame = NULL;
294 release_lock(interpreter_lock);
295
296 /* Other threads may run now */
297
298 acquire_lock(interpreter_lock, 1);
299 current_frame = f;
300 }
301#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000302 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000303
Guido van Rossum374a9221991-04-04 10:40:29 +0000304 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000305
306#ifdef DEBUG
307 f->f_lasti = INSTR_OFFSET();
308#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000309
310 opcode = NEXTOP();
311 if (HAS_ARG(opcode))
312 oparg = NEXTARG();
313
Guido van Rossum96a42c81992-01-12 02:29:51 +0000314#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000315 /* Instruction tracing */
316
Guido van Rossum96a42c81992-01-12 02:29:51 +0000317 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000318 if (HAS_ARG(opcode)) {
319 printf("%d: %d, %d\n",
320 (int) (INSTR_OFFSET() - 3),
321 opcode, oparg);
322 }
323 else {
324 printf("%d: %d\n",
325 (int) (INSTR_OFFSET() - 1), opcode);
326 }
327 }
328#endif
329
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000330 if (!CHECK_STACK(3)) {
331 x = NULL;
332 break;
333 }
334
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 /* Main switch on opcode */
336
337 switch (opcode) {
338
339 /* BEWARE!
340 It is essential that any operation that fails sets either
341 x to NULL, err to nonzero, or why to anything but WHY_NOT,
342 and that no operation that succeeds does this! */
343
344 /* case STOP_CODE: this is an error! */
345
346 case POP_TOP:
347 v = POP();
348 DECREF(v);
349 break;
350
351 case ROT_TWO:
352 v = POP();
353 w = POP();
354 PUSH(v);
355 PUSH(w);
356 break;
357
358 case ROT_THREE:
359 v = POP();
360 w = POP();
361 x = POP();
362 PUSH(v);
363 PUSH(x);
364 PUSH(w);
365 break;
366
367 case DUP_TOP:
368 v = TOP();
369 INCREF(v);
370 PUSH(v);
371 break;
372
373 case UNARY_POSITIVE:
374 v = POP();
375 x = pos(v);
376 DECREF(v);
377 PUSH(x);
378 break;
379
380 case UNARY_NEGATIVE:
381 v = POP();
382 x = neg(v);
383 DECREF(v);
384 PUSH(x);
385 break;
386
387 case UNARY_NOT:
388 v = POP();
389 x = not(v);
390 DECREF(v);
391 PUSH(x);
392 break;
393
394 case UNARY_CONVERT:
395 v = POP();
396 x = reprobject(v);
397 DECREF(v);
398 PUSH(x);
399 break;
400
401 case UNARY_CALL:
402 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000403 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000404 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000405 DECREF(v);
406 PUSH(x);
407 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000408
409 case UNARY_INVERT:
410 v = POP();
411 x = invert(v);
412 DECREF(v);
413 PUSH(x);
414 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000415
416 case BINARY_MULTIPLY:
417 w = POP();
418 v = POP();
419 x = mul(v, w);
420 DECREF(v);
421 DECREF(w);
422 PUSH(x);
423 break;
424
425 case BINARY_DIVIDE:
426 w = POP();
427 v = POP();
428 x = divide(v, w);
429 DECREF(v);
430 DECREF(w);
431 PUSH(x);
432 break;
433
434 case BINARY_MODULO:
435 w = POP();
436 v = POP();
437 x = rem(v, w);
438 DECREF(v);
439 DECREF(w);
440 PUSH(x);
441 break;
442
443 case BINARY_ADD:
444 w = POP();
445 v = POP();
446 x = add(v, w);
447 DECREF(v);
448 DECREF(w);
449 PUSH(x);
450 break;
451
452 case BINARY_SUBTRACT:
453 w = POP();
454 v = POP();
455 x = sub(v, w);
456 DECREF(v);
457 DECREF(w);
458 PUSH(x);
459 break;
460
461 case BINARY_SUBSCR:
462 w = POP();
463 v = POP();
464 x = apply_subscript(v, w);
465 DECREF(v);
466 DECREF(w);
467 PUSH(x);
468 break;
469
470 case BINARY_CALL:
471 w = POP();
472 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000473 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000474 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000475 DECREF(v);
476 DECREF(w);
477 PUSH(x);
478 break;
479
Guido van Rossum7928cd71991-10-24 14:59:31 +0000480 case BINARY_LSHIFT:
481 w = POP();
482 v = POP();
483 x = lshift(v, w);
484 DECREF(v);
485 DECREF(w);
486 PUSH(x);
487 break;
488
489 case BINARY_RSHIFT:
490 w = POP();
491 v = POP();
492 x = rshift(v, w);
493 DECREF(v);
494 DECREF(w);
495 PUSH(x);
496 break;
497
498 case BINARY_AND:
499 w = POP();
500 v = POP();
501 x = and(v, w);
502 DECREF(v);
503 DECREF(w);
504 PUSH(x);
505 break;
506
507 case BINARY_XOR:
508 w = POP();
509 v = POP();
510 x = xor(v, w);
511 DECREF(v);
512 DECREF(w);
513 PUSH(x);
514 break;
515
516 case BINARY_OR:
517 w = POP();
518 v = POP();
519 x = or(v, w);
520 DECREF(v);
521 DECREF(w);
522 PUSH(x);
523 break;
524
Guido van Rossum374a9221991-04-04 10:40:29 +0000525 case SLICE+0:
526 case SLICE+1:
527 case SLICE+2:
528 case SLICE+3:
529 if ((opcode-SLICE) & 2)
530 w = POP();
531 else
532 w = NULL;
533 if ((opcode-SLICE) & 1)
534 v = POP();
535 else
536 v = NULL;
537 u = POP();
538 x = apply_slice(u, v, w);
539 DECREF(u);
540 XDECREF(v);
541 XDECREF(w);
542 PUSH(x);
543 break;
544
545 case STORE_SLICE+0:
546 case STORE_SLICE+1:
547 case STORE_SLICE+2:
548 case STORE_SLICE+3:
549 if ((opcode-STORE_SLICE) & 2)
550 w = POP();
551 else
552 w = NULL;
553 if ((opcode-STORE_SLICE) & 1)
554 v = POP();
555 else
556 v = NULL;
557 u = POP();
558 t = POP();
559 err = assign_slice(u, v, w, t); /* u[v:w] = t */
560 DECREF(t);
561 DECREF(u);
562 XDECREF(v);
563 XDECREF(w);
564 break;
565
566 case DELETE_SLICE+0:
567 case DELETE_SLICE+1:
568 case DELETE_SLICE+2:
569 case DELETE_SLICE+3:
570 if ((opcode-DELETE_SLICE) & 2)
571 w = POP();
572 else
573 w = NULL;
574 if ((opcode-DELETE_SLICE) & 1)
575 v = POP();
576 else
577 v = NULL;
578 u = POP();
579 err = assign_slice(u, v, w, (object *)NULL);
580 /* del u[v:w] */
581 DECREF(u);
582 XDECREF(v);
583 XDECREF(w);
584 break;
585
586 case STORE_SUBSCR:
587 w = POP();
588 v = POP();
589 u = POP();
590 /* v[w] = u */
591 err = assign_subscript(v, w, u);
592 DECREF(u);
593 DECREF(v);
594 DECREF(w);
595 break;
596
597 case DELETE_SUBSCR:
598 w = POP();
599 v = POP();
600 /* del v[w] */
601 err = assign_subscript(v, w, (object *)NULL);
602 DECREF(v);
603 DECREF(w);
604 break;
605
606 case PRINT_EXPR:
607 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000608 /* Print value except if procedure result */
609 if (v != None) {
610 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000611 x = sysget("stdout");
612 softspace(x, 1);
613 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 flushline();
615 }
616 DECREF(v);
617 break;
618
619 case PRINT_ITEM:
620 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000621 w = sysget("stdout");
622 if (softspace(w, 1))
623 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 if (is_stringobject(v)) {
625 char *s = getstringvalue(v);
626 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000627 err = writeobject(v, w, PRINT_RAW);
628 if (err == 0 && len > 0 && s[len-1] == '\n')
629 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000630 }
631 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000632 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000633 }
634 DECREF(v);
635 break;
636
637 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000638 x = sysget("stdout");
639 if (x == NULL)
640 err_setstr(RuntimeError, "lost sys.stdout");
641 else {
642 writestring("\n", x);
643 softspace(x, 0);
644 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 break;
646
647 case BREAK_LOOP:
648 why = WHY_BREAK;
649 break;
650
651 case RAISE_EXCEPTION:
652 v = POP();
653 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000654 /* A tuple is equivalent to its first element here */
655 while (is_tupleobject(w)) {
656 u = w;
657 w = gettupleitem(u, 0);
658 DECREF(u);
659 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 if (!is_stringobject(w))
661 err_setstr(TypeError,
662 "exceptions must be strings");
663 else
664 err_setval(w, v);
665 DECREF(v);
666 DECREF(w);
667 why = WHY_EXCEPTION;
668 break;
669
670 case LOAD_LOCALS:
671 v = f->f_locals;
672 INCREF(v);
673 PUSH(v);
674 break;
675
676 case RETURN_VALUE:
677 retval = POP();
678 why = WHY_RETURN;
679 break;
680
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 case BUILD_FUNCTION:
682 v = POP();
683 x = newfuncobject(v, f->f_globals);
684 DECREF(v);
685 PUSH(x);
686 break;
687
688 case POP_BLOCK:
689 {
690 block *b = pop_block(f);
691 while (STACK_LEVEL() > b->b_level) {
692 v = POP();
693 DECREF(v);
694 }
695 }
696 break;
697
698 case END_FINALLY:
699 v = POP();
700 if (is_intobject(v)) {
701 why = (enum why_code) getintvalue(v);
702 if (why == WHY_RETURN)
703 retval = POP();
704 }
705 else if (is_stringobject(v)) {
706 w = POP();
707 err_setval(v, w);
708 DECREF(w);
709 w = POP();
710 tb_store(w);
711 DECREF(w);
712 why = WHY_RERAISE;
713 }
714 else if (v != None) {
715 err_setstr(SystemError,
716 "'finally' pops bad exception");
717 why = WHY_EXCEPTION;
718 }
719 DECREF(v);
720 break;
721
722 case BUILD_CLASS:
723 w = POP();
724 v = POP();
725 x = build_class(v, w);
726 PUSH(x);
727 DECREF(v);
728 DECREF(w);
729 break;
730
731 case STORE_NAME:
732 w = GETNAMEV(oparg);
733 v = POP();
734 err = dict2insert(f->f_locals, w, v);
735 DECREF(v);
736 break;
737
738 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000739 w = GETNAMEV(oparg);
740 if ((err = dict2remove(f->f_locals, w)) != 0)
741 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000743
744#ifdef CASE_TOO_BIG
745 default: switch (opcode) {
746#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000747
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000748 case UNPACK_VARARG:
749 if (EMPTY()) {
750 err_setstr(TypeError,
751 "no argument list");
752 why = WHY_EXCEPTION;
753 break;
754 }
755 v = POP();
756 if (!is_tupleobject(v)) {
757 err_setstr(TypeError,
758 "bad argument list");
759 why = WHY_EXCEPTION;
760 }
761 else if (gettuplesize(v) < oparg) {
762 err_setstr(TypeError,
763 "not enough arguments");
764 why = WHY_EXCEPTION;
765 }
766 else if (oparg == 0) {
767 PUSH(v);
768 break;
769 }
770 else {
771 x = gettupleslice(v, oparg, gettuplesize(v));
772 if (x != NULL) {
773 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000774 if (!CHECK_STACK(oparg)) {
775 x = NULL;
776 break;
777 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000778 for (; --oparg >= 0; ) {
779 w = gettupleitem(v, oparg);
780 INCREF(w);
781 PUSH(w);
782 }
783 }
784 }
785 DECREF(v);
786 break;
787
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000788 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000789 {
790 int n;
791 if (EMPTY()) {
792 err_setstr(TypeError,
793 "no argument list");
794 why = WHY_EXCEPTION;
795 break;
796 }
797 v = POP();
798 if (!is_tupleobject(v)) {
799 err_setstr(TypeError,
800 "bad argument list");
801 why = WHY_EXCEPTION;
802 break;
803 }
804 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000805#ifdef COMPAT_HACKS
806/* Implement various compatibility hacks (for 0.9.4 or earlier):
807 (a) f(a,b,...) accepts f((1,2,...))
808 (b) f((a,b,...)) accepts f(1,2,...)
809 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
810*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000811 if (n == 1 && oparg != 1) {
812 /* Rule (a) */
813 w = gettupleitem(v, 0);
814 if (is_tupleobject(w)) {
815 INCREF(w);
816 DECREF(v);
817 v = w;
818 n = gettuplesize(v);
819 }
820 }
821 else if (n != 1 && oparg == 1) {
822 /* Rule (b) */
823 PUSH(v);
824 break;
825 /* Don't fall through */
826 }
827 else if (n > 2 && oparg == 2) {
828 /* Rule (c) */
829 int i;
830 w = newtupleobject(n-1);
831 u = newtupleobject(2);
832 if (u == NULL || w == NULL) {
833 XDECREF(w);
834 XDECREF(u);
835 DECREF(v);
836 why = WHY_EXCEPTION;
837 break;
838 }
839 t = gettupleitem(v, 0);
840 INCREF(t);
841 settupleitem(u, 0, t);
842 for (i = 1; i < n; i++) {
843 t = gettupleitem(v, i);
844 INCREF(t);
845 settupleitem(w, i-1, t);
846 }
847 settupleitem(u, 1, w);
848 DECREF(v);
849 v = u;
850 n = 2;
851 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000852#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000853 if (n != oparg) {
854 err_setstr(TypeError,
855 "arg count mismatch");
856 why = WHY_EXCEPTION;
857 DECREF(v);
858 break;
859 }
860 PUSH(v);
861 }
862 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 case UNPACK_TUPLE:
864 v = POP();
865 if (!is_tupleobject(v)) {
866 err_setstr(TypeError, "unpack non-tuple");
867 why = WHY_EXCEPTION;
868 }
869 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000870 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 "unpack tuple of wrong size");
872 why = WHY_EXCEPTION;
873 }
874 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000875 if (!CHECK_STACK(oparg)) {
876 x = NULL;
877 break;
878 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 for (; --oparg >= 0; ) {
880 w = gettupleitem(v, oparg);
881 INCREF(w);
882 PUSH(w);
883 }
884 }
885 DECREF(v);
886 break;
887
888 case UNPACK_LIST:
889 v = POP();
890 if (!is_listobject(v)) {
891 err_setstr(TypeError, "unpack non-list");
892 why = WHY_EXCEPTION;
893 }
894 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000895 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 "unpack list of wrong size");
897 why = WHY_EXCEPTION;
898 }
899 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000900 if (!CHECK_STACK(oparg)) {
901 x = NULL;
902 break;
903 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 for (; --oparg >= 0; ) {
905 w = getlistitem(v, oparg);
906 INCREF(w);
907 PUSH(w);
908 }
909 }
910 DECREF(v);
911 break;
912
913 case STORE_ATTR:
914 name = GETNAME(oparg);
915 v = POP();
916 u = POP();
917 err = setattr(v, name, u); /* v.name = u */
918 DECREF(v);
919 DECREF(u);
920 break;
921
922 case DELETE_ATTR:
923 name = GETNAME(oparg);
924 v = POP();
925 err = setattr(v, name, (object *)NULL);
926 /* del v.name */
927 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;
995
996 case BUILD_TUPLE:
997 x = newtupleobject(oparg);
998 if (x != NULL) {
999 for (; --oparg >= 0;) {
1000 w = POP();
1001 err = settupleitem(x, oparg, w);
1002 if (err != 0)
1003 break;
1004 }
1005 PUSH(x);
1006 }
1007 break;
1008
1009 case BUILD_LIST:
1010 x = newlistobject(oparg);
1011 if (x != NULL) {
1012 for (; --oparg >= 0;) {
1013 w = POP();
1014 err = setlistitem(x, oparg, w);
1015 if (err != 0)
1016 break;
1017 }
1018 PUSH(x);
1019 }
1020 break;
1021
1022 case BUILD_MAP:
1023 x = newdictobject();
1024 PUSH(x);
1025 break;
1026
1027 case LOAD_ATTR:
1028 name = GETNAME(oparg);
1029 v = POP();
1030 x = getattr(v, name);
1031 DECREF(v);
1032 PUSH(x);
1033 break;
1034
1035 case COMPARE_OP:
1036 w = POP();
1037 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001038 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 DECREF(v);
1040 DECREF(w);
1041 PUSH(x);
1042 break;
1043
1044 case IMPORT_NAME:
1045 name = GETNAME(oparg);
1046 x = import_module(name);
1047 XINCREF(x);
1048 PUSH(x);
1049 break;
1050
1051 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001052 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001054 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 break;
1056
1057 case JUMP_FORWARD:
1058 JUMPBY(oparg);
1059 break;
1060
1061 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062 err = testbool(TOP());
1063 if (err > 0)
1064 err = 0;
1065 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001066 JUMPBY(oparg);
1067 break;
1068
1069 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001070 err = testbool(TOP());
1071 if (err > 0) {
1072 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 break;
1076
1077 case JUMP_ABSOLUTE:
1078 JUMPTO(oparg);
1079 break;
1080
1081 case FOR_LOOP:
1082 /* for v in s: ...
1083 On entry: stack contains s, i.
1084 On exit: stack contains s, i+1, s[i];
1085 but if loop exhausted:
1086 s, i are popped, and we jump */
1087 w = POP(); /* Loop index */
1088 v = POP(); /* Sequence object */
1089 u = loop_subscript(v, w);
1090 if (u != NULL) {
1091 PUSH(v);
1092 x = newintobject(getintvalue(w)+1);
1093 PUSH(x);
1094 DECREF(w);
1095 PUSH(u);
1096 }
1097 else {
1098 DECREF(v);
1099 DECREF(w);
1100 /* A NULL can mean "s exhausted"
1101 but also an error: */
1102 if (err_occurred())
1103 why = WHY_EXCEPTION;
1104 else
1105 JUMPBY(oparg);
1106 }
1107 break;
1108
1109 case SETUP_LOOP:
1110 case SETUP_EXCEPT:
1111 case SETUP_FINALLY:
1112 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1113 STACK_LEVEL());
1114 break;
1115
1116 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001117#ifdef LLTRACE
1118 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 printf("--- Line %d ---\n", oparg);
1120#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001121 f->f_lineno = oparg;
1122 if (trace != NULL) {
1123 /* Trace each line of code reached */
1124 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001125 err = call_trace(&trace, &trace,
1126 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001127 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 break;
1129
1130 default:
1131 fprintf(stderr,
1132 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001133 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 err_setstr(SystemError, "eval_code: unknown opcode");
1135 why = WHY_EXCEPTION;
1136 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001137
1138#ifdef CASE_TOO_BIG
1139 }
1140#endif
1141
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 } /* switch */
1143
1144 on_error:
1145
1146 /* Quickly continue if no error occurred */
1147
1148 if (why == WHY_NOT) {
1149 if (err == 0 && x != NULL)
1150 continue; /* Normal, fast path */
1151 why = WHY_EXCEPTION;
1152 x = None;
1153 err = 0;
1154 }
1155
Guido van Rossum801dcae1992-04-08 11:32:32 +00001156#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 /* Double-check exception status */
1158
1159 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1160 if (!err_occurred()) {
1161 fprintf(stderr, "XXX ghost error\n");
1162 err_setstr(SystemError, "ghost error");
1163 why = WHY_EXCEPTION;
1164 }
1165 }
1166 else {
1167 if (err_occurred()) {
1168 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001169 abort();
1170 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 why = WHY_EXCEPTION;
1172 }
1173 }
1174#endif
1175
1176 /* Log traceback info if this is a real exception */
1177
1178 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001179 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001181 f->f_lasti -= 2;
1182 tb_here(f);
1183
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001184 if (trace)
1185 call_exc_trace(&trace, &trace, f);
1186 if (sys_profile)
1187 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 }
1189
1190 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1191
1192 if (why == WHY_RERAISE)
1193 why = WHY_EXCEPTION;
1194
1195 /* Unwind stacks if a (pseudo) exception occurred */
1196
1197 while (why != WHY_NOT && f->f_iblock > 0) {
1198 block *b = pop_block(f);
1199 while (STACK_LEVEL() > b->b_level) {
1200 v = POP();
1201 XDECREF(v);
1202 }
1203 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1204 why = WHY_NOT;
1205 JUMPTO(b->b_handler);
1206 break;
1207 }
1208 if (b->b_type == SETUP_FINALLY ||
1209 b->b_type == SETUP_EXCEPT &&
1210 why == WHY_EXCEPTION) {
1211 if (why == WHY_EXCEPTION) {
1212 object *exc, *val;
1213 err_get(&exc, &val);
1214 if (val == NULL) {
1215 val = None;
1216 INCREF(val);
1217 }
1218 v = tb_fetch();
1219 /* Make the raw exception data
1220 available to the handler,
1221 so a program can emulate the
1222 Python main loop. Don't do
1223 this for 'finally'. */
1224 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 sysset("exc_value", val);
1227 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 }
1229 PUSH(v);
1230 PUSH(val);
1231 PUSH(exc);
1232 }
1233 else {
1234 if (why == WHY_RETURN)
1235 PUSH(retval);
1236 v = newintobject((long)why);
1237 PUSH(v);
1238 }
1239 why = WHY_NOT;
1240 JUMPTO(b->b_handler);
1241 break;
1242 }
1243 } /* unwind stack */
1244
1245 /* End the loop if we still have an error (or return) */
1246
1247 if (why != WHY_NOT)
1248 break;
1249
1250 } /* main loop */
1251
1252 /* Pop remaining stack entries */
1253
1254 while (!EMPTY()) {
1255 v = POP();
1256 XDECREF(v);
1257 }
1258
Guido van Rossum96a42c81992-01-12 02:29:51 +00001259 if (why != WHY_RETURN)
1260 retval = NULL;
1261
1262 if (trace) {
1263 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001264 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001265 XDECREF(retval);
1266 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001267 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001268 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001269 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001270 XDECREF(trace);
1271 }
1272
1273 if (sys_profile && why == WHY_RETURN) {
1274 if (call_trace(&sys_profile, (object**)0,
1275 f, "return", retval)) {
1276 XDECREF(retval);
1277 retval = NULL;
1278 why = WHY_EXCEPTION;
1279 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001280 }
1281
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 /* Restore previous frame and release the current one */
1283
1284 current_frame = f->f_back;
1285 DECREF(f);
1286
Guido van Rossum96a42c81992-01-12 02:29:51 +00001287 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001288}
1289
Guido van Rossum96a42c81992-01-12 02:29:51 +00001290#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001291static int
1292prtrace(v, str)
1293 object *v;
1294 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001295{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001296 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001297 if (printobject(v, stdout, 0) != 0)
1298 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001299 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001303static void
1304call_exc_trace(p_trace, p_newtrace, f)
1305 object **p_trace, **p_newtrace;
1306 frameobject *f;
1307{
1308 object *type, *value, *traceback, *arg;
1309 int err;
1310 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001311 if (value == NULL) {
1312 value = None;
1313 INCREF(value);
1314 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001315 traceback = tb_fetch();
1316 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001317 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001318 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001319 settupleitem(arg, 0, type);
1320 settupleitem(arg, 1, value);
1321 settupleitem(arg, 2, traceback);
1322 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001323 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001324 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001325 /* Restore original exception */
1326 err_setval(type, value);
1327 tb_store(traceback);
1328 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001329 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001330}
1331
1332static int
1333call_trace(p_trace, p_newtrace, f, msg, arg)
1334 object **p_trace; /* in/out; may not be NULL;
1335 may not point to NULL variable initially */
1336 object **p_newtrace; /* in/out; may be NULL;
1337 may point to NULL variable;
1338 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001339 frameobject *f;
1340 char *msg;
1341 object *arg;
1342{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001343 object *arglist, *what;
1344 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001345 static int tracing = 0;
1346
1347 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001348 /* Don't do recursive traces */
1349 if (p_newtrace) {
1350 XDECREF(*p_newtrace);
1351 *p_newtrace = NULL;
1352 }
1353 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001354 }
1355
1356 arglist = newtupleobject(3);
1357 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001358 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001359 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001360 if (what == NULL)
1361 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001362 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001363 settupleitem(arglist, 0, (object *)f);
1364 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001365 if (arg == NULL)
1366 arg = None;
1367 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001368 settupleitem(arglist, 2, arg);
1369 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001370 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001371 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001372 cleanup:
1373 XDECREF(arglist);
1374 if (res == NULL) {
1375 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001376 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001377 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001378 *p_trace = NULL;
1379 if (p_newtrace) {
1380 XDECREF(*p_newtrace);
1381 *p_newtrace = NULL;
1382 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001383 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001384 }
1385 else {
1386 if (p_newtrace) {
1387 XDECREF(*p_newtrace);
1388 if (res == None)
1389 *p_newtrace = NULL;
1390 else {
1391 INCREF(res);
1392 *p_newtrace = res;
1393 }
1394 }
1395 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001396 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001397 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001398}
1399
Guido van Rossum3f5da241990-12-20 15:06:42 +00001400object *
1401getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001403 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405 else
1406 return current_frame->f_locals;
1407}
1408
1409object *
1410getglobals()
1411{
1412 if (current_frame == NULL)
1413 return NULL;
1414 else
1415 return current_frame->f_globals;
1416}
1417
1418void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001419printtraceback(f)
1420 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421{
1422 object *v = tb_fetch();
1423 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001424 writestring("Stack backtrace (innermost last):\n", f);
1425 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001426 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428}
1429
1430
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431void
1432flushline()
1433{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001434 object *f = sysget("stdout");
1435 if (softspace(f, 0))
1436 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437}
1438
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439
Guido van Rossum04691fc1992-08-12 15:35:34 +00001440/* Test a value used as condition, e.g., in a for or if statement.
1441 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001442
1443static int
1444testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 object *v;
1446{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001447 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001448 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001449 res = 0;
1450 else if (v->ob_type->tp_as_number != NULL)
1451 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1452 else if (v->ob_type->tp_as_mapping != NULL)
1453 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1454 else if (v->ob_type->tp_as_sequence != NULL)
1455 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1456 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001457 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001458 if (res > 0)
1459 res = 1;
1460 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461}
1462
1463static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001464or(v, w)
1465 object *v, *w;
1466{
1467 if (v->ob_type->tp_as_number != NULL) {
1468 object *x;
1469 object * (*f) FPROTO((object *, object *));
1470 if (coerce(&v, &w) != 0)
1471 return NULL;
1472 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1473 x = (*f)(v, w);
1474 DECREF(v);
1475 DECREF(w);
1476 if (f != NULL)
1477 return x;
1478 }
1479 err_setstr(TypeError, "bad operand type(s) for |");
1480 return NULL;
1481}
1482
1483static object *
1484xor(v, w)
1485 object *v, *w;
1486{
1487 if (v->ob_type->tp_as_number != NULL) {
1488 object *x;
1489 object * (*f) FPROTO((object *, object *));
1490 if (coerce(&v, &w) != 0)
1491 return NULL;
1492 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1493 x = (*f)(v, w);
1494 DECREF(v);
1495 DECREF(w);
1496 if (f != NULL)
1497 return x;
1498 }
1499 err_setstr(TypeError, "bad operand type(s) for ^");
1500 return NULL;
1501}
1502
1503static object *
1504and(v, w)
1505 object *v, *w;
1506{
1507 if (v->ob_type->tp_as_number != NULL) {
1508 object *x;
1509 object * (*f) FPROTO((object *, object *));
1510 if (coerce(&v, &w) != 0)
1511 return NULL;
1512 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1513 x = (*f)(v, w);
1514 DECREF(v);
1515 DECREF(w);
1516 if (f != NULL)
1517 return x;
1518 }
1519 err_setstr(TypeError, "bad operand type(s) for &");
1520 return NULL;
1521}
1522
1523static object *
1524lshift(v, w)
1525 object *v, *w;
1526{
1527 if (v->ob_type->tp_as_number != NULL) {
1528 object *x;
1529 object * (*f) FPROTO((object *, object *));
1530 if (coerce(&v, &w) != 0)
1531 return NULL;
1532 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1533 x = (*f)(v, w);
1534 DECREF(v);
1535 DECREF(w);
1536 if (f != NULL)
1537 return x;
1538 }
1539 err_setstr(TypeError, "bad operand type(s) for <<");
1540 return NULL;
1541}
1542
1543static object *
1544rshift(v, w)
1545 object *v, *w;
1546{
1547 if (v->ob_type->tp_as_number != NULL) {
1548 object *x;
1549 object * (*f) FPROTO((object *, object *));
1550 if (coerce(&v, &w) != 0)
1551 return NULL;
1552 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1553 x = (*f)(v, w);
1554 DECREF(v);
1555 DECREF(w);
1556 if (f != NULL)
1557 return x;
1558 }
1559 err_setstr(TypeError, "bad operand type(s) for >>");
1560 return NULL;
1561}
1562
1563static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001564add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 object *v, *w;
1566{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001567 if (v->ob_type->tp_as_sequence != NULL)
1568 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1569 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001570 object *x;
1571 if (coerce(&v, &w) != 0)
1572 return NULL;
1573 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1574 DECREF(v);
1575 DECREF(w);
1576 return x;
1577 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001578 err_setstr(TypeError, "bad operand type(s) for +");
1579 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580}
1581
1582static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001583sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584 object *v, *w;
1585{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001586 if (v->ob_type->tp_as_number != NULL) {
1587 object *x;
1588 if (coerce(&v, &w) != 0)
1589 return NULL;
1590 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1591 DECREF(v);
1592 DECREF(w);
1593 return x;
1594 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001595 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596 return NULL;
1597}
1598
1599static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001600mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 object *v, *w;
1602{
1603 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001604 tp = v->ob_type;
1605 if (tp->tp_as_number != NULL &&
1606 w->ob_type->tp_as_sequence != NULL &&
1607 !is_instanceobject(v)) {
1608 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 object *tmp = v;
1610 v = w;
1611 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001612 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001614 if (tp->tp_as_number != NULL) {
1615 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001616 if (is_instanceobject(v)) {
1617 /* Instances of user-defined classes get their
1618 other argument uncoerced, so they may
1619 implement sequence*number as well as
1620 number*number. */
1621 INCREF(v);
1622 INCREF(w);
1623 }
1624 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001625 return NULL;
1626 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1627 DECREF(v);
1628 DECREF(w);
1629 return x;
1630 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631 if (tp->tp_as_sequence != NULL) {
1632 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633 err_setstr(TypeError,
1634 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 return NULL;
1636 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001637 return (*tp->tp_as_sequence->sq_repeat)
1638 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001640 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 return NULL;
1642}
1643
1644static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001645divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 object *v, *w;
1647{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001648 if (v->ob_type->tp_as_number != NULL) {
1649 object *x;
1650 if (coerce(&v, &w) != 0)
1651 return NULL;
1652 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1653 DECREF(v);
1654 DECREF(w);
1655 return x;
1656 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001657 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001658 return NULL;
1659}
1660
1661static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001662rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001663 object *v, *w;
1664{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001665 if (v->ob_type->tp_as_number != NULL) {
1666 object *x;
1667 if (coerce(&v, &w) != 0)
1668 return NULL;
1669 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1670 DECREF(v);
1671 DECREF(w);
1672 return x;
1673 }
Guido van Rossume5372401993-03-16 12:15:04 +00001674 if (is_stringobject(v)) {
1675 return formatstring(v, w);
1676 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001677 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001678 return NULL;
1679}
1680
1681static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001682neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683 object *v;
1684{
1685 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001686 return (*v->ob_type->tp_as_number->nb_negative)(v);
1687 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001688 return NULL;
1689}
1690
1691static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001692pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693 object *v;
1694{
1695 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696 return (*v->ob_type->tp_as_number->nb_positive)(v);
1697 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698 return NULL;
1699}
1700
1701static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001702invert(v)
1703 object *v;
1704{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001705 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001706 if (v->ob_type->tp_as_number != NULL &&
1707 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1708 return (*f)(v);
1709 err_setstr(TypeError, "bad operand type(s) for unary ~");
1710 return NULL;
1711}
1712
1713static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001714not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001715 object *v;
1716{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001717 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001718 object *w;
1719 if (outcome < 0)
1720 return NULL;
1721 if (outcome == 0)
1722 w = True;
1723 else
1724 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001725 INCREF(w);
1726 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001728/* External interface to call any callable object. The arg may be NULL. */
1729
1730object *
1731call_object(func, arg)
1732 object *func;
1733 object *arg;
1734{
1735 if (is_instancemethodobject(func) || is_funcobject(func))
1736 return call_function(func, arg);
1737 else
1738 return call_builtin(func, arg);
1739}
1740
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001742call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 if (is_methodobject(func)) {
1747 method meth = getmethod(func);
1748 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001749 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1750 int size = gettuplesize(arg);
1751 if (size == 1)
1752 arg = gettupleitem(arg, 0);
1753 else if (size == 0)
1754 arg = NULL;
1755 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001756 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757 }
1758 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001759 if (arg != NULL &&
1760 !(is_tupleobject(arg) &&
1761 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762 err_setstr(TypeError,
1763 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 return NULL;
1765 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001768 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769 return NULL;
1770}
1771
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001772static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001773call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001777 object *newarg = NULL;
1778 object *newlocals, *newglobals;
1779 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780
Guido van Rossume8122f11991-05-05 20:03:07 +00001781 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001782 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001783 object *self = instancemethodgetself(func);
1784 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001785 if (arg == NULL)
1786 argcount = 0;
1787 else if (is_tupleobject(arg))
1788 argcount = gettuplesize(arg);
1789 else
1790 argcount = 1;
1791 newarg = newtupleobject(argcount + 1);
1792 if (newarg == NULL)
1793 return NULL;
1794 INCREF(self);
1795 settupleitem(newarg, 0, self);
1796 if (arg != NULL && !is_tupleobject(arg)) {
1797 INCREF(arg);
1798 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 }
1800 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001801 int i;
1802 object *v;
1803 for (i = 0; i < argcount; i++) {
1804 v = gettupleitem(arg, i);
1805 XINCREF(v);
1806 settupleitem(newarg, i+1, v);
1807 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001808 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001809 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 }
1811 else {
1812 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001813 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 return NULL;
1815 }
1816 }
1817
Guido van Rossum3f5da241990-12-20 15:06:42 +00001818 co = getfunccode(func);
1819 if (co == NULL) {
1820 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 return NULL;
1822 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001823 if (!is_codeobject(co)) {
1824 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 abort();
1826 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001827 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001829 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 return NULL;
1831 }
1832
Guido van Rossum3f5da241990-12-20 15:06:42 +00001833 newglobals = getfuncglobals(func);
1834 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835
Guido van Rossum3f5da241990-12-20 15:06:42 +00001836 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838 DECREF(newlocals);
1839 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840
Guido van Rossum3f5da241990-12-20 15:06:42 +00001841 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842
1843 return v;
1844}
1845
1846static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001847apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 object *v, *w;
1849{
1850 typeobject *tp = v->ob_type;
1851 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001852 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 return NULL;
1854 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001855 if (tp->tp_as_mapping != NULL) {
1856 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1857 }
1858 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 int i;
1860 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001861 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862 return NULL;
1863 }
1864 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001865 if (i < 0) {
1866 int len = (*tp->tp_as_sequence->sq_length)(v);
1867 if (len < 0)
1868 return NULL;
1869 i += len;
1870 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001871 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873}
1874
1875static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001877 object *v, *w;
1878{
1879 sequence_methods *sq = v->ob_type->tp_as_sequence;
1880 int i, n;
1881 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001882 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 return NULL;
1884 }
1885 i = getintvalue(w);
1886 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001887 if (n < 0)
1888 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 if (i >= n)
1890 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001891 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892}
1893
1894static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001895slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 object *v;
1897 int isize;
1898 int *pi;
1899{
1900 if (v != NULL) {
1901 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001902 err_setstr(TypeError, "slice index must be int");
1903 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001904 }
1905 *pi = getintvalue(v);
1906 if (*pi < 0)
1907 *pi += isize;
1908 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001909 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910}
1911
1912static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001914 object *u, *v, *w;
1915{
1916 typeobject *tp = u->ob_type;
1917 int ilow, ihigh, isize;
1918 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001919 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920 return NULL;
1921 }
1922 ilow = 0;
1923 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001924 if (isize < 0)
1925 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001926 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001928 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001932
1933static int
1934assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 object *w;
1936 object *key;
1937 object *v;
1938{
1939 typeobject *tp = w->ob_type;
1940 sequence_methods *sq;
1941 mapping_methods *mp;
1942 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001943 if ((mp = tp->tp_as_mapping) != NULL &&
1944 (func = mp->mp_ass_subscript) != NULL) {
1945 return (*func)(w, key, v);
1946 }
1947 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 (func = sq->sq_ass_item) != NULL) {
1949 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001951 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001954 else {
1955 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001956 if (i < 0) {
1957 int len = (*sq->sq_length)(w);
1958 if (len < 0)
1959 return -1;
1960 i += len;
1961 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001962 return (*func)(w, i, v);
1963 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001966 err_setstr(TypeError,
1967 "can't assign to this subscripted object");
1968 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970}
1971
Guido van Rossum3f5da241990-12-20 15:06:42 +00001972static int
1973assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 object *u, *v, *w, *x;
1975{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001976 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978 if (sq == NULL) {
1979 err_setstr(TypeError, "assign to slice of non-sequence");
1980 return -1;
1981 }
1982 if (sq == NULL || sq->sq_ass_slice == NULL) {
1983 err_setstr(TypeError, "unassignable slice");
1984 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
1986 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001987 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001988 if (isize < 0)
1989 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990 if (slice_index(v, isize, &ilow) != 0)
1991 return -1;
1992 if (slice_index(w, isize, &ihigh) != 0)
1993 return -1;
1994 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995}
1996
1997static int
1998cmp_exception(err, v)
1999 object *err, *v;
2000{
2001 if (is_tupleobject(v)) {
2002 int i, n;
2003 n = gettuplesize(v);
2004 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002005 /* Test recursively */
2006 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 return 1;
2008 }
2009 return 0;
2010 }
2011 return err == v;
2012}
2013
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014static int
2015cmp_member(v, w)
2016 object *v, *w;
2017{
2018 int i, n, cmp;
2019 object *x;
2020 sequence_methods *sq;
2021 /* Special case for char in string */
2022 if (is_stringobject(w)) {
2023 register char *s, *end;
2024 register char c;
2025 if (!is_stringobject(v) || getstringsize(v) != 1) {
2026 err_setstr(TypeError,
2027 "string member test needs char left operand");
2028 return -1;
2029 }
2030 c = getstringvalue(v)[0];
2031 s = getstringvalue(w);
2032 end = s + getstringsize(w);
2033 while (s < end) {
2034 if (c == *s++)
2035 return 1;
2036 }
2037 return 0;
2038 }
2039 sq = w->ob_type->tp_as_sequence;
2040 if (sq == NULL) {
2041 err_setstr(TypeError,
2042 "'in' or 'not in' needs sequence right argument");
2043 return -1;
2044 }
2045 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002046 if (n < 0)
2047 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002048 for (i = 0; i < n; i++) {
2049 x = (*sq->sq_item)(w, i);
2050 cmp = cmpobject(v, x);
2051 XDECREF(x);
2052 if (cmp == 0)
2053 return 1;
2054 }
2055 return 0;
2056}
2057
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002059cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002060 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 register object *v;
2062 register object *w;
2063{
2064 register int cmp;
2065 register int res = 0;
2066 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002067 case IS:
2068 case IS_NOT:
2069 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002070 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071 res = !res;
2072 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 case IN:
2074 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002075 res = cmp_member(v, w);
2076 if (res < 0)
2077 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002078 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 break;
2081 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 break;
2084 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085 cmp = cmpobject(v, w);
2086 switch (op) {
2087 case LT: res = cmp < 0; break;
2088 case LE: res = cmp <= 0; break;
2089 case EQ: res = cmp == 0; break;
2090 case NE: res = cmp != 0; break;
2091 case GT: res = cmp > 0; break;
2092 case GE: res = cmp >= 0; break;
2093 /* XXX no default? (res is initialized to 0 though) */
2094 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 }
2096 v = res ? True : False;
2097 INCREF(v);
2098 return v;
2099}
2100
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101static int
2102import_from(locals, v, name)
2103 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002104 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002105 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002106{
2107 object *w, *x;
2108 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002109 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002110 int i;
2111 int n = getdictsize(w);
2112 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002113 name = getdict2key(w, i);
2114 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002115 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002116 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002117 if (x == NULL) {
2118 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002119 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002120 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002121 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002122 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002123 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002124 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002125 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002126 }
2127 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002128 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002130 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002131 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002132 getstringvalue(name));
2133 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002134 return -1;
2135 }
2136 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002137 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002138 }
2139}
2140
2141static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002142build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002143 object *v; /* None or tuple containing base classes */
2144 object *w; /* dictionary */
2145{
2146 if (is_tupleobject(v)) {
2147 int i;
2148 for (i = gettuplesize(v); --i >= 0; ) {
2149 object *x = gettupleitem(v, i);
2150 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002151 err_setstr(TypeError,
2152 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002153 return NULL;
2154 }
2155 }
2156 }
2157 else {
2158 v = NULL;
2159 }
2160 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002162 return NULL;
2163 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002164 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002165}