blob: 829e7526aa69588f8d65e742c52b61dc998acb13 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume59214e1994-08-30 08:01:59 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum34679b71993-01-26 13:33:44 +00003Amsterdam, 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 Rossumdb3165e1993-10-18 17:06:59 +000038#include "graminit.h"
39#include "pythonrun.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040
Guido van Rossumc6004111993-11-05 10:22:19 +000041#include <ctype.h>
42
Guido van Rossume59214e1994-08-30 08:01:59 +000043extern int suppress_print; /* Declared in pythonrun.c, set in pythonmain.c */
44
Guido van Rossum04691fc1992-08-12 15:35:34 +000045/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000046/* #define CASE_TOO_BIG 1 /**/
Guido van Rossum04691fc1992-08-12 15:35:34 +000047
Guido van Rossumacbe8da1993-04-15 15:33:52 +000048/* Turn this on if you want to debug the interpreter: */
49/* (This can be on even if NDEBUG is defined) */
50/* #define DEBUG 1 /**/
51
52#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000053/* For debugging the interpreter: */
54#define LLTRACE 1 /* Low-level trace feature */
55#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000056#endif
57
Guido van Rossum5b722181993-03-30 17:46:03 +000058
Guido van Rossum374a9221991-04-04 10:40:29 +000059/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000060
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
62static int prtrace PROTO((object *, char *));
63#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000064static void call_exc_trace PROTO((object **, object**, frameobject *));
65static int call_trace
66 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000067static object *add PROTO((object *, object *));
68static object *sub PROTO((object *, object *));
69static object *mul PROTO((object *, object *));
70static object *divide PROTO((object *, object *));
71static object *rem PROTO((object *, object *));
72static object *neg PROTO((object *));
73static object *pos PROTO((object *));
74static object *not PROTO((object *));
75static object *invert PROTO((object *));
76static object *lshift PROTO((object *, object *));
77static object *rshift PROTO((object *, object *));
78static object *and PROTO((object *, object *));
79static object *xor PROTO((object *, object *));
80static object *or PROTO((object *, object *));
81static object *call_builtin PROTO((object *, object *));
82static object *call_function PROTO((object *, object *));
83static object *apply_subscript PROTO((object *, object *));
84static object *loop_subscript PROTO((object *, object *));
85static int slice_index PROTO((object *, int, int *));
86static object *apply_slice PROTO((object *, object *, object *));
87static int assign_subscript PROTO((object *, object *, object *));
88static int assign_slice PROTO((object *, object *, object *, object *));
89static int cmp_exception PROTO((object *, object *));
90static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000091static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000092static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000093static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000094static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000095static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum0a066c01992-03-27 17:29:15 +000098/* Pointer to current frame, used to link new frames to */
99
Guido van Rossum374a9221991-04-04 10:40:29 +0000100static frameobject *current_frame;
101
Guido van Rossume59214e1994-08-30 08:01:59 +0000102#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000103
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104#include <errno.h>
105#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000107static type_lock interpreter_lock;
108
109void
110init_save_thread()
111{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000113 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114 interpreter_lock = allocate_lock();
115 acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000116}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000117
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118#endif
119
Guido van Rossumff4949e1992-08-05 19:58:53 +0000120/* Functions save_thread and restore_thread are always defined so
121 dynamically loaded modules needn't be compiled separately for use
122 with and without threads: */
123
Guido van Rossum04691fc1992-08-12 15:35:34 +0000124object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125save_thread()
126{
Guido van Rossume59214e1994-08-30 08:01:59 +0000127#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000129 object *res;
130 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131 current_frame = NULL;
132 release_lock(interpreter_lock);
133 return res;
134 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000136 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137}
138
139void
140restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000141 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142{
Guido van Rossume59214e1994-08-30 08:01:59 +0000143#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144 if (interpreter_lock) {
145 int err;
146 err = errno;
147 acquire_lock(interpreter_lock, 1);
148 errno = err;
149 current_frame = (frameobject *)x;
150 }
151#endif
152}
153
154
Guido van Rossum374a9221991-04-04 10:40:29 +0000155/* Status code for main loop (reason for stack unwind) */
156
157enum why_code {
158 WHY_NOT, /* No error */
159 WHY_EXCEPTION, /* Exception occurred */
160 WHY_RERAISE, /* Exception re-raised by 'finally' */
161 WHY_RETURN, /* 'return' statement */
162 WHY_BREAK /* 'break' statement */
163};
164
165
166/* Interpreter main loop */
167
168object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000169eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000170 codeobject *co;
171 object *globals;
172 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000173 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000174 object *arg;
175{
176 register unsigned char *next_instr;
177 register int opcode; /* Current opcode */
178 register int oparg; /* Current opcode argument, if any */
179 register object **stack_pointer;
180 register enum why_code why; /* Reason for block stack unwind */
181 register int err; /* Error status -- nonzero if error */
182 register object *x; /* Result object -- NULL if error */
183 register object *v; /* Temporary objects popped off stack */
184 register object *w;
185 register object *u;
186 register object *t;
187 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000188 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000189 object *retval; /* Return value iff why == WHY_RETURN */
190 char *name; /* Name used by some instructions */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000191 int needmerge = 0; /* Set if need to merge locals back at end */
192 int defmode = 0; /* Default access mode for new variables */
Guido van Rossume59214e1994-08-30 08:01:59 +0000193 int ticker_count = 10; /* Check for intr every Nth instruction */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000194#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000195 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000196#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000197#ifdef DEBUG
198 /* Make it easier to find out where we are with dbx */
199 char *filename = getstringvalue(co->co_filename);
200#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000201
202/* Code access macros */
203
204#define GETCONST(i) Getconst(f, i)
205#define GETNAME(i) Getname(f, i)
206#define GETNAMEV(i) Getnamev(f, i)
207#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
208#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
209#define NEXTOP() (*next_instr++)
210#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
211#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
212#define JUMPBY(x) (next_instr += (x))
213
214/* Stack manipulation macros */
215
216#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
217#define EMPTY() (STACK_LEVEL() == 0)
218#define TOP() (stack_pointer[-1])
219#define BASIC_PUSH(v) (*stack_pointer++ = (v))
220#define BASIC_POP() (*--stack_pointer)
221
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000222#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
223 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
224
Guido van Rossum96a42c81992-01-12 02:29:51 +0000225#ifdef LLTRACE
226#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
227#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000228#else
229#define PUSH(v) BASIC_PUSH(v)
230#define POP() BASIC_POP()
231#endif
232
Guido van Rossum5b722181993-03-30 17:46:03 +0000233 if (globals == NULL) {
234 globals = getglobals();
235 if (locals == NULL) {
236 locals = getlocals();
237 needmerge = 1;
238 }
239 }
240 else {
241 if (locals == NULL)
242 locals = globals;
243 }
244
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000245#ifdef LLTRACE
246 lltrace = dictlookup(globals, "__lltrace__") != NULL;
247#endif
248
Guido van Rossum374a9221991-04-04 10:40:29 +0000249 f = newframeobject(
250 current_frame, /*back*/
251 co, /*code*/
252 globals, /*globals*/
253 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000254 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000255 50, /*nvalues*/
256 20); /*nblocks*/
257 if (f == NULL)
258 return NULL;
259
260 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000261
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000262 if (sys_trace != NULL) {
263 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000264 be called on *every* entry to a code block.
265 Its return value, if not None, is a function that
266 will be called at the start of each executed line
267 of code. (Actually, the function must return
268 itself in order to continue tracing.)
269 The trace functions are called with three arguments:
270 a pointer to the current frame, a string indicating
271 why the function is called, and an argument which
272 depends on the situation. The global trace function
273 (sys.trace) is also called whenever an exception
274 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000275 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000276 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000277 current_frame = f->f_back;
278 DECREF(f);
279 return NULL;
280 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000281 }
282
283 if (sys_profile != NULL) {
284 /* Similar for sys_profile, except it needn't return
285 itself and isn't called for "line" events */
286 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
287 current_frame = f->f_back;
288 DECREF(f);
289 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000290 }
291 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000292
293 x = sysget("check_interval");
294 if (x != NULL && is_intobject(x))
295 ticker_count = getintvalue(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000296
297 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000298 stack_pointer = f->f_valuestack;
299
300 if (arg != NULL) {
301 INCREF(arg);
302 PUSH(arg);
303 }
304
305 why = WHY_NOT;
306 err = 0;
307 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000308
309 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000310 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000311
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000312 /* Do periodic things.
313 Doing this every time through the loop would add
314 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000315 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000316
317 if (--ticker < 0) {
Guido van Rossume59214e1994-08-30 08:01:59 +0000318 ticker = ticker_count;
319 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000320 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000321 goto on_error;
322 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323
Guido van Rossume59214e1994-08-30 08:01:59 +0000324#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000325 if (interpreter_lock) {
326 /* Give another thread a chance */
327
328 current_frame = NULL;
329 release_lock(interpreter_lock);
330
331 /* Other threads may run now */
332
333 acquire_lock(interpreter_lock, 1);
334 current_frame = f;
335 }
336#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000337 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000338
Guido van Rossum374a9221991-04-04 10:40:29 +0000339 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000340
341#ifdef DEBUG
342 f->f_lasti = INSTR_OFFSET();
343#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000344
345 opcode = NEXTOP();
346 if (HAS_ARG(opcode))
347 oparg = NEXTARG();
348
Guido van Rossum96a42c81992-01-12 02:29:51 +0000349#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000350 /* Instruction tracing */
351
Guido van Rossum96a42c81992-01-12 02:29:51 +0000352 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000353 if (HAS_ARG(opcode)) {
354 printf("%d: %d, %d\n",
355 (int) (INSTR_OFFSET() - 3),
356 opcode, oparg);
357 }
358 else {
359 printf("%d: %d\n",
360 (int) (INSTR_OFFSET() - 1), opcode);
361 }
362 }
363#endif
364
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000365 if (!CHECK_STACK(3)) {
366 x = NULL;
367 break;
368 }
369
Guido van Rossum374a9221991-04-04 10:40:29 +0000370 /* Main switch on opcode */
371
372 switch (opcode) {
373
374 /* BEWARE!
375 It is essential that any operation that fails sets either
376 x to NULL, err to nonzero, or why to anything but WHY_NOT,
377 and that no operation that succeeds does this! */
378
379 /* case STOP_CODE: this is an error! */
380
381 case POP_TOP:
382 v = POP();
383 DECREF(v);
384 break;
385
386 case ROT_TWO:
387 v = POP();
388 w = POP();
389 PUSH(v);
390 PUSH(w);
391 break;
392
393 case ROT_THREE:
394 v = POP();
395 w = POP();
396 x = POP();
397 PUSH(v);
398 PUSH(x);
399 PUSH(w);
400 break;
401
402 case DUP_TOP:
403 v = TOP();
404 INCREF(v);
405 PUSH(v);
406 break;
407
408 case UNARY_POSITIVE:
409 v = POP();
410 x = pos(v);
411 DECREF(v);
412 PUSH(x);
413 break;
414
415 case UNARY_NEGATIVE:
416 v = POP();
417 x = neg(v);
418 DECREF(v);
419 PUSH(x);
420 break;
421
422 case UNARY_NOT:
423 v = POP();
424 x = not(v);
425 DECREF(v);
426 PUSH(x);
427 break;
428
429 case UNARY_CONVERT:
430 v = POP();
431 x = reprobject(v);
432 DECREF(v);
433 PUSH(x);
434 break;
435
436 case UNARY_CALL:
437 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000438 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000439 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000440 DECREF(v);
441 PUSH(x);
442 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000443
444 case UNARY_INVERT:
445 v = POP();
446 x = invert(v);
447 DECREF(v);
448 PUSH(x);
449 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000450
451 case BINARY_MULTIPLY:
452 w = POP();
453 v = POP();
454 x = mul(v, w);
455 DECREF(v);
456 DECREF(w);
457 PUSH(x);
458 break;
459
460 case BINARY_DIVIDE:
461 w = POP();
462 v = POP();
463 x = divide(v, w);
464 DECREF(v);
465 DECREF(w);
466 PUSH(x);
467 break;
468
469 case BINARY_MODULO:
470 w = POP();
471 v = POP();
472 x = rem(v, w);
473 DECREF(v);
474 DECREF(w);
475 PUSH(x);
476 break;
477
478 case BINARY_ADD:
479 w = POP();
480 v = POP();
481 x = add(v, w);
482 DECREF(v);
483 DECREF(w);
484 PUSH(x);
485 break;
486
487 case BINARY_SUBTRACT:
488 w = POP();
489 v = POP();
490 x = sub(v, w);
491 DECREF(v);
492 DECREF(w);
493 PUSH(x);
494 break;
495
496 case BINARY_SUBSCR:
497 w = POP();
498 v = POP();
499 x = apply_subscript(v, w);
500 DECREF(v);
501 DECREF(w);
502 PUSH(x);
503 break;
504
505 case BINARY_CALL:
506 w = POP();
507 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000508 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000509 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000510 DECREF(v);
511 DECREF(w);
512 PUSH(x);
513 break;
514
Guido van Rossum7928cd71991-10-24 14:59:31 +0000515 case BINARY_LSHIFT:
516 w = POP();
517 v = POP();
518 x = lshift(v, w);
519 DECREF(v);
520 DECREF(w);
521 PUSH(x);
522 break;
523
524 case BINARY_RSHIFT:
525 w = POP();
526 v = POP();
527 x = rshift(v, w);
528 DECREF(v);
529 DECREF(w);
530 PUSH(x);
531 break;
532
533 case BINARY_AND:
534 w = POP();
535 v = POP();
536 x = and(v, w);
537 DECREF(v);
538 DECREF(w);
539 PUSH(x);
540 break;
541
542 case BINARY_XOR:
543 w = POP();
544 v = POP();
545 x = xor(v, w);
546 DECREF(v);
547 DECREF(w);
548 PUSH(x);
549 break;
550
551 case BINARY_OR:
552 w = POP();
553 v = POP();
554 x = or(v, w);
555 DECREF(v);
556 DECREF(w);
557 PUSH(x);
558 break;
559
Guido van Rossum374a9221991-04-04 10:40:29 +0000560 case SLICE+0:
561 case SLICE+1:
562 case SLICE+2:
563 case SLICE+3:
564 if ((opcode-SLICE) & 2)
565 w = POP();
566 else
567 w = NULL;
568 if ((opcode-SLICE) & 1)
569 v = POP();
570 else
571 v = NULL;
572 u = POP();
573 x = apply_slice(u, v, w);
574 DECREF(u);
575 XDECREF(v);
576 XDECREF(w);
577 PUSH(x);
578 break;
579
580 case STORE_SLICE+0:
581 case STORE_SLICE+1:
582 case STORE_SLICE+2:
583 case STORE_SLICE+3:
584 if ((opcode-STORE_SLICE) & 2)
585 w = POP();
586 else
587 w = NULL;
588 if ((opcode-STORE_SLICE) & 1)
589 v = POP();
590 else
591 v = NULL;
592 u = POP();
593 t = POP();
594 err = assign_slice(u, v, w, t); /* u[v:w] = t */
595 DECREF(t);
596 DECREF(u);
597 XDECREF(v);
598 XDECREF(w);
599 break;
600
601 case DELETE_SLICE+0:
602 case DELETE_SLICE+1:
603 case DELETE_SLICE+2:
604 case DELETE_SLICE+3:
605 if ((opcode-DELETE_SLICE) & 2)
606 w = POP();
607 else
608 w = NULL;
609 if ((opcode-DELETE_SLICE) & 1)
610 v = POP();
611 else
612 v = NULL;
613 u = POP();
614 err = assign_slice(u, v, w, (object *)NULL);
615 /* del u[v:w] */
616 DECREF(u);
617 XDECREF(v);
618 XDECREF(w);
619 break;
620
621 case STORE_SUBSCR:
622 w = POP();
623 v = POP();
624 u = POP();
625 /* v[w] = u */
626 err = assign_subscript(v, w, u);
627 DECREF(u);
628 DECREF(v);
629 DECREF(w);
630 break;
631
632 case DELETE_SUBSCR:
633 w = POP();
634 v = POP();
635 /* del v[w] */
636 err = assign_subscript(v, w, (object *)NULL);
637 DECREF(v);
638 DECREF(w);
639 break;
640
641 case PRINT_EXPR:
642 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000643 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000644 /* Before printing, also assign to '_' */
645 if (v != None &&
646 (err = setbuiltin("_", v)) == 0 &&
647 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000649 x = sysget("stdout");
650 softspace(x, 1);
651 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000652 flushline();
653 }
654 DECREF(v);
655 break;
656
657 case PRINT_ITEM:
658 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000659 w = sysget("stdout");
660 if (softspace(w, 1))
661 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000662 err = writeobject(v, w, PRINT_RAW);
663 if (err == 0 && is_stringobject(v)) {
664 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000665 char *s = getstringvalue(v);
666 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000667 if (len > 0 && isspace(s[len-1]) &&
668 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000669 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 DECREF(v);
672 break;
673
674 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000675 x = sysget("stdout");
676 if (x == NULL)
677 err_setstr(RuntimeError, "lost sys.stdout");
678 else {
679 writestring("\n", x);
680 softspace(x, 0);
681 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 break;
683
684 case BREAK_LOOP:
685 why = WHY_BREAK;
686 break;
687
688 case RAISE_EXCEPTION:
689 v = POP();
690 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000691 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000692 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000693 u = w;
694 w = gettupleitem(u, 0);
695 DECREF(u);
696 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000697 if (!is_stringobject(w))
698 err_setstr(TypeError,
699 "exceptions must be strings");
700 else
701 err_setval(w, v);
702 DECREF(v);
703 DECREF(w);
704 why = WHY_EXCEPTION;
705 break;
706
707 case LOAD_LOCALS:
708 v = f->f_locals;
709 INCREF(v);
710 PUSH(v);
711 break;
712
713 case RETURN_VALUE:
714 retval = POP();
715 why = WHY_RETURN;
716 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000717
718 case LOAD_GLOBALS:
719 v = f->f_locals;
720 INCREF(v);
721 PUSH(v);
722 break;
723
724 case EXEC_STMT:
725 w = POP();
726 v = POP();
727 u = POP();
728 err = exec_statement(u, v, w);
729 DECREF(u);
730 DECREF(v);
731 DECREF(w);
732 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000733
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 case BUILD_FUNCTION:
735 v = POP();
736 x = newfuncobject(v, f->f_globals);
737 DECREF(v);
738 PUSH(x);
739 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000740
741 case SET_FUNC_ARGS:
742 v = POP(); /* The function */
743 w = POP(); /* The argument list */
744 err = setfuncargstuff(v, oparg, w);
745 PUSH(v);
746 DECREF(w);
747 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000748
749 case POP_BLOCK:
750 {
751 block *b = pop_block(f);
752 while (STACK_LEVEL() > b->b_level) {
753 v = POP();
754 DECREF(v);
755 }
756 }
757 break;
758
759 case END_FINALLY:
760 v = POP();
761 if (is_intobject(v)) {
762 why = (enum why_code) getintvalue(v);
763 if (why == WHY_RETURN)
764 retval = POP();
765 }
766 else if (is_stringobject(v)) {
767 w = POP();
768 err_setval(v, w);
769 DECREF(w);
770 w = POP();
771 tb_store(w);
772 DECREF(w);
773 why = WHY_RERAISE;
774 }
775 else if (v != None) {
776 err_setstr(SystemError,
777 "'finally' pops bad exception");
778 why = WHY_EXCEPTION;
779 }
780 DECREF(v);
781 break;
782
783 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000784 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000786 w = POP();
787 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000789 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 DECREF(v);
791 DECREF(w);
792 break;
793
794 case STORE_NAME:
795 w = GETNAMEV(oparg);
796 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000797 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000798 if (u == NULL) {
799 if (defmode != 0) {
800 if (v != None)
801 u = (object *)v->ob_type;
802 else
803 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000804 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000805 (typeobject *)u,
806 defmode);
807 DECREF(v);
808 if (x == NULL)
809 break;
810 v = x;
811 }
812 }
813 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000814 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000815 DECREF(v);
816 break;
817 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 err = dict2insert(f->f_locals, w, v);
819 DECREF(v);
820 break;
821
822 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000823 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000824 u = dict2lookup(f->f_locals, w);
825 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000826 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000827 (object *)NULL);
828 break;
829 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000830 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000831 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000833
834#ifdef CASE_TOO_BIG
835 default: switch (opcode) {
836#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000837
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000838 case UNPACK_VARARG:
839 if (EMPTY()) {
840 err_setstr(TypeError,
841 "no argument list");
842 why = WHY_EXCEPTION;
843 break;
844 }
845 v = POP();
846 if (!is_tupleobject(v)) {
847 err_setstr(TypeError,
848 "bad argument list");
849 why = WHY_EXCEPTION;
850 }
851 else if (gettuplesize(v) < oparg) {
852 err_setstr(TypeError,
853 "not enough arguments");
854 why = WHY_EXCEPTION;
855 }
856 else if (oparg == 0) {
857 PUSH(v);
858 break;
859 }
860 else {
861 x = gettupleslice(v, oparg, gettuplesize(v));
862 if (x != NULL) {
863 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000864 if (!CHECK_STACK(oparg)) {
865 x = NULL;
866 break;
867 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000868 for (; --oparg >= 0; ) {
869 w = gettupleitem(v, oparg);
870 INCREF(w);
871 PUSH(w);
872 }
873 }
874 }
875 DECREF(v);
876 break;
877
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000878 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000879 {
880 int n;
881 if (EMPTY()) {
882 err_setstr(TypeError,
883 "no argument list");
884 why = WHY_EXCEPTION;
885 break;
886 }
887 v = POP();
888 if (!is_tupleobject(v)) {
889 err_setstr(TypeError,
890 "bad argument list");
891 why = WHY_EXCEPTION;
892 break;
893 }
894 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000895#ifdef COMPAT_HACKS
896/* Implement various compatibility hacks (for 0.9.4 or earlier):
897 (a) f(a,b,...) accepts f((1,2,...))
898 (b) f((a,b,...)) accepts f(1,2,...)
899 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
900*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000901 if (n == 1 && oparg != 1) {
902 /* Rule (a) */
903 w = gettupleitem(v, 0);
904 if (is_tupleobject(w)) {
905 INCREF(w);
906 DECREF(v);
907 v = w;
908 n = gettuplesize(v);
909 }
910 }
911 else if (n != 1 && oparg == 1) {
912 /* Rule (b) */
913 PUSH(v);
914 break;
915 /* Don't fall through */
916 }
917 else if (n > 2 && oparg == 2) {
918 /* Rule (c) */
919 int i;
920 w = newtupleobject(n-1);
921 u = newtupleobject(2);
922 if (u == NULL || w == NULL) {
923 XDECREF(w);
924 XDECREF(u);
925 DECREF(v);
926 why = WHY_EXCEPTION;
927 break;
928 }
929 t = gettupleitem(v, 0);
930 INCREF(t);
931 settupleitem(u, 0, t);
932 for (i = 1; i < n; i++) {
933 t = gettupleitem(v, i);
934 INCREF(t);
935 settupleitem(w, i-1, t);
936 }
937 settupleitem(u, 1, w);
938 DECREF(v);
939 v = u;
940 n = 2;
941 }
Guido van Rossum5f59d601992-12-14 16:59:51 +0000942#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000943 if (n != oparg) {
944 err_setstr(TypeError,
945 "arg count mismatch");
946 why = WHY_EXCEPTION;
947 DECREF(v);
948 break;
949 }
950 PUSH(v);
951 }
952 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 case UNPACK_TUPLE:
954 v = POP();
955 if (!is_tupleobject(v)) {
956 err_setstr(TypeError, "unpack non-tuple");
957 why = WHY_EXCEPTION;
958 }
959 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000960 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 "unpack tuple of wrong size");
962 why = WHY_EXCEPTION;
963 }
964 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000965 if (!CHECK_STACK(oparg)) {
966 x = NULL;
967 break;
968 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 for (; --oparg >= 0; ) {
970 w = gettupleitem(v, oparg);
971 INCREF(w);
972 PUSH(w);
973 }
974 }
975 DECREF(v);
976 break;
977
978 case UNPACK_LIST:
979 v = POP();
980 if (!is_listobject(v)) {
981 err_setstr(TypeError, "unpack non-list");
982 why = WHY_EXCEPTION;
983 }
984 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000985 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 "unpack list of wrong size");
987 why = WHY_EXCEPTION;
988 }
989 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000990 if (!CHECK_STACK(oparg)) {
991 x = NULL;
992 break;
993 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 for (; --oparg >= 0; ) {
995 w = getlistitem(v, oparg);
996 INCREF(w);
997 PUSH(w);
998 }
999 }
1000 DECREF(v);
1001 break;
1002
1003 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001004 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001005 v = POP();
1006 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001007 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 DECREF(v);
1009 DECREF(u);
1010 break;
1011
1012 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001013 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001015 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 DECREF(v);
1017 break;
1018
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001019 case STORE_GLOBAL:
1020 w = GETNAMEV(oparg);
1021 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001022 u = dict2lookup(f->f_locals, w);
1023 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001024 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001025 DECREF(v);
1026 break;
1027 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001028 err = dict2insert(f->f_globals, w, v);
1029 DECREF(v);
1030 break;
1031
1032 case DELETE_GLOBAL:
1033 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001034 u = dict2lookup(f->f_locals, w);
1035 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001036 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001037 (object *)NULL);
1038 break;
1039 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001040 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001041 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001042 break;
1043
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 case LOAD_CONST:
1045 x = GETCONST(oparg);
1046 INCREF(x);
1047 PUSH(x);
1048 break;
1049
1050 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001051 w = GETNAMEV(oparg);
1052 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001054 err_clear();
1055 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001057 err_clear();
1058 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001059 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001060 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 break;
1062 }
1063 }
1064 }
Guido van Rossum25831651993-05-19 14:50:45 +00001065 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001066 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001067 if (x == NULL)
1068 break;
1069 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001070 else
1071 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 PUSH(x);
1073 break;
1074
1075 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001076 w = GETNAMEV(oparg);
1077 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001078 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001079 err_clear();
1080 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001081 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001082 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001083 break;
1084 }
1085 }
Guido van Rossum25831651993-05-19 14:50:45 +00001086 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001087 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001088 if (x == NULL)
1089 break;
1090 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001091 else
1092 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001093 PUSH(x);
1094 break;
1095
1096 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001097 w = GETNAMEV(oparg);
1098 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001100 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 break;
1102 }
Guido van Rossum25831651993-05-19 14:50:45 +00001103 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001104 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001105 if (x == NULL)
1106 break;
1107 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001108 else
1109 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 PUSH(x);
1111 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001112
1113 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001114 x = GETCONST(oparg);
1115 if (x == None)
1116 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001117 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001118 err_setstr(SystemError, "bad RESERVE_FAST");
1119 x = NULL;
1120 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001121 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001122 XDECREF(f->f_fastlocals);
1123 XDECREF(f->f_localmap);
1124 INCREF(x);
1125 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001126 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001127 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001128 break;
1129
1130 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001131 x = GETLISTITEM(fastlocals, oparg);
1132 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001133 err_setval(NameError,
1134 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001135 break;
1136 }
Guido van Rossum25831651993-05-19 14:50:45 +00001137 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001138 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001139 if (x == NULL)
1140 break;
1141 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001142 else
1143 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001144 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001145 break;
1146
1147 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001148 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001149 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001150 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001151 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001152 DECREF(v);
1153 break;
1154 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001155 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001156 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001157 break;
1158
1159 case DELETE_FAST:
1160 x = GETLISTITEM(fastlocals, oparg);
1161 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001162 err_setval(NameError,
1163 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001164 break;
1165 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001166 if (x != NULL && is_accessobject(x)) {
1167 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001168 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001169 break;
1170 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001171 DECREF(x);
1172 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001173 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001174
1175 case BUILD_TUPLE:
1176 x = newtupleobject(oparg);
1177 if (x != NULL) {
1178 for (; --oparg >= 0;) {
1179 w = POP();
1180 err = settupleitem(x, oparg, w);
1181 if (err != 0)
1182 break;
1183 }
1184 PUSH(x);
1185 }
1186 break;
1187
1188 case BUILD_LIST:
1189 x = newlistobject(oparg);
1190 if (x != NULL) {
1191 for (; --oparg >= 0;) {
1192 w = POP();
1193 err = setlistitem(x, oparg, w);
1194 if (err != 0)
1195 break;
1196 }
1197 PUSH(x);
1198 }
1199 break;
1200
1201 case BUILD_MAP:
1202 x = newdictobject();
1203 PUSH(x);
1204 break;
1205
1206 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001207 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001208 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001209 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 DECREF(v);
1211 PUSH(x);
1212 break;
1213
1214 case COMPARE_OP:
1215 w = POP();
1216 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001217 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001218 DECREF(v);
1219 DECREF(w);
1220 PUSH(x);
1221 break;
1222
1223 case IMPORT_NAME:
1224 name = GETNAME(oparg);
1225 x = import_module(name);
1226 XINCREF(x);
1227 PUSH(x);
1228 break;
1229
1230 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001231 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001233 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001234 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001236
1237 case ACCESS_MODE:
1238 v = POP();
1239 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001240 if (getstringvalue(w)[0] == '*')
1241 defmode = getintvalue(v);
1242 else
1243 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001244 DECREF(v);
1245 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001246
1247 case JUMP_FORWARD:
1248 JUMPBY(oparg);
1249 break;
1250
1251 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001252 err = testbool(TOP());
1253 if (err > 0)
1254 err = 0;
1255 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 JUMPBY(oparg);
1257 break;
1258
1259 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001260 err = testbool(TOP());
1261 if (err > 0) {
1262 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001264 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
1266
1267 case JUMP_ABSOLUTE:
1268 JUMPTO(oparg);
1269 break;
1270
1271 case FOR_LOOP:
1272 /* for v in s: ...
1273 On entry: stack contains s, i.
1274 On exit: stack contains s, i+1, s[i];
1275 but if loop exhausted:
1276 s, i are popped, and we jump */
1277 w = POP(); /* Loop index */
1278 v = POP(); /* Sequence object */
1279 u = loop_subscript(v, w);
1280 if (u != NULL) {
1281 PUSH(v);
1282 x = newintobject(getintvalue(w)+1);
1283 PUSH(x);
1284 DECREF(w);
1285 PUSH(u);
1286 }
1287 else {
1288 DECREF(v);
1289 DECREF(w);
1290 /* A NULL can mean "s exhausted"
1291 but also an error: */
1292 if (err_occurred())
1293 why = WHY_EXCEPTION;
1294 else
1295 JUMPBY(oparg);
1296 }
1297 break;
1298
1299 case SETUP_LOOP:
1300 case SETUP_EXCEPT:
1301 case SETUP_FINALLY:
1302 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1303 STACK_LEVEL());
1304 break;
1305
1306 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001307#ifdef LLTRACE
1308 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001309 printf("--- Line %d ---\n", oparg);
1310#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001311 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001312 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001313 /* Trace each line of code reached */
1314 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001315 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001316 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001317 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 break;
1319
1320 default:
1321 fprintf(stderr,
1322 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001323 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 err_setstr(SystemError, "eval_code: unknown opcode");
1325 why = WHY_EXCEPTION;
1326 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001327
1328#ifdef CASE_TOO_BIG
1329 }
1330#endif
1331
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 } /* switch */
1333
1334 on_error:
1335
1336 /* Quickly continue if no error occurred */
1337
1338 if (why == WHY_NOT) {
1339 if (err == 0 && x != NULL)
1340 continue; /* Normal, fast path */
1341 why = WHY_EXCEPTION;
1342 x = None;
1343 err = 0;
1344 }
1345
Guido van Rossum801dcae1992-04-08 11:32:32 +00001346#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 /* Double-check exception status */
1348
1349 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1350 if (!err_occurred()) {
1351 fprintf(stderr, "XXX ghost error\n");
1352 err_setstr(SystemError, "ghost error");
1353 why = WHY_EXCEPTION;
1354 }
1355 }
1356 else {
1357 if (err_occurred()) {
1358 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001359 abort();
1360 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 why = WHY_EXCEPTION;
1362 }
1363 }
1364#endif
1365
1366 /* Log traceback info if this is a real exception */
1367
1368 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001369 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001371 f->f_lasti -= 2;
1372 tb_here(f);
1373
Guido van Rossume59214e1994-08-30 08:01:59 +00001374 if (f->f_trace)
1375 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001376 if (sys_profile)
1377 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 }
1379
1380 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1381
1382 if (why == WHY_RERAISE)
1383 why = WHY_EXCEPTION;
1384
1385 /* Unwind stacks if a (pseudo) exception occurred */
1386
1387 while (why != WHY_NOT && f->f_iblock > 0) {
1388 block *b = pop_block(f);
1389 while (STACK_LEVEL() > b->b_level) {
1390 v = POP();
1391 XDECREF(v);
1392 }
1393 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1394 why = WHY_NOT;
1395 JUMPTO(b->b_handler);
1396 break;
1397 }
1398 if (b->b_type == SETUP_FINALLY ||
1399 b->b_type == SETUP_EXCEPT &&
1400 why == WHY_EXCEPTION) {
1401 if (why == WHY_EXCEPTION) {
1402 object *exc, *val;
1403 err_get(&exc, &val);
1404 if (val == NULL) {
1405 val = None;
1406 INCREF(val);
1407 }
1408 v = tb_fetch();
1409 /* Make the raw exception data
1410 available to the handler,
1411 so a program can emulate the
1412 Python main loop. Don't do
1413 this for 'finally'. */
1414 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 sysset("exc_value", val);
1417 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 }
1419 PUSH(v);
1420 PUSH(val);
1421 PUSH(exc);
1422 }
1423 else {
1424 if (why == WHY_RETURN)
1425 PUSH(retval);
1426 v = newintobject((long)why);
1427 PUSH(v);
1428 }
1429 why = WHY_NOT;
1430 JUMPTO(b->b_handler);
1431 break;
1432 }
1433 } /* unwind stack */
1434
1435 /* End the loop if we still have an error (or return) */
1436
1437 if (why != WHY_NOT)
1438 break;
1439
1440 } /* main loop */
1441
1442 /* Pop remaining stack entries */
1443
1444 while (!EMPTY()) {
1445 v = POP();
1446 XDECREF(v);
1447 }
1448
Guido van Rossum96a42c81992-01-12 02:29:51 +00001449 if (why != WHY_RETURN)
1450 retval = NULL;
1451
Guido van Rossume59214e1994-08-30 08:01:59 +00001452 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001453 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001454 if (call_trace(&f->f_trace, &f->f_trace, f,
1455 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001456 XDECREF(retval);
1457 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001458 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001459 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001460 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001461 }
1462
1463 if (sys_profile && why == WHY_RETURN) {
1464 if (call_trace(&sys_profile, (object**)0,
1465 f, "return", retval)) {
1466 XDECREF(retval);
1467 retval = NULL;
1468 why = WHY_EXCEPTION;
1469 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001470 }
1471
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 /* Restore previous frame and release the current one */
1473
1474 current_frame = f->f_back;
1475 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001476
1477 if (needmerge)
1478 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001479
Guido van Rossum96a42c81992-01-12 02:29:51 +00001480 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001481}
1482
Guido van Rossum96a42c81992-01-12 02:29:51 +00001483#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001484static int
1485prtrace(v, str)
1486 object *v;
1487 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001488{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001489 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001490 if (printobject(v, stdout, 0) != 0)
1491 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001494#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001496static void
1497call_exc_trace(p_trace, p_newtrace, f)
1498 object **p_trace, **p_newtrace;
1499 frameobject *f;
1500{
1501 object *type, *value, *traceback, *arg;
1502 int err;
1503 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001504 if (value == NULL) {
1505 value = None;
1506 INCREF(value);
1507 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001508 traceback = tb_fetch();
1509 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001510 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001511 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001512 settupleitem(arg, 0, type);
1513 settupleitem(arg, 1, value);
1514 settupleitem(arg, 2, traceback);
1515 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001516 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001517 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001518 /* Restore original exception */
1519 err_setval(type, value);
1520 tb_store(traceback);
1521 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001522 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001523}
1524
1525static int
1526call_trace(p_trace, p_newtrace, f, msg, arg)
1527 object **p_trace; /* in/out; may not be NULL;
1528 may not point to NULL variable initially */
1529 object **p_newtrace; /* in/out; may be NULL;
1530 may point to NULL variable;
1531 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001532 frameobject *f;
1533 char *msg;
1534 object *arg;
1535{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001536 object *arglist, *what;
1537 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001538 static int tracing = 0;
1539
1540 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001541 /* Don't do recursive traces */
1542 if (p_newtrace) {
1543 XDECREF(*p_newtrace);
1544 *p_newtrace = NULL;
1545 }
1546 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001547 }
1548
1549 arglist = newtupleobject(3);
1550 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001551 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001552 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001553 if (what == NULL)
1554 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001555 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001556 settupleitem(arglist, 0, (object *)f);
1557 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001558 if (arg == NULL)
1559 arg = None;
1560 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001561 settupleitem(arglist, 2, arg);
1562 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001563 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001564 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001565 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001566 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001567 cleanup:
1568 XDECREF(arglist);
1569 if (res == NULL) {
1570 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001571 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001572 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001573 *p_trace = NULL;
1574 if (p_newtrace) {
1575 XDECREF(*p_newtrace);
1576 *p_newtrace = NULL;
1577 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001578 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001579 }
1580 else {
1581 if (p_newtrace) {
1582 XDECREF(*p_newtrace);
1583 if (res == None)
1584 *p_newtrace = NULL;
1585 else {
1586 INCREF(res);
1587 *p_newtrace = res;
1588 }
1589 }
1590 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001591 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001592 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001593}
1594
Guido van Rossum3f5da241990-12-20 15:06:42 +00001595object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001596getlocals()
1597{
1598 if (current_frame == NULL)
1599 return NULL;
1600 fast_2_locals(current_frame);
1601 return current_frame->f_locals;
1602}
1603
1604object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605getglobals()
1606{
1607 if (current_frame == NULL)
1608 return NULL;
1609 else
1610 return current_frame->f_globals;
1611}
1612
Guido van Rossum81daa321993-05-20 14:24:46 +00001613object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001614getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001615{
1616 if (current_frame == NULL)
1617 return NULL;
1618 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001619 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001620}
1621
Guido van Rossume59214e1994-08-30 08:01:59 +00001622object *
1623getframe()
1624{
1625 return (object *)current_frame;
1626}
1627
Guido van Rossum3f5da241990-12-20 15:06:42 +00001628void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001629printtraceback(f)
1630 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001631{
1632 object *v = tb_fetch();
1633 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001634 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637}
1638
1639
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640void
1641flushline()
1642{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001643 object *f = sysget("stdout");
1644 if (softspace(f, 0))
1645 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646}
1647
Guido van Rossum3f5da241990-12-20 15:06:42 +00001648
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001650or(v, w)
1651 object *v, *w;
1652{
1653 if (v->ob_type->tp_as_number != NULL) {
1654 object *x;
1655 object * (*f) FPROTO((object *, object *));
1656 if (coerce(&v, &w) != 0)
1657 return NULL;
1658 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1659 x = (*f)(v, w);
1660 DECREF(v);
1661 DECREF(w);
1662 if (f != NULL)
1663 return x;
1664 }
1665 err_setstr(TypeError, "bad operand type(s) for |");
1666 return NULL;
1667}
1668
1669static object *
1670xor(v, w)
1671 object *v, *w;
1672{
1673 if (v->ob_type->tp_as_number != NULL) {
1674 object *x;
1675 object * (*f) FPROTO((object *, object *));
1676 if (coerce(&v, &w) != 0)
1677 return NULL;
1678 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1679 x = (*f)(v, w);
1680 DECREF(v);
1681 DECREF(w);
1682 if (f != NULL)
1683 return x;
1684 }
1685 err_setstr(TypeError, "bad operand type(s) for ^");
1686 return NULL;
1687}
1688
1689static object *
1690and(v, w)
1691 object *v, *w;
1692{
1693 if (v->ob_type->tp_as_number != NULL) {
1694 object *x;
1695 object * (*f) FPROTO((object *, object *));
1696 if (coerce(&v, &w) != 0)
1697 return NULL;
1698 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1699 x = (*f)(v, w);
1700 DECREF(v);
1701 DECREF(w);
1702 if (f != NULL)
1703 return x;
1704 }
1705 err_setstr(TypeError, "bad operand type(s) for &");
1706 return NULL;
1707}
1708
1709static object *
1710lshift(v, w)
1711 object *v, *w;
1712{
1713 if (v->ob_type->tp_as_number != NULL) {
1714 object *x;
1715 object * (*f) FPROTO((object *, object *));
1716 if (coerce(&v, &w) != 0)
1717 return NULL;
1718 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1719 x = (*f)(v, w);
1720 DECREF(v);
1721 DECREF(w);
1722 if (f != NULL)
1723 return x;
1724 }
1725 err_setstr(TypeError, "bad operand type(s) for <<");
1726 return NULL;
1727}
1728
1729static object *
1730rshift(v, w)
1731 object *v, *w;
1732{
1733 if (v->ob_type->tp_as_number != NULL) {
1734 object *x;
1735 object * (*f) FPROTO((object *, object *));
1736 if (coerce(&v, &w) != 0)
1737 return NULL;
1738 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1739 x = (*f)(v, w);
1740 DECREF(v);
1741 DECREF(w);
1742 if (f != NULL)
1743 return x;
1744 }
1745 err_setstr(TypeError, "bad operand type(s) for >>");
1746 return NULL;
1747}
1748
1749static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751 object *v, *w;
1752{
Guido van Rossume6eefc21992-08-14 12:06:52 +00001753 if (v->ob_type->tp_as_sequence != NULL)
1754 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1755 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001756 object *x;
1757 if (coerce(&v, &w) != 0)
1758 return NULL;
1759 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1760 DECREF(v);
1761 DECREF(w);
1762 return x;
1763 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001764 err_setstr(TypeError, "bad operand type(s) for +");
1765 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001766}
1767
1768static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001769sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770 object *v, *w;
1771{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001772 if (v->ob_type->tp_as_number != NULL) {
1773 object *x;
1774 if (coerce(&v, &w) != 0)
1775 return NULL;
1776 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1777 DECREF(v);
1778 DECREF(w);
1779 return x;
1780 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001781 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001782 return NULL;
1783}
1784
1785static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001786mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001787 object *v, *w;
1788{
1789 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001790 tp = v->ob_type;
1791 if (tp->tp_as_number != NULL &&
1792 w->ob_type->tp_as_sequence != NULL &&
1793 !is_instanceobject(v)) {
1794 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001795 object *tmp = v;
1796 v = w;
1797 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001798 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001799 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001800 if (tp->tp_as_number != NULL) {
1801 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001802 if (is_instanceobject(v)) {
1803 /* Instances of user-defined classes get their
1804 other argument uncoerced, so they may
1805 implement sequence*number as well as
1806 number*number. */
1807 INCREF(v);
1808 INCREF(w);
1809 }
1810 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001811 return NULL;
1812 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1813 DECREF(v);
1814 DECREF(w);
1815 return x;
1816 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 if (tp->tp_as_sequence != NULL) {
1818 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001819 err_setstr(TypeError,
1820 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 return NULL;
1822 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001823 return (*tp->tp_as_sequence->sq_repeat)
1824 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001825 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001826 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001827 return NULL;
1828}
1829
1830static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001831divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 object *v, *w;
1833{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001834 if (v->ob_type->tp_as_number != NULL) {
1835 object *x;
1836 if (coerce(&v, &w) != 0)
1837 return NULL;
1838 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1839 DECREF(v);
1840 DECREF(w);
1841 return x;
1842 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001843 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 return NULL;
1845}
1846
1847static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001848rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 object *v, *w;
1850{
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001851 if (v->ob_type->tp_as_number != NULL) {
1852 object *x;
1853 if (coerce(&v, &w) != 0)
1854 return NULL;
1855 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1856 DECREF(v);
1857 DECREF(w);
1858 return x;
1859 }
Guido van Rossume5372401993-03-16 12:15:04 +00001860 if (is_stringobject(v)) {
1861 return formatstring(v, w);
1862 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001863 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 return NULL;
1865}
1866
1867static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001868neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001869 object *v;
1870{
1871 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001872 return (*v->ob_type->tp_as_number->nb_negative)(v);
1873 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 return NULL;
1875}
1876
1877static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001878pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 object *v;
1880{
1881 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001882 return (*v->ob_type->tp_as_number->nb_positive)(v);
1883 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 return NULL;
1885}
1886
1887static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001888invert(v)
1889 object *v;
1890{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001891 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001892 if (v->ob_type->tp_as_number != NULL &&
1893 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1894 return (*f)(v);
1895 err_setstr(TypeError, "bad operand type(s) for unary ~");
1896 return NULL;
1897}
1898
1899static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001900not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901 object *v;
1902{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001903 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001904 object *w;
1905 if (outcome < 0)
1906 return NULL;
1907 if (outcome == 0)
1908 w = True;
1909 else
1910 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911 INCREF(w);
1912 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001913}
Guido van Rossum234f9421993-06-17 12:35:49 +00001914
1915
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001916/* External interface to call any callable object. The arg may be NULL. */
1917
1918object *
1919call_object(func, arg)
1920 object *func;
1921 object *arg;
1922{
Guido van Rossume59214e1994-08-30 08:01:59 +00001923 binaryfunc call;
1924 object *result;
1925
1926 if (call = func->ob_type->tp_call) {
1927 int size = gettuplesize(arg);
1928 if (arg) {
1929 size = gettuplesize(arg);
1930 if (size == 1)
1931 arg = gettupleitem(arg, 0);
1932 else if (size == 0)
1933 arg = NULL;
1934 }
1935 result = (*call)(func, arg);
1936 }
1937 else if (is_instancemethodobject(func) || is_funcobject(func))
1938 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001939 else
Guido van Rossume59214e1994-08-30 08:01:59 +00001940 result = call_builtin(func, arg);
1941
1942 if (result == NULL && !err_occurred()) {
1943 fprintf(stderr, "null result without error in call_object\n");
1944 abort();
1945 }
1946
1947 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00001948}
1949
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001950static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001951call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 if (is_methodobject(func)) {
1956 method meth = getmethod(func);
1957 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001958 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
1959 int size = gettuplesize(arg);
1960 if (size == 1)
1961 arg = gettupleitem(arg, 0);
1962 else if (size == 0)
1963 arg = NULL;
1964 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 }
1967 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00001968 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001970 if (is_instanceobject(func)) {
1971 object *res, *call = getattr(func,"__call__");
1972 if (call == NULL) {
1973 err_clear();
1974 err_setstr(AttributeError, "no __call__ method defined");
1975 return NULL;
1976 }
1977 res = call_object(call, arg);
1978 DECREF(call);
1979 return res;
1980 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001981 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 return NULL;
1983}
1984
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001990 object *newarg = NULL;
1991 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00001992 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001993 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00001994 object *argdefs;
1995 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996
Guido van Rossume8122f11991-05-05 20:03:07 +00001997 if (is_instancemethodobject(func)) {
1998 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00001999 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002000 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002001 if (self == NULL) {
2002 /* Unbound methods must be called with an instance of
2003 the class (or a derived class) as first argument */
2004 if (arg != NULL && is_tupleobject(arg) &&
2005 gettuplesize(arg) >= 1) {
2006 self = gettupleitem(arg, 0);
2007 if (self != NULL &&
2008 is_instanceobject(self) &&
2009 issubclass((object *)
2010 (((instanceobject *)self)->in_class),
2011 class))
2012 /* self = self */ ;
2013 else
2014 self = NULL;
2015 }
2016 if (self == NULL) {
2017 err_setstr(TypeError,
2018 "unbound method must be called with class instance argument");
2019 return NULL;
2020 }
2021 }
2022 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002023 if (arg == NULL)
2024 argcount = 0;
2025 else if (is_tupleobject(arg))
2026 argcount = gettuplesize(arg);
2027 else
2028 argcount = 1;
2029 newarg = newtupleobject(argcount + 1);
2030 if (newarg == NULL)
2031 return NULL;
2032 INCREF(self);
2033 settupleitem(newarg, 0, self);
2034 if (arg != NULL && !is_tupleobject(arg)) {
2035 INCREF(arg);
2036 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002037 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002038 else {
2039 int i;
2040 object *v;
2041 for (i = 0; i < argcount; i++) {
2042 v = gettupleitem(arg, i);
2043 XINCREF(v);
2044 settupleitem(newarg, i+1, v);
2045 }
2046 }
2047 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 }
2049 }
2050 else {
2051 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002052 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 return NULL;
2054 }
2055 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002056
2057 argdefs = getfuncargstuff(func, &argcount);
2058 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2059 int actualcount, j;
2060 /* Process default arguments */
2061 if (argcount & 0x4000)
2062 argcount ^= 0x4000;
2063 actualcount = gettuplesize(arg);
2064 j = gettuplesize(argdefs) - (argcount - actualcount);
2065 if (actualcount < argcount && j >= 0) {
2066 int i;
2067 object *v;
2068 if (newarg == NULL)
2069 INCREF(arg);
2070 newarg = newtupleobject(argcount);
2071 if (newarg == NULL) {
2072 DECREF(arg);
2073 return NULL;
2074 }
2075 for (i = 0; i < actualcount; i++) {
2076 v = gettupleitem(arg, i);
2077 XINCREF(v);
2078 settupleitem(newarg, i, v);
2079 }
2080 for (; i < argcount; i++, j++) {
2081 v = gettupleitem(argdefs, j);
2082 XINCREF(v);
2083 settupleitem(newarg, i, v);
2084 }
2085 DECREF(arg);
2086 arg = newarg;
2087 }
2088 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089
Guido van Rossum3f5da241990-12-20 15:06:42 +00002090 co = getfunccode(func);
2091 if (co == NULL) {
2092 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 return NULL;
2094 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095 if (!is_codeobject(co)) {
2096 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 abort();
2098 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 return NULL;
2103 }
2104
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105 newglobals = getfuncglobals(func);
2106 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107
Guido van Rossum81daa321993-05-20 14:24:46 +00002108 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109
Guido van Rossum3f5da241990-12-20 15:06:42 +00002110 DECREF(newlocals);
2111 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112
Guido van Rossum3f5da241990-12-20 15:06:42 +00002113 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114
2115 return v;
2116}
2117
2118static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 object *v, *w;
2121{
2122 typeobject *tp = v->ob_type;
2123 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125 return NULL;
2126 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002127 if (tp->tp_as_mapping != NULL) {
2128 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2129 }
2130 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131 int i;
2132 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002133 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 return NULL;
2135 }
2136 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002137 if (i < 0) {
2138 int len = (*tp->tp_as_sequence->sq_length)(v);
2139 if (len < 0)
2140 return NULL;
2141 i += len;
2142 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002143 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145}
2146
2147static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 object *v, *w;
2150{
2151 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002152 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002154 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 return NULL;
2156 }
2157 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002158 v = (*sq->sq_item)(v, i);
2159 if (v)
2160 return v;
2161 if (err_occurred() == IndexError)
2162 err_clear();
2163 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164}
2165
2166static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002167slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 object *v;
2169 int isize;
2170 int *pi;
2171{
2172 if (v != NULL) {
2173 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002174 err_setstr(TypeError, "slice index must be int");
2175 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 *pi = getintvalue(v);
2178 if (*pi < 0)
2179 *pi += isize;
2180 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002181 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182}
2183
2184static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002185apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 object *u, *v, *w;
2187{
2188 typeobject *tp = u->ob_type;
2189 int ilow, ihigh, isize;
2190 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 return NULL;
2193 }
2194 ilow = 0;
2195 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002196 if (isize < 0)
2197 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002198 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002202 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002204
2205static int
2206assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 object *w;
2208 object *key;
2209 object *v;
2210{
2211 typeobject *tp = w->ob_type;
2212 sequence_methods *sq;
2213 mapping_methods *mp;
2214 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002215 if ((mp = tp->tp_as_mapping) != NULL &&
2216 (func = mp->mp_ass_subscript) != NULL) {
2217 return (*func)(w, key, v);
2218 }
2219 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220 (func = sq->sq_ass_item) != NULL) {
2221 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002222 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002223 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002224 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002226 else {
2227 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002228 if (i < 0) {
2229 int len = (*sq->sq_length)(w);
2230 if (len < 0)
2231 return -1;
2232 i += len;
2233 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002234 return (*func)(w, i, v);
2235 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238 err_setstr(TypeError,
2239 "can't assign to this subscripted object");
2240 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242}
2243
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244static int
2245assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 object *u, *v, *w, *x;
2247{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002248 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002250 if (sq == NULL) {
2251 err_setstr(TypeError, "assign to slice of non-sequence");
2252 return -1;
2253 }
2254 if (sq == NULL || sq->sq_ass_slice == NULL) {
2255 err_setstr(TypeError, "unassignable slice");
2256 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 }
2258 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002259 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002260 if (isize < 0)
2261 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262 if (slice_index(v, isize, &ilow) != 0)
2263 return -1;
2264 if (slice_index(w, isize, &ihigh) != 0)
2265 return -1;
2266 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267}
2268
2269static int
2270cmp_exception(err, v)
2271 object *err, *v;
2272{
2273 if (is_tupleobject(v)) {
2274 int i, n;
2275 n = gettuplesize(v);
2276 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002277 /* Test recursively */
2278 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 return 1;
2280 }
2281 return 0;
2282 }
2283 return err == v;
2284}
2285
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286static int
2287cmp_member(v, w)
2288 object *v, *w;
2289{
Guido van Rossume59214e1994-08-30 08:01:59 +00002290 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002291 object *x;
2292 sequence_methods *sq;
2293 /* Special case for char in string */
2294 if (is_stringobject(w)) {
2295 register char *s, *end;
2296 register char c;
2297 if (!is_stringobject(v) || getstringsize(v) != 1) {
2298 err_setstr(TypeError,
2299 "string member test needs char left operand");
2300 return -1;
2301 }
2302 c = getstringvalue(v)[0];
2303 s = getstringvalue(w);
2304 end = s + getstringsize(w);
2305 while (s < end) {
2306 if (c == *s++)
2307 return 1;
2308 }
2309 return 0;
2310 }
2311 sq = w->ob_type->tp_as_sequence;
2312 if (sq == NULL) {
2313 err_setstr(TypeError,
2314 "'in' or 'not in' needs sequence right argument");
2315 return -1;
2316 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002317 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002318 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002319 if (x == NULL) {
2320 if (err_occurred() == IndexError) {
2321 err_clear();
2322 break;
2323 }
2324 return -1;
2325 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002326 cmp = cmpobject(v, x);
2327 XDECREF(x);
2328 if (cmp == 0)
2329 return 1;
2330 }
2331 return 0;
2332}
2333
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002336 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 register object *v;
2338 register object *w;
2339{
2340 register int cmp;
2341 register int res = 0;
2342 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343 case IS:
2344 case IS_NOT:
2345 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002346 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 res = !res;
2348 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 case IN:
2350 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 res = cmp_member(v, w);
2352 if (res < 0)
2353 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002354 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 break;
2357 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002358 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 break;
2360 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002361 cmp = cmpobject(v, w);
2362 switch (op) {
2363 case LT: res = cmp < 0; break;
2364 case LE: res = cmp <= 0; break;
2365 case EQ: res = cmp == 0; break;
2366 case NE: res = cmp != 0; break;
2367 case GT: res = cmp > 0; break;
2368 case GE: res = cmp >= 0; break;
2369 /* XXX no default? (res is initialized to 0 though) */
2370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 }
2372 v = res ? True : False;
2373 INCREF(v);
2374 return v;
2375}
2376
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377static int
2378import_from(locals, v, name)
2379 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002380 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002381 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002382{
2383 object *w, *x;
2384 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002385 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002386 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002387 object *name, *value;
2388 pos = 0;
2389 while (mappinggetnext(w, &pos, &name, &value)) {
2390 if (!is_stringobject(name) ||
2391 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002392 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002393 if (is_accessobject(value)) {
2394 value = getaccessvalue(value, (object *)NULL);
2395 if (value == NULL) {
2396 err_clear();
2397 continue;
2398 }
2399 }
2400 else
2401 INCREF(value);
2402 err = dict2insert(locals, name, value);
2403 DECREF(value);
2404 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002406 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002407 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002408 }
2409 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002410 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002412 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002413 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002414 getstringvalue(name));
2415 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002416 return -1;
2417 }
2418 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002419 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002420 }
2421}
2422
2423static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002424build_class(methods, bases, name)
2425 object *methods; /* dictionary */
2426 object *bases; /* tuple containing classes */
2427 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002428{
Guido van Rossum25831651993-05-19 14:50:45 +00002429 int i;
2430 if (!is_tupleobject(bases)) {
2431 err_setstr(SystemError, "build_class with non-tuple bases");
2432 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002433 }
Guido van Rossum25831651993-05-19 14:50:45 +00002434 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002435 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002436 return NULL;
2437 }
Guido van Rossum25831651993-05-19 14:50:45 +00002438 if (!is_stringobject(name)) {
2439 err_setstr(SystemError, "build_class witn non-string name");
2440 return NULL;
2441 }
2442 for (i = gettuplesize(bases); --i >= 0; ) {
2443 object *base = gettupleitem(bases, i);
2444 if (!is_classobject(base)) {
2445 err_setstr(TypeError,
2446 "base is not a class object");
2447 return NULL;
2448 }
2449 }
2450 return newclassobject(bases, methods, name);
2451}
2452
2453static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002454access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002455 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002456 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002457 frameobject *f;
2458{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002459 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002460 object *value, *ac;
2461 typeobject *type;
2462 int fastind, ret;
2463 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002464 if (f->f_localmap == NULL)
2465 value = dict2lookup(f->f_locals, name);
2466 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002467 object *map = f->f_localmap;
2468 value = NULL;
2469 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2470 object *fname = gettupleitem(map, fastind);
2471 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002472 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002473 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002474 }
2475 }
2476 }
2477 if (value && is_accessobject(value)) {
2478 err_setstr(AccessError, "can't override access");
2479 return -1;
2480 }
2481 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002482 if (value != NULL && value != None)
2483 type = value->ob_type;
2484 else
2485 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002486 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002487 if (ac == NULL)
2488 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002489 if (fastind >= 0)
2490 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002491 else {
2492 ret = dict2insert(f->f_locals, name, ac);
2493 DECREF(ac);
2494 }
2495 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002496}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002497
2498static int
2499exec_statement(prog, globals, locals)
2500 object *prog;
2501 object *globals;
2502 object *locals;
2503{
2504 char *s;
2505 int n;
2506
2507 if (is_tupleobject(prog) && globals == None && locals == None &&
2508 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2509 /* Backward compatibility hack */
2510 globals = gettupleitem(prog, 1);
2511 if (n == 3)
2512 locals = gettupleitem(prog, 2);
2513 prog = gettupleitem(prog, 0);
2514 }
2515 if (globals == None) {
2516 globals = getglobals();
2517 if (locals == None)
2518 locals = getlocals();
2519 }
2520 else if (locals == None)
2521 locals = globals;
2522 if (!is_stringobject(prog) &&
2523 !is_codeobject(prog) &&
2524 !is_fileobject(prog)) {
2525 err_setstr(TypeError,
2526 "exec 1st arg must be string, code or file object");
2527 return -1;
2528 }
2529 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2530 err_setstr(TypeError,
2531 "exec 2nd/3rd args must be dict or None");
2532 return -1;
2533 }
2534 if (is_codeobject(prog)) {
2535 if (eval_code((codeobject *) prog, globals, locals,
2536 (object *)NULL, (object *)NULL) == NULL)
2537 return -1;
2538 return 0;
2539 }
2540 if (is_fileobject(prog)) {
2541 FILE *fp = getfilefile(prog);
2542 char *name = getstringvalue(getfilename(prog));
2543 if (run_file(fp, name, file_input, globals, locals) == NULL)
2544 return -1;
2545 return 0;
2546 }
2547 s = getstringvalue(prog);
2548 if (strlen(s) != getstringsize(prog)) {
2549 err_setstr(ValueError, "embedded '\\0' in exec string");
2550 return -1;
2551 }
2552 if (run_string(s, file_input, globals, locals) == NULL)
2553 return -1;
2554 return 0;
2555}