blob: d3a732a62ee880172173df3cf572484027d11e73 [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,...)
793 */
794 {
795 int n;
796 if (EMPTY()) {
797 err_setstr(TypeError,
798 "no argument list");
799 why = WHY_EXCEPTION;
800 break;
801 }
802 v = POP();
803 if (!is_tupleobject(v)) {
804 err_setstr(TypeError,
805 "bad argument list");
806 why = WHY_EXCEPTION;
807 break;
808 }
809 n = gettuplesize(v);
810 if (n == 1 && oparg != 1) {
811 /* Rule (a) */
812 w = gettupleitem(v, 0);
813 if (is_tupleobject(w)) {
814 INCREF(w);
815 DECREF(v);
816 v = w;
817 n = gettuplesize(v);
818 }
819 }
820 else if (n != 1 && oparg == 1) {
821 /* Rule (b) */
822 PUSH(v);
823 break;
824 /* Don't fall through */
825 }
826 else if (n > 2 && oparg == 2) {
827 /* Rule (c) */
828 int i;
829 w = newtupleobject(n-1);
830 u = newtupleobject(2);
831 if (u == NULL || w == NULL) {
832 XDECREF(w);
833 XDECREF(u);
834 DECREF(v);
835 why = WHY_EXCEPTION;
836 break;
837 }
838 t = gettupleitem(v, 0);
839 INCREF(t);
840 settupleitem(u, 0, t);
841 for (i = 1; i < n; i++) {
842 t = gettupleitem(v, i);
843 INCREF(t);
844 settupleitem(w, i-1, t);
845 }
846 settupleitem(u, 1, w);
847 DECREF(v);
848 v = u;
849 n = 2;
850 }
851 if (n != oparg) {
852 err_setstr(TypeError,
853 "arg count mismatch");
854 why = WHY_EXCEPTION;
855 DECREF(v);
856 break;
857 }
858 PUSH(v);
859 }
860 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 case UNPACK_TUPLE:
862 v = POP();
863 if (!is_tupleobject(v)) {
864 err_setstr(TypeError, "unpack non-tuple");
865 why = WHY_EXCEPTION;
866 }
867 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000868 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 "unpack tuple of wrong size");
870 why = WHY_EXCEPTION;
871 }
872 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000873 if (!CHECK_STACK(oparg)) {
874 x = NULL;
875 break;
876 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 for (; --oparg >= 0; ) {
878 w = gettupleitem(v, oparg);
879 INCREF(w);
880 PUSH(w);
881 }
882 }
883 DECREF(v);
884 break;
885
886 case UNPACK_LIST:
887 v = POP();
888 if (!is_listobject(v)) {
889 err_setstr(TypeError, "unpack non-list");
890 why = WHY_EXCEPTION;
891 }
892 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000893 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 "unpack list of wrong size");
895 why = WHY_EXCEPTION;
896 }
897 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000898 if (!CHECK_STACK(oparg)) {
899 x = NULL;
900 break;
901 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 for (; --oparg >= 0; ) {
903 w = getlistitem(v, oparg);
904 INCREF(w);
905 PUSH(w);
906 }
907 }
908 DECREF(v);
909 break;
910
911 case STORE_ATTR:
912 name = GETNAME(oparg);
913 v = POP();
914 u = POP();
915 err = setattr(v, name, u); /* v.name = u */
916 DECREF(v);
917 DECREF(u);
918 break;
919
920 case DELETE_ATTR:
921 name = GETNAME(oparg);
922 v = POP();
923 err = setattr(v, name, (object *)NULL);
924 /* del v.name */
925 DECREF(v);
926 break;
927
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000928 case STORE_GLOBAL:
929 w = GETNAMEV(oparg);
930 v = POP();
931 err = dict2insert(f->f_globals, w, v);
932 DECREF(v);
933 break;
934
935 case DELETE_GLOBAL:
936 w = GETNAMEV(oparg);
937 if ((err = dict2remove(f->f_globals, w)) != 0)
938 err_setstr(NameError, getstringvalue(w));
939 break;
940
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 case LOAD_CONST:
942 x = GETCONST(oparg);
943 INCREF(x);
944 PUSH(x);
945 break;
946
947 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000948 w = GETNAMEV(oparg);
949 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000951 err_clear();
952 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000954 err_clear();
955 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000957 err_setstr(NameError,
958 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 break;
960 }
961 }
962 }
963 INCREF(x);
964 PUSH(x);
965 break;
966
967 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000968 w = GETNAMEV(oparg);
969 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000971 err_clear();
972 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000974 err_setstr(NameError,
975 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 break;
977 }
978 }
979 INCREF(x);
980 PUSH(x);
981 break;
982
983 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000984 w = GETNAMEV(oparg);
985 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000987 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 break;
989 }
990 INCREF(x);
991 PUSH(x);
992 break;
993
994 case BUILD_TUPLE:
995 x = newtupleobject(oparg);
996 if (x != NULL) {
997 for (; --oparg >= 0;) {
998 w = POP();
999 err = settupleitem(x, oparg, w);
1000 if (err != 0)
1001 break;
1002 }
1003 PUSH(x);
1004 }
1005 break;
1006
1007 case BUILD_LIST:
1008 x = newlistobject(oparg);
1009 if (x != NULL) {
1010 for (; --oparg >= 0;) {
1011 w = POP();
1012 err = setlistitem(x, oparg, w);
1013 if (err != 0)
1014 break;
1015 }
1016 PUSH(x);
1017 }
1018 break;
1019
1020 case BUILD_MAP:
1021 x = newdictobject();
1022 PUSH(x);
1023 break;
1024
1025 case LOAD_ATTR:
1026 name = GETNAME(oparg);
1027 v = POP();
1028 x = getattr(v, name);
1029 DECREF(v);
1030 PUSH(x);
1031 break;
1032
1033 case COMPARE_OP:
1034 w = POP();
1035 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001036 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 DECREF(v);
1038 DECREF(w);
1039 PUSH(x);
1040 break;
1041
1042 case IMPORT_NAME:
1043 name = GETNAME(oparg);
1044 x = import_module(name);
1045 XINCREF(x);
1046 PUSH(x);
1047 break;
1048
1049 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001050 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001052 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 break;
1054
1055 case JUMP_FORWARD:
1056 JUMPBY(oparg);
1057 break;
1058
1059 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001060 err = testbool(TOP());
1061 if (err > 0)
1062 err = 0;
1063 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 JUMPBY(oparg);
1065 break;
1066
1067 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001068 err = testbool(TOP());
1069 if (err > 0) {
1070 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 break;
1074
1075 case JUMP_ABSOLUTE:
1076 JUMPTO(oparg);
1077 break;
1078
1079 case FOR_LOOP:
1080 /* for v in s: ...
1081 On entry: stack contains s, i.
1082 On exit: stack contains s, i+1, s[i];
1083 but if loop exhausted:
1084 s, i are popped, and we jump */
1085 w = POP(); /* Loop index */
1086 v = POP(); /* Sequence object */
1087 u = loop_subscript(v, w);
1088 if (u != NULL) {
1089 PUSH(v);
1090 x = newintobject(getintvalue(w)+1);
1091 PUSH(x);
1092 DECREF(w);
1093 PUSH(u);
1094 }
1095 else {
1096 DECREF(v);
1097 DECREF(w);
1098 /* A NULL can mean "s exhausted"
1099 but also an error: */
1100 if (err_occurred())
1101 why = WHY_EXCEPTION;
1102 else
1103 JUMPBY(oparg);
1104 }
1105 break;
1106
1107 case SETUP_LOOP:
1108 case SETUP_EXCEPT:
1109 case SETUP_FINALLY:
1110 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1111 STACK_LEVEL());
1112 break;
1113
1114 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001115#ifdef LLTRACE
1116 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 printf("--- Line %d ---\n", oparg);
1118#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001119 f->f_lineno = oparg;
1120 if (trace != NULL) {
1121 /* Trace each line of code reached */
1122 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001123 err = call_trace(&trace, &trace,
1124 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001125 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 break;
1127
1128 default:
1129 fprintf(stderr,
1130 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001131 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 err_setstr(SystemError, "eval_code: unknown opcode");
1133 why = WHY_EXCEPTION;
1134 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001135
1136#ifdef CASE_TOO_BIG
1137 }
1138#endif
1139
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 } /* switch */
1141
1142 on_error:
1143
1144 /* Quickly continue if no error occurred */
1145
1146 if (why == WHY_NOT) {
1147 if (err == 0 && x != NULL)
1148 continue; /* Normal, fast path */
1149 why = WHY_EXCEPTION;
1150 x = None;
1151 err = 0;
1152 }
1153
Guido van Rossum801dcae1992-04-08 11:32:32 +00001154#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 /* Double-check exception status */
1156
1157 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1158 if (!err_occurred()) {
1159 fprintf(stderr, "XXX ghost error\n");
1160 err_setstr(SystemError, "ghost error");
1161 why = WHY_EXCEPTION;
1162 }
1163 }
1164 else {
1165 if (err_occurred()) {
1166 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001167 abort();
1168 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 why = WHY_EXCEPTION;
1170 }
1171 }
1172#endif
1173
1174 /* Log traceback info if this is a real exception */
1175
1176 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001177 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001179 f->f_lasti -= 2;
1180 tb_here(f);
1181
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001182 if (trace)
1183 call_exc_trace(&trace, &trace, f);
1184 if (sys_profile)
1185 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 }
1187
1188 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1189
1190 if (why == WHY_RERAISE)
1191 why = WHY_EXCEPTION;
1192
1193 /* Unwind stacks if a (pseudo) exception occurred */
1194
1195 while (why != WHY_NOT && f->f_iblock > 0) {
1196 block *b = pop_block(f);
1197 while (STACK_LEVEL() > b->b_level) {
1198 v = POP();
1199 XDECREF(v);
1200 }
1201 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1202 why = WHY_NOT;
1203 JUMPTO(b->b_handler);
1204 break;
1205 }
1206 if (b->b_type == SETUP_FINALLY ||
1207 b->b_type == SETUP_EXCEPT &&
1208 why == WHY_EXCEPTION) {
1209 if (why == WHY_EXCEPTION) {
1210 object *exc, *val;
1211 err_get(&exc, &val);
1212 if (val == NULL) {
1213 val = None;
1214 INCREF(val);
1215 }
1216 v = tb_fetch();
1217 /* Make the raw exception data
1218 available to the handler,
1219 so a program can emulate the
1220 Python main loop. Don't do
1221 this for 'finally'. */
1222 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 sysset("exc_value", val);
1225 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 }
1227 PUSH(v);
1228 PUSH(val);
1229 PUSH(exc);
1230 }
1231 else {
1232 if (why == WHY_RETURN)
1233 PUSH(retval);
1234 v = newintobject((long)why);
1235 PUSH(v);
1236 }
1237 why = WHY_NOT;
1238 JUMPTO(b->b_handler);
1239 break;
1240 }
1241 } /* unwind stack */
1242
1243 /* End the loop if we still have an error (or return) */
1244
1245 if (why != WHY_NOT)
1246 break;
1247
1248 } /* main loop */
1249
1250 /* Pop remaining stack entries */
1251
1252 while (!EMPTY()) {
1253 v = POP();
1254 XDECREF(v);
1255 }
1256
Guido van Rossum96a42c81992-01-12 02:29:51 +00001257 if (why != WHY_RETURN)
1258 retval = NULL;
1259
1260 if (trace) {
1261 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001262 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001263 XDECREF(retval);
1264 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001265 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001266 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001267 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001268 XDECREF(trace);
1269 }
1270
1271 if (sys_profile && why == WHY_RETURN) {
1272 if (call_trace(&sys_profile, (object**)0,
1273 f, "return", retval)) {
1274 XDECREF(retval);
1275 retval = NULL;
1276 why = WHY_EXCEPTION;
1277 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001278 }
1279
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 /* Restore previous frame and release the current one */
1281
1282 current_frame = f->f_back;
1283 DECREF(f);
1284
Guido van Rossum96a42c81992-01-12 02:29:51 +00001285 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001286}
1287
Guido van Rossum96a42c81992-01-12 02:29:51 +00001288#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001289static int
1290prtrace(v, str)
1291 object *v;
1292 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001294 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001295 if (printobject(v, stdout, 0) != 0)
1296 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001297 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001298}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001299#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001301static void
1302call_exc_trace(p_trace, p_newtrace, f)
1303 object **p_trace, **p_newtrace;
1304 frameobject *f;
1305{
1306 object *type, *value, *traceback, *arg;
1307 int err;
1308 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001309 if (value == NULL) {
1310 value = None;
1311 INCREF(value);
1312 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001313 traceback = tb_fetch();
1314 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001315 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001316 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001317 settupleitem(arg, 0, type);
1318 settupleitem(arg, 1, value);
1319 settupleitem(arg, 2, traceback);
1320 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001321 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001322 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001323 /* Restore original exception */
1324 err_setval(type, value);
1325 tb_store(traceback);
1326 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001327 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001328}
1329
1330static int
1331call_trace(p_trace, p_newtrace, f, msg, arg)
1332 object **p_trace; /* in/out; may not be NULL;
1333 may not point to NULL variable initially */
1334 object **p_newtrace; /* in/out; may be NULL;
1335 may point to NULL variable;
1336 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001337 frameobject *f;
1338 char *msg;
1339 object *arg;
1340{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001341 object *arglist, *what;
1342 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001343 static int tracing = 0;
1344
1345 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001346 /* Don't do recursive traces */
1347 if (p_newtrace) {
1348 XDECREF(*p_newtrace);
1349 *p_newtrace = NULL;
1350 }
1351 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001352 }
1353
1354 arglist = newtupleobject(3);
1355 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001356 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001357 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001358 if (what == NULL)
1359 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001360 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001361 settupleitem(arglist, 0, (object *)f);
1362 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001363 if (arg == NULL)
1364 arg = None;
1365 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001366 settupleitem(arglist, 2, arg);
1367 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001368 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001369 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001370 cleanup:
1371 XDECREF(arglist);
1372 if (res == NULL) {
1373 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001374 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001375 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001376 *p_trace = NULL;
1377 if (p_newtrace) {
1378 XDECREF(*p_newtrace);
1379 *p_newtrace = NULL;
1380 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001381 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001382 }
1383 else {
1384 if (p_newtrace) {
1385 XDECREF(*p_newtrace);
1386 if (res == None)
1387 *p_newtrace = NULL;
1388 else {
1389 INCREF(res);
1390 *p_newtrace = res;
1391 }
1392 }
1393 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001394 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001395 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001396}
1397
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398object *
1399getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001400{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001403 else
1404 return current_frame->f_locals;
1405}
1406
1407object *
1408getglobals()
1409{
1410 if (current_frame == NULL)
1411 return NULL;
1412 else
1413 return current_frame->f_globals;
1414}
1415
1416void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001417printtraceback(f)
1418 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001419{
1420 object *v = tb_fetch();
1421 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001422 writestring("Stack backtrace (innermost last):\n", f);
1423 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001424 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426}
1427
1428
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429void
1430flushline()
1431{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001432 object *f = sysget("stdout");
1433 if (softspace(f, 0))
1434 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435}
1436
Guido van Rossum3f5da241990-12-20 15:06:42 +00001437
Guido van Rossum04691fc1992-08-12 15:35:34 +00001438/* Test a value used as condition, e.g., in a for or if statement.
1439 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440
1441static int
1442testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 object *v;
1444{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001445 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001446 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001447 res = 0;
1448 else if (v->ob_type->tp_as_number != NULL)
1449 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1450 else if (v->ob_type->tp_as_mapping != NULL)
1451 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1452 else if (v->ob_type->tp_as_sequence != NULL)
1453 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1454 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001455 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001456 if (res > 0)
1457 res = 1;
1458 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459}
1460
1461static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001462or(v, w)
1463 object *v, *w;
1464{
1465 if (v->ob_type->tp_as_number != NULL) {
1466 object *x;
1467 object * (*f) FPROTO((object *, object *));
1468 if (coerce(&v, &w) != 0)
1469 return NULL;
1470 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1471 x = (*f)(v, w);
1472 DECREF(v);
1473 DECREF(w);
1474 if (f != NULL)
1475 return x;
1476 }
1477 err_setstr(TypeError, "bad operand type(s) for |");
1478 return NULL;
1479}
1480
1481static object *
1482xor(v, w)
1483 object *v, *w;
1484{
1485 if (v->ob_type->tp_as_number != NULL) {
1486 object *x;
1487 object * (*f) FPROTO((object *, object *));
1488 if (coerce(&v, &w) != 0)
1489 return NULL;
1490 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1491 x = (*f)(v, w);
1492 DECREF(v);
1493 DECREF(w);
1494 if (f != NULL)
1495 return x;
1496 }
1497 err_setstr(TypeError, "bad operand type(s) for ^");
1498 return NULL;
1499}
1500
1501static object *
1502and(v, w)
1503 object *v, *w;
1504{
1505 if (v->ob_type->tp_as_number != NULL) {
1506 object *x;
1507 object * (*f) FPROTO((object *, object *));
1508 if (coerce(&v, &w) != 0)
1509 return NULL;
1510 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1511 x = (*f)(v, w);
1512 DECREF(v);
1513 DECREF(w);
1514 if (f != NULL)
1515 return x;
1516 }
1517 err_setstr(TypeError, "bad operand type(s) for &");
1518 return NULL;
1519}
1520
1521static object *
1522lshift(v, w)
1523 object *v, *w;
1524{
1525 if (v->ob_type->tp_as_number != NULL) {
1526 object *x;
1527 object * (*f) FPROTO((object *, object *));
1528 if (coerce(&v, &w) != 0)
1529 return NULL;
1530 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1531 x = (*f)(v, w);
1532 DECREF(v);
1533 DECREF(w);
1534 if (f != NULL)
1535 return x;
1536 }
1537 err_setstr(TypeError, "bad operand type(s) for <<");
1538 return NULL;
1539}
1540
1541static object *
1542rshift(v, w)
1543 object *v, *w;
1544{
1545 if (v->ob_type->tp_as_number != NULL) {
1546 object *x;
1547 object * (*f) FPROTO((object *, object *));
1548 if (coerce(&v, &w) != 0)
1549 return NULL;
1550 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1551 x = (*f)(v, w);
1552 DECREF(v);
1553 DECREF(w);
1554 if (f != NULL)
1555 return x;
1556 }
1557 err_setstr(TypeError, "bad operand type(s) for >>");
1558 return NULL;
1559}
1560
1561static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001562add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563 object *v, *w;
1564{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001565 if (v->ob_type->tp_as_sequence != NULL)
1566 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1567 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001568 object *x;
1569 if (coerce(&v, &w) != 0)
1570 return NULL;
1571 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1572 DECREF(v);
1573 DECREF(w);
1574 return x;
1575 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001577 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 return NULL;
1579 }
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 Rossum3f5da241990-12-20 15:06:42 +00001674 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675 return NULL;
1676}
1677
1678static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001679neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 object *v;
1681{
1682 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001683 return (*v->ob_type->tp_as_number->nb_negative)(v);
1684 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 return NULL;
1686}
1687
1688static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001689pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690 object *v;
1691{
1692 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693 return (*v->ob_type->tp_as_number->nb_positive)(v);
1694 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 return NULL;
1696}
1697
1698static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001699invert(v)
1700 object *v;
1701{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001702 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001703 if (v->ob_type->tp_as_number != NULL &&
1704 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1705 return (*f)(v);
1706 err_setstr(TypeError, "bad operand type(s) for unary ~");
1707 return NULL;
1708}
1709
1710static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712 object *v;
1713{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001714 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001715 object *w;
1716 if (outcome < 0)
1717 return NULL;
1718 if (outcome == 0)
1719 w = True;
1720 else
1721 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001722 INCREF(w);
1723 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001725/* External interface to call any callable object. The arg may be NULL. */
1726
1727object *
1728call_object(func, arg)
1729 object *func;
1730 object *arg;
1731{
1732 if (is_instancemethodobject(func) || is_funcobject(func))
1733 return call_function(func, arg);
1734 else
1735 return call_builtin(func, arg);
1736}
1737
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001741 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743 if (is_methodobject(func)) {
1744 method meth = getmethod(func);
1745 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001746 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1747 int size = gettuplesize(arg);
1748 if (size == 1)
1749 arg = gettupleitem(arg, 0);
1750 else if (size == 0)
1751 arg = NULL;
1752 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001753 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001754 }
1755 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001756 if (arg != NULL &&
1757 !(is_tupleobject(arg) &&
1758 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759 err_setstr(TypeError,
1760 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001761 return NULL;
1762 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001765 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766 return NULL;
1767}
1768
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001770call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001772 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001773{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774 object *newarg = NULL;
1775 object *newlocals, *newglobals;
1776 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777
Guido van Rossume8122f11991-05-05 20:03:07 +00001778 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001779 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001780 object *self = instancemethodgetself(func);
1781 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001782 if (arg == NULL)
1783 argcount = 0;
1784 else if (is_tupleobject(arg))
1785 argcount = gettuplesize(arg);
1786 else
1787 argcount = 1;
1788 newarg = newtupleobject(argcount + 1);
1789 if (newarg == NULL)
1790 return NULL;
1791 INCREF(self);
1792 settupleitem(newarg, 0, self);
1793 if (arg != NULL && !is_tupleobject(arg)) {
1794 INCREF(arg);
1795 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 }
1797 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001798 int i;
1799 object *v;
1800 for (i = 0; i < argcount; i++) {
1801 v = gettupleitem(arg, i);
1802 XINCREF(v);
1803 settupleitem(newarg, i+1, v);
1804 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001806 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 }
1808 else {
1809 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001810 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811 return NULL;
1812 }
1813 }
1814
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815 co = getfunccode(func);
1816 if (co == NULL) {
1817 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 return NULL;
1819 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001820 if (!is_codeobject(co)) {
1821 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 abort();
1823 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001824 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001826 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 return NULL;
1828 }
1829
Guido van Rossum3f5da241990-12-20 15:06:42 +00001830 newglobals = getfuncglobals(func);
1831 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832
Guido van Rossum3f5da241990-12-20 15:06:42 +00001833 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834
Guido van Rossum3f5da241990-12-20 15:06:42 +00001835 DECREF(newlocals);
1836 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001837
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839
1840 return v;
1841}
1842
1843static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001844apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 object *v, *w;
1846{
1847 typeobject *tp = v->ob_type;
1848 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 return NULL;
1851 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001852 if (tp->tp_as_mapping != NULL) {
1853 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1854 }
1855 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 int i;
1857 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001858 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859 return NULL;
1860 }
1861 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001862 if (i < 0) {
1863 int len = (*tp->tp_as_sequence->sq_length)(v);
1864 if (len < 0)
1865 return NULL;
1866 i += len;
1867 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001868 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870}
1871
1872static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001873loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 object *v, *w;
1875{
1876 sequence_methods *sq = v->ob_type->tp_as_sequence;
1877 int i, n;
1878 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001879 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001880 return NULL;
1881 }
1882 i = getintvalue(w);
1883 n = (*sq->sq_length)(v);
1884 if (i >= n)
1885 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001886 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887}
1888
1889static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001890slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891 object *v;
1892 int isize;
1893 int *pi;
1894{
1895 if (v != NULL) {
1896 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001897 err_setstr(TypeError, "slice index must be int");
1898 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 }
1900 *pi = getintvalue(v);
1901 if (*pi < 0)
1902 *pi += isize;
1903 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001904 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001905}
1906
1907static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001908apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001909 object *u, *v, *w;
1910{
1911 typeobject *tp = u->ob_type;
1912 int ilow, ihigh, isize;
1913 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001914 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 return NULL;
1916 }
1917 ilow = 0;
1918 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001919 if (isize < 0)
1920 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001921 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001923 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001927
1928static int
1929assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 object *w;
1931 object *key;
1932 object *v;
1933{
1934 typeobject *tp = w->ob_type;
1935 sequence_methods *sq;
1936 mapping_methods *mp;
1937 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001938 if ((mp = tp->tp_as_mapping) != NULL &&
1939 (func = mp->mp_ass_subscript) != NULL) {
1940 return (*func)(w, key, v);
1941 }
1942 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 (func = sq->sq_ass_item) != NULL) {
1944 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001945 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001946 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001947 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001949 else {
1950 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001951 if (i < 0) {
1952 int len = (*sq->sq_length)(w);
1953 if (len < 0)
1954 return -1;
1955 i += len;
1956 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001957 return (*func)(w, i, v);
1958 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 err_setstr(TypeError,
1962 "can't assign to this subscripted object");
1963 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965}
1966
Guido van Rossum3f5da241990-12-20 15:06:42 +00001967static int
1968assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 object *u, *v, *w, *x;
1970{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001971 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001973 if (sq == NULL) {
1974 err_setstr(TypeError, "assign to slice of non-sequence");
1975 return -1;
1976 }
1977 if (sq == NULL || sq->sq_ass_slice == NULL) {
1978 err_setstr(TypeError, "unassignable slice");
1979 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 }
1981 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001983 if (isize < 0)
1984 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985 if (slice_index(v, isize, &ilow) != 0)
1986 return -1;
1987 if (slice_index(w, isize, &ihigh) != 0)
1988 return -1;
1989 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990}
1991
1992static int
1993cmp_exception(err, v)
1994 object *err, *v;
1995{
1996 if (is_tupleobject(v)) {
1997 int i, n;
1998 n = gettuplesize(v);
1999 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002000 /* Test recursively */
2001 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 return 1;
2003 }
2004 return 0;
2005 }
2006 return err == v;
2007}
2008
Guido van Rossum3f5da241990-12-20 15:06:42 +00002009static int
2010cmp_member(v, w)
2011 object *v, *w;
2012{
2013 int i, n, cmp;
2014 object *x;
2015 sequence_methods *sq;
2016 /* Special case for char in string */
2017 if (is_stringobject(w)) {
2018 register char *s, *end;
2019 register char c;
2020 if (!is_stringobject(v) || getstringsize(v) != 1) {
2021 err_setstr(TypeError,
2022 "string member test needs char left operand");
2023 return -1;
2024 }
2025 c = getstringvalue(v)[0];
2026 s = getstringvalue(w);
2027 end = s + getstringsize(w);
2028 while (s < end) {
2029 if (c == *s++)
2030 return 1;
2031 }
2032 return 0;
2033 }
2034 sq = w->ob_type->tp_as_sequence;
2035 if (sq == NULL) {
2036 err_setstr(TypeError,
2037 "'in' or 'not in' needs sequence right argument");
2038 return -1;
2039 }
2040 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002041 if (n < 0)
2042 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002043 for (i = 0; i < n; i++) {
2044 x = (*sq->sq_item)(w, i);
2045 cmp = cmpobject(v, x);
2046 XDECREF(x);
2047 if (cmp == 0)
2048 return 1;
2049 }
2050 return 0;
2051}
2052
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002054cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002055 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 register object *v;
2057 register object *w;
2058{
2059 register int cmp;
2060 register int res = 0;
2061 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002062 case IS:
2063 case IS_NOT:
2064 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002065 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 res = !res;
2067 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068 case IN:
2069 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002070 res = cmp_member(v, w);
2071 if (res < 0)
2072 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002073 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002074 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 break;
2076 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 break;
2079 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002080 cmp = cmpobject(v, w);
2081 switch (op) {
2082 case LT: res = cmp < 0; break;
2083 case LE: res = cmp <= 0; break;
2084 case EQ: res = cmp == 0; break;
2085 case NE: res = cmp != 0; break;
2086 case GT: res = cmp > 0; break;
2087 case GE: res = cmp >= 0; break;
2088 /* XXX no default? (res is initialized to 0 though) */
2089 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 }
2091 v = res ? True : False;
2092 INCREF(v);
2093 return v;
2094}
2095
Guido van Rossum3f5da241990-12-20 15:06:42 +00002096static int
2097import_from(locals, v, name)
2098 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002099 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002100 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002101{
2102 object *w, *x;
2103 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002104 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002105 int i;
2106 int n = getdictsize(w);
2107 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002108 name = getdict2key(w, i);
2109 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002110 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002111 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002112 if (x == NULL) {
2113 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002114 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002115 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002116 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002117 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002118 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002119 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002120 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002121 }
2122 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002123 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002125 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002126 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002127 getstringvalue(name));
2128 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129 return -1;
2130 }
2131 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002132 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002133 }
2134}
2135
2136static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002137build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002138 object *v; /* None or tuple containing base classes */
2139 object *w; /* dictionary */
2140{
2141 if (is_tupleobject(v)) {
2142 int i;
2143 for (i = gettuplesize(v); --i >= 0; ) {
2144 object *x = gettupleitem(v, i);
2145 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002146 err_setstr(TypeError,
2147 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002148 return NULL;
2149 }
2150 }
2151 }
2152 else {
2153 v = NULL;
2154 }
2155 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002156 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002157 return NULL;
2158 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002159 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002160}