blob: ad679a68861d5eea35fee66443868b827aea9a64 [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 Rossum89d55ca1991-07-01 18:43:13 +00001535 if (v->ob_type->tp_as_number != NULL) {
1536 object *x;
1537 if (coerce(&v, &w) != 0)
1538 return NULL;
1539 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1540 DECREF(v);
1541 DECREF(w);
1542 return x;
1543 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001544 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001545 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
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;
1574 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1575 /* int*sequence -- swap v and w */
1576 object *tmp = v;
1577 v = w;
1578 w = tmp;
1579 }
1580 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001581 if (tp->tp_as_number != NULL) {
1582 object *x;
1583 if (coerce(&v, &w) != 0)
1584 return NULL;
1585 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1586 DECREF(v);
1587 DECREF(w);
1588 return x;
1589 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 if (tp->tp_as_sequence != NULL) {
1591 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001592 err_setstr(TypeError,
1593 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594 return NULL;
1595 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596 return (*tp->tp_as_sequence->sq_repeat)
1597 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001599 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 return NULL;
1601}
1602
1603static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001604divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001605 object *v, *w;
1606{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001607 if (v->ob_type->tp_as_number != NULL) {
1608 object *x;
1609 if (coerce(&v, &w) != 0)
1610 return NULL;
1611 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1612 DECREF(v);
1613 DECREF(w);
1614 return x;
1615 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001616 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 return NULL;
1618}
1619
1620static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001621rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 object *v, *w;
1623{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001624 if (v->ob_type->tp_as_number != NULL) {
1625 object *x;
1626 if (coerce(&v, &w) != 0)
1627 return NULL;
1628 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1629 DECREF(v);
1630 DECREF(w);
1631 return x;
1632 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 return NULL;
1635}
1636
1637static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001638neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001639 object *v;
1640{
1641 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001642 return (*v->ob_type->tp_as_number->nb_negative)(v);
1643 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 return NULL;
1645}
1646
1647static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001648pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 object *v;
1650{
1651 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001652 return (*v->ob_type->tp_as_number->nb_positive)(v);
1653 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 return NULL;
1655}
1656
1657static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001658invert(v)
1659 object *v;
1660{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001661 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001662 if (v->ob_type->tp_as_number != NULL &&
1663 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1664 return (*f)(v);
1665 err_setstr(TypeError, "bad operand type(s) for unary ~");
1666 return NULL;
1667}
1668
1669static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001670not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671 object *v;
1672{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001673 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001674 object *w;
1675 if (outcome < 0)
1676 return NULL;
1677 if (outcome == 0)
1678 w = True;
1679 else
1680 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681 INCREF(w);
1682 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001683}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001684/* External interface to call any callable object. The arg may be NULL. */
1685
1686object *
1687call_object(func, arg)
1688 object *func;
1689 object *arg;
1690{
1691 if (is_instancemethodobject(func) || is_funcobject(func))
1692 return call_function(func, arg);
1693 else
1694 return call_builtin(func, arg);
1695}
1696
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001699 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 if (is_methodobject(func)) {
1703 method meth = getmethod(func);
1704 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001705 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1706 int size = gettuplesize(arg);
1707 if (size == 1)
1708 arg = gettupleitem(arg, 0);
1709 else if (size == 0)
1710 arg = NULL;
1711 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001712 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713 }
1714 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001715 if (arg != NULL &&
1716 !(is_tupleobject(arg) &&
1717 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001718 err_setstr(TypeError,
1719 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 return NULL;
1721 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001723 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001724 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001725 return NULL;
1726}
1727
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001728static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001729call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001730 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001731 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001732{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733 object *newarg = NULL;
1734 object *newlocals, *newglobals;
1735 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736
Guido van Rossume8122f11991-05-05 20:03:07 +00001737 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001738 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001739 object *self = instancemethodgetself(func);
1740 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001741 if (arg == NULL)
1742 argcount = 0;
1743 else if (is_tupleobject(arg))
1744 argcount = gettuplesize(arg);
1745 else
1746 argcount = 1;
1747 newarg = newtupleobject(argcount + 1);
1748 if (newarg == NULL)
1749 return NULL;
1750 INCREF(self);
1751 settupleitem(newarg, 0, self);
1752 if (arg != NULL && !is_tupleobject(arg)) {
1753 INCREF(arg);
1754 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 }
1756 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001757 int i;
1758 object *v;
1759 for (i = 0; i < argcount; i++) {
1760 v = gettupleitem(arg, i);
1761 XINCREF(v);
1762 settupleitem(newarg, i+1, v);
1763 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001764 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001765 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766 }
1767 else {
1768 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 return NULL;
1771 }
1772 }
1773
Guido van Rossum3f5da241990-12-20 15:06:42 +00001774 co = getfunccode(func);
1775 if (co == NULL) {
1776 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001777 return NULL;
1778 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001779 if (!is_codeobject(co)) {
1780 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 abort();
1782 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001783 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001785 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 return NULL;
1787 }
1788
Guido van Rossum3f5da241990-12-20 15:06:42 +00001789 newglobals = getfuncglobals(func);
1790 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791
Guido van Rossum3f5da241990-12-20 15:06:42 +00001792 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001793
Guido van Rossum3f5da241990-12-20 15:06:42 +00001794 DECREF(newlocals);
1795 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796
Guido van Rossum3f5da241990-12-20 15:06:42 +00001797 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798
1799 return v;
1800}
1801
1802static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001803apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001804 object *v, *w;
1805{
1806 typeobject *tp = v->ob_type;
1807 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001808 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809 return NULL;
1810 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00001811 if (tp->tp_as_mapping != NULL) {
1812 return (*tp->tp_as_mapping->mp_subscript)(v, w);
1813 }
1814 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815 int i;
1816 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001817 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818 return NULL;
1819 }
1820 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001821 if (i < 0) {
1822 int len = (*tp->tp_as_sequence->sq_length)(v);
1823 if (len < 0)
1824 return NULL;
1825 i += len;
1826 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001827 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829}
1830
1831static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001832loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 object *v, *w;
1834{
1835 sequence_methods *sq = v->ob_type->tp_as_sequence;
1836 int i, n;
1837 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001838 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001839 return NULL;
1840 }
1841 i = getintvalue(w);
1842 n = (*sq->sq_length)(v);
1843 if (i >= n)
1844 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001845 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846}
1847
1848static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 object *v;
1851 int isize;
1852 int *pi;
1853{
1854 if (v != NULL) {
1855 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 err_setstr(TypeError, "slice index must be int");
1857 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 }
1859 *pi = getintvalue(v);
1860 if (*pi < 0)
1861 *pi += isize;
1862 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001863 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864}
1865
1866static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 object *u, *v, *w;
1869{
1870 typeobject *tp = u->ob_type;
1871 int ilow, ihigh, isize;
1872 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001873 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 return NULL;
1875 }
1876 ilow = 0;
1877 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001878 if (isize < 0)
1879 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001882 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001884 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001886
1887static int
1888assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 object *w;
1890 object *key;
1891 object *v;
1892{
1893 typeobject *tp = w->ob_type;
1894 sequence_methods *sq;
1895 mapping_methods *mp;
1896 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00001897 if ((mp = tp->tp_as_mapping) != NULL &&
1898 (func = mp->mp_ass_subscript) != NULL) {
1899 return (*func)(w, key, v);
1900 }
1901 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902 (func = sq->sq_ass_item) != NULL) {
1903 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001904 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001905 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001906 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001908 else {
1909 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001910 if (i < 0) {
1911 int len = (*sq->sq_length)(w);
1912 if (len < 0)
1913 return -1;
1914 i += len;
1915 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001916 return (*func)(w, i, v);
1917 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001920 err_setstr(TypeError,
1921 "can't assign to this subscripted object");
1922 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924}
1925
Guido van Rossum3f5da241990-12-20 15:06:42 +00001926static int
1927assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001928 object *u, *v, *w, *x;
1929{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001932 if (sq == NULL) {
1933 err_setstr(TypeError, "assign to slice of non-sequence");
1934 return -1;
1935 }
1936 if (sq == NULL || sq->sq_ass_slice == NULL) {
1937 err_setstr(TypeError, "unassignable slice");
1938 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 }
1940 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001941 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001942 if (isize < 0)
1943 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001944 if (slice_index(v, isize, &ilow) != 0)
1945 return -1;
1946 if (slice_index(w, isize, &ihigh) != 0)
1947 return -1;
1948 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949}
1950
1951static int
1952cmp_exception(err, v)
1953 object *err, *v;
1954{
1955 if (is_tupleobject(v)) {
1956 int i, n;
1957 n = gettuplesize(v);
1958 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001959 /* Test recursively */
1960 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 return 1;
1962 }
1963 return 0;
1964 }
1965 return err == v;
1966}
1967
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968static int
1969cmp_member(v, w)
1970 object *v, *w;
1971{
1972 int i, n, cmp;
1973 object *x;
1974 sequence_methods *sq;
1975 /* Special case for char in string */
1976 if (is_stringobject(w)) {
1977 register char *s, *end;
1978 register char c;
1979 if (!is_stringobject(v) || getstringsize(v) != 1) {
1980 err_setstr(TypeError,
1981 "string member test needs char left operand");
1982 return -1;
1983 }
1984 c = getstringvalue(v)[0];
1985 s = getstringvalue(w);
1986 end = s + getstringsize(w);
1987 while (s < end) {
1988 if (c == *s++)
1989 return 1;
1990 }
1991 return 0;
1992 }
1993 sq = w->ob_type->tp_as_sequence;
1994 if (sq == NULL) {
1995 err_setstr(TypeError,
1996 "'in' or 'not in' needs sequence right argument");
1997 return -1;
1998 }
1999 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002000 if (n < 0)
2001 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002002 for (i = 0; i < n; i++) {
2003 x = (*sq->sq_item)(w, i);
2004 cmp = cmpobject(v, x);
2005 XDECREF(x);
2006 if (cmp == 0)
2007 return 1;
2008 }
2009 return 0;
2010}
2011
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002014 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 register object *v;
2016 register object *w;
2017{
2018 register int cmp;
2019 register int res = 0;
2020 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002021 case IS:
2022 case IS_NOT:
2023 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002024 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002025 res = !res;
2026 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002027 case IN:
2028 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002029 res = cmp_member(v, w);
2030 if (res < 0)
2031 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002032 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002033 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034 break;
2035 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002036 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 break;
2038 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002039 cmp = cmpobject(v, w);
2040 switch (op) {
2041 case LT: res = cmp < 0; break;
2042 case LE: res = cmp <= 0; break;
2043 case EQ: res = cmp == 0; break;
2044 case NE: res = cmp != 0; break;
2045 case GT: res = cmp > 0; break;
2046 case GE: res = cmp >= 0; break;
2047 /* XXX no default? (res is initialized to 0 though) */
2048 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049 }
2050 v = res ? True : False;
2051 INCREF(v);
2052 return v;
2053}
2054
Guido van Rossum3f5da241990-12-20 15:06:42 +00002055static int
2056import_from(locals, v, name)
2057 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002058 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002059 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002060{
2061 object *w, *x;
2062 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002063 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002064 int i;
2065 int n = getdictsize(w);
2066 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002067 name = getdict2key(w, i);
2068 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002069 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002070 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002071 if (x == NULL) {
2072 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002073 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002074 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002075 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002076 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002078 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002080 }
2081 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002082 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002084 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002085 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002086 getstringvalue(name));
2087 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088 return -1;
2089 }
2090 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002091 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002092 }
2093}
2094
2095static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002096build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002097 object *v; /* None or tuple containing base classes */
2098 object *w; /* dictionary */
2099{
2100 if (is_tupleobject(v)) {
2101 int i;
2102 for (i = gettuplesize(v); --i >= 0; ) {
2103 object *x = gettupleitem(v, i);
2104 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105 err_setstr(TypeError,
2106 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002107 return NULL;
2108 }
2109 }
2110 }
2111 else {
2112 v = NULL;
2113 }
2114 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002115 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002116 return NULL;
2117 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002118 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002119}