blob: 935ce527b148da476bcc18b9e23c0fd35c874bed [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum34679b71993-01-26 13:33:44 +00002Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
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: */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000040/* #define CASE_TOO_BIG 1 /**/
Guido van Rossum04691fc1992-08-12 15:35:34 +000041
Guido van Rossumacbe8da1993-04-15 15:33:52 +000042/* Turn this on if you want to debug the interpreter: */
43/* (This can be on even if NDEBUG is defined) */
44/* #define DEBUG 1 /**/
45
46#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000047/* For debugging the interpreter: */
48#define LLTRACE 1 /* Low-level trace feature */
49#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000050#endif
51
Guido van Rossum5b722181993-03-30 17:46:03 +000052
Guido van Rossum374a9221991-04-04 10:40:29 +000053/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000054
Guido van Rossum0a066c01992-03-27 17:29:15 +000055#ifdef LLTRACE
56static int prtrace PROTO((object *, char *));
57#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000058static void call_exc_trace PROTO((object **, object**, frameobject *));
59static int call_trace
60 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000061static int testbool PROTO((object *));
62static object *add PROTO((object *, object *));
63static object *sub PROTO((object *, object *));
64static object *mul PROTO((object *, object *));
65static object *divide PROTO((object *, object *));
66static object *rem PROTO((object *, object *));
67static object *neg PROTO((object *));
68static object *pos PROTO((object *));
69static object *not PROTO((object *));
70static object *invert PROTO((object *));
71static object *lshift PROTO((object *, object *));
72static object *rshift PROTO((object *, object *));
73static object *and PROTO((object *, object *));
74static object *xor PROTO((object *, object *));
75static object *or PROTO((object *, object *));
76static object *call_builtin PROTO((object *, object *));
77static object *call_function PROTO((object *, object *));
78static object *apply_subscript PROTO((object *, object *));
79static object *loop_subscript PROTO((object *, object *));
80static int slice_index PROTO((object *, int, int *));
81static object *apply_slice PROTO((object *, object *, object *));
82static int assign_subscript PROTO((object *, object *, object *));
83static int assign_slice PROTO((object *, object *, object *, object *));
84static int cmp_exception PROTO((object *, object *));
85static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000086static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000087static int import_from PROTO((object *, object *, object *));
88static object *build_class PROTO((object *, object *));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +000089static void locals_2_fast PROTO((frameobject *, int));
Guido van Rossum5b722181993-03-30 17:46:03 +000090static void fast_2_locals PROTO((frameobject *));
Guido van Rossum374a9221991-04-04 10:40:29 +000091
92
Guido van Rossum0a066c01992-03-27 17:29:15 +000093/* Pointer to current frame, used to link new frames to */
94
Guido van Rossum374a9221991-04-04 10:40:29 +000095static frameobject *current_frame;
96
Guido van Rossum1984f1e1992-08-04 12:41:02 +000097#ifdef USE_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000098
Guido van Rossum1984f1e1992-08-04 12:41:02 +000099#include <errno.h>
100#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000102static type_lock interpreter_lock;
103
104void
105init_save_thread()
106{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000108 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109 interpreter_lock = allocate_lock();
110 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113#endif
114
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115/* Functions save_thread and restore_thread are always defined so
116 dynamically loaded modules needn't be compiled separately for use
117 with and without threads: */
118
Guido van Rossum04691fc1992-08-12 15:35:34 +0000119object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120save_thread()
121{
122#ifdef USE_THREAD
123 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000124 object *res;
125 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126 current_frame = NULL;
127 release_lock(interpreter_lock);
128 return res;
129 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000131 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132}
133
134void
135restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000136 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137{
138#ifdef USE_THREAD
139 if (interpreter_lock) {
140 int err;
141 err = errno;
142 acquire_lock(interpreter_lock, 1);
143 errno = err;
144 current_frame = (frameobject *)x;
145 }
146#endif
147}
148
149
Guido van Rossum374a9221991-04-04 10:40:29 +0000150/* Status code for main loop (reason for stack unwind) */
151
152enum why_code {
153 WHY_NOT, /* No error */
154 WHY_EXCEPTION, /* Exception occurred */
155 WHY_RERAISE, /* Exception re-raised by 'finally' */
156 WHY_RETURN, /* 'return' statement */
157 WHY_BREAK /* 'break' statement */
158};
159
160
161/* Interpreter main loop */
162
163object *
164eval_code(co, globals, locals, arg)
165 codeobject *co;
166 object *globals;
167 object *locals;
168 object *arg;
169{
170 register unsigned char *next_instr;
171 register int opcode; /* Current opcode */
172 register int oparg; /* Current opcode argument, if any */
173 register object **stack_pointer;
174 register enum why_code why; /* Reason for block stack unwind */
175 register int err; /* Error status -- nonzero if error */
176 register object *x; /* Result object -- NULL if error */
177 register object *v; /* Temporary objects popped off stack */
178 register object *w;
179 register object *u;
180 register object *t;
181 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000182 register listobject *fastlocals = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000183 object *trace = NULL; /* Trace function or NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000184 object *retval; /* Return value iff why == WHY_RETURN */
185 char *name; /* Name used by some instructions */
Guido van Rossum5b722181993-03-30 17:46:03 +0000186 int needmerge = 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000187#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000188 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000189#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000190#ifdef DEBUG
191 /* Make it easier to find out where we are with dbx */
192 char *filename = getstringvalue(co->co_filename);
193#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000194
195/* Code access macros */
196
197#define GETCONST(i) Getconst(f, i)
198#define GETNAME(i) Getname(f, i)
199#define GETNAMEV(i) Getnamev(f, i)
200#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
201#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
202#define NEXTOP() (*next_instr++)
203#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
204#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
205#define JUMPBY(x) (next_instr += (x))
206
207/* Stack manipulation macros */
208
209#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
210#define EMPTY() (STACK_LEVEL() == 0)
211#define TOP() (stack_pointer[-1])
212#define BASIC_PUSH(v) (*stack_pointer++ = (v))
213#define BASIC_POP() (*--stack_pointer)
214
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000215#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
216 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
217
Guido van Rossum96a42c81992-01-12 02:29:51 +0000218#ifdef LLTRACE
219#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
220#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000221#else
222#define PUSH(v) BASIC_PUSH(v)
223#define POP() BASIC_POP()
224#endif
225
Guido van Rossum5b722181993-03-30 17:46:03 +0000226 if (globals == NULL) {
227 globals = getglobals();
228 if (locals == NULL) {
229 locals = getlocals();
230 needmerge = 1;
231 }
232 }
233 else {
234 if (locals == NULL)
235 locals = globals;
236 }
237
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000238#ifdef LLTRACE
239 lltrace = dictlookup(globals, "__lltrace__") != NULL;
240#endif
241
Guido van Rossum374a9221991-04-04 10:40:29 +0000242 f = newframeobject(
243 current_frame, /*back*/
244 co, /*code*/
245 globals, /*globals*/
246 locals, /*locals*/
247 50, /*nvalues*/
248 20); /*nblocks*/
249 if (f == NULL)
250 return NULL;
251
252 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000253
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000254 if (sys_trace != NULL) {
255 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000256 be called on *every* entry to a code block.
257 Its return value, if not None, is a function that
258 will be called at the start of each executed line
259 of code. (Actually, the function must return
260 itself in order to continue tracing.)
261 The trace functions are called with three arguments:
262 a pointer to the current frame, a string indicating
263 why the function is called, and an argument which
264 depends on the situation. The global trace function
265 (sys.trace) is also called whenever an exception
266 is detected. */
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000267 if (call_trace(&sys_trace, &trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000268 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000269 current_frame = f->f_back;
270 DECREF(f);
271 return NULL;
272 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000273 }
274
275 if (sys_profile != NULL) {
276 /* Similar for sys_profile, except it needn't return
277 itself and isn't called for "line" events */
278 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
279 current_frame = f->f_back;
280 DECREF(f);
281 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000282 }
283 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000284
285 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000286 stack_pointer = f->f_valuestack;
287
288 if (arg != NULL) {
289 INCREF(arg);
290 PUSH(arg);
291 }
292
293 why = WHY_NOT;
294 err = 0;
295 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000296
297 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000298 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000299
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000300 /* Do periodic things.
301 Doing this every time through the loop would add
302 too much overhead (a function call per instruction).
303 So we do it only every tenth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000304
305 if (--ticker < 0) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000306 ticker = 10;
Guido van Rossum374a9221991-04-04 10:40:29 +0000307 if (intrcheck()) {
308 err_set(KeyboardInterrupt);
309 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000310 goto on_error;
311 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000312
313#ifdef USE_THREAD
314 if (interpreter_lock) {
315 /* Give another thread a chance */
316
317 current_frame = NULL;
318 release_lock(interpreter_lock);
319
320 /* Other threads may run now */
321
322 acquire_lock(interpreter_lock, 1);
323 current_frame = f;
324 }
325#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000326 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327
Guido van Rossum374a9221991-04-04 10:40:29 +0000328 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000329
330#ifdef DEBUG
331 f->f_lasti = INSTR_OFFSET();
332#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000333
334 opcode = NEXTOP();
335 if (HAS_ARG(opcode))
336 oparg = NEXTARG();
337
Guido van Rossum96a42c81992-01-12 02:29:51 +0000338#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000339 /* Instruction tracing */
340
Guido van Rossum96a42c81992-01-12 02:29:51 +0000341 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 if (HAS_ARG(opcode)) {
343 printf("%d: %d, %d\n",
344 (int) (INSTR_OFFSET() - 3),
345 opcode, oparg);
346 }
347 else {
348 printf("%d: %d\n",
349 (int) (INSTR_OFFSET() - 1), opcode);
350 }
351 }
352#endif
353
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000354 if (!CHECK_STACK(3)) {
355 x = NULL;
356 break;
357 }
358
Guido van Rossum374a9221991-04-04 10:40:29 +0000359 /* Main switch on opcode */
360
361 switch (opcode) {
362
363 /* BEWARE!
364 It is essential that any operation that fails sets either
365 x to NULL, err to nonzero, or why to anything but WHY_NOT,
366 and that no operation that succeeds does this! */
367
368 /* case STOP_CODE: this is an error! */
369
370 case POP_TOP:
371 v = POP();
372 DECREF(v);
373 break;
374
375 case ROT_TWO:
376 v = POP();
377 w = POP();
378 PUSH(v);
379 PUSH(w);
380 break;
381
382 case ROT_THREE:
383 v = POP();
384 w = POP();
385 x = POP();
386 PUSH(v);
387 PUSH(x);
388 PUSH(w);
389 break;
390
391 case DUP_TOP:
392 v = TOP();
393 INCREF(v);
394 PUSH(v);
395 break;
396
397 case UNARY_POSITIVE:
398 v = POP();
399 x = pos(v);
400 DECREF(v);
401 PUSH(x);
402 break;
403
404 case UNARY_NEGATIVE:
405 v = POP();
406 x = neg(v);
407 DECREF(v);
408 PUSH(x);
409 break;
410
411 case UNARY_NOT:
412 v = POP();
413 x = not(v);
414 DECREF(v);
415 PUSH(x);
416 break;
417
418 case UNARY_CONVERT:
419 v = POP();
420 x = reprobject(v);
421 DECREF(v);
422 PUSH(x);
423 break;
424
425 case UNARY_CALL:
426 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000427 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000428 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000429 DECREF(v);
430 PUSH(x);
431 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000432
433 case UNARY_INVERT:
434 v = POP();
435 x = invert(v);
436 DECREF(v);
437 PUSH(x);
438 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000439
440 case BINARY_MULTIPLY:
441 w = POP();
442 v = POP();
443 x = mul(v, w);
444 DECREF(v);
445 DECREF(w);
446 PUSH(x);
447 break;
448
449 case BINARY_DIVIDE:
450 w = POP();
451 v = POP();
452 x = divide(v, w);
453 DECREF(v);
454 DECREF(w);
455 PUSH(x);
456 break;
457
458 case BINARY_MODULO:
459 w = POP();
460 v = POP();
461 x = rem(v, w);
462 DECREF(v);
463 DECREF(w);
464 PUSH(x);
465 break;
466
467 case BINARY_ADD:
468 w = POP();
469 v = POP();
470 x = add(v, w);
471 DECREF(v);
472 DECREF(w);
473 PUSH(x);
474 break;
475
476 case BINARY_SUBTRACT:
477 w = POP();
478 v = POP();
479 x = sub(v, w);
480 DECREF(v);
481 DECREF(w);
482 PUSH(x);
483 break;
484
485 case BINARY_SUBSCR:
486 w = POP();
487 v = POP();
488 x = apply_subscript(v, w);
489 DECREF(v);
490 DECREF(w);
491 PUSH(x);
492 break;
493
494 case BINARY_CALL:
495 w = POP();
496 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000497 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000498 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000499 DECREF(v);
500 DECREF(w);
501 PUSH(x);
502 break;
503
Guido van Rossum7928cd71991-10-24 14:59:31 +0000504 case BINARY_LSHIFT:
505 w = POP();
506 v = POP();
507 x = lshift(v, w);
508 DECREF(v);
509 DECREF(w);
510 PUSH(x);
511 break;
512
513 case BINARY_RSHIFT:
514 w = POP();
515 v = POP();
516 x = rshift(v, w);
517 DECREF(v);
518 DECREF(w);
519 PUSH(x);
520 break;
521
522 case BINARY_AND:
523 w = POP();
524 v = POP();
525 x = and(v, w);
526 DECREF(v);
527 DECREF(w);
528 PUSH(x);
529 break;
530
531 case BINARY_XOR:
532 w = POP();
533 v = POP();
534 x = xor(v, w);
535 DECREF(v);
536 DECREF(w);
537 PUSH(x);
538 break;
539
540 case BINARY_OR:
541 w = POP();
542 v = POP();
543 x = or(v, w);
544 DECREF(v);
545 DECREF(w);
546 PUSH(x);
547 break;
548
Guido van Rossum374a9221991-04-04 10:40:29 +0000549 case SLICE+0:
550 case SLICE+1:
551 case SLICE+2:
552 case SLICE+3:
553 if ((opcode-SLICE) & 2)
554 w = POP();
555 else
556 w = NULL;
557 if ((opcode-SLICE) & 1)
558 v = POP();
559 else
560 v = NULL;
561 u = POP();
562 x = apply_slice(u, v, w);
563 DECREF(u);
564 XDECREF(v);
565 XDECREF(w);
566 PUSH(x);
567 break;
568
569 case STORE_SLICE+0:
570 case STORE_SLICE+1:
571 case STORE_SLICE+2:
572 case STORE_SLICE+3:
573 if ((opcode-STORE_SLICE) & 2)
574 w = POP();
575 else
576 w = NULL;
577 if ((opcode-STORE_SLICE) & 1)
578 v = POP();
579 else
580 v = NULL;
581 u = POP();
582 t = POP();
583 err = assign_slice(u, v, w, t); /* u[v:w] = t */
584 DECREF(t);
585 DECREF(u);
586 XDECREF(v);
587 XDECREF(w);
588 break;
589
590 case DELETE_SLICE+0:
591 case DELETE_SLICE+1:
592 case DELETE_SLICE+2:
593 case DELETE_SLICE+3:
594 if ((opcode-DELETE_SLICE) & 2)
595 w = POP();
596 else
597 w = NULL;
598 if ((opcode-DELETE_SLICE) & 1)
599 v = POP();
600 else
601 v = NULL;
602 u = POP();
603 err = assign_slice(u, v, w, (object *)NULL);
604 /* del u[v:w] */
605 DECREF(u);
606 XDECREF(v);
607 XDECREF(w);
608 break;
609
610 case STORE_SUBSCR:
611 w = POP();
612 v = POP();
613 u = POP();
614 /* v[w] = u */
615 err = assign_subscript(v, w, u);
616 DECREF(u);
617 DECREF(v);
618 DECREF(w);
619 break;
620
621 case DELETE_SUBSCR:
622 w = POP();
623 v = POP();
624 /* del v[w] */
625 err = assign_subscript(v, w, (object *)NULL);
626 DECREF(v);
627 DECREF(w);
628 break;
629
630 case PRINT_EXPR:
631 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 /* Print value except if procedure result */
633 if (v != None) {
634 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000635 x = sysget("stdout");
636 softspace(x, 1);
637 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 flushline();
639 }
640 DECREF(v);
641 break;
642
643 case PRINT_ITEM:
644 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000645 w = sysget("stdout");
646 if (softspace(w, 1))
647 writestring(" ", w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 if (is_stringobject(v)) {
649 char *s = getstringvalue(v);
650 int len = getstringsize(v);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000651 err = writeobject(v, w, PRINT_RAW);
652 if (err == 0 && len > 0 && s[len-1] == '\n')
653 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 }
655 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000656 err = writeobject(v, w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 }
658 DECREF(v);
659 break;
660
661 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000662 x = sysget("stdout");
663 if (x == NULL)
664 err_setstr(RuntimeError, "lost sys.stdout");
665 else {
666 writestring("\n", x);
667 softspace(x, 0);
668 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 break;
670
671 case BREAK_LOOP:
672 why = WHY_BREAK;
673 break;
674
675 case RAISE_EXCEPTION:
676 v = POP();
677 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000678 /* A tuple is equivalent to its first element here */
679 while (is_tupleobject(w)) {
680 u = w;
681 w = gettupleitem(u, 0);
682 DECREF(u);
683 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 if (!is_stringobject(w))
685 err_setstr(TypeError,
686 "exceptions must be strings");
687 else
688 err_setval(w, v);
689 DECREF(v);
690 DECREF(w);
691 why = WHY_EXCEPTION;
692 break;
693
694 case LOAD_LOCALS:
695 v = f->f_locals;
696 INCREF(v);
697 PUSH(v);
698 break;
699
700 case RETURN_VALUE:
701 retval = POP();
702 why = WHY_RETURN;
703 break;
704
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 case BUILD_FUNCTION:
706 v = POP();
707 x = newfuncobject(v, f->f_globals);
708 DECREF(v);
709 PUSH(x);
710 break;
711
712 case POP_BLOCK:
713 {
714 block *b = pop_block(f);
715 while (STACK_LEVEL() > b->b_level) {
716 v = POP();
717 DECREF(v);
718 }
719 }
720 break;
721
722 case END_FINALLY:
723 v = POP();
724 if (is_intobject(v)) {
725 why = (enum why_code) getintvalue(v);
726 if (why == WHY_RETURN)
727 retval = POP();
728 }
729 else if (is_stringobject(v)) {
730 w = POP();
731 err_setval(v, w);
732 DECREF(w);
733 w = POP();
734 tb_store(w);
735 DECREF(w);
736 why = WHY_RERAISE;
737 }
738 else if (v != None) {
739 err_setstr(SystemError,
740 "'finally' pops bad exception");
741 why = WHY_EXCEPTION;
742 }
743 DECREF(v);
744 break;
745
746 case BUILD_CLASS:
747 w = POP();
748 v = POP();
749 x = build_class(v, w);
750 PUSH(x);
751 DECREF(v);
752 DECREF(w);
753 break;
754
755 case STORE_NAME:
756 w = GETNAMEV(oparg);
757 v = POP();
758 err = dict2insert(f->f_locals, w, v);
759 DECREF(v);
760 break;
761
762 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000763 w = GETNAMEV(oparg);
764 if ((err = dict2remove(f->f_locals, w)) != 0)
765 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000767
768#ifdef CASE_TOO_BIG
769 default: switch (opcode) {
770#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000771
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000772 case UNPACK_VARARG:
773 if (EMPTY()) {
774 err_setstr(TypeError,
775 "no argument list");
776 why = WHY_EXCEPTION;
777 break;
778 }
779 v = POP();
780 if (!is_tupleobject(v)) {
781 err_setstr(TypeError,
782 "bad argument list");
783 why = WHY_EXCEPTION;
784 }
785 else if (gettuplesize(v) < oparg) {
786 err_setstr(TypeError,
787 "not enough arguments");
788 why = WHY_EXCEPTION;
789 }
790 else if (oparg == 0) {
791 PUSH(v);
792 break;
793 }
794 else {
795 x = gettupleslice(v, oparg, gettuplesize(v));
796 if (x != NULL) {
797 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000798 if (!CHECK_STACK(oparg)) {
799 x = NULL;
800 break;
801 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000802 for (; --oparg >= 0; ) {
803 w = gettupleitem(v, oparg);
804 INCREF(w);
805 PUSH(w);
806 }
807 }
808 }
809 DECREF(v);
810 break;
811
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000812 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000813 {
814 int n;
815 if (EMPTY()) {
816 err_setstr(TypeError,
817 "no argument list");
818 why = WHY_EXCEPTION;
819 break;
820 }
821 v = POP();
822 if (!is_tupleobject(v)) {
823 err_setstr(TypeError,
824 "bad argument list");
825 why = WHY_EXCEPTION;
826 break;
827 }
828 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000829#ifdef COMPAT_HACKS
830/* Implement various compatibility hacks (for 0.9.4 or earlier):
831 (a) f(a,b,...) accepts f((1,2,...))
832 (b) f((a,b,...)) accepts f(1,2,...)
833 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
834*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000835 if (n == 1 && oparg != 1) {
836 /* Rule (a) */
837 w = gettupleitem(v, 0);
838 if (is_tupleobject(w)) {
839 INCREF(w);
840 DECREF(v);
841 v = w;
842 n = gettuplesize(v);
843 }
844 }
845 else if (n != 1 && oparg == 1) {
846 /* Rule (b) */
847 PUSH(v);
848 break;
849 /* Don't fall through */
850 }
851 else if (n > 2 && oparg == 2) {
852 /* Rule (c) */
853 int i;
854 w = newtupleobject(n-1);
855 u = newtupleobject(2);
856 if (u == NULL || w == NULL) {
857 XDECREF(w);
858 XDECREF(u);
859 DECREF(v);
860 why = WHY_EXCEPTION;
861 break;
862 }
863 t = gettupleitem(v, 0);
864 INCREF(t);
865 settupleitem(u, 0, t);
866 for (i = 1; i < n; i++) {
867 t = gettupleitem(v, i);
868 INCREF(t);
869 settupleitem(w, i-1, t);
870 }
871 settupleitem(u, 1, w);
872 DECREF(v);
873 v = u;
874 n = 2;
875 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000876#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000877 if (n != oparg) {
878 err_setstr(TypeError,
879 "arg count mismatch");
880 why = WHY_EXCEPTION;
881 DECREF(v);
882 break;
883 }
884 PUSH(v);
885 }
886 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 case UNPACK_TUPLE:
888 v = POP();
889 if (!is_tupleobject(v)) {
890 err_setstr(TypeError, "unpack non-tuple");
891 why = WHY_EXCEPTION;
892 }
893 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000894 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 "unpack tuple of wrong size");
896 why = WHY_EXCEPTION;
897 }
898 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000899 if (!CHECK_STACK(oparg)) {
900 x = NULL;
901 break;
902 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 for (; --oparg >= 0; ) {
904 w = gettupleitem(v, oparg);
905 INCREF(w);
906 PUSH(w);
907 }
908 }
909 DECREF(v);
910 break;
911
912 case UNPACK_LIST:
913 v = POP();
914 if (!is_listobject(v)) {
915 err_setstr(TypeError, "unpack non-list");
916 why = WHY_EXCEPTION;
917 }
918 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000919 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 "unpack list of wrong size");
921 why = WHY_EXCEPTION;
922 }
923 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000924 if (!CHECK_STACK(oparg)) {
925 x = NULL;
926 break;
927 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 for (; --oparg >= 0; ) {
929 w = getlistitem(v, oparg);
930 INCREF(w);
931 PUSH(w);
932 }
933 }
934 DECREF(v);
935 break;
936
937 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000938 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 v = POP();
940 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000941 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 DECREF(v);
943 DECREF(u);
944 break;
945
946 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +0000947 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +0000949 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 DECREF(v);
951 break;
952
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000953 case STORE_GLOBAL:
954 w = GETNAMEV(oparg);
955 v = POP();
956 err = dict2insert(f->f_globals, w, v);
957 DECREF(v);
958 break;
959
960 case DELETE_GLOBAL:
961 w = GETNAMEV(oparg);
962 if ((err = dict2remove(f->f_globals, w)) != 0)
963 err_setstr(NameError, getstringvalue(w));
964 break;
965
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 case LOAD_CONST:
967 x = GETCONST(oparg);
968 INCREF(x);
969 PUSH(x);
970 break;
971
972 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000973 w = GETNAMEV(oparg);
974 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000975 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000976 err_clear();
977 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000979 err_clear();
980 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000982 err_setstr(NameError,
983 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 break;
985 }
986 }
987 }
988 INCREF(x);
989 PUSH(x);
990 break;
991
992 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000993 w = GETNAMEV(oparg);
994 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000996 err_clear();
997 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +0000999 err_setstr(NameError,
1000 getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 break;
1002 }
1003 }
1004 INCREF(x);
1005 PUSH(x);
1006 break;
1007
1008 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001009 w = GETNAMEV(oparg);
1010 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001012 err_setstr(NameError, getstringvalue(w));
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 break;
1014 }
1015 INCREF(x);
1016 PUSH(x);
1017 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001018
1019 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001020 x = GETCONST(oparg);
1021 if (x == None)
1022 break;
1023 if (x == NULL || !is_dictobject(x)) {
1024 fatal("bad RESERVE_FAST");
1025 err_setstr(SystemError, "bad RESERVE_FAST");
1026 x = NULL;
1027 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001028 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001029 XDECREF(f->f_fastlocals);
1030 XDECREF(f->f_localmap);
1031 INCREF(x);
1032 f->f_localmap = x;
1033 f->f_fastlocals = x = newlistobject(
1034 x->ob_type->tp_as_mapping->mp_length(x));
1035 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001036 break;
1037
1038 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001039 x = GETLISTITEM(fastlocals, oparg);
1040 if (x == NULL) {
1041 err_setstr(NameError,
1042 "undefined local variable");
1043 break;
1044 }
1045 INCREF(x);
1046 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001047 break;
1048
1049 case STORE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001050 w = GETLISTITEM(fastlocals, oparg);
1051 XDECREF(w);
1052 w = POP();
1053 GETLISTITEM(fastlocals, oparg) = w;
1054 break;
1055
1056 case DELETE_FAST:
1057 x = GETLISTITEM(fastlocals, oparg);
1058 if (x == NULL) {
1059 err_setstr(NameError,
1060 "undefined local variable");
1061 break;
1062 }
1063 DECREF(x);
1064 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001065 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001066
1067 case BUILD_TUPLE:
1068 x = newtupleobject(oparg);
1069 if (x != NULL) {
1070 for (; --oparg >= 0;) {
1071 w = POP();
1072 err = settupleitem(x, oparg, w);
1073 if (err != 0)
1074 break;
1075 }
1076 PUSH(x);
1077 }
1078 break;
1079
1080 case BUILD_LIST:
1081 x = newlistobject(oparg);
1082 if (x != NULL) {
1083 for (; --oparg >= 0;) {
1084 w = POP();
1085 err = setlistitem(x, oparg, w);
1086 if (err != 0)
1087 break;
1088 }
1089 PUSH(x);
1090 }
1091 break;
1092
1093 case BUILD_MAP:
1094 x = newdictobject();
1095 PUSH(x);
1096 break;
1097
1098 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001099 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001100 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001101 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 DECREF(v);
1103 PUSH(x);
1104 break;
1105
1106 case COMPARE_OP:
1107 w = POP();
1108 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001109 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 DECREF(v);
1111 DECREF(w);
1112 PUSH(x);
1113 break;
1114
1115 case IMPORT_NAME:
1116 name = GETNAME(oparg);
1117 x = import_module(name);
1118 XINCREF(x);
1119 PUSH(x);
1120 break;
1121
1122 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001123 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001125 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001126 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001127 break;
1128
1129 case JUMP_FORWARD:
1130 JUMPBY(oparg);
1131 break;
1132
1133 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001134 err = testbool(TOP());
1135 if (err > 0)
1136 err = 0;
1137 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 JUMPBY(oparg);
1139 break;
1140
1141 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001142 err = testbool(TOP());
1143 if (err > 0) {
1144 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001146 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 break;
1148
1149 case JUMP_ABSOLUTE:
1150 JUMPTO(oparg);
1151 break;
1152
1153 case FOR_LOOP:
1154 /* for v in s: ...
1155 On entry: stack contains s, i.
1156 On exit: stack contains s, i+1, s[i];
1157 but if loop exhausted:
1158 s, i are popped, and we jump */
1159 w = POP(); /* Loop index */
1160 v = POP(); /* Sequence object */
1161 u = loop_subscript(v, w);
1162 if (u != NULL) {
1163 PUSH(v);
1164 x = newintobject(getintvalue(w)+1);
1165 PUSH(x);
1166 DECREF(w);
1167 PUSH(u);
1168 }
1169 else {
1170 DECREF(v);
1171 DECREF(w);
1172 /* A NULL can mean "s exhausted"
1173 but also an error: */
1174 if (err_occurred())
1175 why = WHY_EXCEPTION;
1176 else
1177 JUMPBY(oparg);
1178 }
1179 break;
1180
1181 case SETUP_LOOP:
1182 case SETUP_EXCEPT:
1183 case SETUP_FINALLY:
1184 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1185 STACK_LEVEL());
1186 break;
1187
1188 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001189#ifdef LLTRACE
1190 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 printf("--- Line %d ---\n", oparg);
1192#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001193 f->f_lineno = oparg;
1194 if (trace != NULL) {
1195 /* Trace each line of code reached */
1196 f->f_lasti = INSTR_OFFSET();
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001197 err = call_trace(&trace, &trace,
1198 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001199 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 break;
1201
1202 default:
1203 fprintf(stderr,
1204 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001205 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 err_setstr(SystemError, "eval_code: unknown opcode");
1207 why = WHY_EXCEPTION;
1208 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001209
1210#ifdef CASE_TOO_BIG
1211 }
1212#endif
1213
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 } /* switch */
1215
1216 on_error:
1217
1218 /* Quickly continue if no error occurred */
1219
1220 if (why == WHY_NOT) {
1221 if (err == 0 && x != NULL)
1222 continue; /* Normal, fast path */
1223 why = WHY_EXCEPTION;
1224 x = None;
1225 err = 0;
1226 }
1227
Guido van Rossum801dcae1992-04-08 11:32:32 +00001228#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 /* Double-check exception status */
1230
1231 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1232 if (!err_occurred()) {
1233 fprintf(stderr, "XXX ghost error\n");
1234 err_setstr(SystemError, "ghost error");
1235 why = WHY_EXCEPTION;
1236 }
1237 }
1238 else {
1239 if (err_occurred()) {
1240 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001241 abort();
1242 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 why = WHY_EXCEPTION;
1244 }
1245 }
1246#endif
1247
1248 /* Log traceback info if this is a real exception */
1249
1250 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001251 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001253 f->f_lasti -= 2;
1254 tb_here(f);
1255
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001256 if (trace)
1257 call_exc_trace(&trace, &trace, f);
1258 if (sys_profile)
1259 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 }
1261
1262 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1263
1264 if (why == WHY_RERAISE)
1265 why = WHY_EXCEPTION;
1266
1267 /* Unwind stacks if a (pseudo) exception occurred */
1268
1269 while (why != WHY_NOT && f->f_iblock > 0) {
1270 block *b = pop_block(f);
1271 while (STACK_LEVEL() > b->b_level) {
1272 v = POP();
1273 XDECREF(v);
1274 }
1275 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1276 why = WHY_NOT;
1277 JUMPTO(b->b_handler);
1278 break;
1279 }
1280 if (b->b_type == SETUP_FINALLY ||
1281 b->b_type == SETUP_EXCEPT &&
1282 why == WHY_EXCEPTION) {
1283 if (why == WHY_EXCEPTION) {
1284 object *exc, *val;
1285 err_get(&exc, &val);
1286 if (val == NULL) {
1287 val = None;
1288 INCREF(val);
1289 }
1290 v = tb_fetch();
1291 /* Make the raw exception data
1292 available to the handler,
1293 so a program can emulate the
1294 Python main loop. Don't do
1295 this for 'finally'. */
1296 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 sysset("exc_value", val);
1299 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 }
1301 PUSH(v);
1302 PUSH(val);
1303 PUSH(exc);
1304 }
1305 else {
1306 if (why == WHY_RETURN)
1307 PUSH(retval);
1308 v = newintobject((long)why);
1309 PUSH(v);
1310 }
1311 why = WHY_NOT;
1312 JUMPTO(b->b_handler);
1313 break;
1314 }
1315 } /* unwind stack */
1316
1317 /* End the loop if we still have an error (or return) */
1318
1319 if (why != WHY_NOT)
1320 break;
1321
1322 } /* main loop */
1323
1324 /* Pop remaining stack entries */
1325
1326 while (!EMPTY()) {
1327 v = POP();
1328 XDECREF(v);
1329 }
1330
Guido van Rossum96a42c81992-01-12 02:29:51 +00001331 if (why != WHY_RETURN)
1332 retval = NULL;
1333
1334 if (trace) {
1335 if (why == WHY_RETURN) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001336 if (call_trace(&trace, &trace, f, "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001337 XDECREF(retval);
1338 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001339 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001340 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001341 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001342 XDECREF(trace);
1343 }
1344
1345 if (sys_profile && why == WHY_RETURN) {
1346 if (call_trace(&sys_profile, (object**)0,
1347 f, "return", retval)) {
1348 XDECREF(retval);
1349 retval = NULL;
1350 why = WHY_EXCEPTION;
1351 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001352 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001353
1354 if (fastlocals && (f->ob_refcnt > 1 || f->f_locals->ob_refcnt > 2))
1355 fast_2_locals(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001356
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 /* Restore previous frame and release the current one */
1358
1359 current_frame = f->f_back;
1360 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001361
1362 if (needmerge)
1363 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001364
Guido van Rossum96a42c81992-01-12 02:29:51 +00001365 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001366}
1367
Guido van Rossum96a42c81992-01-12 02:29:51 +00001368#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001369static int
1370prtrace(v, str)
1371 object *v;
1372 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001374 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001375 if (printobject(v, stdout, 0) != 0)
1376 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001377 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001379#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001381static void
1382call_exc_trace(p_trace, p_newtrace, f)
1383 object **p_trace, **p_newtrace;
1384 frameobject *f;
1385{
1386 object *type, *value, *traceback, *arg;
1387 int err;
1388 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001389 if (value == NULL) {
1390 value = None;
1391 INCREF(value);
1392 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001393 traceback = tb_fetch();
1394 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001395 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001396 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001397 settupleitem(arg, 0, type);
1398 settupleitem(arg, 1, value);
1399 settupleitem(arg, 2, traceback);
1400 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001401 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001402 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001403 /* Restore original exception */
1404 err_setval(type, value);
1405 tb_store(traceback);
1406 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001407 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001408}
1409
1410static int
1411call_trace(p_trace, p_newtrace, f, msg, arg)
1412 object **p_trace; /* in/out; may not be NULL;
1413 may not point to NULL variable initially */
1414 object **p_newtrace; /* in/out; may be NULL;
1415 may point to NULL variable;
1416 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001417 frameobject *f;
1418 char *msg;
1419 object *arg;
1420{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001421 object *arglist, *what;
1422 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001423 static int tracing = 0;
1424
1425 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001426 /* Don't do recursive traces */
1427 if (p_newtrace) {
1428 XDECREF(*p_newtrace);
1429 *p_newtrace = NULL;
1430 }
1431 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001432 }
1433
1434 arglist = newtupleobject(3);
1435 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001436 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001437 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001438 if (what == NULL)
1439 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001440 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001441 settupleitem(arglist, 0, (object *)f);
1442 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001443 if (arg == NULL)
1444 arg = None;
1445 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001446 settupleitem(arglist, 2, arg);
1447 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001448 fast_2_locals(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001449 res = call_object(*p_trace, arglist);
Guido van Rossum5b722181993-03-30 17:46:03 +00001450 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001451 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001452 cleanup:
1453 XDECREF(arglist);
1454 if (res == NULL) {
1455 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001456 tb_here(f);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001457 DECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001458 *p_trace = NULL;
1459 if (p_newtrace) {
1460 XDECREF(*p_newtrace);
1461 *p_newtrace = NULL;
1462 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001463 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001464 }
1465 else {
1466 if (p_newtrace) {
1467 XDECREF(*p_newtrace);
1468 if (res == None)
1469 *p_newtrace = NULL;
1470 else {
1471 INCREF(res);
1472 *p_newtrace = res;
1473 }
1474 }
1475 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001476 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001477 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001478}
1479
Guido van Rossum5b722181993-03-30 17:46:03 +00001480static void
1481fast_2_locals(f)
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001482 frameobject *f;
Guido van Rossum5b722181993-03-30 17:46:03 +00001483{
1484 /* Merge f->f_fastlocals into f->f_locals */
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001485 object *locals, *fast, *map;
Guido van Rossum5b722181993-03-30 17:46:03 +00001486 object *error_type, *error_value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001487 int i;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001488 if (f == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001489 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001490 locals = f->f_locals;
1491 fast = f->f_fastlocals;
1492 map = f->f_localmap;
1493 if (locals == NULL || fast == NULL || map == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +00001494 return;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001495 if (!is_dictobject(locals) || !is_listobject(fast) ||
1496 !is_dictobject(map))
Guido van Rossum5b722181993-03-30 17:46:03 +00001497 return;
1498 err_get(&error_type, &error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001499 i = getdictsize(map);
1500 while (--i >= 0) {
1501 object *key;
1502 object *value;
1503 int j;
1504 key = getdict2key(map, i);
1505 if (key == NULL)
1506 continue;
1507 value = dict2lookup(map, key);
1508 if (value == NULL || !is_intobject(value))
1509 continue;
1510 j = getintvalue(value);
1511 value = getlistitem(fast, j);
1512 if (value == NULL) {
1513 err_clear();
1514 if (dict2remove(locals, key) != 0)
1515 err_clear();
1516 }
1517 else {
1518 if (dict2insert(locals, key, value) != 0)
1519 err_clear();
1520 }
1521 }
Guido van Rossum5b722181993-03-30 17:46:03 +00001522 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001523}
1524
1525static void
1526locals_2_fast(f, clear)
1527 frameobject *f;
1528 int clear;
1529{
1530 /* Merge f->f_locals into f->f_fastlocals */
1531 object *locals, *fast, *map;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001532 object *error_type, *error_value;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001533 int i;
1534 if (f == NULL)
1535 return;
1536 locals = f->f_locals;
1537 fast = f->f_fastlocals;
1538 map = f->f_localmap;
1539 if (locals == NULL || fast == NULL || map == NULL)
1540 return;
1541 if (!is_dictobject(locals) || !is_listobject(fast) ||
1542 !is_dictobject(map))
1543 return;
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001544 err_get(&error_type, &error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001545 i = getdictsize(map);
1546 while (--i >= 0) {
1547 object *key;
1548 object *value;
1549 int j;
1550 key = getdict2key(map, i);
1551 if (key == NULL)
1552 continue;
1553 value = dict2lookup(map, key);
1554 if (value == NULL || !is_intobject(value))
1555 continue;
1556 j = getintvalue(value);
1557 value = dict2lookup(locals, key);
1558 if (value == NULL)
1559 err_clear();
1560 else
1561 INCREF(value);
1562 if (value != NULL || clear)
1563 if (setlistitem(fast, j, value) != 0)
1564 err_clear();
1565 }
Guido van Rossumacbe8da1993-04-15 15:33:52 +00001566 err_setval(error_type, error_value);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001567}
1568
1569void
1570mergelocals()
1571{
1572 locals_2_fast(current_frame, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001573}
1574
1575object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001576getlocals()
1577{
1578 if (current_frame == NULL)
1579 return NULL;
1580 fast_2_locals(current_frame);
1581 return current_frame->f_locals;
1582}
1583
1584object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001585getglobals()
1586{
1587 if (current_frame == NULL)
1588 return NULL;
1589 else
1590 return current_frame->f_globals;
1591}
1592
1593void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001594printtraceback(f)
1595 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596{
1597 object *v = tb_fetch();
1598 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001599 writestring("Stack backtrace (innermost last):\n", f);
1600 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603}
1604
1605
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606void
1607flushline()
1608{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001609 object *f = sysget("stdout");
1610 if (softspace(f, 0))
1611 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612}
1613
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614
Guido van Rossum04691fc1992-08-12 15:35:34 +00001615/* Test a value used as condition, e.g., in a for or if statement.
1616 Return -1 if an error occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617
1618static int
1619testbool(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620 object *v;
1621{
Guido van Rossum04691fc1992-08-12 15:35:34 +00001622 int res;
Guido van Rossum4965bc81991-05-14 11:51:49 +00001623 if (v == None)
Guido van Rossum04691fc1992-08-12 15:35:34 +00001624 res = 0;
1625 else if (v->ob_type->tp_as_number != NULL)
1626 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
1627 else if (v->ob_type->tp_as_mapping != NULL)
1628 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
1629 else if (v->ob_type->tp_as_sequence != NULL)
1630 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
1631 else
Guido van Rossumf9a2d331992-08-19 16:41:45 +00001632 res = 1;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001633 if (res > 0)
1634 res = 1;
1635 return res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636}
1637
1638static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001639or(v, w)
1640 object *v, *w;
1641{
1642 if (v->ob_type->tp_as_number != NULL) {
1643 object *x;
1644 object * (*f) FPROTO((object *, object *));
1645 if (coerce(&v, &w) != 0)
1646 return NULL;
1647 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1648 x = (*f)(v, w);
1649 DECREF(v);
1650 DECREF(w);
1651 if (f != NULL)
1652 return x;
1653 }
1654 err_setstr(TypeError, "bad operand type(s) for |");
1655 return NULL;
1656}
1657
1658static object *
1659xor(v, w)
1660 object *v, *w;
1661{
1662 if (v->ob_type->tp_as_number != NULL) {
1663 object *x;
1664 object * (*f) FPROTO((object *, object *));
1665 if (coerce(&v, &w) != 0)
1666 return NULL;
1667 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1668 x = (*f)(v, w);
1669 DECREF(v);
1670 DECREF(w);
1671 if (f != NULL)
1672 return x;
1673 }
1674 err_setstr(TypeError, "bad operand type(s) for ^");
1675 return NULL;
1676}
1677
1678static object *
1679and(v, w)
1680 object *v, *w;
1681{
1682 if (v->ob_type->tp_as_number != NULL) {
1683 object *x;
1684 object * (*f) FPROTO((object *, object *));
1685 if (coerce(&v, &w) != 0)
1686 return NULL;
1687 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1688 x = (*f)(v, w);
1689 DECREF(v);
1690 DECREF(w);
1691 if (f != NULL)
1692 return x;
1693 }
1694 err_setstr(TypeError, "bad operand type(s) for &");
1695 return NULL;
1696}
1697
1698static object *
1699lshift(v, w)
1700 object *v, *w;
1701{
1702 if (v->ob_type->tp_as_number != NULL) {
1703 object *x;
1704 object * (*f) FPROTO((object *, object *));
1705 if (coerce(&v, &w) != 0)
1706 return NULL;
1707 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1708 x = (*f)(v, w);
1709 DECREF(v);
1710 DECREF(w);
1711 if (f != NULL)
1712 return x;
1713 }
1714 err_setstr(TypeError, "bad operand type(s) for <<");
1715 return NULL;
1716}
1717
1718static object *
1719rshift(v, w)
1720 object *v, *w;
1721{
1722 if (v->ob_type->tp_as_number != NULL) {
1723 object *x;
1724 object * (*f) FPROTO((object *, object *));
1725 if (coerce(&v, &w) != 0)
1726 return NULL;
1727 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1728 x = (*f)(v, w);
1729 DECREF(v);
1730 DECREF(w);
1731 if (f != NULL)
1732 return x;
1733 }
1734 err_setstr(TypeError, "bad operand type(s) for >>");
1735 return NULL;
1736}
1737
1738static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001739add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001740 object *v, *w;
1741{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001742 if (v->ob_type->tp_as_sequence != NULL)
1743 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1744 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001745 object *x;
1746 if (coerce(&v, &w) != 0)
1747 return NULL;
1748 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1749 DECREF(v);
1750 DECREF(w);
1751 return x;
1752 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001753 err_setstr(TypeError, "bad operand type(s) for +");
1754 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755}
1756
1757static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001758sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 object *v, *w;
1760{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001761 if (v->ob_type->tp_as_number != NULL) {
1762 object *x;
1763 if (coerce(&v, &w) != 0)
1764 return NULL;
1765 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1766 DECREF(v);
1767 DECREF(w);
1768 return x;
1769 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001770 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001771 return NULL;
1772}
1773
1774static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001775mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 object *v, *w;
1777{
1778 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001779 tp = v->ob_type;
1780 if (tp->tp_as_number != NULL &&
1781 w->ob_type->tp_as_sequence != NULL &&
1782 !is_instanceobject(v)) {
1783 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001784 object *tmp = v;
1785 v = w;
1786 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001787 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001788 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001789 if (tp->tp_as_number != NULL) {
1790 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001791 if (is_instanceobject(v)) {
1792 /* Instances of user-defined classes get their
1793 other argument uncoerced, so they may
1794 implement sequence*number as well as
1795 number*number. */
1796 INCREF(v);
1797 INCREF(w);
1798 }
1799 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001800 return NULL;
1801 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1802 DECREF(v);
1803 DECREF(w);
1804 return x;
1805 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 if (tp->tp_as_sequence != NULL) {
1807 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001808 err_setstr(TypeError,
1809 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810 return NULL;
1811 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001812 return (*tp->tp_as_sequence->sq_repeat)
1813 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 return NULL;
1817}
1818
1819static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001820divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 object *v, *w;
1822{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001823 if (v->ob_type->tp_as_number != NULL) {
1824 object *x;
1825 if (coerce(&v, &w) != 0)
1826 return NULL;
1827 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1828 DECREF(v);
1829 DECREF(w);
1830 return x;
1831 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001832 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 return NULL;
1834}
1835
1836static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001837rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838 object *v, *w;
1839{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001840 if (v->ob_type->tp_as_number != NULL) {
1841 object *x;
1842 if (coerce(&v, &w) != 0)
1843 return NULL;
1844 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1845 DECREF(v);
1846 DECREF(w);
1847 return x;
1848 }
Guido van Rossume5372401993-03-16 12:15:04 +00001849 if (is_stringobject(v)) {
1850 return formatstring(v, w);
1851 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001852 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 return NULL;
1854}
1855
1856static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001857neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 object *v;
1859{
1860 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001861 return (*v->ob_type->tp_as_number->nb_negative)(v);
1862 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 return NULL;
1864}
1865
1866static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868 object *v;
1869{
1870 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001871 return (*v->ob_type->tp_as_number->nb_positive)(v);
1872 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001873 return NULL;
1874}
1875
1876static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001877invert(v)
1878 object *v;
1879{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001880 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001881 if (v->ob_type->tp_as_number != NULL &&
1882 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1883 return (*f)(v);
1884 err_setstr(TypeError, "bad operand type(s) for unary ~");
1885 return NULL;
1886}
1887
1888static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001889not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001890 object *v;
1891{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001893 object *w;
1894 if (outcome < 0)
1895 return NULL;
1896 if (outcome == 0)
1897 w = True;
1898 else
1899 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001900 INCREF(w);
1901 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001902}
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001903/* External interface to call any callable object. The arg may be NULL. */
1904
1905object *
1906call_object(func, arg)
1907 object *func;
1908 object *arg;
1909{
1910 if (is_instancemethodobject(func) || is_funcobject(func))
1911 return call_function(func, arg);
1912 else
1913 return call_builtin(func, arg);
1914}
1915
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001917call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001919 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001920{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 if (is_methodobject(func)) {
1922 method meth = getmethod(func);
1923 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001924 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1925 int size = gettuplesize(arg);
1926 if (size == 1)
1927 arg = gettupleitem(arg, 0);
1928 else if (size == 0)
1929 arg = NULL;
1930 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001931 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 }
1933 if (is_classobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001934 if (arg != NULL &&
1935 !(is_tupleobject(arg) &&
1936 gettuplesize(arg) == 0)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001937 err_setstr(TypeError,
1938 "classobject() allows no arguments");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 return NULL;
1940 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001941 return newinstanceobject(func);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001943 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 return NULL;
1945}
1946
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001948call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001951{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952 object *newarg = NULL;
1953 object *newlocals, *newglobals;
1954 object *co, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955
Guido van Rossume8122f11991-05-05 20:03:07 +00001956 if (is_instancemethodobject(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001957 int argcount;
Guido van Rossume8122f11991-05-05 20:03:07 +00001958 object *self = instancemethodgetself(func);
1959 func = instancemethodgetfunc(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001960 if (arg == NULL)
1961 argcount = 0;
1962 else if (is_tupleobject(arg))
1963 argcount = gettuplesize(arg);
1964 else
1965 argcount = 1;
1966 newarg = newtupleobject(argcount + 1);
1967 if (newarg == NULL)
1968 return NULL;
1969 INCREF(self);
1970 settupleitem(newarg, 0, self);
1971 if (arg != NULL && !is_tupleobject(arg)) {
1972 INCREF(arg);
1973 settupleitem(newarg, 1, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 }
1975 else {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001976 int i;
1977 object *v;
1978 for (i = 0; i < argcount; i++) {
1979 v = gettupleitem(arg, i);
1980 XINCREF(v);
1981 settupleitem(newarg, i+1, v);
1982 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 }
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001984 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
1986 else {
1987 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 return NULL;
1990 }
1991 }
1992
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993 co = getfunccode(func);
1994 if (co == NULL) {
1995 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 return NULL;
1997 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001998 if (!is_codeobject(co)) {
1999 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 abort();
2001 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002002 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002004 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 return NULL;
2006 }
2007
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008 newglobals = getfuncglobals(func);
2009 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010
Guido van Rossum3f5da241990-12-20 15:06:42 +00002011 v = eval_code((codeobject *)co, newglobals, newlocals, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013 DECREF(newlocals);
2014 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017
2018 return v;
2019}
2020
2021static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002022apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 object *v, *w;
2024{
2025 typeobject *tp = v->ob_type;
2026 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002027 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002028 return NULL;
2029 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002030 if (tp->tp_as_mapping != NULL) {
2031 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2032 }
2033 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034 int i;
2035 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002036 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 return NULL;
2038 }
2039 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002040 if (i < 0) {
2041 int len = (*tp->tp_as_sequence->sq_length)(v);
2042 if (len < 0)
2043 return NULL;
2044 i += len;
2045 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002046 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002047 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048}
2049
2050static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002051loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 object *v, *w;
2053{
2054 sequence_methods *sq = v->ob_type->tp_as_sequence;
2055 int i, n;
2056 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002057 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 return NULL;
2059 }
2060 i = getintvalue(w);
2061 n = (*sq->sq_length)(v);
Guido van Rossumd014ea61992-11-26 10:30:26 +00002062 if (n < 0)
2063 return NULL; /* Exception */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 if (i >= n)
2065 return NULL; /* End of loop */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 return (*sq->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067}
2068
2069static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002070slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 object *v;
2072 int isize;
2073 int *pi;
2074{
2075 if (v != NULL) {
2076 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 err_setstr(TypeError, "slice index must be int");
2078 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 }
2080 *pi = getintvalue(v);
2081 if (*pi < 0)
2082 *pi += isize;
2083 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085}
2086
2087static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002088apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089 object *u, *v, *w;
2090{
2091 typeobject *tp = u->ob_type;
2092 int ilow, ihigh, isize;
2093 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 return NULL;
2096 }
2097 ilow = 0;
2098 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002099 if (isize < 0)
2100 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107
2108static int
2109assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 object *w;
2111 object *key;
2112 object *v;
2113{
2114 typeobject *tp = w->ob_type;
2115 sequence_methods *sq;
2116 mapping_methods *mp;
2117 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002118 if ((mp = tp->tp_as_mapping) != NULL &&
2119 (func = mp->mp_ass_subscript) != NULL) {
2120 return (*func)(w, key, v);
2121 }
2122 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 (func = sq->sq_ass_item) != NULL) {
2124 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002125 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002126 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002127 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002128 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002129 else {
2130 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002131 if (i < 0) {
2132 int len = (*sq->sq_length)(w);
2133 if (len < 0)
2134 return -1;
2135 i += len;
2136 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002137 return (*func)(w, i, v);
2138 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141 err_setstr(TypeError,
2142 "can't assign to this subscripted object");
2143 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145}
2146
Guido van Rossum3f5da241990-12-20 15:06:42 +00002147static int
2148assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 object *u, *v, *w, *x;
2150{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002151 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002153 if (sq == NULL) {
2154 err_setstr(TypeError, "assign to slice of non-sequence");
2155 return -1;
2156 }
2157 if (sq == NULL || sq->sq_ass_slice == NULL) {
2158 err_setstr(TypeError, "unassignable slice");
2159 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 }
2161 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002162 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002163 if (isize < 0)
2164 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002165 if (slice_index(v, isize, &ilow) != 0)
2166 return -1;
2167 if (slice_index(w, isize, &ihigh) != 0)
2168 return -1;
2169 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170}
2171
2172static int
2173cmp_exception(err, v)
2174 object *err, *v;
2175{
2176 if (is_tupleobject(v)) {
2177 int i, n;
2178 n = gettuplesize(v);
2179 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002180 /* Test recursively */
2181 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 return 1;
2183 }
2184 return 0;
2185 }
2186 return err == v;
2187}
2188
Guido van Rossum3f5da241990-12-20 15:06:42 +00002189static int
2190cmp_member(v, w)
2191 object *v, *w;
2192{
2193 int i, n, cmp;
2194 object *x;
2195 sequence_methods *sq;
2196 /* Special case for char in string */
2197 if (is_stringobject(w)) {
2198 register char *s, *end;
2199 register char c;
2200 if (!is_stringobject(v) || getstringsize(v) != 1) {
2201 err_setstr(TypeError,
2202 "string member test needs char left operand");
2203 return -1;
2204 }
2205 c = getstringvalue(v)[0];
2206 s = getstringvalue(w);
2207 end = s + getstringsize(w);
2208 while (s < end) {
2209 if (c == *s++)
2210 return 1;
2211 }
2212 return 0;
2213 }
2214 sq = w->ob_type->tp_as_sequence;
2215 if (sq == NULL) {
2216 err_setstr(TypeError,
2217 "'in' or 'not in' needs sequence right argument");
2218 return -1;
2219 }
2220 n = (*sq->sq_length)(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002221 if (n < 0)
2222 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002223 for (i = 0; i < n; i++) {
2224 x = (*sq->sq_item)(w, i);
2225 cmp = cmpobject(v, x);
2226 XDECREF(x);
2227 if (cmp == 0)
2228 return 1;
2229 }
2230 return 0;
2231}
2232
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002234cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002235 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 register object *v;
2237 register object *w;
2238{
2239 register int cmp;
2240 register int res = 0;
2241 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 case IS:
2243 case IS_NOT:
2244 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002245 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 res = !res;
2247 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 case IN:
2249 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002250 res = cmp_member(v, w);
2251 if (res < 0)
2252 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002253 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002254 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255 break;
2256 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 break;
2259 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260 cmp = cmpobject(v, w);
2261 switch (op) {
2262 case LT: res = cmp < 0; break;
2263 case LE: res = cmp <= 0; break;
2264 case EQ: res = cmp == 0; break;
2265 case NE: res = cmp != 0; break;
2266 case GT: res = cmp > 0; break;
2267 case GE: res = cmp >= 0; break;
2268 /* XXX no default? (res is initialized to 0 though) */
2269 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270 }
2271 v = res ? True : False;
2272 INCREF(v);
2273 return v;
2274}
2275
Guido van Rossum3f5da241990-12-20 15:06:42 +00002276static int
2277import_from(locals, v, name)
2278 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002279 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002280 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002281{
2282 object *w, *x;
2283 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002284 if (getstringvalue(name)[0] == '*') {
Guido van Rossume9736fc1990-11-18 17:33:06 +00002285 int i;
2286 int n = getdictsize(w);
2287 for (i = 0; i < n; i++) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002288 name = getdict2key(w, i);
2289 if (name == NULL || getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002290 continue;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002291 x = dict2lookup(w, name);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002292 if (x == NULL) {
2293 /* XXX can't happen? */
Guido van Rossum98256aa1991-12-24 13:25:19 +00002294 err_setstr(SystemError, getstringvalue(name));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002295 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002296 }
Guido van Rossumdf62e441991-08-16 08:56:04 +00002297 if (dict2insert(locals, name, x) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002298 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002299 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002300 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002301 }
2302 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002303 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002305 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002306 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002307 getstringvalue(name));
2308 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 return -1;
2310 }
2311 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002312 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002313 }
2314}
2315
2316static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002317build_class(v, w)
Guido van Rossume9736fc1990-11-18 17:33:06 +00002318 object *v; /* None or tuple containing base classes */
2319 object *w; /* dictionary */
2320{
2321 if (is_tupleobject(v)) {
2322 int i;
2323 for (i = gettuplesize(v); --i >= 0; ) {
2324 object *x = gettupleitem(v, i);
2325 if (!is_classobject(x)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002326 err_setstr(TypeError,
2327 "base is not a class object");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002328 return NULL;
2329 }
2330 }
2331 }
2332 else {
2333 v = NULL;
2334 }
2335 if (!is_dictobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002336 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002337 return NULL;
2338 }
Guido van Rossum7e3090c1991-10-20 20:26:16 +00002339 return newclassobject(v, w, (object *) NULL);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002340}