blob: 5b72d8eeb7e917dd0d7c7915011ed43b9ed0296e [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 */
179 FILE *fp; /* Used by print operations */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000180#ifdef LLTRACE
181 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000182#endif
183
184/* Code access macros */
185
186#define GETCONST(i) Getconst(f, i)
187#define GETNAME(i) Getname(f, i)
188#define GETNAMEV(i) Getnamev(f, i)
189#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
190#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
191#define NEXTOP() (*next_instr++)
192#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
193#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
194#define JUMPBY(x) (next_instr += (x))
195
196/* Stack manipulation macros */
197
198#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
199#define EMPTY() (STACK_LEVEL() == 0)
200#define TOP() (stack_pointer[-1])
201#define BASIC_PUSH(v) (*stack_pointer++ = (v))
202#define BASIC_POP() (*--stack_pointer)
203
Guido van Rossum96a42c81992-01-12 02:29:51 +0000204#ifdef LLTRACE
205#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
206#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000207#else
208#define PUSH(v) BASIC_PUSH(v)
209#define POP() BASIC_POP()
210#endif
211
212 f = newframeobject(
213 current_frame, /*back*/
214 co, /*code*/
215 globals, /*globals*/
216 locals, /*locals*/
217 50, /*nvalues*/
218 20); /*nblocks*/
219 if (f == NULL)
220 return NULL;
221
222 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000223
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000224 if (sys_trace != NULL) {
225 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000226 be called on *every* entry to a code block.
227 Its return value, if not None, is a function that
228 will be called at the start of each executed line
229 of code. (Actually, the function must return
230 itself in order to continue tracing.)
231 The trace functions are called with three arguments:
232 a pointer to the current frame, a string indicating
233 why the function is called, and an argument which
234 depends on the situation. The global trace function
235 (sys.trace) is also called whenever an exception
236 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000237 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000238 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000239 current_frame = f->f_back;
240 DECREF(f);
241 return NULL;
242 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000243 }
244
245 if (sys_profile != NULL) {
246 /* Similar for sys_profile, except it needn't return
247 itself and isn't called for "line" events */
248 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
249 current_frame = f->f_back;
250 DECREF(f);
251 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000252 }
253 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000254
255 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000256 stack_pointer = f->f_valuestack;
257
258 if (arg != NULL) {
259 INCREF(arg);
260 PUSH(arg);
261 }
262
263 why = WHY_NOT;
264 err = 0;
265 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000266
267 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000268 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000269
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000270 /* Do periodic things.
271 Doing this every time through the loop would add
272 too much overhead (a function call per instruction).
273 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000274
275 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000276 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000277 if (intrcheck()) {
278 err_set(KeyboardInterrupt);
279 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000280 goto on_error;
281 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000282
283#ifdef USE_THREAD
284 if (interpreter_lock) {
285 /* Give another thread a chance */
286
287 current_frame = NULL;
288 release_lock(interpreter_lock);
289
290 /* Other threads may run now */
291
292 acquire_lock(interpreter_lock, 1);
293 current_frame = f;
294 }
295#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000296 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000297
Guido van Rossum374a9221991-04-04 10:40:29 +0000298 /* Extract opcode and argument */
299
300 opcode = NEXTOP();
301 if (HAS_ARG(opcode))
302 oparg = NEXTARG();
303
Guido van Rossum96a42c81992-01-12 02:29:51 +0000304#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000305 /* Instruction tracing */
306
Guido van Rossum96a42c81992-01-12 02:29:51 +0000307 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000308 if (HAS_ARG(opcode)) {
309 printf("%d: %d, %d\n",
310 (int) (INSTR_OFFSET() - 3),
311 opcode, oparg);
312 }
313 else {
314 printf("%d: %d\n",
315 (int) (INSTR_OFFSET() - 1), opcode);
316 }
317 }
318#endif
319
320 /* Main switch on opcode */
321
322 switch (opcode) {
323
324 /* BEWARE!
325 It is essential that any operation that fails sets either
326 x to NULL, err to nonzero, or why to anything but WHY_NOT,
327 and that no operation that succeeds does this! */
328
329 /* case STOP_CODE: this is an error! */
330
331 case POP_TOP:
332 v = POP();
333 DECREF(v);
334 break;
335
336 case ROT_TWO:
337 v = POP();
338 w = POP();
339 PUSH(v);
340 PUSH(w);
341 break;
342
343 case ROT_THREE:
344 v = POP();
345 w = POP();
346 x = POP();
347 PUSH(v);
348 PUSH(x);
349 PUSH(w);
350 break;
351
352 case DUP_TOP:
353 v = TOP();
354 INCREF(v);
355 PUSH(v);
356 break;
357
358 case UNARY_POSITIVE:
359 v = POP();
360 x = pos(v);
361 DECREF(v);
362 PUSH(x);
363 break;
364
365 case UNARY_NEGATIVE:
366 v = POP();
367 x = neg(v);
368 DECREF(v);
369 PUSH(x);
370 break;
371
372 case UNARY_NOT:
373 v = POP();
374 x = not(v);
375 DECREF(v);
376 PUSH(x);
377 break;
378
379 case UNARY_CONVERT:
380 v = POP();
381 x = reprobject(v);
382 DECREF(v);
383 PUSH(x);
384 break;
385
386 case UNARY_CALL:
387 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000388 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000389 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000390 DECREF(v);
391 PUSH(x);
392 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000393
394 case UNARY_INVERT:
395 v = POP();
396 x = invert(v);
397 DECREF(v);
398 PUSH(x);
399 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000400
401 case BINARY_MULTIPLY:
402 w = POP();
403 v = POP();
404 x = mul(v, w);
405 DECREF(v);
406 DECREF(w);
407 PUSH(x);
408 break;
409
410 case BINARY_DIVIDE:
411 w = POP();
412 v = POP();
413 x = divide(v, w);
414 DECREF(v);
415 DECREF(w);
416 PUSH(x);
417 break;
418
419 case BINARY_MODULO:
420 w = POP();
421 v = POP();
422 x = rem(v, w);
423 DECREF(v);
424 DECREF(w);
425 PUSH(x);
426 break;
427
428 case BINARY_ADD:
429 w = POP();
430 v = POP();
431 x = add(v, w);
432 DECREF(v);
433 DECREF(w);
434 PUSH(x);
435 break;
436
437 case BINARY_SUBTRACT:
438 w = POP();
439 v = POP();
440 x = sub(v, w);
441 DECREF(v);
442 DECREF(w);
443 PUSH(x);
444 break;
445
446 case BINARY_SUBSCR:
447 w = POP();
448 v = POP();
449 x = apply_subscript(v, w);
450 DECREF(v);
451 DECREF(w);
452 PUSH(x);
453 break;
454
455 case BINARY_CALL:
456 w = POP();
457 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000458 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000459 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000460 DECREF(v);
461 DECREF(w);
462 PUSH(x);
463 break;
464
Guido van Rossum7928cd71991-10-24 14:59:31 +0000465 case BINARY_LSHIFT:
466 w = POP();
467 v = POP();
468 x = lshift(v, w);
469 DECREF(v);
470 DECREF(w);
471 PUSH(x);
472 break;
473
474 case BINARY_RSHIFT:
475 w = POP();
476 v = POP();
477 x = rshift(v, w);
478 DECREF(v);
479 DECREF(w);
480 PUSH(x);
481 break;
482
483 case BINARY_AND:
484 w = POP();
485 v = POP();
486 x = and(v, w);
487 DECREF(v);
488 DECREF(w);
489 PUSH(x);
490 break;
491
492 case BINARY_XOR:
493 w = POP();
494 v = POP();
495 x = xor(v, w);
496 DECREF(v);
497 DECREF(w);
498 PUSH(x);
499 break;
500
501 case BINARY_OR:
502 w = POP();
503 v = POP();
504 x = or(v, w);
505 DECREF(v);
506 DECREF(w);
507 PUSH(x);
508 break;
509
Guido van Rossum374a9221991-04-04 10:40:29 +0000510 case SLICE+0:
511 case SLICE+1:
512 case SLICE+2:
513 case SLICE+3:
514 if ((opcode-SLICE) & 2)
515 w = POP();
516 else
517 w = NULL;
518 if ((opcode-SLICE) & 1)
519 v = POP();
520 else
521 v = NULL;
522 u = POP();
523 x = apply_slice(u, v, w);
524 DECREF(u);
525 XDECREF(v);
526 XDECREF(w);
527 PUSH(x);
528 break;
529
530 case STORE_SLICE+0:
531 case STORE_SLICE+1:
532 case STORE_SLICE+2:
533 case STORE_SLICE+3:
534 if ((opcode-STORE_SLICE) & 2)
535 w = POP();
536 else
537 w = NULL;
538 if ((opcode-STORE_SLICE) & 1)
539 v = POP();
540 else
541 v = NULL;
542 u = POP();
543 t = POP();
544 err = assign_slice(u, v, w, t); /* u[v:w] = t */
545 DECREF(t);
546 DECREF(u);
547 XDECREF(v);
548 XDECREF(w);
549 break;
550
551 case DELETE_SLICE+0:
552 case DELETE_SLICE+1:
553 case DELETE_SLICE+2:
554 case DELETE_SLICE+3:
555 if ((opcode-DELETE_SLICE) & 2)
556 w = POP();
557 else
558 w = NULL;
559 if ((opcode-DELETE_SLICE) & 1)
560 v = POP();
561 else
562 v = NULL;
563 u = POP();
564 err = assign_slice(u, v, w, (object *)NULL);
565 /* del u[v:w] */
566 DECREF(u);
567 XDECREF(v);
568 XDECREF(w);
569 break;
570
571 case STORE_SUBSCR:
572 w = POP();
573 v = POP();
574 u = POP();
575 /* v[w] = u */
576 err = assign_subscript(v, w, u);
577 DECREF(u);
578 DECREF(v);
579 DECREF(w);
580 break;
581
582 case DELETE_SUBSCR:
583 w = POP();
584 v = POP();
585 /* del v[w] */
586 err = assign_subscript(v, w, (object *)NULL);
587 DECREF(v);
588 DECREF(w);
589 break;
590
591 case PRINT_EXPR:
592 v = POP();
593 fp = sysgetfile("stdout", stdout);
594 /* Print value except if procedure result */
595 if (v != None) {
596 flushline();
597 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000598 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000599 flushline();
600 }
601 DECREF(v);
602 break;
603
604 case PRINT_ITEM:
605 v = POP();
606 fp = sysgetfile("stdout", stdout);
607 if (softspace(sysget("stdout"), 1))
608 fprintf(fp, " ");
609 if (is_stringobject(v)) {
610 char *s = getstringvalue(v);
611 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000612 fwrite(s, 1, len, fp);
Guido van Rossum299a7341992-03-04 16:39:08 +0000613 if (ferror(fp)) {
614 err_errno(IOError);
615 err = -1;
616 }
617 else if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 softspace(sysget("stdout"), 0);
619 }
620 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000621 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000622 }
623 DECREF(v);
624 break;
625
626 case PRINT_NEWLINE:
627 fp = sysgetfile("stdout", stdout);
628 fprintf(fp, "\n");
629 softspace(sysget("stdout"), 0);
630 break;
631
632 case BREAK_LOOP:
633 why = WHY_BREAK;
634 break;
635
636 case RAISE_EXCEPTION:
637 v = POP();
638 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000639 /* A tuple is equivalent to its first element here */
640 while (is_tupleobject(w)) {
641 u = w;
642 w = gettupleitem(u, 0);
643 DECREF(u);
644 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 if (!is_stringobject(w))
646 err_setstr(TypeError,
647 "exceptions must be strings");
648 else
649 err_setval(w, v);
650 DECREF(v);
651 DECREF(w);
652 why = WHY_EXCEPTION;
653 break;
654
655 case LOAD_LOCALS:
656 v = f->f_locals;
657 INCREF(v);
658 PUSH(v);
659 break;
660
661 case RETURN_VALUE:
662 retval = POP();
663 why = WHY_RETURN;
664 break;
665
Guido van Rossum374a9221991-04-04 10:40:29 +0000666 case BUILD_FUNCTION:
667 v = POP();
668 x = newfuncobject(v, f->f_globals);
669 DECREF(v);
670 PUSH(x);
671 break;
672
673 case POP_BLOCK:
674 {
675 block *b = pop_block(f);
676 while (STACK_LEVEL() > b->b_level) {
677 v = POP();
678 DECREF(v);
679 }
680 }
681 break;
682
683 case END_FINALLY:
684 v = POP();
685 if (is_intobject(v)) {
686 why = (enum why_code) getintvalue(v);
687 if (why == WHY_RETURN)
688 retval = POP();
689 }
690 else if (is_stringobject(v)) {
691 w = POP();
692 err_setval(v, w);
693 DECREF(w);
694 w = POP();
695 tb_store(w);
696 DECREF(w);
697 why = WHY_RERAISE;
698 }
699 else if (v != None) {
700 err_setstr(SystemError,
701 "'finally' pops bad exception");
702 why = WHY_EXCEPTION;
703 }
704 DECREF(v);
705 break;
706
707 case BUILD_CLASS:
708 w = POP();
709 v = POP();
710 x = build_class(v, w);
711 PUSH(x);
712 DECREF(v);
713 DECREF(w);
714 break;
715
716 case STORE_NAME:
717 w = GETNAMEV(oparg);
718 v = POP();
719 err = dict2insert(f->f_locals, w, v);
720 DECREF(v);
721 break;
722
723 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000724 w = GETNAMEV(oparg);
725 if ((err = dict2remove(f->f_locals, w)) != 0)
726 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000728
729#ifdef CASE_TOO_BIG
730 default: switch (opcode) {
731#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000732
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000733 case UNPACK_VARARG:
734 if (EMPTY()) {
735 err_setstr(TypeError,
736 "no argument list");
737 why = WHY_EXCEPTION;
738 break;
739 }
740 v = POP();
741 if (!is_tupleobject(v)) {
742 err_setstr(TypeError,
743 "bad argument list");
744 why = WHY_EXCEPTION;
745 }
746 else if (gettuplesize(v) < oparg) {
747 err_setstr(TypeError,
748 "not enough arguments");
749 why = WHY_EXCEPTION;
750 }
751 else if (oparg == 0) {
752 PUSH(v);
753 break;
754 }
755 else {
756 x = gettupleslice(v, oparg, gettuplesize(v));
757 if (x != NULL) {
758 PUSH(x);
759 for (; --oparg >= 0; ) {
760 w = gettupleitem(v, oparg);
761 INCREF(w);
762 PUSH(w);
763 }
764 }
765 }
766 DECREF(v);
767 break;
768
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000769 case UNPACK_ARG:
770 /* Implement various compatibility hacks:
771 (a) f(a,b,...) should accept f((1,2,...))
772 (b) f((a,b,...)) should accept f(1,2,...)
773 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
774 */
775 {
776 int n;
777 if (EMPTY()) {
778 err_setstr(TypeError,
779 "no argument list");
780 why = WHY_EXCEPTION;
781 break;
782 }
783 v = POP();
784 if (!is_tupleobject(v)) {
785 err_setstr(TypeError,
786 "bad argument list");
787 why = WHY_EXCEPTION;
788 break;
789 }
790 n = gettuplesize(v);
791 if (n == 1 && oparg != 1) {
792 /* Rule (a) */
793 w = gettupleitem(v, 0);
794 if (is_tupleobject(w)) {
795 INCREF(w);
796 DECREF(v);
797 v = w;
798 n = gettuplesize(v);
799 }
800 }
801 else if (n != 1 && oparg == 1) {
802 /* Rule (b) */
803 PUSH(v);
804 break;
805 /* Don't fall through */
806 }
807 else if (n > 2 && oparg == 2) {
808 /* Rule (c) */
809 int i;
810 w = newtupleobject(n-1);
811 u = newtupleobject(2);
812 if (u == NULL || w == NULL) {
813 XDECREF(w);
814 XDECREF(u);
815 DECREF(v);
816 why = WHY_EXCEPTION;
817 break;
818 }
819 t = gettupleitem(v, 0);
820 INCREF(t);
821 settupleitem(u, 0, t);
822 for (i = 1; i < n; i++) {
823 t = gettupleitem(v, i);
824 INCREF(t);
825 settupleitem(w, i-1, t);
826 }
827 settupleitem(u, 1, w);
828 DECREF(v);
829 v = u;
830 n = 2;
831 }
832 if (n != oparg) {
833 err_setstr(TypeError,
834 "arg count mismatch");
835 why = WHY_EXCEPTION;
836 DECREF(v);
837 break;
838 }
839 PUSH(v);
840 }
841 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 case UNPACK_TUPLE:
843 v = POP();
844 if (!is_tupleobject(v)) {
845 err_setstr(TypeError, "unpack non-tuple");
846 why = WHY_EXCEPTION;
847 }
848 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000849 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 "unpack tuple of wrong size");
851 why = WHY_EXCEPTION;
852 }
853 else {
854 for (; --oparg >= 0; ) {
855 w = gettupleitem(v, oparg);
856 INCREF(w);
857 PUSH(w);
858 }
859 }
860 DECREF(v);
861 break;
862
863 case UNPACK_LIST:
864 v = POP();
865 if (!is_listobject(v)) {
866 err_setstr(TypeError, "unpack non-list");
867 why = WHY_EXCEPTION;
868 }
869 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000870 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 "unpack list of wrong size");
872 why = WHY_EXCEPTION;
873 }
874 else {
875 for (; --oparg >= 0; ) {
876 w = getlistitem(v, oparg);
877 INCREF(w);
878 PUSH(w);
879 }
880 }
881 DECREF(v);
882 break;
883
884 case STORE_ATTR:
885 name = GETNAME(oparg);
886 v = POP();
887 u = POP();
888 err = setattr(v, name, u); /* v.name = u */
889 DECREF(v);
890 DECREF(u);
891 break;
892
893 case DELETE_ATTR:
894 name = GETNAME(oparg);
895 v = POP();
896 err = setattr(v, name, (object *)NULL);
897 /* del v.name */
898 DECREF(v);
899 break;
900
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000901 case STORE_GLOBAL:
902 w = GETNAMEV(oparg);
903 v = POP();
904 err = dict2insert(f->f_globals, w, v);
905 DECREF(v);
906 break;
907
908 case DELETE_GLOBAL:
909 w = GETNAMEV(oparg);
910 if ((err = dict2remove(f->f_globals, w)) != 0)
911 err_setstr(NameError, getstringvalue(w));
912 break;
913
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 case LOAD_CONST:
915 x = GETCONST(oparg);
916 INCREF(x);
917 PUSH(x);
918 break;
919
920 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000921 w = GETNAMEV(oparg);
922 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000924 err_clear();
925 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000927 err_clear();
928 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000930 err_setstr(NameError,
931 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 break;
933 }
934 }
935 }
936 INCREF(x);
937 PUSH(x);
938 break;
939
940 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000941 w = GETNAMEV(oparg);
942 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000944 err_clear();
945 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000947 err_setstr(NameError,
948 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 break;
950 }
951 }
952 INCREF(x);
953 PUSH(x);
954 break;
955
956 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000957 w = GETNAMEV(oparg);
958 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000960 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 break;
962 }
963 INCREF(x);
964 PUSH(x);
965 break;
966
967 case BUILD_TUPLE:
968 x = newtupleobject(oparg);
969 if (x != NULL) {
970 for (; --oparg >= 0;) {
971 w = POP();
972 err = settupleitem(x, oparg, w);
973 if (err != 0)
974 break;
975 }
976 PUSH(x);
977 }
978 break;
979
980 case BUILD_LIST:
981 x = newlistobject(oparg);
982 if (x != NULL) {
983 for (; --oparg >= 0;) {
984 w = POP();
985 err = setlistitem(x, oparg, w);
986 if (err != 0)
987 break;
988 }
989 PUSH(x);
990 }
991 break;
992
993 case BUILD_MAP:
994 x = newdictobject();
995 PUSH(x);
996 break;
997
998 case LOAD_ATTR:
999 name = GETNAME(oparg);
1000 v = POP();
1001 x = getattr(v, name);
1002 DECREF(v);
1003 PUSH(x);
1004 break;
1005
1006 case COMPARE_OP:
1007 w = POP();
1008 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001009 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 DECREF(v);
1011 DECREF(w);
1012 PUSH(x);
1013 break;
1014
1015 case IMPORT_NAME:
1016 name = GETNAME(oparg);
1017 x = import_module(name);
1018 XINCREF(x);
1019 PUSH(x);
1020 break;
1021
1022 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001023 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001024 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001025 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 break;
1027
1028 case JUMP_FORWARD:
1029 JUMPBY(oparg);
1030 break;
1031
1032 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001033 err = testbool(TOP());
1034 if (err > 0)
1035 err = 0;
1036 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 JUMPBY(oparg);
1038 break;
1039
1040 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001041 err = testbool(TOP());
1042 if (err > 0) {
1043 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001045 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 break;
1047
1048 case JUMP_ABSOLUTE:
1049 JUMPTO(oparg);
1050 break;
1051
1052 case FOR_LOOP:
1053 /* for v in s: ...
1054 On entry: stack contains s, i.
1055 On exit: stack contains s, i+1, s[i];
1056 but if loop exhausted:
1057 s, i are popped, and we jump */
1058 w = POP(); /* Loop index */
1059 v = POP(); /* Sequence object */
1060 u = loop_subscript(v, w);
1061 if (u != NULL) {
1062 PUSH(v);
1063 x = newintobject(getintvalue(w)+1);
1064 PUSH(x);
1065 DECREF(w);
1066 PUSH(u);
1067 }
1068 else {
1069 DECREF(v);
1070 DECREF(w);
1071 /* A NULL can mean "s exhausted"
1072 but also an error: */
1073 if (err_occurred())
1074 why = WHY_EXCEPTION;
1075 else
1076 JUMPBY(oparg);
1077 }
1078 break;
1079
1080 case SETUP_LOOP:
1081 case SETUP_EXCEPT:
1082 case SETUP_FINALLY:
1083 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1084 STACK_LEVEL());
1085 break;
1086
1087 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001088#ifdef LLTRACE
1089 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001090 printf("--- Line %d ---\n", oparg);
1091#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001092 f->f_lineno = oparg;
1093 if (trace != NULL) {
1094 /* Trace each line of code reached */
1095 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001096 err = call_trace(&trace, &trace,
1097 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001098 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 break;
1100
1101 default:
1102 fprintf(stderr,
1103 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001104 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 err_setstr(SystemError, "eval_code: unknown opcode");
1106 why = WHY_EXCEPTION;
1107 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108
1109#ifdef CASE_TOO_BIG
1110 }
1111#endif
1112
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 } /* switch */
1114
1115 on_error:
1116
1117 /* Quickly continue if no error occurred */
1118
1119 if (why == WHY_NOT) {
1120 if (err == 0 && x != NULL)
1121 continue; /* Normal, fast path */
1122 why = WHY_EXCEPTION;
1123 x = None;
1124 err = 0;
1125 }
1126
Guido van Rossum801dcae1992-04-08 11:32:32 +00001127#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 /* Double-check exception status */
1129
1130 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1131 if (!err_occurred()) {
1132 fprintf(stderr, "XXX ghost error\n");
1133 err_setstr(SystemError, "ghost error");
1134 why = WHY_EXCEPTION;
1135 }
1136 }
1137 else {
1138 if (err_occurred()) {
1139 fprintf(stderr, "XXX undetected error\n");
1140 why = WHY_EXCEPTION;
1141 }
1142 }
1143#endif
1144
1145 /* Log traceback info if this is a real exception */
1146
1147 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001148 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001150 f->f_lasti -= 2;
1151 tb_here(f);
1152
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001153 if (trace)
1154 call_exc_trace(&trace, &trace, f);
1155 if (sys_profile)
1156 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 }
1158
1159 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1160
1161 if (why == WHY_RERAISE)
1162 why = WHY_EXCEPTION;
1163
1164 /* Unwind stacks if a (pseudo) exception occurred */
1165
1166 while (why != WHY_NOT && f->f_iblock > 0) {
1167 block *b = pop_block(f);
1168 while (STACK_LEVEL() > b->b_level) {
1169 v = POP();
1170 XDECREF(v);
1171 }
1172 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1173 why = WHY_NOT;
1174 JUMPTO(b->b_handler);
1175 break;
1176 }
1177 if (b->b_type == SETUP_FINALLY ||
1178 b->b_type == SETUP_EXCEPT &&
1179 why == WHY_EXCEPTION) {
1180 if (why == WHY_EXCEPTION) {
1181 object *exc, *val;
1182 err_get(&exc, &val);
1183 if (val == NULL) {
1184 val = None;
1185 INCREF(val);
1186 }
1187 v = tb_fetch();
1188 /* Make the raw exception data
1189 available to the handler,
1190 so a program can emulate the
1191 Python main loop. Don't do
1192 this for 'finally'. */
1193 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 sysset("exc_value", val);
1196 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001197 }
1198 PUSH(v);
1199 PUSH(val);
1200 PUSH(exc);
1201 }
1202 else {
1203 if (why == WHY_RETURN)
1204 PUSH(retval);
1205 v = newintobject((long)why);
1206 PUSH(v);
1207 }
1208 why = WHY_NOT;
1209 JUMPTO(b->b_handler);
1210 break;
1211 }
1212 } /* unwind stack */
1213
1214 /* End the loop if we still have an error (or return) */
1215
1216 if (why != WHY_NOT)
1217 break;
1218
1219 } /* main loop */
1220
1221 /* Pop remaining stack entries */
1222
1223 while (!EMPTY()) {
1224 v = POP();
1225 XDECREF(v);
1226 }
1227
Guido van Rossum96a42c81992-01-12 02:29:51 +00001228 if (why != WHY_RETURN)
1229 retval = NULL;
1230
1231 if (trace) {
1232 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001233 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001234 XDECREF(retval);
1235 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001236 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001237 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001238 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001239 XDECREF(trace);
1240 }
1241
1242 if (sys_profile && why == WHY_RETURN) {
1243 if (call_trace(&sys_profile, (object**)0,
1244 f, "return", retval)) {
1245 XDECREF(retval);
1246 retval = NULL;
1247 why = WHY_EXCEPTION;
1248 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001249 }
1250
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 /* Restore previous frame and release the current one */
1252
1253 current_frame = f->f_back;
1254 DECREF(f);
1255
Guido van Rossum96a42c81992-01-12 02:29:51 +00001256 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001257}
1258
Guido van Rossum96a42c81992-01-12 02:29:51 +00001259#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001260static int
1261prtrace(v, str)
1262 object *v;
1263 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001264{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001265 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001266 if (printobject(v, stdout, 0) != 0)
1267 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001268 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001269}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001272static void
1273call_exc_trace(p_trace, p_newtrace, f)
1274 object **p_trace, **p_newtrace;
1275 frameobject *f;
1276{
1277 object *type, *value, *traceback, *arg;
1278 int err;
1279 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001280 if (value == NULL) {
1281 value = None;
1282 INCREF(value);
1283 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001284 traceback = tb_fetch();
1285 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001286 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001287 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001288 settupleitem(arg, 0, type);
1289 settupleitem(arg, 1, value);
1290 settupleitem(arg, 2, traceback);
1291 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001292 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001293 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001294 /* Restore original exception */
1295 err_setval(type, value);
1296 tb_store(traceback);
1297 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001298 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001299}
1300
1301static int
1302call_trace(p_trace, p_newtrace, f, msg, arg)
1303 object **p_trace; /* in/out; may not be NULL;
1304 may not point to NULL variable initially */
1305 object **p_newtrace; /* in/out; may be NULL;
1306 may point to NULL variable;
1307 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001308 frameobject *f;
1309 char *msg;
1310 object *arg;
1311{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001312 object *arglist, *what;
1313 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001314 static int tracing = 0;
1315
1316 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001317 /* Don't do recursive traces */
1318 if (p_newtrace) {
1319 XDECREF(*p_newtrace);
1320 *p_newtrace = NULL;
1321 }
1322 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001323 }
1324
1325 arglist = newtupleobject(3);
1326 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001327 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001328 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001329 if (what == NULL)
1330 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001331 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001332 settupleitem(arglist, 0, (object *)f);
1333 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001334 if (arg == NULL)
1335 arg = None;
1336 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001337 settupleitem(arglist, 2, arg);
1338 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001339 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001340 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001341 cleanup:
1342 XDECREF(arglist);
1343 if (res == NULL) {
1344 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001345 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001346 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001347 *p_trace = NULL;
1348 if (p_newtrace) {
1349 XDECREF(*p_newtrace);
1350 *p_newtrace = NULL;
1351 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001352 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001353 }
1354 else {
1355 if (p_newtrace) {
1356 XDECREF(*p_newtrace);
1357 if (res == None)
1358 *p_newtrace = NULL;
1359 else {
1360 INCREF(res);
1361 *p_newtrace = res;
1362 }
1363 }
1364 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001365 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001366 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001367}
1368
Guido van Rossum3f5da241990-12-20 15:06:42 +00001369object *
1370getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001372 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001374 else
1375 return current_frame->f_locals;
1376}
1377
1378object *
1379getglobals()
1380{
1381 if (current_frame == NULL)
1382 return NULL;
1383 else
1384 return current_frame->f_globals;
1385}
1386
1387void
1388printtraceback(fp)
1389 FILE *fp;
1390{
1391 object *v = tb_fetch();
1392 if (v != NULL) {
1393 fprintf(fp, "Stack backtrace (innermost last):\n");
1394 tb_print(v, fp);
1395 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397}
1398
1399
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001400void
1401flushline()
1402{
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 if (softspace(sysget("stdout"), 0))
1404 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405}
1406
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407
Guido van Rossum04691fc1992-08-12 15:35:34 +00001408/* Test a value used as condition, e.g., in a for or if statement.
1409 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001410
1411static int
1412testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413 object *v;
1414{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001415 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001416 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001417 res = 0;
1418 else if (v->ob_type->tp_as_number != NULL)
1419 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1420 else if (v->ob_type->tp_as_mapping != NULL)
1421 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1422 else if (v->ob_type->tp_as_sequence != NULL)
1423 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1424 else
1425 res = 0;
1426 if (res > 0)
1427 res = 1;
1428 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429}
1430
1431static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001432or(v, w)
1433 object *v, *w;
1434{
1435 if (v->ob_type->tp_as_number != NULL) {
1436 object *x;
1437 object * (*f) FPROTO((object *, object *));
1438 if (coerce(&v, &w) != 0)
1439 return NULL;
1440 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1441 x = (*f)(v, w);
1442 DECREF(v);
1443 DECREF(w);
1444 if (f != NULL)
1445 return x;
1446 }
1447 err_setstr(TypeError, "bad operand type(s) for |");
1448 return NULL;
1449}
1450
1451static object *
1452xor(v, w)
1453 object *v, *w;
1454{
1455 if (v->ob_type->tp_as_number != NULL) {
1456 object *x;
1457 object * (*f) FPROTO((object *, object *));
1458 if (coerce(&v, &w) != 0)
1459 return NULL;
1460 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1461 x = (*f)(v, w);
1462 DECREF(v);
1463 DECREF(w);
1464 if (f != NULL)
1465 return x;
1466 }
1467 err_setstr(TypeError, "bad operand type(s) for ^");
1468 return NULL;
1469}
1470
1471static object *
1472and(v, w)
1473 object *v, *w;
1474{
1475 if (v->ob_type->tp_as_number != NULL) {
1476 object *x;
1477 object * (*f) FPROTO((object *, object *));
1478 if (coerce(&v, &w) != 0)
1479 return NULL;
1480 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1481 x = (*f)(v, w);
1482 DECREF(v);
1483 DECREF(w);
1484 if (f != NULL)
1485 return x;
1486 }
1487 err_setstr(TypeError, "bad operand type(s) for &");
1488 return NULL;
1489}
1490
1491static object *
1492lshift(v, w)
1493 object *v, *w;
1494{
1495 if (v->ob_type->tp_as_number != NULL) {
1496 object *x;
1497 object * (*f) FPROTO((object *, object *));
1498 if (coerce(&v, &w) != 0)
1499 return NULL;
1500 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1501 x = (*f)(v, w);
1502 DECREF(v);
1503 DECREF(w);
1504 if (f != NULL)
1505 return x;
1506 }
1507 err_setstr(TypeError, "bad operand type(s) for <<");
1508 return NULL;
1509}
1510
1511static object *
1512rshift(v, w)
1513 object *v, *w;
1514{
1515 if (v->ob_type->tp_as_number != NULL) {
1516 object *x;
1517 object * (*f) FPROTO((object *, object *));
1518 if (coerce(&v, &w) != 0)
1519 return NULL;
1520 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1521 x = (*f)(v, w);
1522 DECREF(v);
1523 DECREF(w);
1524 if (f != NULL)
1525 return x;
1526 }
1527 err_setstr(TypeError, "bad operand type(s) for >>");
1528 return NULL;
1529}
1530
1531static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001532add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533 object *v, *w;
1534{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001535 if (v->ob_type->tp_as_sequence != NULL)
1536 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1537 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001538 object *x;
1539 if (coerce(&v, &w) != 0)
1540 return NULL;
1541 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1542 DECREF(v);
1543 DECREF(w);
1544 return x;
1545 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001547 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 return NULL;
1549 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550}
1551
1552static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001553sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 object *v, *w;
1555{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001556 if (v->ob_type->tp_as_number != NULL) {
1557 object *x;
1558 if (coerce(&v, &w) != 0)
1559 return NULL;
1560 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1561 DECREF(v);
1562 DECREF(w);
1563 return x;
1564 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 return NULL;
1567}
1568
1569static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 object *v, *w;
1572{
1573 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001574 tp = v->ob_type;
1575 if (tp->tp_as_number != NULL &&
1576 w->ob_type->tp_as_sequence != NULL &&
1577 !is_instanceobject(v)) {
1578 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001579 object *tmp = v;
1580 v = w;
1581 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001582 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001584 if (tp->tp_as_number != NULL) {
1585 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001586 if (is_instanceobject(v)) {
1587 /* Instances of user-defined classes get their
1588 other argument uncoerced, so they may
1589 implement sequence*number as well as
1590 number*number. */
1591 INCREF(v);
1592 INCREF(w);
1593 }
1594 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001595 return NULL;
1596 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1597 DECREF(v);
1598 DECREF(w);
1599 return x;
1600 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001601 if (tp->tp_as_sequence != NULL) {
1602 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001603 err_setstr(TypeError,
1604 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 return NULL;
1606 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001607 return (*tp->tp_as_sequence->sq_repeat)
1608 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611 return NULL;
1612}
1613
1614static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001615divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 object *v, *w;
1617{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001618 if (v->ob_type->tp_as_number != NULL) {
1619 object *x;
1620 if (coerce(&v, &w) != 0)
1621 return NULL;
1622 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1623 DECREF(v);
1624 DECREF(w);
1625 return x;
1626 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001627 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 return NULL;
1629}
1630
1631static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001632rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633 object *v, *w;
1634{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001635 if (v->ob_type->tp_as_number != NULL) {
1636 object *x;
1637 if (coerce(&v, &w) != 0)
1638 return NULL;
1639 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1640 DECREF(v);
1641 DECREF(w);
1642 return x;
1643 }
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 Rossum3f5da241990-12-20 15:06:42 +00001649neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 object *v;
1651{
1652 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001653 return (*v->ob_type->tp_as_number->nb_negative)(v);
1654 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 return NULL;
1656}
1657
1658static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660 object *v;
1661{
1662 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663 return (*v->ob_type->tp_as_number->nb_positive)(v);
1664 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001665 return NULL;
1666}
1667
1668static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001669invert(v)
1670 object *v;
1671{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001672 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001673 if (v->ob_type->tp_as_number != NULL &&
1674 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1675 return (*f)(v);
1676 err_setstr(TypeError, "bad operand type(s) for unary ~");
1677 return NULL;
1678}
1679
1680static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682 object *v;
1683{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001684 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001685 object *w;
1686 if (outcome < 0)
1687 return NULL;
1688 if (outcome == 0)
1689 w = True;
1690 else
1691 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001692 INCREF(w);
1693 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001694}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001695/* External interface to call any callable object. The arg may be NULL. */
1696
1697object *
1698call_object(func, arg)
1699 object *func;
1700 object *arg;
1701{
1702 if (is_instancemethodobject(func) || is_funcobject(func))
1703 return call_function(func, arg);
1704 else
1705 return call_builtin(func, arg);
1706}
1707
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001709call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001710 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001712{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 if (is_methodobject(func)) {
1714 method meth = getmethod(func);
1715 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001716 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1717 int size = gettuplesize(arg);
1718 if (size == 1)
1719 arg = gettupleitem(arg, 0);
1720 else if (size == 0)
1721 arg = NULL;
1722 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 }
1725 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001726 if (arg != NULL &&
1727 !(is_tupleobject(arg) &&
1728 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729 err_setstr(TypeError,
1730 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001731 return NULL;
1732 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001735 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 return NULL;
1737}
1738
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001741 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001742 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001743{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744 object *newarg = NULL;
1745 object *newlocals, *newglobals;
1746 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001747
Guido van Rossume8122f11991-05-05 20:03:07 +00001748 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001749 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001750 object *self = instancemethodgetself(func);
1751 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001752 if (arg == NULL)
1753 argcount = 0;
1754 else if (is_tupleobject(arg))
1755 argcount = gettuplesize(arg);
1756 else
1757 argcount = 1;
1758 newarg = newtupleobject(argcount + 1);
1759 if (newarg == NULL)
1760 return NULL;
1761 INCREF(self);
1762 settupleitem(newarg, 0, self);
1763 if (arg != NULL && !is_tupleobject(arg)) {
1764 INCREF(arg);
1765 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766 }
1767 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001768 int i;
1769 object *v;
1770 for (i = 0; i < argcount; i++) {
1771 v = gettupleitem(arg, i);
1772 XINCREF(v);
1773 settupleitem(newarg, i+1, v);
1774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001775 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001776 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 }
1778 else {
1779 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001780 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 return NULL;
1782 }
1783 }
1784
Guido van Rossum3f5da241990-12-20 15:06:42 +00001785 co = getfunccode(func);
1786 if (co == NULL) {
1787 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 return NULL;
1789 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001790 if (!is_codeobject(co)) {
1791 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792 abort();
1793 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001794 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001796 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001797 return NULL;
1798 }
1799
Guido van Rossum3f5da241990-12-20 15:06:42 +00001800 newglobals = getfuncglobals(func);
1801 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001802
Guido van Rossum3f5da241990-12-20 15:06:42 +00001803 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804
Guido van Rossum3f5da241990-12-20 15:06:42 +00001805 DECREF(newlocals);
1806 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807
Guido van Rossum3f5da241990-12-20 15:06:42 +00001808 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809
1810 return v;
1811}
1812
1813static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001814apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 object *v, *w;
1816{
1817 typeobject *tp = v->ob_type;
1818 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001819 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820 return NULL;
1821 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001822 if (tp->tp_as_mapping != NULL) {
1823 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1824 }
1825 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826 int i;
1827 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001828 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 return NULL;
1830 }
1831 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001832 if (i < 0) {
1833 int len = (*tp->tp_as_sequence->sq_length)(v);
1834 if (len < 0)
1835 return NULL;
1836 i += len;
1837 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840}
1841
1842static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001843loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 object *v, *w;
1845{
1846 sequence_methods *sq = v->ob_type->tp_as_sequence;
1847 int i, n;
1848 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 return NULL;
1851 }
1852 i = getintvalue(w);
1853 n = (*sq->sq_length)(v);
1854 if (i >= n)
1855 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001857}
1858
1859static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001860slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861 object *v;
1862 int isize;
1863 int *pi;
1864{
1865 if (v != NULL) {
1866 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867 err_setstr(TypeError, "slice index must be int");
1868 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 }
1870 *pi = getintvalue(v);
1871 if (*pi < 0)
1872 *pi += isize;
1873 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001874 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001875}
1876
1877static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001878apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 object *u, *v, *w;
1880{
1881 typeobject *tp = u->ob_type;
1882 int ilow, ihigh, isize;
1883 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001884 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 return NULL;
1886 }
1887 ilow = 0;
1888 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001889 if (isize < 0)
1890 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001891 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001893 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001895 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001897
1898static int
1899assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001900 object *w;
1901 object *key;
1902 object *v;
1903{
1904 typeobject *tp = w->ob_type;
1905 sequence_methods *sq;
1906 mapping_methods *mp;
1907 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001908 if ((mp = tp->tp_as_mapping) != NULL &&
1909 (func = mp->mp_ass_subscript) != NULL) {
1910 return (*func)(w, key, v);
1911 }
1912 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913 (func = sq->sq_ass_item) != NULL) {
1914 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001916 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001917 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001919 else {
1920 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001921 if (i < 0) {
1922 int len = (*sq->sq_length)(w);
1923 if (len < 0)
1924 return -1;
1925 i += len;
1926 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001927 return (*func)(w, i, v);
1928 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001931 err_setstr(TypeError,
1932 "can't assign to this subscripted object");
1933 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935}
1936
Guido van Rossum3f5da241990-12-20 15:06:42 +00001937static int
1938assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 object *u, *v, *w, *x;
1940{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001941 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001943 if (sq == NULL) {
1944 err_setstr(TypeError, "assign to slice of non-sequence");
1945 return -1;
1946 }
1947 if (sq == NULL || sq->sq_ass_slice == NULL) {
1948 err_setstr(TypeError, "unassignable slice");
1949 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950 }
1951 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001953 if (isize < 0)
1954 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955 if (slice_index(v, isize, &ilow) != 0)
1956 return -1;
1957 if (slice_index(w, isize, &ihigh) != 0)
1958 return -1;
1959 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960}
1961
1962static int
1963cmp_exception(err, v)
1964 object *err, *v;
1965{
1966 if (is_tupleobject(v)) {
1967 int i, n;
1968 n = gettuplesize(v);
1969 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001970 /* Test recursively */
1971 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 return 1;
1973 }
1974 return 0;
1975 }
1976 return err == v;
1977}
1978
Guido van Rossum3f5da241990-12-20 15:06:42 +00001979static int
1980cmp_member(v, w)
1981 object *v, *w;
1982{
1983 int i, n, cmp;
1984 object *x;
1985 sequence_methods *sq;
1986 /* Special case for char in string */
1987 if (is_stringobject(w)) {
1988 register char *s, *end;
1989 register char c;
1990 if (!is_stringobject(v) || getstringsize(v) != 1) {
1991 err_setstr(TypeError,
1992 "string member test needs char left operand");
1993 return -1;
1994 }
1995 c = getstringvalue(v)[0];
1996 s = getstringvalue(w);
1997 end = s + getstringsize(w);
1998 while (s < end) {
1999 if (c == *s++)
2000 return 1;
2001 }
2002 return 0;
2003 }
2004 sq = w->ob_type->tp_as_sequence;
2005 if (sq == NULL) {
2006 err_setstr(TypeError,
2007 "'in' or 'not in' needs sequence right argument");
2008 return -1;
2009 }
2010 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002011 if (n < 0)
2012 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013 for (i = 0; i < n; i++) {
2014 x = (*sq->sq_item)(w, i);
2015 cmp = cmpobject(v, x);
2016 XDECREF(x);
2017 if (cmp == 0)
2018 return 1;
2019 }
2020 return 0;
2021}
2022
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002024cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002025 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 register object *v;
2027 register object *w;
2028{
2029 register int cmp;
2030 register int res = 0;
2031 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002032 case IS:
2033 case IS_NOT:
2034 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002035 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002036 res = !res;
2037 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002038 case IN:
2039 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002040 res = cmp_member(v, w);
2041 if (res < 0)
2042 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002043 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002044 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002045 break;
2046 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002047 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 break;
2049 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002050 cmp = cmpobject(v, w);
2051 switch (op) {
2052 case LT: res = cmp < 0; break;
2053 case LE: res = cmp <= 0; break;
2054 case EQ: res = cmp == 0; break;
2055 case NE: res = cmp != 0; break;
2056 case GT: res = cmp > 0; break;
2057 case GE: res = cmp >= 0; break;
2058 /* XXX no default? (res is initialized to 0 though) */
2059 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 }
2061 v = res ? True : False;
2062 INCREF(v);
2063 return v;
2064}
2065
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066static int
2067import_from(locals, v, name)
2068 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002069 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002070 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002071{
2072 object *w, *x;
2073 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002074 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002075 int i;
2076 int n = getdictsize(w);
2077 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002078 name = getdict2key(w, i);
2079 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002080 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002081 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002082 if (x == NULL) {
2083 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002084 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002086 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002087 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002089 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002091 }
2092 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002093 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002095 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002096 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002097 getstringvalue(name));
2098 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099 return -1;
2100 }
2101 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002102 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002103 }
2104}
2105
2106static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002108 object *v; /* None or tuple containing base classes */
2109 object *w; /* dictionary */
2110{
2111 if (is_tupleobject(v)) {
2112 int i;
2113 for (i = gettuplesize(v); --i >= 0; ) {
2114 object *x = gettupleitem(v, i);
2115 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002116 err_setstr(TypeError,
2117 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002118 return NULL;
2119 }
2120 }
2121 }
2122 else {
2123 v = NULL;
2124 }
2125 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002126 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002127 return NULL;
2128 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002129 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002130}