blob: 252b1dcdcceb11336026a9e844ffc661051133dd [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 Rossum3f5da241990-12-20 15:06:42 +000039#ifndef NDEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000040/* For debugging the interpreter: */
41#define LLTRACE 1 /* Low-level trace feature */
42#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000043#endif
44
Guido van Rossum374a9221991-04-04 10:40:29 +000045/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000046
Guido van Rossum0a066c01992-03-27 17:29:15 +000047#ifdef LLTRACE
48static int prtrace PROTO((object *, char *));
49#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000050static void call_exc_trace PROTO((object **, object**, frameobject *));
51static int call_trace
52 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000053static int testbool PROTO((object *));
54static object *add PROTO((object *, object *));
55static object *sub PROTO((object *, object *));
56static object *mul PROTO((object *, object *));
57static object *divide PROTO((object *, object *));
58static object *rem PROTO((object *, object *));
59static object *neg PROTO((object *));
60static object *pos PROTO((object *));
61static object *not PROTO((object *));
62static object *invert PROTO((object *));
63static object *lshift PROTO((object *, object *));
64static object *rshift PROTO((object *, object *));
65static object *and PROTO((object *, object *));
66static object *xor PROTO((object *, object *));
67static object *or PROTO((object *, object *));
68static object *call_builtin PROTO((object *, object *));
69static object *call_function PROTO((object *, object *));
70static object *apply_subscript PROTO((object *, object *));
71static object *loop_subscript PROTO((object *, object *));
72static int slice_index PROTO((object *, int, int *));
73static object *apply_slice PROTO((object *, object *, object *));
74static int assign_subscript PROTO((object *, object *, object *));
75static int assign_slice PROTO((object *, object *, object *, object *));
76static int cmp_exception PROTO((object *, object *));
77static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000078static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000079static int import_from PROTO((object *, object *, object *));
80static object *build_class PROTO((object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000081
82
Guido van Rossum0a066c01992-03-27 17:29:15 +000083/* Pointer to current frame, used to link new frames to */
84
Guido van Rossum374a9221991-04-04 10:40:29 +000085static frameobject *current_frame;
86
Guido van Rossum1984f1e1992-08-04 12:41:02 +000087#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000088
Guido van Rossum1984f1e1992-08-04 12:41:02 +000089#include <errno.h>
90#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000091
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092static type_lock interpreter_lock;
93
94void
95init_save_thread()
96{
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097 if (interpreter_lock)
98 fatal("2nd call to init_save_thread");
99 interpreter_lock = allocate_lock();
100 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000101}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000102
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000103#endif
104
Guido van Rossumff4949e1992-08-05 19:58:53 +0000105/* Functions save_thread and restore_thread are always defined so
106 dynamically loaded modules needn't be compiled separately for use
107 with and without threads: */
108
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109void *
110save_thread()
111{
112#ifdef USE_THREAD
113 if (interpreter_lock) {
114 void *res;
115 res = (void *)current_frame;
116 current_frame = NULL;
117 release_lock(interpreter_lock);
118 return res;
119 }
120 else
121 return NULL;
122#endif
123}
124
125void
126restore_thread(x)
127 void *x;
128{
129#ifdef USE_THREAD
130 if (interpreter_lock) {
131 int err;
132 err = errno;
133 acquire_lock(interpreter_lock, 1);
134 errno = err;
135 current_frame = (frameobject *)x;
136 }
137#endif
138}
139
140
Guido van Rossum374a9221991-04-04 10:40:29 +0000141/* Status code for main loop (reason for stack unwind) */
142
143enum why_code {
144 WHY_NOT, /* No error */
145 WHY_EXCEPTION, /* Exception occurred */
146 WHY_RERAISE, /* Exception re-raised by 'finally' */
147 WHY_RETURN, /* 'return' statement */
148 WHY_BREAK /* 'break' statement */
149};
150
151
152/* Interpreter main loop */
153
154object *
155eval_code(co, globals, locals, arg)
156 codeobject *co;
157 object *globals;
158 object *locals;
159 object *arg;
160{
161 register unsigned char *next_instr;
162 register int opcode; /* Current opcode */
163 register int oparg; /* Current opcode argument, if any */
164 register object **stack_pointer;
165 register enum why_code why; /* Reason for block stack unwind */
166 register int err; /* Error status -- nonzero if error */
167 register object *x; /* Result object -- NULL if error */
168 register object *v; /* Temporary objects popped off stack */
169 register object *w;
170 register object *u;
171 register object *t;
172 register frameobject *f; /* Current frame */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000173 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000174 object *retval; /* Return value iff why == WHY_RETURN */
175 char *name; /* Name used by some instructions */
176 FILE *fp; /* Used by print operations */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000177#ifdef LLTRACE
178 int lltrace = dictlookup(globals, "__lltrace__") != NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000179#endif
180
181/* Code access macros */
182
183#define GETCONST(i) Getconst(f, i)
184#define GETNAME(i) Getname(f, i)
185#define GETNAMEV(i) Getnamev(f, i)
186#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
187#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
188#define NEXTOP() (*next_instr++)
189#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
190#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
191#define JUMPBY(x) (next_instr += (x))
192
193/* Stack manipulation macros */
194
195#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
196#define EMPTY() (STACK_LEVEL() == 0)
197#define TOP() (stack_pointer[-1])
198#define BASIC_PUSH(v) (*stack_pointer++ = (v))
199#define BASIC_POP() (*--stack_pointer)
200
Guido van Rossum96a42c81992-01-12 02:29:51 +0000201#ifdef LLTRACE
202#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
203#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000204#else
205#define PUSH(v) BASIC_PUSH(v)
206#define POP() BASIC_POP()
207#endif
208
209 f = newframeobject(
210 current_frame, /*back*/
211 co, /*code*/
212 globals, /*globals*/
213 locals, /*locals*/
214 50, /*nvalues*/
215 20); /*nblocks*/
216 if (f == NULL)
217 return NULL;
218
219 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000220
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000221 if (sys_trace != NULL) {
222 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000223 be called on *every* entry to a code block.
224 Its return value, if not None, is a function that
225 will be called at the start of each executed line
226 of code. (Actually, the function must return
227 itself in order to continue tracing.)
228 The trace functions are called with three arguments:
229 a pointer to the current frame, a string indicating
230 why the function is called, and an argument which
231 depends on the situation. The global trace function
232 (sys.trace) is also called whenever an exception
233 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000234 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000235 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000236 current_frame = f->f_back;
237 DECREF(f);
238 return NULL;
239 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000240 }
241
242 if (sys_profile != NULL) {
243 /* Similar for sys_profile, except it needn't return
244 itself and isn't called for "line" events */
245 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
246 current_frame = f->f_back;
247 DECREF(f);
248 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000249 }
250 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000251
252 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000253 stack_pointer = f->f_valuestack;
254
255 if (arg != NULL) {
256 INCREF(arg);
257 PUSH(arg);
258 }
259
260 why = WHY_NOT;
261 err = 0;
262 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000263
264 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000265 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000266
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000267 /* Do periodic things.
268 Doing this every time through the loop would add
269 too much overhead (a function call per instruction).
270 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000271
272 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000273 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000274 if (intrcheck()) {
275 err_set(KeyboardInterrupt);
276 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000277 goto on_error;
278 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000279
280#ifdef USE_THREAD
281 if (interpreter_lock) {
282 /* Give another thread a chance */
283
284 current_frame = NULL;
285 release_lock(interpreter_lock);
286
287 /* Other threads may run now */
288
289 acquire_lock(interpreter_lock, 1);
290 current_frame = f;
291 }
292#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000293 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000294
Guido van Rossum374a9221991-04-04 10:40:29 +0000295 /* Extract opcode and argument */
296
297 opcode = NEXTOP();
298 if (HAS_ARG(opcode))
299 oparg = NEXTARG();
300
Guido van Rossum96a42c81992-01-12 02:29:51 +0000301#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000302 /* Instruction tracing */
303
Guido van Rossum96a42c81992-01-12 02:29:51 +0000304 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000305 if (HAS_ARG(opcode)) {
306 printf("%d: %d, %d\n",
307 (int) (INSTR_OFFSET() - 3),
308 opcode, oparg);
309 }
310 else {
311 printf("%d: %d\n",
312 (int) (INSTR_OFFSET() - 1), opcode);
313 }
314 }
315#endif
316
317 /* Main switch on opcode */
318
319 switch (opcode) {
320
321 /* BEWARE!
322 It is essential that any operation that fails sets either
323 x to NULL, err to nonzero, or why to anything but WHY_NOT,
324 and that no operation that succeeds does this! */
325
326 /* case STOP_CODE: this is an error! */
327
328 case POP_TOP:
329 v = POP();
330 DECREF(v);
331 break;
332
333 case ROT_TWO:
334 v = POP();
335 w = POP();
336 PUSH(v);
337 PUSH(w);
338 break;
339
340 case ROT_THREE:
341 v = POP();
342 w = POP();
343 x = POP();
344 PUSH(v);
345 PUSH(x);
346 PUSH(w);
347 break;
348
349 case DUP_TOP:
350 v = TOP();
351 INCREF(v);
352 PUSH(v);
353 break;
354
355 case UNARY_POSITIVE:
356 v = POP();
357 x = pos(v);
358 DECREF(v);
359 PUSH(x);
360 break;
361
362 case UNARY_NEGATIVE:
363 v = POP();
364 x = neg(v);
365 DECREF(v);
366 PUSH(x);
367 break;
368
369 case UNARY_NOT:
370 v = POP();
371 x = not(v);
372 DECREF(v);
373 PUSH(x);
374 break;
375
376 case UNARY_CONVERT:
377 v = POP();
378 x = reprobject(v);
379 DECREF(v);
380 PUSH(x);
381 break;
382
383 case UNARY_CALL:
384 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000385 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000386 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000387 DECREF(v);
388 PUSH(x);
389 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000390
391 case UNARY_INVERT:
392 v = POP();
393 x = invert(v);
394 DECREF(v);
395 PUSH(x);
396 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000397
398 case BINARY_MULTIPLY:
399 w = POP();
400 v = POP();
401 x = mul(v, w);
402 DECREF(v);
403 DECREF(w);
404 PUSH(x);
405 break;
406
407 case BINARY_DIVIDE:
408 w = POP();
409 v = POP();
410 x = divide(v, w);
411 DECREF(v);
412 DECREF(w);
413 PUSH(x);
414 break;
415
416 case BINARY_MODULO:
417 w = POP();
418 v = POP();
419 x = rem(v, w);
420 DECREF(v);
421 DECREF(w);
422 PUSH(x);
423 break;
424
425 case BINARY_ADD:
426 w = POP();
427 v = POP();
428 x = add(v, w);
429 DECREF(v);
430 DECREF(w);
431 PUSH(x);
432 break;
433
434 case BINARY_SUBTRACT:
435 w = POP();
436 v = POP();
437 x = sub(v, w);
438 DECREF(v);
439 DECREF(w);
440 PUSH(x);
441 break;
442
443 case BINARY_SUBSCR:
444 w = POP();
445 v = POP();
446 x = apply_subscript(v, w);
447 DECREF(v);
448 DECREF(w);
449 PUSH(x);
450 break;
451
452 case BINARY_CALL:
453 w = POP();
454 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000455 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000456 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000457 DECREF(v);
458 DECREF(w);
459 PUSH(x);
460 break;
461
Guido van Rossum7928cd71991-10-24 14:59:31 +0000462 case BINARY_LSHIFT:
463 w = POP();
464 v = POP();
465 x = lshift(v, w);
466 DECREF(v);
467 DECREF(w);
468 PUSH(x);
469 break;
470
471 case BINARY_RSHIFT:
472 w = POP();
473 v = POP();
474 x = rshift(v, w);
475 DECREF(v);
476 DECREF(w);
477 PUSH(x);
478 break;
479
480 case BINARY_AND:
481 w = POP();
482 v = POP();
483 x = and(v, w);
484 DECREF(v);
485 DECREF(w);
486 PUSH(x);
487 break;
488
489 case BINARY_XOR:
490 w = POP();
491 v = POP();
492 x = xor(v, w);
493 DECREF(v);
494 DECREF(w);
495 PUSH(x);
496 break;
497
498 case BINARY_OR:
499 w = POP();
500 v = POP();
501 x = or(v, w);
502 DECREF(v);
503 DECREF(w);
504 PUSH(x);
505 break;
506
Guido van Rossum374a9221991-04-04 10:40:29 +0000507 case SLICE+0:
508 case SLICE+1:
509 case SLICE+2:
510 case SLICE+3:
511 if ((opcode-SLICE) & 2)
512 w = POP();
513 else
514 w = NULL;
515 if ((opcode-SLICE) & 1)
516 v = POP();
517 else
518 v = NULL;
519 u = POP();
520 x = apply_slice(u, v, w);
521 DECREF(u);
522 XDECREF(v);
523 XDECREF(w);
524 PUSH(x);
525 break;
526
527 case STORE_SLICE+0:
528 case STORE_SLICE+1:
529 case STORE_SLICE+2:
530 case STORE_SLICE+3:
531 if ((opcode-STORE_SLICE) & 2)
532 w = POP();
533 else
534 w = NULL;
535 if ((opcode-STORE_SLICE) & 1)
536 v = POP();
537 else
538 v = NULL;
539 u = POP();
540 t = POP();
541 err = assign_slice(u, v, w, t); /* u[v:w] = t */
542 DECREF(t);
543 DECREF(u);
544 XDECREF(v);
545 XDECREF(w);
546 break;
547
548 case DELETE_SLICE+0:
549 case DELETE_SLICE+1:
550 case DELETE_SLICE+2:
551 case DELETE_SLICE+3:
552 if ((opcode-DELETE_SLICE) & 2)
553 w = POP();
554 else
555 w = NULL;
556 if ((opcode-DELETE_SLICE) & 1)
557 v = POP();
558 else
559 v = NULL;
560 u = POP();
561 err = assign_slice(u, v, w, (object *)NULL);
562 /* del u[v:w] */
563 DECREF(u);
564 XDECREF(v);
565 XDECREF(w);
566 break;
567
568 case STORE_SUBSCR:
569 w = POP();
570 v = POP();
571 u = POP();
572 /* v[w] = u */
573 err = assign_subscript(v, w, u);
574 DECREF(u);
575 DECREF(v);
576 DECREF(w);
577 break;
578
579 case DELETE_SUBSCR:
580 w = POP();
581 v = POP();
582 /* del v[w] */
583 err = assign_subscript(v, w, (object *)NULL);
584 DECREF(v);
585 DECREF(w);
586 break;
587
588 case PRINT_EXPR:
589 v = POP();
590 fp = sysgetfile("stdout", stdout);
591 /* Print value except if procedure result */
592 if (v != None) {
593 flushline();
594 softspace(sysget("stdout"), 1);
Guido van Rossum90933611991-06-07 16:10:43 +0000595 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000596 flushline();
597 }
598 DECREF(v);
599 break;
600
601 case PRINT_ITEM:
602 v = POP();
603 fp = sysgetfile("stdout", stdout);
604 if (softspace(sysget("stdout"), 1))
605 fprintf(fp, " ");
606 if (is_stringobject(v)) {
607 char *s = getstringvalue(v);
608 int len = getstringsize(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +0000609 fwrite(s, 1, len, fp);
Guido van Rossum299a7341992-03-04 16:39:08 +0000610 if (ferror(fp)) {
611 err_errno(IOError);
612 err = -1;
613 }
614 else if (len > 0 && s[len-1] == '\n')
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 softspace(sysget("stdout"), 0);
616 }
617 else {
Guido van Rossum90933611991-06-07 16:10:43 +0000618 err = printobject(v, fp, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 }
620 DECREF(v);
621 break;
622
623 case PRINT_NEWLINE:
624 fp = sysgetfile("stdout", stdout);
625 fprintf(fp, "\n");
626 softspace(sysget("stdout"), 0);
627 break;
628
629 case BREAK_LOOP:
630 why = WHY_BREAK;
631 break;
632
633 case RAISE_EXCEPTION:
634 v = POP();
635 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000636 /* A tuple is equivalent to its first element here */
637 while (is_tupleobject(w)) {
638 u = w;
639 w = gettupleitem(u, 0);
640 DECREF(u);
641 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000642 if (!is_stringobject(w))
643 err_setstr(TypeError,
644 "exceptions must be strings");
645 else
646 err_setval(w, v);
647 DECREF(v);
648 DECREF(w);
649 why = WHY_EXCEPTION;
650 break;
651
652 case LOAD_LOCALS:
653 v = f->f_locals;
654 INCREF(v);
655 PUSH(v);
656 break;
657
658 case RETURN_VALUE:
659 retval = POP();
660 why = WHY_RETURN;
661 break;
662
Guido van Rossum374a9221991-04-04 10:40:29 +0000663 case BUILD_FUNCTION:
664 v = POP();
665 x = newfuncobject(v, f->f_globals);
666 DECREF(v);
667 PUSH(x);
668 break;
669
670 case POP_BLOCK:
671 {
672 block *b = pop_block(f);
673 while (STACK_LEVEL() > b->b_level) {
674 v = POP();
675 DECREF(v);
676 }
677 }
678 break;
679
680 case END_FINALLY:
681 v = POP();
682 if (is_intobject(v)) {
683 why = (enum why_code) getintvalue(v);
684 if (why == WHY_RETURN)
685 retval = POP();
686 }
687 else if (is_stringobject(v)) {
688 w = POP();
689 err_setval(v, w);
690 DECREF(w);
691 w = POP();
692 tb_store(w);
693 DECREF(w);
694 why = WHY_RERAISE;
695 }
696 else if (v != None) {
697 err_setstr(SystemError,
698 "'finally' pops bad exception");
699 why = WHY_EXCEPTION;
700 }
701 DECREF(v);
702 break;
703
704 case BUILD_CLASS:
705 w = POP();
706 v = POP();
707 x = build_class(v, w);
708 PUSH(x);
709 DECREF(v);
710 DECREF(w);
711 break;
712
713 case STORE_NAME:
714 w = GETNAMEV(oparg);
715 v = POP();
716 err = dict2insert(f->f_locals, w, v);
717 DECREF(v);
718 break;
719
720 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000721 w = GETNAMEV(oparg);
722 if ((err = dict2remove(f->f_locals, w)) != 0)
723 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 break;
725
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000726 case UNPACK_VARARG:
727 if (EMPTY()) {
728 err_setstr(TypeError,
729 "no argument list");
730 why = WHY_EXCEPTION;
731 break;
732 }
733 v = POP();
734 if (!is_tupleobject(v)) {
735 err_setstr(TypeError,
736 "bad argument list");
737 why = WHY_EXCEPTION;
738 }
739 else if (gettuplesize(v) < oparg) {
740 err_setstr(TypeError,
741 "not enough arguments");
742 why = WHY_EXCEPTION;
743 }
744 else if (oparg == 0) {
745 PUSH(v);
746 break;
747 }
748 else {
749 x = gettupleslice(v, oparg, gettuplesize(v));
750 if (x != NULL) {
751 PUSH(x);
752 for (; --oparg >= 0; ) {
753 w = gettupleitem(v, oparg);
754 INCREF(w);
755 PUSH(w);
756 }
757 }
758 }
759 DECREF(v);
760 break;
761
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000762 case UNPACK_ARG:
763 /* Implement various compatibility hacks:
764 (a) f(a,b,...) should accept f((1,2,...))
765 (b) f((a,b,...)) should accept f(1,2,...)
766 (c) f(self,(a,b,...)) should accept f(x,1,2,...)
767 */
768 {
769 int n;
770 if (EMPTY()) {
771 err_setstr(TypeError,
772 "no argument list");
773 why = WHY_EXCEPTION;
774 break;
775 }
776 v = POP();
777 if (!is_tupleobject(v)) {
778 err_setstr(TypeError,
779 "bad argument list");
780 why = WHY_EXCEPTION;
781 break;
782 }
783 n = gettuplesize(v);
784 if (n == 1 && oparg != 1) {
785 /* Rule (a) */
786 w = gettupleitem(v, 0);
787 if (is_tupleobject(w)) {
788 INCREF(w);
789 DECREF(v);
790 v = w;
791 n = gettuplesize(v);
792 }
793 }
794 else if (n != 1 && oparg == 1) {
795 /* Rule (b) */
796 PUSH(v);
797 break;
798 /* Don't fall through */
799 }
800 else if (n > 2 && oparg == 2) {
801 /* Rule (c) */
802 int i;
803 w = newtupleobject(n-1);
804 u = newtupleobject(2);
805 if (u == NULL || w == NULL) {
806 XDECREF(w);
807 XDECREF(u);
808 DECREF(v);
809 why = WHY_EXCEPTION;
810 break;
811 }
812 t = gettupleitem(v, 0);
813 INCREF(t);
814 settupleitem(u, 0, t);
815 for (i = 1; i < n; i++) {
816 t = gettupleitem(v, i);
817 INCREF(t);
818 settupleitem(w, i-1, t);
819 }
820 settupleitem(u, 1, w);
821 DECREF(v);
822 v = u;
823 n = 2;
824 }
825 if (n != oparg) {
826 err_setstr(TypeError,
827 "arg count mismatch");
828 why = WHY_EXCEPTION;
829 DECREF(v);
830 break;
831 }
832 PUSH(v);
833 }
834 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 case UNPACK_TUPLE:
836 v = POP();
837 if (!is_tupleobject(v)) {
838 err_setstr(TypeError, "unpack non-tuple");
839 why = WHY_EXCEPTION;
840 }
841 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000842 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 "unpack tuple of wrong size");
844 why = WHY_EXCEPTION;
845 }
846 else {
847 for (; --oparg >= 0; ) {
848 w = gettupleitem(v, oparg);
849 INCREF(w);
850 PUSH(w);
851 }
852 }
853 DECREF(v);
854 break;
855
856 case UNPACK_LIST:
857 v = POP();
858 if (!is_listobject(v)) {
859 err_setstr(TypeError, "unpack non-list");
860 why = WHY_EXCEPTION;
861 }
862 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000863 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000864 "unpack list of wrong size");
865 why = WHY_EXCEPTION;
866 }
867 else {
868 for (; --oparg >= 0; ) {
869 w = getlistitem(v, oparg);
870 INCREF(w);
871 PUSH(w);
872 }
873 }
874 DECREF(v);
875 break;
876
877 case STORE_ATTR:
878 name = GETNAME(oparg);
879 v = POP();
880 u = POP();
881 err = setattr(v, name, u); /* v.name = u */
882 DECREF(v);
883 DECREF(u);
884 break;
885
886 case DELETE_ATTR:
887 name = GETNAME(oparg);
888 v = POP();
889 err = setattr(v, name, (object *)NULL);
890 /* del v.name */
891 DECREF(v);
892 break;
893
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000894 case STORE_GLOBAL:
895 w = GETNAMEV(oparg);
896 v = POP();
897 err = dict2insert(f->f_globals, w, v);
898 DECREF(v);
899 break;
900
901 case DELETE_GLOBAL:
902 w = GETNAMEV(oparg);
903 if ((err = dict2remove(f->f_globals, w)) != 0)
904 err_setstr(NameError, getstringvalue(w));
905 break;
906
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 case LOAD_CONST:
908 x = GETCONST(oparg);
909 INCREF(x);
910 PUSH(x);
911 break;
912
913 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000914 w = GETNAMEV(oparg);
915 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000917 err_clear();
918 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000920 err_clear();
921 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000923 err_setstr(NameError,
924 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 break;
926 }
927 }
928 }
929 INCREF(x);
930 PUSH(x);
931 break;
932
933 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000934 w = GETNAMEV(oparg);
935 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000937 err_clear();
938 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000940 err_setstr(NameError,
941 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
943 }
944 }
945 INCREF(x);
946 PUSH(x);
947 break;
948
949 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000950 w = GETNAMEV(oparg);
951 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000953 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000954 break;
955 }
956 INCREF(x);
957 PUSH(x);
958 break;
959
960 case BUILD_TUPLE:
961 x = newtupleobject(oparg);
962 if (x != NULL) {
963 for (; --oparg >= 0;) {
964 w = POP();
965 err = settupleitem(x, oparg, w);
966 if (err != 0)
967 break;
968 }
969 PUSH(x);
970 }
971 break;
972
973 case BUILD_LIST:
974 x = newlistobject(oparg);
975 if (x != NULL) {
976 for (; --oparg >= 0;) {
977 w = POP();
978 err = setlistitem(x, oparg, w);
979 if (err != 0)
980 break;
981 }
982 PUSH(x);
983 }
984 break;
985
986 case BUILD_MAP:
987 x = newdictobject();
988 PUSH(x);
989 break;
990
991 case LOAD_ATTR:
992 name = GETNAME(oparg);
993 v = POP();
994 x = getattr(v, name);
995 DECREF(v);
996 PUSH(x);
997 break;
998
999 case COMPARE_OP:
1000 w = POP();
1001 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001002 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001003 DECREF(v);
1004 DECREF(w);
1005 PUSH(x);
1006 break;
1007
1008 case IMPORT_NAME:
1009 name = GETNAME(oparg);
1010 x = import_module(name);
1011 XINCREF(x);
1012 PUSH(x);
1013 break;
1014
1015 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001016 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001018 err = import_from(f->f_locals, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
1020
1021 case JUMP_FORWARD:
1022 JUMPBY(oparg);
1023 break;
1024
1025 case JUMP_IF_FALSE:
1026 if (!testbool(TOP()))
1027 JUMPBY(oparg);
1028 break;
1029
1030 case JUMP_IF_TRUE:
1031 if (testbool(TOP()))
1032 JUMPBY(oparg);
1033 break;
1034
1035 case JUMP_ABSOLUTE:
1036 JUMPTO(oparg);
1037 break;
1038
1039 case FOR_LOOP:
1040 /* for v in s: ...
1041 On entry: stack contains s, i.
1042 On exit: stack contains s, i+1, s[i];
1043 but if loop exhausted:
1044 s, i are popped, and we jump */
1045 w = POP(); /* Loop index */
1046 v = POP(); /* Sequence object */
1047 u = loop_subscript(v, w);
1048 if (u != NULL) {
1049 PUSH(v);
1050 x = newintobject(getintvalue(w)+1);
1051 PUSH(x);
1052 DECREF(w);
1053 PUSH(u);
1054 }
1055 else {
1056 DECREF(v);
1057 DECREF(w);
1058 /* A NULL can mean "s exhausted"
1059 but also an error: */
1060 if (err_occurred())
1061 why = WHY_EXCEPTION;
1062 else
1063 JUMPBY(oparg);
1064 }
1065 break;
1066
1067 case SETUP_LOOP:
1068 case SETUP_EXCEPT:
1069 case SETUP_FINALLY:
1070 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1071 STACK_LEVEL());
1072 break;
1073
1074 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001075#ifdef LLTRACE
1076 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 printf("--- Line %d ---\n", oparg);
1078#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001079 f->f_lineno = oparg;
1080 if (trace != NULL) {
1081 /* Trace each line of code reached */
1082 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001083 err = call_trace(&trace, &trace,
1084 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001085 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001086 break;
1087
1088 default:
1089 fprintf(stderr,
1090 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001091 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001092 err_setstr(SystemError, "eval_code: unknown opcode");
1093 why = WHY_EXCEPTION;
1094 break;
1095
1096 } /* switch */
1097
1098 on_error:
1099
1100 /* Quickly continue if no error occurred */
1101
1102 if (why == WHY_NOT) {
1103 if (err == 0 && x != NULL)
1104 continue; /* Normal, fast path */
1105 why = WHY_EXCEPTION;
1106 x = None;
1107 err = 0;
1108 }
1109
Guido van Rossum801dcae1992-04-08 11:32:32 +00001110#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 /* Double-check exception status */
1112
1113 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1114 if (!err_occurred()) {
1115 fprintf(stderr, "XXX ghost error\n");
1116 err_setstr(SystemError, "ghost error");
1117 why = WHY_EXCEPTION;
1118 }
1119 }
1120 else {
1121 if (err_occurred()) {
1122 fprintf(stderr, "XXX undetected error\n");
1123 why = WHY_EXCEPTION;
1124 }
1125 }
1126#endif
1127
1128 /* Log traceback info if this is a real exception */
1129
1130 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001131 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001133 f->f_lasti -= 2;
1134 tb_here(f);
1135
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001136 if (trace)
1137 call_exc_trace(&trace, &trace, f);
1138 if (sys_profile)
1139 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 }
1141
1142 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1143
1144 if (why == WHY_RERAISE)
1145 why = WHY_EXCEPTION;
1146
1147 /* Unwind stacks if a (pseudo) exception occurred */
1148
1149 while (why != WHY_NOT && f->f_iblock > 0) {
1150 block *b = pop_block(f);
1151 while (STACK_LEVEL() > b->b_level) {
1152 v = POP();
1153 XDECREF(v);
1154 }
1155 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1156 why = WHY_NOT;
1157 JUMPTO(b->b_handler);
1158 break;
1159 }
1160 if (b->b_type == SETUP_FINALLY ||
1161 b->b_type == SETUP_EXCEPT &&
1162 why == WHY_EXCEPTION) {
1163 if (why == WHY_EXCEPTION) {
1164 object *exc, *val;
1165 err_get(&exc, &val);
1166 if (val == NULL) {
1167 val = None;
1168 INCREF(val);
1169 }
1170 v = tb_fetch();
1171 /* Make the raw exception data
1172 available to the handler,
1173 so a program can emulate the
1174 Python main loop. Don't do
1175 this for 'finally'. */
1176 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 sysset("exc_value", val);
1179 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 }
1181 PUSH(v);
1182 PUSH(val);
1183 PUSH(exc);
1184 }
1185 else {
1186 if (why == WHY_RETURN)
1187 PUSH(retval);
1188 v = newintobject((long)why);
1189 PUSH(v);
1190 }
1191 why = WHY_NOT;
1192 JUMPTO(b->b_handler);
1193 break;
1194 }
1195 } /* unwind stack */
1196
1197 /* End the loop if we still have an error (or return) */
1198
1199 if (why != WHY_NOT)
1200 break;
1201
1202 } /* main loop */
1203
1204 /* Pop remaining stack entries */
1205
1206 while (!EMPTY()) {
1207 v = POP();
1208 XDECREF(v);
1209 }
1210
Guido van Rossum96a42c81992-01-12 02:29:51 +00001211 if (why != WHY_RETURN)
1212 retval = NULL;
1213
1214 if (trace) {
1215 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001216 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001217 XDECREF(retval);
1218 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001219 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001220 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001221 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001222 XDECREF(trace);
1223 }
1224
1225 if (sys_profile && why == WHY_RETURN) {
1226 if (call_trace(&sys_profile, (object**)0,
1227 f, "return", retval)) {
1228 XDECREF(retval);
1229 retval = NULL;
1230 why = WHY_EXCEPTION;
1231 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001232 }
1233
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 /* Restore previous frame and release the current one */
1235
1236 current_frame = f->f_back;
1237 DECREF(f);
1238
Guido van Rossum96a42c81992-01-12 02:29:51 +00001239 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001240}
1241
Guido van Rossum96a42c81992-01-12 02:29:51 +00001242#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001243static int
1244prtrace(v, str)
1245 object *v;
1246 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001249 if (printobject(v, stdout, 0) != 0)
1250 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001253#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001255static void
1256call_exc_trace(p_trace, p_newtrace, f)
1257 object **p_trace, **p_newtrace;
1258 frameobject *f;
1259{
1260 object *type, *value, *traceback, *arg;
1261 int err;
1262 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001263 if (value == NULL) {
1264 value = None;
1265 INCREF(value);
1266 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001267 traceback = tb_fetch();
1268 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001269 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001270 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001271 settupleitem(arg, 0, type);
1272 settupleitem(arg, 1, value);
1273 settupleitem(arg, 2, traceback);
1274 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001275 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001276 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001277 /* Restore original exception */
1278 err_setval(type, value);
1279 tb_store(traceback);
1280 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001281 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001282}
1283
1284static int
1285call_trace(p_trace, p_newtrace, f, msg, arg)
1286 object **p_trace; /* in/out; may not be NULL;
1287 may not point to NULL variable initially */
1288 object **p_newtrace; /* in/out; may be NULL;
1289 may point to NULL variable;
1290 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001291 frameobject *f;
1292 char *msg;
1293 object *arg;
1294{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001295 object *arglist, *what;
1296 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001297 static int tracing = 0;
1298
1299 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001300 /* Don't do recursive traces */
1301 if (p_newtrace) {
1302 XDECREF(*p_newtrace);
1303 *p_newtrace = NULL;
1304 }
1305 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001306 }
1307
1308 arglist = newtupleobject(3);
1309 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001310 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001311 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001312 if (what == NULL)
1313 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001314 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001315 settupleitem(arglist, 0, (object *)f);
1316 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001317 if (arg == NULL)
1318 arg = None;
1319 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001320 settupleitem(arglist, 2, arg);
1321 tracing++;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001322 res = call_object(*p_trace, arglist);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001323 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001324 cleanup:
1325 XDECREF(arglist);
1326 if (res == NULL) {
1327 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001328 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001329 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001330 *p_trace = NULL;
1331 if (p_newtrace) {
1332 XDECREF(*p_newtrace);
1333 *p_newtrace = NULL;
1334 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001335 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001336 }
1337 else {
1338 if (p_newtrace) {
1339 XDECREF(*p_newtrace);
1340 if (res == None)
1341 *p_newtrace = NULL;
1342 else {
1343 INCREF(res);
1344 *p_newtrace = res;
1345 }
1346 }
1347 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001348 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001349 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001350}
1351
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352object *
1353getlocals()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001355 if (current_frame == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001357 else
1358 return current_frame->f_locals;
1359}
1360
1361object *
1362getglobals()
1363{
1364 if (current_frame == NULL)
1365 return NULL;
1366 else
1367 return current_frame->f_globals;
1368}
1369
1370void
1371printtraceback(fp)
1372 FILE *fp;
1373{
1374 object *v = tb_fetch();
1375 if (v != NULL) {
1376 fprintf(fp, "Stack backtrace (innermost last):\n");
1377 tb_print(v, fp);
1378 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001379 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380}
1381
1382
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001383void
1384flushline()
1385{
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 if (softspace(sysget("stdout"), 0))
1387 fprintf(sysgetfile("stdout", stdout), "\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388}
1389
Guido van Rossum3f5da241990-12-20 15:06:42 +00001390
1391/* Test a value used as condition, e.g., in a for or if statement */
1392
1393static int
1394testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001395 object *v;
1396{
Guido van Rossum4965bc81991-05-14 11:51:49 +00001397 if (v == None)
1398 return 0;
1399 if (v->ob_type->tp_as_number != NULL)
1400 return (*v->ob_type->tp_as_number->nb_nonzero)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001401 if (v->ob_type->tp_as_sequence != NULL)
1402 return (*v->ob_type->tp_as_sequence->sq_length)(v) != 0;
1403 if (v->ob_type->tp_as_mapping != NULL)
1404 return (*v->ob_type->tp_as_mapping->mp_length)(v) != 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405 /* All other objects are 'true' */
1406 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001407}
1408
1409static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001410or(v, w)
1411 object *v, *w;
1412{
1413 if (v->ob_type->tp_as_number != NULL) {
1414 object *x;
1415 object * (*f) FPROTO((object *, object *));
1416 if (coerce(&v, &w) != 0)
1417 return NULL;
1418 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1419 x = (*f)(v, w);
1420 DECREF(v);
1421 DECREF(w);
1422 if (f != NULL)
1423 return x;
1424 }
1425 err_setstr(TypeError, "bad operand type(s) for |");
1426 return NULL;
1427}
1428
1429static object *
1430xor(v, w)
1431 object *v, *w;
1432{
1433 if (v->ob_type->tp_as_number != NULL) {
1434 object *x;
1435 object * (*f) FPROTO((object *, object *));
1436 if (coerce(&v, &w) != 0)
1437 return NULL;
1438 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1439 x = (*f)(v, w);
1440 DECREF(v);
1441 DECREF(w);
1442 if (f != NULL)
1443 return x;
1444 }
1445 err_setstr(TypeError, "bad operand type(s) for ^");
1446 return NULL;
1447}
1448
1449static object *
1450and(v, w)
1451 object *v, *w;
1452{
1453 if (v->ob_type->tp_as_number != NULL) {
1454 object *x;
1455 object * (*f) FPROTO((object *, object *));
1456 if (coerce(&v, &w) != 0)
1457 return NULL;
1458 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1459 x = (*f)(v, w);
1460 DECREF(v);
1461 DECREF(w);
1462 if (f != NULL)
1463 return x;
1464 }
1465 err_setstr(TypeError, "bad operand type(s) for &");
1466 return NULL;
1467}
1468
1469static object *
1470lshift(v, w)
1471 object *v, *w;
1472{
1473 if (v->ob_type->tp_as_number != NULL) {
1474 object *x;
1475 object * (*f) FPROTO((object *, object *));
1476 if (coerce(&v, &w) != 0)
1477 return NULL;
1478 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1479 x = (*f)(v, w);
1480 DECREF(v);
1481 DECREF(w);
1482 if (f != NULL)
1483 return x;
1484 }
1485 err_setstr(TypeError, "bad operand type(s) for <<");
1486 return NULL;
1487}
1488
1489static object *
1490rshift(v, w)
1491 object *v, *w;
1492{
1493 if (v->ob_type->tp_as_number != NULL) {
1494 object *x;
1495 object * (*f) FPROTO((object *, object *));
1496 if (coerce(&v, &w) != 0)
1497 return NULL;
1498 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1499 x = (*f)(v, w);
1500 DECREF(v);
1501 DECREF(w);
1502 if (f != NULL)
1503 return x;
1504 }
1505 err_setstr(TypeError, "bad operand type(s) for >>");
1506 return NULL;
1507}
1508
1509static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001510add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511 object *v, *w;
1512{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001513 if (v->ob_type->tp_as_number != NULL) {
1514 object *x;
1515 if (coerce(&v, &w) != 0)
1516 return NULL;
1517 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1518 DECREF(v);
1519 DECREF(w);
1520 return x;
1521 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 else if (v->ob_type->tp_as_sequence != NULL)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001523 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001525 err_setstr(TypeError, "+ not supported by operands");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526 return NULL;
1527 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528}
1529
1530static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001531sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 object *v, *w;
1533{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001534 if (v->ob_type->tp_as_number != NULL) {
1535 object *x;
1536 if (coerce(&v, &w) != 0)
1537 return NULL;
1538 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1539 DECREF(v);
1540 DECREF(w);
1541 return x;
1542 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001543 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001544 return NULL;
1545}
1546
1547static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001548mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 object *v, *w;
1550{
1551 typeobject *tp;
1552 if (is_intobject(v) && w->ob_type->tp_as_sequence != NULL) {
1553 /* int*sequence -- swap v and w */
1554 object *tmp = v;
1555 v = w;
1556 w = tmp;
1557 }
1558 tp = v->ob_type;
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001559 if (tp->tp_as_number != NULL) {
1560 object *x;
1561 if (coerce(&v, &w) != 0)
1562 return NULL;
1563 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1564 DECREF(v);
1565 DECREF(w);
1566 return x;
1567 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 if (tp->tp_as_sequence != NULL) {
1569 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 err_setstr(TypeError,
1571 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572 return NULL;
1573 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001574 return (*tp->tp_as_sequence->sq_repeat)
1575 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001577 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001578 return NULL;
1579}
1580
1581static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001582divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 object *v, *w;
1584{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001585 if (v->ob_type->tp_as_number != NULL) {
1586 object *x;
1587 if (coerce(&v, &w) != 0)
1588 return NULL;
1589 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1590 DECREF(v);
1591 DECREF(w);
1592 return x;
1593 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001594 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595 return NULL;
1596}
1597
1598static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001599rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001600 object *v, *w;
1601{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001602 if (v->ob_type->tp_as_number != NULL) {
1603 object *x;
1604 if (coerce(&v, &w) != 0)
1605 return NULL;
1606 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1607 DECREF(v);
1608 DECREF(w);
1609 return x;
1610 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001611 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612 return NULL;
1613}
1614
1615static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001616neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617 object *v;
1618{
1619 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620 return (*v->ob_type->tp_as_number->nb_negative)(v);
1621 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 return NULL;
1623}
1624
1625static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627 object *v;
1628{
1629 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630 return (*v->ob_type->tp_as_number->nb_positive)(v);
1631 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 return NULL;
1633}
1634
1635static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001636invert(v)
1637 object *v;
1638{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001639 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001640 if (v->ob_type->tp_as_number != NULL &&
1641 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1642 return (*f)(v);
1643 err_setstr(TypeError, "bad operand type(s) for unary ~");
1644 return NULL;
1645}
1646
1647static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001648not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 object *v;
1650{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001651 int outcome = testbool(v);
1652 object *w = outcome == 0 ? True : False;
1653 INCREF(w);
1654 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001656/* External interface to call any callable object. The arg may be NULL. */
1657
1658object *
1659call_object(func, arg)
1660 object *func;
1661 object *arg;
1662{
1663 if (is_instancemethodobject(func) || is_funcobject(func))
1664 return call_function(func, arg);
1665 else
1666 return call_builtin(func, arg);
1667}
1668
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001670call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001671 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001672 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001673{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001674 if (is_methodobject(func)) {
1675 method meth = getmethod(func);
1676 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001677 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1678 int size = gettuplesize(arg);
1679 if (size == 1)
1680 arg = gettupleitem(arg, 0);
1681 else if (size == 0)
1682 arg = NULL;
1683 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001684 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 }
1686 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001687 if (arg != NULL &&
1688 !(is_tupleobject(arg) &&
1689 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001690 err_setstr(TypeError,
1691 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692 return NULL;
1693 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697 return NULL;
1698}
1699
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001701call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001704{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001705 object *newarg = NULL;
1706 object *newlocals, *newglobals;
1707 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001708
Guido van Rossume8122f11991-05-05 20:03:07 +00001709 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001710 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001711 object *self = instancemethodgetself(func);
1712 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001713 if (arg == NULL)
1714 argcount = 0;
1715 else if (is_tupleobject(arg))
1716 argcount = gettuplesize(arg);
1717 else
1718 argcount = 1;
1719 newarg = newtupleobject(argcount + 1);
1720 if (newarg == NULL)
1721 return NULL;
1722 INCREF(self);
1723 settupleitem(newarg, 0, self);
1724 if (arg != NULL && !is_tupleobject(arg)) {
1725 INCREF(arg);
1726 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 }
1728 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001729 int i;
1730 object *v;
1731 for (i = 0; i < argcount; i++) {
1732 v = gettupleitem(arg, i);
1733 XINCREF(v);
1734 settupleitem(newarg, i+1, v);
1735 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001736 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001737 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738 }
1739 else {
1740 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001741 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 return NULL;
1743 }
1744 }
1745
Guido van Rossum3f5da241990-12-20 15:06:42 +00001746 co = getfunccode(func);
1747 if (co == NULL) {
1748 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001749 return NULL;
1750 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001751 if (!is_codeobject(co)) {
1752 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753 abort();
1754 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001755 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001756 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001757 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758 return NULL;
1759 }
1760
Guido van Rossum3f5da241990-12-20 15:06:42 +00001761 newglobals = getfuncglobals(func);
1762 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001763
Guido van Rossum3f5da241990-12-20 15:06:42 +00001764 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001765
Guido van Rossum3f5da241990-12-20 15:06:42 +00001766 DECREF(newlocals);
1767 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770
1771 return v;
1772}
1773
1774static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 object *v, *w;
1777{
1778 typeobject *tp = v->ob_type;
1779 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001780 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001781 return NULL;
1782 }
1783 if (tp->tp_as_sequence != NULL) {
1784 int i;
1785 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001786 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 return NULL;
1788 }
1789 i = getintvalue(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001790 if (i < 0)
1791 i += (*tp->tp_as_sequence->sq_length)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001792 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001793 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001794 return (*tp->tp_as_mapping->mp_subscript)(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795}
1796
1797static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001798loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 object *v, *w;
1800{
1801 sequence_methods *sq = v->ob_type->tp_as_sequence;
1802 int i, n;
1803 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001804 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805 return NULL;
1806 }
1807 i = getintvalue(w);
1808 n = (*sq->sq_length)(v);
1809 if (i >= n)
1810 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001811 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812}
1813
1814static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 object *v;
1817 int isize;
1818 int *pi;
1819{
1820 if (v != NULL) {
1821 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001822 err_setstr(TypeError, "slice index must be int");
1823 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824 }
1825 *pi = getintvalue(v);
1826 if (*pi < 0)
1827 *pi += isize;
1828 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001829 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830}
1831
1832static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001833apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001834 object *u, *v, *w;
1835{
1836 typeobject *tp = u->ob_type;
1837 int ilow, ihigh, isize;
1838 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001839 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840 return NULL;
1841 }
1842 ilow = 0;
1843 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001844 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001846 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001848 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001850
1851static int
1852assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 object *w;
1854 object *key;
1855 object *v;
1856{
1857 typeobject *tp = w->ob_type;
1858 sequence_methods *sq;
1859 mapping_methods *mp;
1860 int (*func)();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861 if ((sq = tp->tp_as_sequence) != NULL &&
1862 (func = sq->sq_ass_item) != NULL) {
1863 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00001865 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001866 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00001868 else {
1869 int i = getintvalue(key);
1870 if (i < 0)
Guido van Rossum626dae71992-01-10 00:28:07 +00001871 i += (*sq->sq_length)(w);
Guido van Rossum98256aa1991-12-24 13:25:19 +00001872 return (*func)(w, i, v);
1873 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 }
1875 else if ((mp = tp->tp_as_mapping) != NULL &&
1876 (func = mp->mp_ass_subscript) != NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001877 return (*func)(w, key, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878 }
1879 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880 err_setstr(TypeError,
1881 "can't assign to this subscripted object");
1882 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001883 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884}
1885
Guido van Rossum3f5da241990-12-20 15:06:42 +00001886static int
1887assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001888 object *u, *v, *w, *x;
1889{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001890 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892 if (sq == NULL) {
1893 err_setstr(TypeError, "assign to slice of non-sequence");
1894 return -1;
1895 }
1896 if (sq == NULL || sq->sq_ass_slice == NULL) {
1897 err_setstr(TypeError, "unassignable slice");
1898 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001899 }
1900 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001901 isize = ihigh = (*sq->sq_length)(u);
1902 if (slice_index(v, isize, &ilow) != 0)
1903 return -1;
1904 if (slice_index(w, isize, &ihigh) != 0)
1905 return -1;
1906 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001907}
1908
1909static int
1910cmp_exception(err, v)
1911 object *err, *v;
1912{
1913 if (is_tupleobject(v)) {
1914 int i, n;
1915 n = gettuplesize(v);
1916 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001917 /* Test recursively */
1918 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 return 1;
1920 }
1921 return 0;
1922 }
1923 return err == v;
1924}
1925
Guido van Rossum3f5da241990-12-20 15:06:42 +00001926static int
1927cmp_member(v, w)
1928 object *v, *w;
1929{
1930 int i, n, cmp;
1931 object *x;
1932 sequence_methods *sq;
1933 /* Special case for char in string */
1934 if (is_stringobject(w)) {
1935 register char *s, *end;
1936 register char c;
1937 if (!is_stringobject(v) || getstringsize(v) != 1) {
1938 err_setstr(TypeError,
1939 "string member test needs char left operand");
1940 return -1;
1941 }
1942 c = getstringvalue(v)[0];
1943 s = getstringvalue(w);
1944 end = s + getstringsize(w);
1945 while (s < end) {
1946 if (c == *s++)
1947 return 1;
1948 }
1949 return 0;
1950 }
1951 sq = w->ob_type->tp_as_sequence;
1952 if (sq == NULL) {
1953 err_setstr(TypeError,
1954 "'in' or 'not in' needs sequence right argument");
1955 return -1;
1956 }
1957 n = (*sq->sq_length)(w);
1958 for (i = 0; i < n; i++) {
1959 x = (*sq->sq_item)(w, i);
1960 cmp = cmpobject(v, x);
1961 XDECREF(x);
1962 if (cmp == 0)
1963 return 1;
1964 }
1965 return 0;
1966}
1967
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001969cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001970 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 register object *v;
1972 register object *w;
1973{
1974 register int cmp;
1975 register int res = 0;
1976 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977 case IS:
1978 case IS_NOT:
1979 res = (v == w);
1980 if (op == IS_NOT)
1981 res = !res;
1982 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 case IN:
1984 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985 res = cmp_member(v, w);
1986 if (res < 0)
1987 return NULL;
1988 if (op == NOT_IN)
1989 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 break;
1991 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001992 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 break;
1994 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00001995 cmp = cmpobject(v, w);
1996 switch (op) {
1997 case LT: res = cmp < 0; break;
1998 case LE: res = cmp <= 0; break;
1999 case EQ: res = cmp == 0; break;
2000 case NE: res = cmp != 0; break;
2001 case GT: res = cmp > 0; break;
2002 case GE: res = cmp >= 0; break;
2003 /* XXX no default? (res is initialized to 0 though) */
2004 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 }
2006 v = res ? True : False;
2007 INCREF(v);
2008 return v;
2009}
2010
Guido van Rossum3f5da241990-12-20 15:06:42 +00002011static int
2012import_from(locals, v, name)
2013 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002014 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002015 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002016{
2017 object *w, *x;
2018 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002019 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002020 int i;
2021 int n = getdictsize(w);
2022 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002023 name = getdict2key(w, i);
2024 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002025 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002026 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002027 if (x == NULL) {
2028 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002029 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002030 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002031 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002032 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002033 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002034 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002035 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002036 }
2037 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002038 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002039 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002040 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002041 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002042 getstringvalue(name));
2043 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002044 return -1;
2045 }
2046 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002047 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002048 }
2049}
2050
2051static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002052build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002053 object *v; /* None or tuple containing base classes */
2054 object *w; /* dictionary */
2055{
2056 if (is_tupleobject(v)) {
2057 int i;
2058 for (i = gettuplesize(v); --i >= 0; ) {
2059 object *x = gettupleitem(v, i);
2060 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002061 err_setstr(TypeError,
2062 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002063 return NULL;
2064 }
2065 }
2066 }
2067 else {
2068 v = NULL;
2069 }
2070 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002072 return NULL;
2073 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002074 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002075}