blob: e548763d4e87a52c992d5ca99f293a3d6eaa160f [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 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:
789 /* Implement various compatibility hacks:
790 (a) f(a,b,...) should accept f((1,2,...))
791 (b) f((a,b,...)) should accept f(1,2,...)
792 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
Guido van Rossum5f59d601992-12-14 16:59:51 +0000793 Actually, (c) is dangerous, and (b) seems
794 unnecessary, but (a) can't be missed...
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000795 */
796 {
797 int n;
798 if (EMPTY()) {
799 err_setstr(TypeError,
800 "no argument list");
801 why = WHY_EXCEPTION;
802 break;
803 }
804 v = POP();
805 if (!is_tupleobject(v)) {
806 err_setstr(TypeError,
807 "bad argument list");
808 why = WHY_EXCEPTION;
809 break;
810 }
811 n = gettuplesize(v);
812 if (n == 1 && oparg != 1) {
813 /* Rule (a) */
814 w = gettupleitem(v, 0);
815 if (is_tupleobject(w)) {
816 INCREF(w);
817 DECREF(v);
818 v = w;
819 n = gettuplesize(v);
820 }
821 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000822#if 0 /* Compatibility hacks no longer needed (I think) */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000823 else if (n != 1 && oparg == 1) {
824 /* Rule (b) */
825 PUSH(v);
826 break;
827 /* Don't fall through */
828 }
829 else if (n > 2 && oparg == 2) {
830 /* Rule (c) */
831 int i;
832 w = newtupleobject(n-1);
833 u = newtupleobject(2);
834 if (u == NULL || w == NULL) {
835 XDECREF(w);
836 XDECREF(u);
837 DECREF(v);
838 why = WHY_EXCEPTION;
839 break;
840 }
841 t = gettupleitem(v, 0);
842 INCREF(t);
843 settupleitem(u, 0, t);
844 for (i = 1; i < n; i++) {
845 t = gettupleitem(v, i);
846 INCREF(t);
847 settupleitem(w, i-1, t);
848 }
849 settupleitem(u, 1, w);
850 DECREF(v);
851 v = u;
852 n = 2;
853 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000854#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000855 if (n != oparg) {
856 err_setstr(TypeError,
857 "arg count mismatch");
858 why = WHY_EXCEPTION;
859 DECREF(v);
860 break;
861 }
862 PUSH(v);
863 }
864 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 case UNPACK_TUPLE:
866 v = POP();
867 if (!is_tupleobject(v)) {
868 err_setstr(TypeError, "unpack non-tuple");
869 why = WHY_EXCEPTION;
870 }
871 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000872 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 "unpack tuple of wrong size");
874 why = WHY_EXCEPTION;
875 }
876 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000877 if (!CHECK_STACK(oparg)) {
878 x = NULL;
879 break;
880 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 for (; --oparg >= 0; ) {
882 w = gettupleitem(v, oparg);
883 INCREF(w);
884 PUSH(w);
885 }
886 }
887 DECREF(v);
888 break;
889
890 case UNPACK_LIST:
891 v = POP();
892 if (!is_listobject(v)) {
893 err_setstr(TypeError, "unpack non-list");
894 why = WHY_EXCEPTION;
895 }
896 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000897 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 "unpack list of wrong size");
899 why = WHY_EXCEPTION;
900 }
901 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000902 if (!CHECK_STACK(oparg)) {
903 x = NULL;
904 break;
905 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 for (; --oparg >= 0; ) {
907 w = getlistitem(v, oparg);
908 INCREF(w);
909 PUSH(w);
910 }
911 }
912 DECREF(v);
913 break;
914
915 case STORE_ATTR:
916 name = GETNAME(oparg);
917 v = POP();
918 u = POP();
919 err = setattr(v, name, u); /* v.name = u */
920 DECREF(v);
921 DECREF(u);
922 break;
923
924 case DELETE_ATTR:
925 name = GETNAME(oparg);
926 v = POP();
927 err = setattr(v, name, (object *)NULL);
928 /* del v.name */
929 DECREF(v);
930 break;
931
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000932 case STORE_GLOBAL:
933 w = GETNAMEV(oparg);
934 v = POP();
935 err = dict2insert(f->f_globals, w, v);
936 DECREF(v);
937 break;
938
939 case DELETE_GLOBAL:
940 w = GETNAMEV(oparg);
941 if ((err = dict2remove(f->f_globals, w)) != 0)
942 err_setstr(NameError, getstringvalue(w));
943 break;
944
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 case LOAD_CONST:
946 x = GETCONST(oparg);
947 INCREF(x);
948 PUSH(x);
949 break;
950
951 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000952 w = GETNAMEV(oparg);
953 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000955 err_clear();
956 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000958 err_clear();
959 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000961 err_setstr(NameError,
962 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
964 }
965 }
966 }
967 INCREF(x);
968 PUSH(x);
969 break;
970
971 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000972 w = GETNAMEV(oparg);
973 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000975 err_clear();
976 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000978 err_setstr(NameError,
979 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 break;
981 }
982 }
983 INCREF(x);
984 PUSH(x);
985 break;
986
987 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000988 w = GETNAMEV(oparg);
989 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000991 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
993 }
994 INCREF(x);
995 PUSH(x);
996 break;
997
998 case BUILD_TUPLE:
999 x = newtupleobject(oparg);
1000 if (x != NULL) {
1001 for (; --oparg >= 0;) {
1002 w = POP();
1003 err = settupleitem(x, oparg, w);
1004 if (err != 0)
1005 break;
1006 }
1007 PUSH(x);
1008 }
1009 break;
1010
1011 case BUILD_LIST:
1012 x = newlistobject(oparg);
1013 if (x != NULL) {
1014 for (; --oparg >= 0;) {
1015 w = POP();
1016 err = setlistitem(x, oparg, w);
1017 if (err != 0)
1018 break;
1019 }
1020 PUSH(x);
1021 }
1022 break;
1023
1024 case BUILD_MAP:
1025 x = newdictobject();
1026 PUSH(x);
1027 break;
1028
1029 case LOAD_ATTR:
1030 name = GETNAME(oparg);
1031 v = POP();
1032 x = getattr(v, name);
1033 DECREF(v);
1034 PUSH(x);
1035 break;
1036
1037 case COMPARE_OP:
1038 w = POP();
1039 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001040 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 DECREF(v);
1042 DECREF(w);
1043 PUSH(x);
1044 break;
1045
1046 case IMPORT_NAME:
1047 name = GETNAME(oparg);
1048 x = import_module(name);
1049 XINCREF(x);
1050 PUSH(x);
1051 break;
1052
1053 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001054 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001056 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001057 break;
1058
1059 case JUMP_FORWARD:
1060 JUMPBY(oparg);
1061 break;
1062
1063 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001064 err = testbool(TOP());
1065 if (err > 0)
1066 err = 0;
1067 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001068 JUMPBY(oparg);
1069 break;
1070
1071 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072 err = testbool(TOP());
1073 if (err > 0) {
1074 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001076 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 break;
1078
1079 case JUMP_ABSOLUTE:
1080 JUMPTO(oparg);
1081 break;
1082
1083 case FOR_LOOP:
1084 /* for v in s: ...
1085 On entry: stack contains s, i.
1086 On exit: stack contains s, i+1, s[i];
1087 but if loop exhausted:
1088 s, i are popped, and we jump */
1089 w = POP(); /* Loop index */
1090 v = POP(); /* Sequence object */
1091 u = loop_subscript(v, w);
1092 if (u != NULL) {
1093 PUSH(v);
1094 x = newintobject(getintvalue(w)+1);
1095 PUSH(x);
1096 DECREF(w);
1097 PUSH(u);
1098 }
1099 else {
1100 DECREF(v);
1101 DECREF(w);
1102 /* A NULL can mean "s exhausted"
1103 but also an error: */
1104 if (err_occurred())
1105 why = WHY_EXCEPTION;
1106 else
1107 JUMPBY(oparg);
1108 }
1109 break;
1110
1111 case SETUP_LOOP:
1112 case SETUP_EXCEPT:
1113 case SETUP_FINALLY:
1114 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1115 STACK_LEVEL());
1116 break;
1117
1118 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001119#ifdef LLTRACE
1120 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 printf("--- Line %d ---\n", oparg);
1122#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001123 f->f_lineno = oparg;
1124 if (trace != NULL) {
1125 /* Trace each line of code reached */
1126 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001127 err = call_trace(&trace, &trace,
1128 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001129 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 break;
1131
1132 default:
1133 fprintf(stderr,
1134 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001135 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 err_setstr(SystemError, "eval_code: unknown opcode");
1137 why = WHY_EXCEPTION;
1138 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001139
1140#ifdef CASE_TOO_BIG
1141 }
1142#endif
1143
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 } /* switch */
1145
1146 on_error:
1147
1148 /* Quickly continue if no error occurred */
1149
1150 if (why == WHY_NOT) {
1151 if (err == 0 && x != NULL)
1152 continue; /* Normal, fast path */
1153 why = WHY_EXCEPTION;
1154 x = None;
1155 err = 0;
1156 }
1157
Guido van Rossum801dcae1992-04-08 11:32:32 +00001158#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 /* Double-check exception status */
1160
1161 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1162 if (!err_occurred()) {
1163 fprintf(stderr, "XXX ghost error\n");
1164 err_setstr(SystemError, "ghost error");
1165 why = WHY_EXCEPTION;
1166 }
1167 }
1168 else {
1169 if (err_occurred()) {
1170 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001171 abort();
1172 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 why = WHY_EXCEPTION;
1174 }
1175 }
1176#endif
1177
1178 /* Log traceback info if this is a real exception */
1179
1180 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001181 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001183 f->f_lasti -= 2;
1184 tb_here(f);
1185
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001186 if (trace)
1187 call_exc_trace(&trace, &trace, f);
1188 if (sys_profile)
1189 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 }
1191
1192 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1193
1194 if (why == WHY_RERAISE)
1195 why = WHY_EXCEPTION;
1196
1197 /* Unwind stacks if a (pseudo) exception occurred */
1198
1199 while (why != WHY_NOT && f->f_iblock > 0) {
1200 block *b = pop_block(f);
1201 while (STACK_LEVEL() > b->b_level) {
1202 v = POP();
1203 XDECREF(v);
1204 }
1205 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1206 why = WHY_NOT;
1207 JUMPTO(b->b_handler);
1208 break;
1209 }
1210 if (b->b_type == SETUP_FINALLY ||
1211 b->b_type == SETUP_EXCEPT &&
1212 why == WHY_EXCEPTION) {
1213 if (why == WHY_EXCEPTION) {
1214 object *exc, *val;
1215 err_get(&exc, &val);
1216 if (val == NULL) {
1217 val = None;
1218 INCREF(val);
1219 }
1220 v = tb_fetch();
1221 /* Make the raw exception data
1222 available to the handler,
1223 so a program can emulate the
1224 Python main loop. Don't do
1225 this for 'finally'. */
1226 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 sysset("exc_value", val);
1229 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 }
1231 PUSH(v);
1232 PUSH(val);
1233 PUSH(exc);
1234 }
1235 else {
1236 if (why == WHY_RETURN)
1237 PUSH(retval);
1238 v = newintobject((long)why);
1239 PUSH(v);
1240 }
1241 why = WHY_NOT;
1242 JUMPTO(b->b_handler);
1243 break;
1244 }
1245 } /* unwind stack */
1246
1247 /* End the loop if we still have an error (or return) */
1248
1249 if (why != WHY_NOT)
1250 break;
1251
1252 } /* main loop */
1253
1254 /* Pop remaining stack entries */
1255
1256 while (!EMPTY()) {
1257 v = POP();
1258 XDECREF(v);
1259 }
1260
Guido van Rossum96a42c81992-01-12 02:29:51 +00001261 if (why != WHY_RETURN)
1262 retval = NULL;
1263
1264 if (trace) {
1265 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001266 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001267 XDECREF(retval);
1268 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001269 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001270 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001271 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001272 XDECREF(trace);
1273 }
1274
1275 if (sys_profile && why == WHY_RETURN) {
1276 if (call_trace(&sys_profile, (object**)0,
1277 f, "return", retval)) {
1278 XDECREF(retval);
1279 retval = NULL;
1280 why = WHY_EXCEPTION;
1281 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001282 }
1283
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 /* Restore previous frame and release the current one */
1285
1286 current_frame = f->f_back;
1287 DECREF(f);
1288
Guido van Rossum96a42c81992-01-12 02:29:51 +00001289 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001290}
1291
Guido van Rossum96a42c81992-01-12 02:29:51 +00001292#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001293static int
1294prtrace(v, str)
1295 object *v;
1296 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001297{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001298 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001299 if (printobject(v, stdout, 0) != 0)
1300 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001303#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001305static void
1306call_exc_trace(p_trace, p_newtrace, f)
1307 object **p_trace, **p_newtrace;
1308 frameobject *f;
1309{
1310 object *type, *value, *traceback, *arg;
1311 int err;
1312 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001313 if (value == NULL) {
1314 value = None;
1315 INCREF(value);
1316 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001317 traceback = tb_fetch();
1318 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001319 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001320 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001321 settupleitem(arg, 0, type);
1322 settupleitem(arg, 1, value);
1323 settupleitem(arg, 2, traceback);
1324 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001325 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001326 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001327 /* Restore original exception */
1328 err_setval(type, value);
1329 tb_store(traceback);
1330 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001331 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001332}
1333
1334static int
1335call_trace(p_trace, p_newtrace, f, msg, arg)
1336 object **p_trace; /* in/out; may not be NULL;
1337 may not point to NULL variable initially */
1338 object **p_newtrace; /* in/out; may be NULL;
1339 may point to NULL variable;
1340 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001341 frameobject *f;
1342 char *msg;
1343 object *arg;
1344{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001345 object *arglist, *what;
1346 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001347 static int tracing = 0;
1348
1349 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001350 /* Don't do recursive traces */
1351 if (p_newtrace) {
1352 XDECREF(*p_newtrace);
1353 *p_newtrace = NULL;
1354 }
1355 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001356 }
1357
1358 arglist = newtupleobject(3);
1359 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001360 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001361 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001362 if (what == NULL)
1363 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001364 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001365 settupleitem(arglist, 0, (object *)f);
1366 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001367 if (arg == NULL)
1368 arg = None;
1369 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001370 settupleitem(arglist, 2, arg);
1371 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001372 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001373 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001374 cleanup:
1375 XDECREF(arglist);
1376 if (res == NULL) {
1377 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001378 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001379 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001380 *p_trace = NULL;
1381 if (p_newtrace) {
1382 XDECREF(*p_newtrace);
1383 *p_newtrace = NULL;
1384 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001385 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001386 }
1387 else {
1388 if (p_newtrace) {
1389 XDECREF(*p_newtrace);
1390 if (res == None)
1391 *p_newtrace = NULL;
1392 else {
1393 INCREF(res);
1394 *p_newtrace = res;
1395 }
1396 }
1397 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001398 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001399 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001400}
1401
Guido van Rossum3f5da241990-12-20 15:06:42 +00001402object *
1403getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407 else
1408 return current_frame->f_locals;
1409}
1410
1411object *
1412getglobals()
1413{
1414 if (current_frame == NULL)
1415 return NULL;
1416 else
1417 return current_frame->f_globals;
1418}
1419
1420void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001421printtraceback(f)
1422 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001423{
1424 object *v = tb_fetch();
1425 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001426 writestring("Stack backtrace (innermost last):\n", f);
1427 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001428 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430}
1431
1432
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433void
1434flushline()
1435{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001436 object *f = sysget("stdout");
1437 if (softspace(f, 0))
1438 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439}
1440
Guido van Rossum3f5da241990-12-20 15:06:42 +00001441
Guido van Rossum04691fc1992-08-12 15:35:34 +00001442/* Test a value used as condition, e.g., in a for or if statement.
1443 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444
1445static int
1446testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 object *v;
1448{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001449 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001450 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001451 res = 0;
1452 else if (v->ob_type->tp_as_number != NULL)
1453 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1454 else if (v->ob_type->tp_as_mapping != NULL)
1455 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1456 else if (v->ob_type->tp_as_sequence != NULL)
1457 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1458 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001459 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460 if (res > 0)
1461 res = 1;
1462 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463}
1464
1465static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001466or(v, w)
1467 object *v, *w;
1468{
1469 if (v->ob_type->tp_as_number != NULL) {
1470 object *x;
1471 object * (*f) FPROTO((object *, object *));
1472 if (coerce(&v, &w) != 0)
1473 return NULL;
1474 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1475 x = (*f)(v, w);
1476 DECREF(v);
1477 DECREF(w);
1478 if (f != NULL)
1479 return x;
1480 }
1481 err_setstr(TypeError, "bad operand type(s) for |");
1482 return NULL;
1483}
1484
1485static object *
1486xor(v, w)
1487 object *v, *w;
1488{
1489 if (v->ob_type->tp_as_number != NULL) {
1490 object *x;
1491 object * (*f) FPROTO((object *, object *));
1492 if (coerce(&v, &w) != 0)
1493 return NULL;
1494 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1495 x = (*f)(v, w);
1496 DECREF(v);
1497 DECREF(w);
1498 if (f != NULL)
1499 return x;
1500 }
1501 err_setstr(TypeError, "bad operand type(s) for ^");
1502 return NULL;
1503}
1504
1505static object *
1506and(v, w)
1507 object *v, *w;
1508{
1509 if (v->ob_type->tp_as_number != NULL) {
1510 object *x;
1511 object * (*f) FPROTO((object *, object *));
1512 if (coerce(&v, &w) != 0)
1513 return NULL;
1514 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1515 x = (*f)(v, w);
1516 DECREF(v);
1517 DECREF(w);
1518 if (f != NULL)
1519 return x;
1520 }
1521 err_setstr(TypeError, "bad operand type(s) for &");
1522 return NULL;
1523}
1524
1525static object *
1526lshift(v, w)
1527 object *v, *w;
1528{
1529 if (v->ob_type->tp_as_number != NULL) {
1530 object *x;
1531 object * (*f) FPROTO((object *, object *));
1532 if (coerce(&v, &w) != 0)
1533 return NULL;
1534 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1535 x = (*f)(v, w);
1536 DECREF(v);
1537 DECREF(w);
1538 if (f != NULL)
1539 return x;
1540 }
1541 err_setstr(TypeError, "bad operand type(s) for <<");
1542 return NULL;
1543}
1544
1545static object *
1546rshift(v, w)
1547 object *v, *w;
1548{
1549 if (v->ob_type->tp_as_number != NULL) {
1550 object *x;
1551 object * (*f) FPROTO((object *, object *));
1552 if (coerce(&v, &w) != 0)
1553 return NULL;
1554 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1555 x = (*f)(v, w);
1556 DECREF(v);
1557 DECREF(w);
1558 if (f != NULL)
1559 return x;
1560 }
1561 err_setstr(TypeError, "bad operand type(s) for >>");
1562 return NULL;
1563}
1564
1565static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001566add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 object *v, *w;
1568{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001569 if (v->ob_type->tp_as_sequence != NULL)
1570 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1571 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001572 object *x;
1573 if (coerce(&v, &w) != 0)
1574 return NULL;
1575 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1576 DECREF(v);
1577 DECREF(w);
1578 return x;
1579 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001581 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582 return NULL;
1583 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001584}
1585
1586static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001587sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 object *v, *w;
1589{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001590 if (v->ob_type->tp_as_number != NULL) {
1591 object *x;
1592 if (coerce(&v, &w) != 0)
1593 return NULL;
1594 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1595 DECREF(v);
1596 DECREF(w);
1597 return x;
1598 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001599 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 return NULL;
1601}
1602
1603static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001604mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 object *v, *w;
1606{
1607 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001608 tp = v->ob_type;
1609 if (tp->tp_as_number != NULL &&
1610 w->ob_type->tp_as_sequence != NULL &&
1611 !is_instanceobject(v)) {
1612 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613 object *tmp = v;
1614 v = w;
1615 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001616 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001618 if (tp->tp_as_number != NULL) {
1619 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001620 if (is_instanceobject(v)) {
1621 /* Instances of user-defined classes get their
1622 other argument uncoerced, so they may
1623 implement sequence*number as well as
1624 number*number. */
1625 INCREF(v);
1626 INCREF(w);
1627 }
1628 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001629 return NULL;
1630 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1631 DECREF(v);
1632 DECREF(w);
1633 return x;
1634 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001635 if (tp->tp_as_sequence != NULL) {
1636 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001637 err_setstr(TypeError,
1638 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639 return NULL;
1640 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001641 return (*tp->tp_as_sequence->sq_repeat)
1642 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001644 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 return NULL;
1646}
1647
1648static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001649divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 object *v, *w;
1651{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001652 if (v->ob_type->tp_as_number != NULL) {
1653 object *x;
1654 if (coerce(&v, &w) != 0)
1655 return NULL;
1656 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1657 DECREF(v);
1658 DECREF(w);
1659 return x;
1660 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001661 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001662 return NULL;
1663}
1664
1665static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001666rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667 object *v, *w;
1668{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001669 if (v->ob_type->tp_as_number != NULL) {
1670 object *x;
1671 if (coerce(&v, &w) != 0)
1672 return NULL;
1673 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1674 DECREF(v);
1675 DECREF(w);
1676 return x;
1677 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001678 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001679 return NULL;
1680}
1681
1682static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001683neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 object *v;
1685{
1686 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001687 return (*v->ob_type->tp_as_number->nb_negative)(v);
1688 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689 return NULL;
1690}
1691
1692static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694 object *v;
1695{
1696 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001697 return (*v->ob_type->tp_as_number->nb_positive)(v);
1698 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 return NULL;
1700}
1701
1702static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001703invert(v)
1704 object *v;
1705{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001706 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001707 if (v->ob_type->tp_as_number != NULL &&
1708 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1709 return (*f)(v);
1710 err_setstr(TypeError, "bad operand type(s) for unary ~");
1711 return NULL;
1712}
1713
1714static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001716 object *v;
1717{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001718 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001719 object *w;
1720 if (outcome < 0)
1721 return NULL;
1722 if (outcome == 0)
1723 w = True;
1724 else
1725 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001726 INCREF(w);
1727 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001729/* External interface to call any callable object. The arg may be NULL. */
1730
1731object *
1732call_object(func, arg)
1733 object *func;
1734 object *arg;
1735{
1736 if (is_instancemethodobject(func) || is_funcobject(func))
1737 return call_function(func, arg);
1738 else
1739 return call_builtin(func, arg);
1740}
1741
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001743call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001744 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001745 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747 if (is_methodobject(func)) {
1748 method meth = getmethod(func);
1749 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001750 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1751 int size = gettuplesize(arg);
1752 if (size == 1)
1753 arg = gettupleitem(arg, 0);
1754 else if (size == 0)
1755 arg = NULL;
1756 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001757 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 }
1759 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001760 if (arg != NULL &&
1761 !(is_tupleobject(arg) &&
1762 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001763 err_setstr(TypeError,
1764 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765 return NULL;
1766 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 return NULL;
1771}
1772
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001776 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001778 object *newarg = NULL;
1779 object *newlocals, *newglobals;
1780 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781
Guido van Rossume8122f11991-05-05 20:03:07 +00001782 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001783 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001784 object *self = instancemethodgetself(func);
1785 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001786 if (arg == NULL)
1787 argcount = 0;
1788 else if (is_tupleobject(arg))
1789 argcount = gettuplesize(arg);
1790 else
1791 argcount = 1;
1792 newarg = newtupleobject(argcount + 1);
1793 if (newarg == NULL)
1794 return NULL;
1795 INCREF(self);
1796 settupleitem(newarg, 0, self);
1797 if (arg != NULL && !is_tupleobject(arg)) {
1798 INCREF(arg);
1799 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001800 }
1801 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001802 int i;
1803 object *v;
1804 for (i = 0; i < argcount; i++) {
1805 v = gettupleitem(arg, i);
1806 XINCREF(v);
1807 settupleitem(newarg, i+1, v);
1808 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001810 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 }
1812 else {
1813 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001814 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 return NULL;
1816 }
1817 }
1818
Guido van Rossum3f5da241990-12-20 15:06:42 +00001819 co = getfunccode(func);
1820 if (co == NULL) {
1821 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 return NULL;
1823 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001824 if (!is_codeobject(co)) {
1825 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826 abort();
1827 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001828 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001830 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831 return NULL;
1832 }
1833
Guido van Rossum3f5da241990-12-20 15:06:42 +00001834 newglobals = getfuncglobals(func);
1835 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836
Guido van Rossum3f5da241990-12-20 15:06:42 +00001837 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838
Guido van Rossum3f5da241990-12-20 15:06:42 +00001839 DECREF(newlocals);
1840 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001841
Guido van Rossum3f5da241990-12-20 15:06:42 +00001842 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843
1844 return v;
1845}
1846
1847static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001848apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 object *v, *w;
1850{
1851 typeobject *tp = v->ob_type;
1852 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001853 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854 return NULL;
1855 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001856 if (tp->tp_as_mapping != NULL) {
1857 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1858 }
1859 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 int i;
1861 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001862 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 return NULL;
1864 }
1865 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001866 if (i < 0) {
1867 int len = (*tp->tp_as_sequence->sq_length)(v);
1868 if (len < 0)
1869 return NULL;
1870 i += len;
1871 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001872 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874}
1875
1876static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001877loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878 object *v, *w;
1879{
1880 sequence_methods *sq = v->ob_type->tp_as_sequence;
1881 int i, n;
1882 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001883 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 return NULL;
1885 }
1886 i = getintvalue(w);
1887 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00001888 if (n < 0)
1889 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 if (i >= n)
1891 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893}
1894
1895static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001896slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 object *v;
1898 int isize;
1899 int *pi;
1900{
1901 if (v != NULL) {
1902 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001903 err_setstr(TypeError, "slice index must be int");
1904 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905 }
1906 *pi = getintvalue(v);
1907 if (*pi < 0)
1908 *pi += isize;
1909 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001910 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911}
1912
1913static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001914apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 object *u, *v, *w;
1916{
1917 typeobject *tp = u->ob_type;
1918 int ilow, ihigh, isize;
1919 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 return NULL;
1922 }
1923 ilow = 0;
1924 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001925 if (isize < 0)
1926 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001927 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001929 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001931 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933
1934static int
1935assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 object *w;
1937 object *key;
1938 object *v;
1939{
1940 typeobject *tp = w->ob_type;
1941 sequence_methods *sq;
1942 mapping_methods *mp;
1943 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001944 if ((mp = tp->tp_as_mapping) != NULL &&
1945 (func = mp->mp_ass_subscript) != NULL) {
1946 return (*func)(w, key, v);
1947 }
1948 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 (func = sq->sq_ass_item) != NULL) {
1950 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001951 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001952 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001955 else {
1956 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001957 if (i < 0) {
1958 int len = (*sq->sq_length)(w);
1959 if (len < 0)
1960 return -1;
1961 i += len;
1962 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001963 return (*func)(w, i, v);
1964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001967 err_setstr(TypeError,
1968 "can't assign to this subscripted object");
1969 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971}
1972
Guido van Rossum3f5da241990-12-20 15:06:42 +00001973static int
1974assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 object *u, *v, *w, *x;
1976{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001979 if (sq == NULL) {
1980 err_setstr(TypeError, "assign to slice of non-sequence");
1981 return -1;
1982 }
1983 if (sq == NULL || sq->sq_ass_slice == NULL) {
1984 err_setstr(TypeError, "unassignable slice");
1985 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 }
1987 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001989 if (isize < 0)
1990 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001991 if (slice_index(v, isize, &ilow) != 0)
1992 return -1;
1993 if (slice_index(w, isize, &ihigh) != 0)
1994 return -1;
1995 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996}
1997
1998static int
1999cmp_exception(err, v)
2000 object *err, *v;
2001{
2002 if (is_tupleobject(v)) {
2003 int i, n;
2004 n = gettuplesize(v);
2005 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002006 /* Test recursively */
2007 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002008 return 1;
2009 }
2010 return 0;
2011 }
2012 return err == v;
2013}
2014
Guido van Rossum3f5da241990-12-20 15:06:42 +00002015static int
2016cmp_member(v, w)
2017 object *v, *w;
2018{
2019 int i, n, cmp;
2020 object *x;
2021 sequence_methods *sq;
2022 /* Special case for char in string */
2023 if (is_stringobject(w)) {
2024 register char *s, *end;
2025 register char c;
2026 if (!is_stringobject(v) || getstringsize(v) != 1) {
2027 err_setstr(TypeError,
2028 "string member test needs char left operand");
2029 return -1;
2030 }
2031 c = getstringvalue(v)[0];
2032 s = getstringvalue(w);
2033 end = s + getstringsize(w);
2034 while (s < end) {
2035 if (c == *s++)
2036 return 1;
2037 }
2038 return 0;
2039 }
2040 sq = w->ob_type->tp_as_sequence;
2041 if (sq == NULL) {
2042 err_setstr(TypeError,
2043 "'in' or 'not in' needs sequence right argument");
2044 return -1;
2045 }
2046 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002047 if (n < 0)
2048 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002049 for (i = 0; i < n; i++) {
2050 x = (*sq->sq_item)(w, i);
2051 cmp = cmpobject(v, x);
2052 XDECREF(x);
2053 if (cmp == 0)
2054 return 1;
2055 }
2056 return 0;
2057}
2058
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002060cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002061 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 register object *v;
2063 register object *w;
2064{
2065 register int cmp;
2066 register int res = 0;
2067 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002068 case IS:
2069 case IS_NOT:
2070 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002071 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002072 res = !res;
2073 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 case IN:
2075 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076 res = cmp_member(v, w);
2077 if (res < 0)
2078 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002079 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 break;
2082 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 break;
2085 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086 cmp = cmpobject(v, w);
2087 switch (op) {
2088 case LT: res = cmp < 0; break;
2089 case LE: res = cmp <= 0; break;
2090 case EQ: res = cmp == 0; break;
2091 case NE: res = cmp != 0; break;
2092 case GT: res = cmp > 0; break;
2093 case GE: res = cmp >= 0; break;
2094 /* XXX no default? (res is initialized to 0 though) */
2095 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 }
2097 v = res ? True : False;
2098 INCREF(v);
2099 return v;
2100}
2101
Guido van Rossum3f5da241990-12-20 15:06:42 +00002102static int
2103import_from(locals, v, name)
2104 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002105 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002106 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002107{
2108 object *w, *x;
2109 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002110 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002111 int i;
2112 int n = getdictsize(w);
2113 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002114 name = getdict2key(w, i);
2115 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002116 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002117 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002118 if (x == NULL) {
2119 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002120 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002121 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002122 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002123 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002125 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002126 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002127 }
2128 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002129 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002130 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002131 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002132 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002133 getstringvalue(name));
2134 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002135 return -1;
2136 }
2137 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002138 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002139 }
2140}
2141
2142static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002143build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002144 object *v; /* None or tuple containing base classes */
2145 object *w; /* dictionary */
2146{
2147 if (is_tupleobject(v)) {
2148 int i;
2149 for (i = gettuplesize(v); --i >= 0; ) {
2150 object *x = gettupleitem(v, i);
2151 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002152 err_setstr(TypeError,
2153 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002154 return NULL;
2155 }
2156 }
2157 }
2158 else {
2159 v = NULL;
2160 }
2161 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002162 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002163 return NULL;
2164 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002165 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002166}