blob: a55451c3e467578afb62a8c444e32fe87f379be8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The 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"
Guido van Rossum94390ec1995-01-12 11:37:57 +000031#include "bltinmodule.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000032#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000033#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000034#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000036#include "opcode.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 Rossum1ae940a1995-01-02 19:04:15 +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) */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050/* #define DEBUG 1 */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000051
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 *));
Guido van Rossum06186511995-01-07 12:40:10 +000071static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000072static 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 Rossum24c13741995-02-14 09:42:43 +000096static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +000097
98
Guido van Rossum0a066c01992-03-27 17:29:15 +000099/* Pointer to current frame, used to link new frames to */
100
Guido van Rossum374a9221991-04-04 10:40:29 +0000101static frameobject *current_frame;
102
Guido van Rossume59214e1994-08-30 08:01:59 +0000103#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000104
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000105#include <errno.h>
106#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000107
Guido van Rossuma9672091994-09-14 13:31:22 +0000108static type_lock interpreter_lock = 0;
109static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110
111void
112init_save_thread()
113{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000115 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000116 interpreter_lock = allocate_lock();
117 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000118 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000120
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121#endif
122
Guido van Rossumff4949e1992-08-05 19:58:53 +0000123/* Functions save_thread and restore_thread are always defined so
124 dynamically loaded modules needn't be compiled separately for use
125 with and without threads: */
126
Guido van Rossum04691fc1992-08-12 15:35:34 +0000127object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128save_thread()
129{
Guido van Rossume59214e1994-08-30 08:01:59 +0000130#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000132 object *res;
133 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000134 current_frame = NULL;
135 release_lock(interpreter_lock);
136 return res;
137 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000139 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000140}
141
142void
143restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000144 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145{
Guido van Rossume59214e1994-08-30 08:01:59 +0000146#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000147 if (interpreter_lock) {
148 int err;
149 err = errno;
150 acquire_lock(interpreter_lock, 1);
151 errno = err;
152 current_frame = (frameobject *)x;
153 }
154#endif
155}
156
157
Guido van Rossuma9672091994-09-14 13:31:22 +0000158/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
159 signal handlers or Mac I/O completion routines) can schedule calls
160 to a function to be called synchronously.
161 The synchronous function is called with one void* argument.
162 It should return 0 for success or -1 for failure -- failure should
163 be accompanied by an exception.
164
165 If registry succeeds, the registry function returns 0; if it fails
166 (e.g. due to too many pending calls) it returns -1 (without setting
167 an exception condition).
168
169 Note that because registry may occur from within signal handlers,
170 or other asynchronous events, calling malloc() is unsafe!
171
172#ifdef WITH_THREAD
173 Any thread can schedule pending calls, but only the main thread
174 will execute them.
175#endif
176
177 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
178 There are two possible race conditions:
179 (1) nested asynchronous registry calls;
180 (2) registry calls made while pending calls are being processed.
181 While (1) is very unlikely, (2) is a real possibility.
182 The current code is safe against (2), but not against (1).
183 The safety against (2) is derived from the fact that only one
184 thread (the main thread) ever takes things out of the queue.
185*/
186
187#define NPENDINGCALLS 32
188static struct {
189 int (*func) PROTO((ANY *));
190 ANY *arg;
191} pendingcalls[NPENDINGCALLS];
192static volatile int pendingfirst = 0;
193static volatile int pendinglast = 0;
194
195int
196Py_AddPendingCall(func, arg)
197 int (*func) PROTO((ANY *));
198 ANY *arg;
199{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000200 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000201 int i, j;
202 /* XXX Begin critical section */
203 /* XXX If you want this to be safe against nested
204 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000205 if (busy)
206 return -1;
207 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000208 i = pendinglast;
209 j = (i + 1) % NPENDINGCALLS;
210 if (j == pendingfirst)
211 return -1; /* Queue full */
212 pendingcalls[i].func = func;
213 pendingcalls[i].arg = arg;
214 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000215 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000216 /* XXX End critical section */
217 return 0;
218}
219
Guido van Rossum180d7b41994-09-29 09:45:57 +0000220int
221Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000222{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000223 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000224#ifdef WITH_THREAD
225 if (get_thread_ident() != main_thread)
226 return 0;
227#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000228 if (busy)
229 return 0;
230 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000231 for (;;) {
232 int i;
233 int (*func) PROTO((ANY *));
234 ANY *arg;
235 i = pendingfirst;
236 if (i == pendinglast)
237 break; /* Queue empty */
238 func = pendingcalls[i].func;
239 arg = pendingcalls[i].arg;
240 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000241 if (func(arg) < 0) {
242 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000243 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000245 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000246 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000247 return 0;
248}
249
250
Guido van Rossum374a9221991-04-04 10:40:29 +0000251/* Status code for main loop (reason for stack unwind) */
252
253enum why_code {
254 WHY_NOT, /* No error */
255 WHY_EXCEPTION, /* Exception occurred */
256 WHY_RERAISE, /* Exception re-raised by 'finally' */
257 WHY_RETURN, /* 'return' statement */
258 WHY_BREAK /* 'break' statement */
259};
260
261
262/* Interpreter main loop */
263
264object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000265eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000266 codeobject *co;
267 object *globals;
268 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000269 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000270 object *arg;
271{
272 register unsigned char *next_instr;
273 register int opcode; /* Current opcode */
274 register int oparg; /* Current opcode argument, if any */
275 register object **stack_pointer;
276 register enum why_code why; /* Reason for block stack unwind */
277 register int err; /* Error status -- nonzero if error */
278 register object *x; /* Result object -- NULL if error */
279 register object *v; /* Temporary objects popped off stack */
280 register object *w;
281 register object *u;
282 register object *t;
283 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000284 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000285 object *retval; /* Return value iff why == WHY_RETURN */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000286 int needmerge = 0; /* Set if need to merge locals back at end */
287 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000288#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000289 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000290#endif
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000291#if defined( DEBUG ) || defined( LLTRACE )
Guido van Rossum99bec951992-09-03 20:29:45 +0000292 /* Make it easier to find out where we are with dbx */
293 char *filename = getstringvalue(co->co_filename);
294#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000295
296/* Code access macros */
297
298#define GETCONST(i) Getconst(f, i)
299#define GETNAME(i) Getname(f, i)
300#define GETNAMEV(i) Getnamev(f, i)
301#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
302#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
303#define NEXTOP() (*next_instr++)
304#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
305#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
306#define JUMPBY(x) (next_instr += (x))
307
308/* Stack manipulation macros */
309
310#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
311#define EMPTY() (STACK_LEVEL() == 0)
312#define TOP() (stack_pointer[-1])
313#define BASIC_PUSH(v) (*stack_pointer++ = (v))
314#define BASIC_POP() (*--stack_pointer)
315
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000316#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
317 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
318
Guido van Rossum96a42c81992-01-12 02:29:51 +0000319#ifdef LLTRACE
320#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
321#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000322#else
323#define PUSH(v) BASIC_PUSH(v)
324#define POP() BASIC_POP()
325#endif
326
Guido van Rossum6135a871995-01-09 17:53:26 +0000327 if (globals == NULL || locals == NULL) {
328 err_setstr(SystemError, "eval_code: NULL globals or locals");
329 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000330 }
331
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000332#ifdef LLTRACE
333 lltrace = dictlookup(globals, "__lltrace__") != NULL;
334#endif
335
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 f = newframeobject(
337 current_frame, /*back*/
338 co, /*code*/
339 globals, /*globals*/
340 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000341 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000342 50, /*nvalues*/
343 20); /*nblocks*/
344 if (f == NULL)
345 return NULL;
346
347 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000348
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000349 if (sys_trace != NULL) {
350 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000351 be called on *every* entry to a code block.
352 Its return value, if not None, is a function that
353 will be called at the start of each executed line
354 of code. (Actually, the function must return
355 itself in order to continue tracing.)
356 The trace functions are called with three arguments:
357 a pointer to the current frame, a string indicating
358 why the function is called, and an argument which
359 depends on the situation. The global trace function
360 (sys.trace) is also called whenever an exception
361 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000362 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000363 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000364 current_frame = f->f_back;
365 DECREF(f);
366 return NULL;
367 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000368 }
369
370 if (sys_profile != NULL) {
371 /* Similar for sys_profile, except it needn't return
372 itself and isn't called for "line" events */
373 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
374 current_frame = f->f_back;
375 DECREF(f);
376 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000377 }
378 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000379
Guido van Rossum374a9221991-04-04 10:40:29 +0000380 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000381 stack_pointer = f->f_valuestack;
382
383 if (arg != NULL) {
384 INCREF(arg);
385 PUSH(arg);
386 }
387
388 why = WHY_NOT;
389 err = 0;
390 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000391
392 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000393 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000394
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000395 /* Do periodic things.
396 Doing this every time through the loop would add
397 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000398 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000399
Guido van Rossuma9672091994-09-14 13:31:22 +0000400 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000402 why = WHY_EXCEPTION;
403 goto on_error;
404 }
405 }
406
Guido van Rossum374a9221991-04-04 10:40:29 +0000407 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000408 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000409 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000411 goto on_error;
412 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000413
Guido van Rossume59214e1994-08-30 08:01:59 +0000414#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000415 if (interpreter_lock) {
416 /* Give another thread a chance */
417
418 current_frame = NULL;
419 release_lock(interpreter_lock);
420
421 /* Other threads may run now */
422
423 acquire_lock(interpreter_lock, 1);
424 current_frame = f;
425 }
426#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000427 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000428
Guido van Rossum374a9221991-04-04 10:40:29 +0000429 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000430
431#ifdef DEBUG
432 f->f_lasti = INSTR_OFFSET();
433#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000434
435 opcode = NEXTOP();
436 if (HAS_ARG(opcode))
437 oparg = NEXTARG();
438
Guido van Rossum96a42c81992-01-12 02:29:51 +0000439#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000440 /* Instruction tracing */
441
Guido van Rossum96a42c81992-01-12 02:29:51 +0000442 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000443 if (HAS_ARG(opcode)) {
444 printf("%d: %d, %d\n",
445 (int) (INSTR_OFFSET() - 3),
446 opcode, oparg);
447 }
448 else {
449 printf("%d: %d\n",
450 (int) (INSTR_OFFSET() - 1), opcode);
451 }
452 }
453#endif
454
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000455 if (!CHECK_STACK(3)) {
456 x = NULL;
457 break;
458 }
459
Guido van Rossum374a9221991-04-04 10:40:29 +0000460 /* Main switch on opcode */
461
462 switch (opcode) {
463
464 /* BEWARE!
465 It is essential that any operation that fails sets either
466 x to NULL, err to nonzero, or why to anything but WHY_NOT,
467 and that no operation that succeeds does this! */
468
469 /* case STOP_CODE: this is an error! */
470
471 case POP_TOP:
472 v = POP();
473 DECREF(v);
474 break;
475
476 case ROT_TWO:
477 v = POP();
478 w = POP();
479 PUSH(v);
480 PUSH(w);
481 break;
482
483 case ROT_THREE:
484 v = POP();
485 w = POP();
486 x = POP();
487 PUSH(v);
488 PUSH(x);
489 PUSH(w);
490 break;
491
492 case DUP_TOP:
493 v = TOP();
494 INCREF(v);
495 PUSH(v);
496 break;
497
498 case UNARY_POSITIVE:
499 v = POP();
500 x = pos(v);
501 DECREF(v);
502 PUSH(x);
503 break;
504
505 case UNARY_NEGATIVE:
506 v = POP();
507 x = neg(v);
508 DECREF(v);
509 PUSH(x);
510 break;
511
512 case UNARY_NOT:
513 v = POP();
514 x = not(v);
515 DECREF(v);
516 PUSH(x);
517 break;
518
519 case UNARY_CONVERT:
520 v = POP();
521 x = reprobject(v);
522 DECREF(v);
523 PUSH(x);
524 break;
525
526 case UNARY_CALL:
527 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000528 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000529 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000530 DECREF(v);
531 PUSH(x);
532 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000533
534 case UNARY_INVERT:
535 v = POP();
536 x = invert(v);
537 DECREF(v);
538 PUSH(x);
539 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000540
541 case BINARY_MULTIPLY:
542 w = POP();
543 v = POP();
544 x = mul(v, w);
545 DECREF(v);
546 DECREF(w);
547 PUSH(x);
548 break;
549
550 case BINARY_DIVIDE:
551 w = POP();
552 v = POP();
553 x = divide(v, w);
554 DECREF(v);
555 DECREF(w);
556 PUSH(x);
557 break;
558
559 case BINARY_MODULO:
560 w = POP();
561 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000562 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000563 DECREF(v);
564 DECREF(w);
565 PUSH(x);
566 break;
567
568 case BINARY_ADD:
569 w = POP();
570 v = POP();
571 x = add(v, w);
572 DECREF(v);
573 DECREF(w);
574 PUSH(x);
575 break;
576
577 case BINARY_SUBTRACT:
578 w = POP();
579 v = POP();
580 x = sub(v, w);
581 DECREF(v);
582 DECREF(w);
583 PUSH(x);
584 break;
585
586 case BINARY_SUBSCR:
587 w = POP();
588 v = POP();
589 x = apply_subscript(v, w);
590 DECREF(v);
591 DECREF(w);
592 PUSH(x);
593 break;
594
595 case BINARY_CALL:
596 w = POP();
597 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000598 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000599 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 DECREF(v);
601 DECREF(w);
602 PUSH(x);
603 break;
604
Guido van Rossum7928cd71991-10-24 14:59:31 +0000605 case BINARY_LSHIFT:
606 w = POP();
607 v = POP();
608 x = lshift(v, w);
609 DECREF(v);
610 DECREF(w);
611 PUSH(x);
612 break;
613
614 case BINARY_RSHIFT:
615 w = POP();
616 v = POP();
617 x = rshift(v, w);
618 DECREF(v);
619 DECREF(w);
620 PUSH(x);
621 break;
622
623 case BINARY_AND:
624 w = POP();
625 v = POP();
626 x = and(v, w);
627 DECREF(v);
628 DECREF(w);
629 PUSH(x);
630 break;
631
632 case BINARY_XOR:
633 w = POP();
634 v = POP();
635 x = xor(v, w);
636 DECREF(v);
637 DECREF(w);
638 PUSH(x);
639 break;
640
641 case BINARY_OR:
642 w = POP();
643 v = POP();
644 x = or(v, w);
645 DECREF(v);
646 DECREF(w);
647 PUSH(x);
648 break;
649
Guido van Rossum374a9221991-04-04 10:40:29 +0000650 case SLICE+0:
651 case SLICE+1:
652 case SLICE+2:
653 case SLICE+3:
654 if ((opcode-SLICE) & 2)
655 w = POP();
656 else
657 w = NULL;
658 if ((opcode-SLICE) & 1)
659 v = POP();
660 else
661 v = NULL;
662 u = POP();
663 x = apply_slice(u, v, w);
664 DECREF(u);
665 XDECREF(v);
666 XDECREF(w);
667 PUSH(x);
668 break;
669
670 case STORE_SLICE+0:
671 case STORE_SLICE+1:
672 case STORE_SLICE+2:
673 case STORE_SLICE+3:
674 if ((opcode-STORE_SLICE) & 2)
675 w = POP();
676 else
677 w = NULL;
678 if ((opcode-STORE_SLICE) & 1)
679 v = POP();
680 else
681 v = NULL;
682 u = POP();
683 t = POP();
684 err = assign_slice(u, v, w, t); /* u[v:w] = t */
685 DECREF(t);
686 DECREF(u);
687 XDECREF(v);
688 XDECREF(w);
689 break;
690
691 case DELETE_SLICE+0:
692 case DELETE_SLICE+1:
693 case DELETE_SLICE+2:
694 case DELETE_SLICE+3:
695 if ((opcode-DELETE_SLICE) & 2)
696 w = POP();
697 else
698 w = NULL;
699 if ((opcode-DELETE_SLICE) & 1)
700 v = POP();
701 else
702 v = NULL;
703 u = POP();
704 err = assign_slice(u, v, w, (object *)NULL);
705 /* del u[v:w] */
706 DECREF(u);
707 XDECREF(v);
708 XDECREF(w);
709 break;
710
711 case STORE_SUBSCR:
712 w = POP();
713 v = POP();
714 u = POP();
715 /* v[w] = u */
716 err = assign_subscript(v, w, u);
717 DECREF(u);
718 DECREF(v);
719 DECREF(w);
720 break;
721
722 case DELETE_SUBSCR:
723 w = POP();
724 v = POP();
725 /* del v[w] */
726 err = assign_subscript(v, w, (object *)NULL);
727 DECREF(v);
728 DECREF(w);
729 break;
730
731 case PRINT_EXPR:
732 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000734 /* Before printing, also assign to '_' */
735 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000736 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000737 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000739 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000740 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000741 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 flushline();
743 }
744 DECREF(v);
745 break;
746
747 case PRINT_ITEM:
748 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000749 w = sysget("stdout");
750 if (softspace(w, 1))
751 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000752 err = writeobject(v, w, PRINT_RAW);
753 if (err == 0 && is_stringobject(v)) {
754 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 char *s = getstringvalue(v);
756 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000757 if (len > 0 &&
758 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000759 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000760 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 DECREF(v);
763 break;
764
765 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000766 x = sysget("stdout");
767 if (x == NULL)
768 err_setstr(RuntimeError, "lost sys.stdout");
769 else {
770 writestring("\n", x);
771 softspace(x, 0);
772 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 break;
774
775 case BREAK_LOOP:
776 why = WHY_BREAK;
777 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000778
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 case RAISE_EXCEPTION:
Guido van Rossumf10570b1995-07-07 22:53:21 +0000780 oparg = 2;
781 /* Fallthrough */
782 case RAISE_VARARGS:
783 u = v = w = NULL;
784 switch (oparg) {
785 case 3:
786 u = POP(); /* traceback */
787 if (u == None) {
788 DECREF(u);
789 u = NULL;
790 }
791 else if (strcmp(u->ob_type->tp_name,
792 "traceback") != 0) {
793 /* XXX traceback.h needs to define
794 is_traceback() */
795 err_setstr(TypeError,
796 "raise 3rd arg must be traceback or None");
797 goto raise_error;
798 }
799 /* Fallthrough */
800 case 2:
801 v = POP(); /* value */
802 /* Fallthrough */
803 case 1:
804 w = POP(); /* exc */
805 break;
806 default:
807 err_setstr(SystemError,
808 "bad RAISE_VARARGS oparg");
809 goto raise_error;
810 }
811 if (v == NULL) {
812 v = None;
813 INCREF(v);
814 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000815 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000816 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000817 object *t = w;
818 w = GETTUPLEITEM(t, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000819 INCREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000820 DECREF(t);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000821 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000822 if (is_stringobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000823 ;
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000824 } else if (is_classobject(w)) {
825 if (!is_instanceobject(v)
826 || !issubclass((object*)((instanceobject*)v)->in_class,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000827 w)) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000828 err_setstr(TypeError,
829 "a class exception must have a value that is an instance of the class");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000830 goto raise_error;
831 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000832 } else if (is_instanceobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000833 if (v != None) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000834 err_setstr(TypeError,
835 "an instance exception may not have a separate value");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000836 goto raise_error;
837 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000838 else {
839 DECREF(v);
840 v = w;
841 w = (object*) ((instanceobject*)w)->in_class;
842 INCREF(w);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000843 }
Guido van Rossumf10570b1995-07-07 22:53:21 +0000844 }
845 else {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000846 err_setstr(TypeError,
847 "exceptions must be strings, classes, or instances");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000848 goto raise_error;
849 }
850 err_restore(w, v, u);
851 if (u == NULL)
852 why = WHY_EXCEPTION;
853 else
854 why = WHY_RERAISE;
855 break;
856 raise_error:
857 XDECREF(v);
858 XDECREF(w);
859 XDECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 why = WHY_EXCEPTION;
861 break;
862
863 case LOAD_LOCALS:
864 v = f->f_locals;
865 INCREF(v);
866 PUSH(v);
867 break;
868
869 case RETURN_VALUE:
870 retval = POP();
871 why = WHY_RETURN;
872 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000873
874 case LOAD_GLOBALS:
875 v = f->f_locals;
876 INCREF(v);
877 PUSH(v);
878 break;
879
880 case EXEC_STMT:
881 w = POP();
882 v = POP();
883 u = POP();
884 err = exec_statement(u, v, w);
885 DECREF(u);
886 DECREF(v);
887 DECREF(w);
888 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000889
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 case BUILD_FUNCTION:
891 v = POP();
892 x = newfuncobject(v, f->f_globals);
893 DECREF(v);
894 PUSH(x);
895 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000896
897 case SET_FUNC_ARGS:
898 v = POP(); /* The function */
899 w = POP(); /* The argument list */
900 err = setfuncargstuff(v, oparg, w);
901 PUSH(v);
902 DECREF(w);
903 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000904
905 case POP_BLOCK:
906 {
907 block *b = pop_block(f);
908 while (STACK_LEVEL() > b->b_level) {
909 v = POP();
910 DECREF(v);
911 }
912 }
913 break;
914
915 case END_FINALLY:
916 v = POP();
917 if (is_intobject(v)) {
918 why = (enum why_code) getintvalue(v);
919 if (why == WHY_RETURN)
920 retval = POP();
921 }
Guido van Rossum1d339e81995-02-17 15:04:21 +0000922 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +0000924 u = POP();
925 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 why = WHY_RERAISE;
927 }
928 else if (v != None) {
929 err_setstr(SystemError,
930 "'finally' pops bad exception");
931 why = WHY_EXCEPTION;
932 }
933 DECREF(v);
934 break;
935
936 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000937 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000939 w = POP();
940 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000942 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 DECREF(v);
944 DECREF(w);
945 break;
946
947 case STORE_NAME:
948 w = GETNAMEV(oparg);
949 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000950 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000951 if (u == NULL) {
952 if (defmode != 0) {
953 if (v != None)
954 u = (object *)v->ob_type;
955 else
956 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000957 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000958 (typeobject *)u,
959 defmode);
960 DECREF(v);
961 if (x == NULL)
962 break;
963 v = x;
964 }
965 }
966 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000967 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000968 DECREF(v);
969 break;
970 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 err = dict2insert(f->f_locals, w, v);
972 DECREF(v);
973 break;
974
975 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000976 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000977 u = dict2lookup(f->f_locals, w);
978 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000979 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000980 (object *)NULL);
981 break;
982 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000983 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000984 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000986
987#ifdef CASE_TOO_BIG
988 default: switch (opcode) {
989#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000990
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000991 case UNPACK_VARARG:
992 if (EMPTY()) {
993 err_setstr(TypeError,
994 "no argument list");
995 why = WHY_EXCEPTION;
996 break;
997 }
998 v = POP();
999 if (!is_tupleobject(v)) {
1000 err_setstr(TypeError,
1001 "bad argument list");
1002 why = WHY_EXCEPTION;
1003 }
1004 else if (gettuplesize(v) < oparg) {
1005 err_setstr(TypeError,
1006 "not enough arguments");
1007 why = WHY_EXCEPTION;
1008 }
1009 else if (oparg == 0) {
1010 PUSH(v);
1011 break;
1012 }
1013 else {
1014 x = gettupleslice(v, oparg, gettuplesize(v));
1015 if (x != NULL) {
1016 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001017 if (!CHECK_STACK(oparg)) {
1018 x = NULL;
1019 break;
1020 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +00001021 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001022 w = GETTUPLEITEM(v, oparg);
Guido van Rossum6a3f9a81992-01-14 18:29:20 +00001023 INCREF(w);
1024 PUSH(w);
1025 }
1026 }
1027 }
1028 DECREF(v);
1029 break;
1030
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001031 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001032 {
1033 int n;
1034 if (EMPTY()) {
1035 err_setstr(TypeError,
1036 "no argument list");
1037 why = WHY_EXCEPTION;
1038 break;
1039 }
1040 v = POP();
1041 if (!is_tupleobject(v)) {
1042 err_setstr(TypeError,
1043 "bad argument list");
1044 why = WHY_EXCEPTION;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001045 DECREF(v);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001046 break;
1047 }
1048 n = gettuplesize(v);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001049 if (n != oparg) {
1050 err_setstr(TypeError,
1051 "arg count mismatch");
1052 why = WHY_EXCEPTION;
1053 DECREF(v);
1054 break;
1055 }
1056 PUSH(v);
1057 }
1058 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001059 case UNPACK_TUPLE:
1060 v = POP();
1061 if (!is_tupleobject(v)) {
1062 err_setstr(TypeError, "unpack non-tuple");
1063 why = WHY_EXCEPTION;
1064 }
1065 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001066 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001067 "unpack tuple of wrong size");
1068 why = WHY_EXCEPTION;
1069 }
1070 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001071 if (!CHECK_STACK(oparg)) {
1072 x = NULL;
1073 break;
1074 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001076 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 INCREF(w);
1078 PUSH(w);
1079 }
1080 }
1081 DECREF(v);
1082 break;
1083
1084 case UNPACK_LIST:
1085 v = POP();
1086 if (!is_listobject(v)) {
1087 err_setstr(TypeError, "unpack non-list");
1088 why = WHY_EXCEPTION;
1089 }
1090 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001091 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001092 "unpack list of wrong size");
1093 why = WHY_EXCEPTION;
1094 }
1095 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001096 if (!CHECK_STACK(oparg)) {
1097 x = NULL;
1098 break;
1099 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001100 for (; --oparg >= 0; ) {
1101 w = getlistitem(v, oparg);
1102 INCREF(w);
1103 PUSH(w);
1104 }
1105 }
1106 DECREF(v);
1107 break;
1108
1109 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001110 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 v = POP();
1112 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001113 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001114 DECREF(v);
1115 DECREF(u);
1116 break;
1117
1118 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001121 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 DECREF(v);
1123 break;
1124
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001125 case STORE_GLOBAL:
1126 w = GETNAMEV(oparg);
1127 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001128 u = dict2lookup(f->f_locals, w);
1129 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001130 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001131 DECREF(v);
1132 break;
1133 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001134 err = dict2insert(f->f_globals, w, v);
1135 DECREF(v);
1136 break;
1137
1138 case DELETE_GLOBAL:
1139 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001140 u = dict2lookup(f->f_locals, w);
1141 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001142 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001143 (object *)NULL);
1144 break;
1145 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001146 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001147 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001148 break;
1149
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 case LOAD_CONST:
1151 x = GETCONST(oparg);
1152 INCREF(x);
1153 PUSH(x);
1154 break;
1155
1156 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001157 w = GETNAMEV(oparg);
1158 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001160 err_clear();
1161 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001163 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001164 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001166 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 break;
1168 }
1169 }
1170 }
Guido van Rossum25831651993-05-19 14:50:45 +00001171 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001172 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001173 if (x == NULL)
1174 break;
1175 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001176 else
1177 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 PUSH(x);
1179 break;
1180
1181 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001182 w = GETNAMEV(oparg);
1183 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001185 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001186 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001188 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 break;
1190 }
1191 }
Guido van Rossum25831651993-05-19 14:50:45 +00001192 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001193 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001194 if (x == NULL)
1195 break;
1196 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001197 else
1198 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 PUSH(x);
1200 break;
1201
1202 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001203 w = GETNAMEV(oparg);
1204 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001206 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 break;
1208 }
Guido van Rossum25831651993-05-19 14:50:45 +00001209 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001210 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001211 if (x == NULL)
1212 break;
1213 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001214 else
1215 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 PUSH(x);
1217 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001218
1219 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001220 x = GETCONST(oparg);
1221 if (x == None)
1222 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001223 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001224 err_setstr(SystemError, "bad RESERVE_FAST");
1225 x = NULL;
1226 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001227 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001228 XDECREF(f->f_fastlocals);
1229 XDECREF(f->f_localmap);
1230 INCREF(x);
1231 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001232 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001233 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001234 break;
1235
1236 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001237 x = GETLISTITEM(fastlocals, oparg);
1238 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001239 err_setval(NameError,
1240 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001241 break;
1242 }
Guido van Rossum25831651993-05-19 14:50:45 +00001243 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001244 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001245 if (x == NULL)
1246 break;
1247 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001248 else
1249 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001250 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001251 break;
1252
1253 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001254 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001255 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001256 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001257 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001258 DECREF(v);
1259 break;
1260 }
Guido van Rossum25831651993-05-19 14:50:45 +00001261 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001263 break;
1264
1265 case DELETE_FAST:
1266 x = GETLISTITEM(fastlocals, oparg);
1267 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001268 err_setval(NameError,
1269 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001270 break;
1271 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001272 if (x != NULL && is_accessobject(x)) {
1273 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001274 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001275 break;
1276 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001277 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001278 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001279 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001280
1281 case BUILD_TUPLE:
1282 x = newtupleobject(oparg);
1283 if (x != NULL) {
1284 for (; --oparg >= 0;) {
1285 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001286 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 }
1288 PUSH(x);
1289 }
1290 break;
1291
1292 case BUILD_LIST:
1293 x = newlistobject(oparg);
1294 if (x != NULL) {
1295 for (; --oparg >= 0;) {
1296 w = POP();
1297 err = setlistitem(x, oparg, w);
1298 if (err != 0)
1299 break;
1300 }
1301 PUSH(x);
1302 }
1303 break;
1304
1305 case BUILD_MAP:
1306 x = newdictobject();
1307 PUSH(x);
1308 break;
1309
1310 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001311 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001313 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 DECREF(v);
1315 PUSH(x);
1316 break;
1317
1318 case COMPARE_OP:
1319 w = POP();
1320 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001321 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 DECREF(v);
1323 DECREF(w);
1324 PUSH(x);
1325 break;
1326
1327 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001328 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001329 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001330 if (x == NULL) {
1331 err_setstr(ImportError,
1332 "__import__ not found");
1333 break;
1334 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001335 if (is_methodobject(x)) {
1336 u = None;
1337 INCREF(u);
1338 }
1339 else {
1340 u = find_from_args(f, INSTR_OFFSET());
1341 if (u == NULL) {
1342 x = u;
1343 break;
1344 }
1345 }
1346 w = mkvalue("(OOOO)", w, f->f_globals, f->f_locals, u);
1347 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001348 if (w == NULL) {
1349 x = NULL;
1350 break;
1351 }
1352 x = call_object(x, w);
1353 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001354 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 break;
1356
1357 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001358 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001360 fast_2_locals(f);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001361 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001362 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001364
1365 case ACCESS_MODE:
1366 v = POP();
1367 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001368 if (getstringvalue(w)[0] == '*')
1369 defmode = getintvalue(v);
1370 else
1371 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001372 DECREF(v);
1373 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374
1375 case JUMP_FORWARD:
1376 JUMPBY(oparg);
1377 break;
1378
1379 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001380 err = testbool(TOP());
1381 if (err > 0)
1382 err = 0;
1383 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 JUMPBY(oparg);
1385 break;
1386
1387 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001388 err = testbool(TOP());
1389 if (err > 0) {
1390 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001392 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 break;
1394
1395 case JUMP_ABSOLUTE:
1396 JUMPTO(oparg);
1397 break;
1398
1399 case FOR_LOOP:
1400 /* for v in s: ...
1401 On entry: stack contains s, i.
1402 On exit: stack contains s, i+1, s[i];
1403 but if loop exhausted:
1404 s, i are popped, and we jump */
1405 w = POP(); /* Loop index */
1406 v = POP(); /* Sequence object */
1407 u = loop_subscript(v, w);
1408 if (u != NULL) {
1409 PUSH(v);
1410 x = newintobject(getintvalue(w)+1);
1411 PUSH(x);
1412 DECREF(w);
1413 PUSH(u);
1414 }
1415 else {
1416 DECREF(v);
1417 DECREF(w);
1418 /* A NULL can mean "s exhausted"
1419 but also an error: */
1420 if (err_occurred())
1421 why = WHY_EXCEPTION;
1422 else
1423 JUMPBY(oparg);
1424 }
1425 break;
1426
1427 case SETUP_LOOP:
1428 case SETUP_EXCEPT:
1429 case SETUP_FINALLY:
1430 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1431 STACK_LEVEL());
1432 break;
1433
1434 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001435#ifdef LLTRACE
1436 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001437 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001438#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001439 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001440 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001441 /* Trace each line of code reached */
1442 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001443 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001444 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001445 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001447
1448 case CALL_FUNCTION:
1449 {
1450 /* XXX To do:
1451 - fill in default arguments here
1452 - proper handling of keyword parameters
1453 - change eval_code interface to take an
1454 array of arguments instead of a tuple
1455 */
1456 int na = oparg & 0xff;
1457 int nk = (oparg>>8) & 0xff;
1458 int n = na + 2*nk;
1459 object **pfunc = stack_pointer - n - 1;
1460 object *func = *pfunc;
1461 object *self = NULL;
1462 object *class = NULL;
1463 object *args;
1464 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1465 INCREF(func);
1466 if (is_instancemethodobject(func)) {
1467 self = instancemethodgetself(func);
1468 if (self != NULL) {
1469 class = instancemethodgetclass(func);
1470 DECREF(func);
1471 func = instancemethodgetfunc(func);
1472 INCREF(func);
1473 INCREF(self);
1474 DECREF(*pfunc);
1475 *pfunc = self;
1476 na++;
1477 n++;
1478 }
1479 }
1480 args = newtupleobject(n);
1481 if (args == NULL)
1482 x = NULL;
1483 else {
1484 while (--n >= 0) {
1485 w = POP();
1486 SETTUPLEITEM(args, n, w);
1487 }
1488 if (self == NULL)
1489 POP();
1490 if (is_funcobject(func)) {
1491 int argcount;
1492 object *argdefs =
1493 getfuncargstuff(func, &argcount);
1494 if (argdefs == NULL) { /* Fast path */
1495 object *co, *loc, *glob;
1496 co = getfunccode(func);
1497 loc = newdictobject();
1498 if (loc == NULL) {
1499 x = NULL;
1500 DECREF(func);
1501 break;
1502 }
1503 glob = getfuncglobals(func);
1504 INCREF(glob);
1505 x = eval_code(
1506 (codeobject *)co,
1507 glob,
1508 loc,
1509 class,
1510 args);
1511 DECREF(glob);
1512 DECREF(loc);
1513 DECREF(args);
1514 DECREF(func);
1515 PUSH(x);
1516 break;
1517 }
1518 }
1519 x = call_object(func, args);
1520 DECREF(args);
1521 PUSH(x);
1522 }
1523 DECREF(func);
1524 break;
1525 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001526
1527 default:
1528 fprintf(stderr,
1529 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001530 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 err_setstr(SystemError, "eval_code: unknown opcode");
1532 why = WHY_EXCEPTION;
1533 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001534
1535#ifdef CASE_TOO_BIG
1536 }
1537#endif
1538
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 } /* switch */
1540
1541 on_error:
1542
1543 /* Quickly continue if no error occurred */
1544
1545 if (why == WHY_NOT) {
1546 if (err == 0 && x != NULL)
1547 continue; /* Normal, fast path */
1548 why = WHY_EXCEPTION;
1549 x = None;
1550 err = 0;
1551 }
1552
Guido van Rossum801dcae1992-04-08 11:32:32 +00001553#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 /* Double-check exception status */
1555
1556 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1557 if (!err_occurred()) {
1558 fprintf(stderr, "XXX ghost error\n");
1559 err_setstr(SystemError, "ghost error");
1560 why = WHY_EXCEPTION;
1561 }
1562 }
1563 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001564 if (err_occurred())
1565 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 }
1567#endif
1568
1569 /* Log traceback info if this is a real exception */
1570
1571 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001572 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001574 f->f_lasti -= 2;
1575 tb_here(f);
1576
Guido van Rossume59214e1994-08-30 08:01:59 +00001577 if (f->f_trace)
1578 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001579 if (sys_profile)
1580 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 }
1582
1583 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1584
1585 if (why == WHY_RERAISE)
1586 why = WHY_EXCEPTION;
1587
1588 /* Unwind stacks if a (pseudo) exception occurred */
1589
1590 while (why != WHY_NOT && f->f_iblock > 0) {
1591 block *b = pop_block(f);
1592 while (STACK_LEVEL() > b->b_level) {
1593 v = POP();
1594 XDECREF(v);
1595 }
1596 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1597 why = WHY_NOT;
1598 JUMPTO(b->b_handler);
1599 break;
1600 }
1601 if (b->b_type == SETUP_FINALLY ||
1602 b->b_type == SETUP_EXCEPT &&
1603 why == WHY_EXCEPTION) {
1604 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001605 object *exc, *val, *tb;
1606 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 if (val == NULL) {
1608 val = None;
1609 INCREF(val);
1610 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001611 /* Make the raw exception data
1612 available to the handler,
1613 so a program can emulate the
1614 Python main loop. Don't do
1615 this for 'finally'. */
1616 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001617 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 sysset("exc_value", val);
1619 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001621 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001622 PUSH(val);
1623 PUSH(exc);
1624 }
1625 else {
1626 if (why == WHY_RETURN)
1627 PUSH(retval);
1628 v = newintobject((long)why);
1629 PUSH(v);
1630 }
1631 why = WHY_NOT;
1632 JUMPTO(b->b_handler);
1633 break;
1634 }
1635 } /* unwind stack */
1636
1637 /* End the loop if we still have an error (or return) */
1638
1639 if (why != WHY_NOT)
1640 break;
1641
1642 } /* main loop */
1643
1644 /* Pop remaining stack entries */
1645
1646 while (!EMPTY()) {
1647 v = POP();
1648 XDECREF(v);
1649 }
1650
Guido van Rossum96a42c81992-01-12 02:29:51 +00001651 if (why != WHY_RETURN)
1652 retval = NULL;
1653
Guido van Rossume59214e1994-08-30 08:01:59 +00001654 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001655 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001656 if (call_trace(&f->f_trace, &f->f_trace, f,
1657 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001658 XDECREF(retval);
1659 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001660 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001661 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001662 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001663 }
1664
1665 if (sys_profile && why == WHY_RETURN) {
1666 if (call_trace(&sys_profile, (object**)0,
1667 f, "return", retval)) {
1668 XDECREF(retval);
1669 retval = NULL;
1670 why = WHY_EXCEPTION;
1671 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001672 }
1673
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 /* Restore previous frame and release the current one */
1675
1676 current_frame = f->f_back;
1677 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001678
1679 if (needmerge)
1680 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681
Guido van Rossum96a42c81992-01-12 02:29:51 +00001682 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001683}
1684
Guido van Rossum96a42c81992-01-12 02:29:51 +00001685#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001686static int
1687prtrace(v, str)
1688 object *v;
1689 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001691 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001692 if (printobject(v, stdout, 0) != 0)
1693 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001696#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001697
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001698static void
1699call_exc_trace(p_trace, p_newtrace, f)
1700 object **p_trace, **p_newtrace;
1701 frameobject *f;
1702{
1703 object *type, *value, *traceback, *arg;
1704 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001705 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001706 if (value == NULL) {
1707 value = None;
1708 INCREF(value);
1709 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001710 arg = mkvalue("(OOO)", type, value, traceback);
1711 if (arg == NULL) {
1712 err_restore(type, value, traceback);
1713 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001714 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001715 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1716 DECREF(arg);
1717 if (err == 0)
1718 err_restore(type, value, traceback);
1719 else {
1720 XDECREF(type);
1721 XDECREF(value);
1722 XDECREF(traceback);
1723 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001724}
1725
1726static int
1727call_trace(p_trace, p_newtrace, f, msg, arg)
1728 object **p_trace; /* in/out; may not be NULL;
1729 may not point to NULL variable initially */
1730 object **p_newtrace; /* in/out; may be NULL;
1731 may point to NULL variable;
1732 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001733 frameobject *f;
1734 char *msg;
1735 object *arg;
1736{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001737 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001738 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001739 static int tracing = 0;
1740
1741 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001742 /* Don't do recursive traces */
1743 if (p_newtrace) {
1744 XDECREF(*p_newtrace);
1745 *p_newtrace = NULL;
1746 }
1747 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001748 }
1749
Guido van Rossumf10570b1995-07-07 22:53:21 +00001750 args = newtupleobject(3);
1751 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001752 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001753 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001754 if (what == NULL)
1755 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001756 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001757 SETTUPLEITEM(args, 0, (object *)f);
1758 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001759 if (arg == NULL)
1760 arg = None;
1761 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001762 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001763 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001764 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001765 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001766 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001767 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001768 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001769 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001770 if (res == NULL) {
1771 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001772 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001773 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001774 *p_trace = NULL;
1775 if (p_newtrace) {
1776 XDECREF(*p_newtrace);
1777 *p_newtrace = NULL;
1778 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001779 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001780 }
1781 else {
1782 if (p_newtrace) {
1783 XDECREF(*p_newtrace);
1784 if (res == None)
1785 *p_newtrace = NULL;
1786 else {
1787 INCREF(res);
1788 *p_newtrace = res;
1789 }
1790 }
1791 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001792 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001793 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001794}
1795
Guido van Rossum3f5da241990-12-20 15:06:42 +00001796object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001797getbuiltins()
1798{
1799 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001800 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001801 else
1802 return current_frame->f_builtins;
1803}
1804
1805object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001806getlocals()
1807{
1808 if (current_frame == NULL)
1809 return NULL;
1810 fast_2_locals(current_frame);
1811 return current_frame->f_locals;
1812}
1813
1814object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815getglobals()
1816{
1817 if (current_frame == NULL)
1818 return NULL;
1819 else
1820 return current_frame->f_globals;
1821}
1822
Guido van Rossum81daa321993-05-20 14:24:46 +00001823object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001824getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001825{
1826 if (current_frame == NULL)
1827 return NULL;
1828 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001829 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001830}
1831
Guido van Rossume59214e1994-08-30 08:01:59 +00001832object *
1833getframe()
1834{
1835 return (object *)current_frame;
1836}
1837
Guido van Rossum6135a871995-01-09 17:53:26 +00001838int
1839getrestricted()
1840{
1841 return current_frame == NULL ? 0 : current_frame->f_restricted;
1842}
1843
Guido van Rossum3f5da241990-12-20 15:06:42 +00001844void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845flushline()
1846{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001847 object *f = sysget("stdout");
1848 if (softspace(f, 0))
1849 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850}
1851
Guido van Rossum3f5da241990-12-20 15:06:42 +00001852
Guido van Rossum06186511995-01-07 12:40:10 +00001853#define BINOP(opname, ropname, thisfunc) \
1854 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1855 ; \
1856 else \
1857 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001858
1859
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001861or(v, w)
1862 object *v, *w;
1863{
Guido van Rossum06186511995-01-07 12:40:10 +00001864 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001865 if (v->ob_type->tp_as_number != NULL) {
1866 object *x;
1867 object * (*f) FPROTO((object *, object *));
1868 if (coerce(&v, &w) != 0)
1869 return NULL;
1870 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1871 x = (*f)(v, w);
1872 DECREF(v);
1873 DECREF(w);
1874 if (f != NULL)
1875 return x;
1876 }
1877 err_setstr(TypeError, "bad operand type(s) for |");
1878 return NULL;
1879}
1880
1881static object *
1882xor(v, w)
1883 object *v, *w;
1884{
Guido van Rossum06186511995-01-07 12:40:10 +00001885 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001886 if (v->ob_type->tp_as_number != NULL) {
1887 object *x;
1888 object * (*f) FPROTO((object *, object *));
1889 if (coerce(&v, &w) != 0)
1890 return NULL;
1891 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1892 x = (*f)(v, w);
1893 DECREF(v);
1894 DECREF(w);
1895 if (f != NULL)
1896 return x;
1897 }
1898 err_setstr(TypeError, "bad operand type(s) for ^");
1899 return NULL;
1900}
1901
1902static object *
1903and(v, w)
1904 object *v, *w;
1905{
Guido van Rossum06186511995-01-07 12:40:10 +00001906 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001907 if (v->ob_type->tp_as_number != NULL) {
1908 object *x;
1909 object * (*f) FPROTO((object *, object *));
1910 if (coerce(&v, &w) != 0)
1911 return NULL;
1912 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1913 x = (*f)(v, w);
1914 DECREF(v);
1915 DECREF(w);
1916 if (f != NULL)
1917 return x;
1918 }
1919 err_setstr(TypeError, "bad operand type(s) for &");
1920 return NULL;
1921}
1922
1923static object *
1924lshift(v, w)
1925 object *v, *w;
1926{
Guido van Rossum06186511995-01-07 12:40:10 +00001927 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001928 if (v->ob_type->tp_as_number != NULL) {
1929 object *x;
1930 object * (*f) FPROTO((object *, object *));
1931 if (coerce(&v, &w) != 0)
1932 return NULL;
1933 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1934 x = (*f)(v, w);
1935 DECREF(v);
1936 DECREF(w);
1937 if (f != NULL)
1938 return x;
1939 }
1940 err_setstr(TypeError, "bad operand type(s) for <<");
1941 return NULL;
1942}
1943
1944static object *
1945rshift(v, w)
1946 object *v, *w;
1947{
Guido van Rossum06186511995-01-07 12:40:10 +00001948 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001949 if (v->ob_type->tp_as_number != NULL) {
1950 object *x;
1951 object * (*f) FPROTO((object *, object *));
1952 if (coerce(&v, &w) != 0)
1953 return NULL;
1954 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1955 x = (*f)(v, w);
1956 DECREF(v);
1957 DECREF(w);
1958 if (f != NULL)
1959 return x;
1960 }
1961 err_setstr(TypeError, "bad operand type(s) for >>");
1962 return NULL;
1963}
1964
1965static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001966add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 object *v, *w;
1968{
Guido van Rossum06186511995-01-07 12:40:10 +00001969 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001970 if (v->ob_type->tp_as_sequence != NULL)
1971 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1972 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001973 object *x;
1974 if (coerce(&v, &w) != 0)
1975 return NULL;
1976 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1977 DECREF(v);
1978 DECREF(w);
1979 return x;
1980 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001981 err_setstr(TypeError, "bad operand type(s) for +");
1982 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983}
1984
1985static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 object *v, *w;
1988{
Guido van Rossum06186511995-01-07 12:40:10 +00001989 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001990 if (v->ob_type->tp_as_number != NULL) {
1991 object *x;
1992 if (coerce(&v, &w) != 0)
1993 return NULL;
1994 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1995 DECREF(v);
1996 DECREF(w);
1997 return x;
1998 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001999 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 return NULL;
2001}
2002
2003static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002004mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 object *v, *w;
2006{
2007 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002008 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002009 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002010 if (tp->tp_as_number != NULL &&
2011 w->ob_type->tp_as_sequence != NULL &&
2012 !is_instanceobject(v)) {
2013 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 object *tmp = v;
2015 v = w;
2016 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002017 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002018 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002019 if (tp->tp_as_number != NULL) {
2020 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002021 if (is_instanceobject(v)) {
2022 /* Instances of user-defined classes get their
2023 other argument uncoerced, so they may
2024 implement sequence*number as well as
2025 number*number. */
2026 INCREF(v);
2027 INCREF(w);
2028 }
2029 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002030 return NULL;
2031 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2032 DECREF(v);
2033 DECREF(w);
2034 return x;
2035 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036 if (tp->tp_as_sequence != NULL) {
2037 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002038 err_setstr(TypeError,
2039 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002040 return NULL;
2041 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002042 return (*tp->tp_as_sequence->sq_repeat)
2043 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002044 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002045 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 return NULL;
2047}
2048
2049static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002050divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 object *v, *w;
2052{
Guido van Rossum06186511995-01-07 12:40:10 +00002053 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002054 if (v->ob_type->tp_as_number != NULL) {
2055 object *x;
2056 if (coerce(&v, &w) != 0)
2057 return NULL;
2058 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2059 DECREF(v);
2060 DECREF(w);
2061 return x;
2062 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002063 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002064 return NULL;
2065}
2066
2067static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002068mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 object *v, *w;
2070{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 if (is_stringobject(v)) {
2072 return formatstring(v, w);
2073 }
Guido van Rossum06186511995-01-07 12:40:10 +00002074 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002075 if (v->ob_type->tp_as_number != NULL) {
2076 object *x;
2077 if (coerce(&v, &w) != 0)
2078 return NULL;
2079 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2080 DECREF(v);
2081 DECREF(w);
2082 return x;
2083 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 return NULL;
2086}
2087
2088static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002089neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 object *v;
2091{
2092 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002093 return (*v->ob_type->tp_as_number->nb_negative)(v);
2094 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 return NULL;
2096}
2097
2098static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 object *v;
2101{
2102 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103 return (*v->ob_type->tp_as_number->nb_positive)(v);
2104 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 return NULL;
2106}
2107
2108static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002109invert(v)
2110 object *v;
2111{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002112 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002113 if (v->ob_type->tp_as_number != NULL &&
2114 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2115 return (*f)(v);
2116 err_setstr(TypeError, "bad operand type(s) for unary ~");
2117 return NULL;
2118}
2119
2120static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002121not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 object *v;
2123{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002125 object *w;
2126 if (outcome < 0)
2127 return NULL;
2128 if (outcome == 0)
2129 w = True;
2130 else
2131 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002132 INCREF(w);
2133 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134}
Guido van Rossum234f9421993-06-17 12:35:49 +00002135
2136
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002137/* External interface to call any callable object. The arg may be NULL. */
2138
2139object *
2140call_object(func, arg)
2141 object *func;
2142 object *arg;
2143{
Guido van Rossume59214e1994-08-30 08:01:59 +00002144 binaryfunc call;
2145 object *result;
2146
Guido van Rossum684ed981995-03-22 10:09:02 +00002147 if (call = func->ob_type->tp_call)
Guido van Rossume59214e1994-08-30 08:01:59 +00002148 result = (*call)(func, arg);
Guido van Rossume59214e1994-08-30 08:01:59 +00002149 else if (is_instancemethodobject(func) || is_funcobject(func))
2150 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002151 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002152 result = call_builtin(func, arg);
2153
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002154 if (result == NULL && !err_occurred())
2155 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002156
2157 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002158}
2159
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002163 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 if (is_methodobject(func)) {
2166 method meth = getmethod(func);
2167 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002168 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2169 int size = gettuplesize(arg);
2170 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002171 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002172 else if (size == 0)
2173 arg = NULL;
2174 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002175 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002178 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002180 if (is_instanceobject(func)) {
2181 object *res, *call = getattr(func,"__call__");
2182 if (call == NULL) {
2183 err_clear();
2184 err_setstr(AttributeError, "no __call__ method defined");
2185 return NULL;
2186 }
2187 res = call_object(call, arg);
2188 DECREF(call);
2189 return res;
2190 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002192 return NULL;
2193}
2194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002196call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002198 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 object *newarg = NULL;
2201 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002202 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002204 object *argdefs;
2205 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206
Guido van Rossume8122f11991-05-05 20:03:07 +00002207 if (is_instancemethodobject(func)) {
2208 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002209 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002210 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002211 if (self == NULL) {
2212 /* Unbound methods must be called with an instance of
2213 the class (or a derived class) as first argument */
2214 if (arg != NULL && is_tupleobject(arg) &&
2215 gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002216 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002217 if (self != NULL &&
2218 is_instanceobject(self) &&
2219 issubclass((object *)
2220 (((instanceobject *)self)->in_class),
2221 class))
2222 /* self = self */ ;
2223 else
2224 self = NULL;
2225 }
2226 if (self == NULL) {
2227 err_setstr(TypeError,
2228 "unbound method must be called with class instance argument");
2229 return NULL;
2230 }
2231 }
2232 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002233 if (arg == NULL)
2234 argcount = 0;
2235 else if (is_tupleobject(arg))
2236 argcount = gettuplesize(arg);
2237 else
2238 argcount = 1;
2239 newarg = newtupleobject(argcount + 1);
2240 if (newarg == NULL)
2241 return NULL;
2242 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002243 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00002244 if (arg != NULL && !is_tupleobject(arg)) {
2245 INCREF(arg);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002246 SETTUPLEITEM(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002247 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002248 else {
2249 int i;
2250 object *v;
2251 for (i = 0; i < argcount; i++) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002252 v = GETTUPLEITEM(arg, i);
Guido van Rossum81daa321993-05-20 14:24:46 +00002253 XINCREF(v);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002254 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002255 }
2256 }
2257 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 }
2259 }
2260 else {
2261 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 return NULL;
2264 }
2265 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002266
2267 argdefs = getfuncargstuff(func, &argcount);
2268 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2269 int actualcount, j;
2270 /* Process default arguments */
2271 if (argcount & 0x4000)
2272 argcount ^= 0x4000;
2273 actualcount = gettuplesize(arg);
2274 j = gettuplesize(argdefs) - (argcount - actualcount);
2275 if (actualcount < argcount && j >= 0) {
2276 int i;
2277 object *v;
2278 if (newarg == NULL)
2279 INCREF(arg);
2280 newarg = newtupleobject(argcount);
2281 if (newarg == NULL) {
2282 DECREF(arg);
2283 return NULL;
2284 }
2285 for (i = 0; i < actualcount; i++) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002286 v = GETTUPLEITEM(arg, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002287 XINCREF(v);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002288 SETTUPLEITEM(newarg, i, v);
Guido van Rossume59214e1994-08-30 08:01:59 +00002289 }
2290 for (; i < argcount; i++, j++) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002291 v = GETTUPLEITEM(argdefs, j);
Guido van Rossume59214e1994-08-30 08:01:59 +00002292 XINCREF(v);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002293 SETTUPLEITEM(newarg, i, v);
Guido van Rossume59214e1994-08-30 08:01:59 +00002294 }
2295 DECREF(arg);
2296 arg = newarg;
2297 }
2298 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299
Guido van Rossum3f5da241990-12-20 15:06:42 +00002300 co = getfunccode(func);
2301 if (co == NULL) {
2302 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 return NULL;
2304 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002305 if (!is_codeobject(co))
2306 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002307 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 return NULL;
2311 }
2312
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 newglobals = getfuncglobals(func);
2314 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315
Guido van Rossum81daa321993-05-20 14:24:46 +00002316 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317
Guido van Rossum3f5da241990-12-20 15:06:42 +00002318 DECREF(newlocals);
2319 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320
Guido van Rossum3f5da241990-12-20 15:06:42 +00002321 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322
2323 return v;
2324}
2325
2326static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002327apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 object *v, *w;
2329{
2330 typeobject *tp = v->ob_type;
2331 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002332 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 return NULL;
2334 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002335 if (tp->tp_as_mapping != NULL) {
2336 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2337 }
2338 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 int i;
2340 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002341 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 return NULL;
2343 }
2344 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002345 if (i < 0) {
2346 int len = (*tp->tp_as_sequence->sq_length)(v);
2347 if (len < 0)
2348 return NULL;
2349 i += len;
2350 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353}
2354
2355static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002356loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 object *v, *w;
2358{
2359 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002360 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002362 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363 return NULL;
2364 }
2365 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002366 v = (*sq->sq_item)(v, i);
2367 if (v)
2368 return v;
2369 if (err_occurred() == IndexError)
2370 err_clear();
2371 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372}
2373
2374static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002375slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 object *v;
2377 int isize;
2378 int *pi;
2379{
2380 if (v != NULL) {
2381 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002382 err_setstr(TypeError, "slice index must be int");
2383 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 }
2385 *pi = getintvalue(v);
2386 if (*pi < 0)
2387 *pi += isize;
2388 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002389 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390}
2391
2392static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002393apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 object *u, *v, *w;
2395{
2396 typeobject *tp = u->ob_type;
2397 int ilow, ihigh, isize;
2398 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002399 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 return NULL;
2401 }
2402 ilow = 0;
2403 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002404 if (isize < 0)
2405 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002406 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002410 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002412
2413static int
2414assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 object *w;
2416 object *key;
2417 object *v;
2418{
2419 typeobject *tp = w->ob_type;
2420 sequence_methods *sq;
2421 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002422 int (*func1)();
2423 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002424 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002425 (func1 = mp->mp_ass_subscript) != NULL) {
2426 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002427 }
2428 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002429 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002431 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002432 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002433 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002435 else {
2436 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002437 if (i < 0) {
2438 int len = (*sq->sq_length)(w);
2439 if (len < 0)
2440 return -1;
2441 i += len;
2442 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002443 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002444 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002447 err_setstr(TypeError,
2448 "can't assign to this subscripted object");
2449 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451}
2452
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453static int
2454assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002455 object *u, *v, *w, *x;
2456{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002457 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459 if (sq == NULL) {
2460 err_setstr(TypeError, "assign to slice of non-sequence");
2461 return -1;
2462 }
2463 if (sq == NULL || sq->sq_ass_slice == NULL) {
2464 err_setstr(TypeError, "unassignable slice");
2465 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 }
2467 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002468 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002469 if (isize < 0)
2470 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002471 if (slice_index(v, isize, &ilow) != 0)
2472 return -1;
2473 if (slice_index(w, isize, &ihigh) != 0)
2474 return -1;
2475 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476}
2477
2478static int
2479cmp_exception(err, v)
2480 object *err, *v;
2481{
2482 if (is_tupleobject(v)) {
2483 int i, n;
2484 n = gettuplesize(v);
2485 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002486 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002487 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488 return 1;
2489 }
2490 return 0;
2491 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002492 if (is_classobject(v) && is_classobject(err))
2493 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 return err == v;
2495}
2496
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497static int
2498cmp_member(v, w)
2499 object *v, *w;
2500{
Guido van Rossume59214e1994-08-30 08:01:59 +00002501 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002502 object *x;
2503 sequence_methods *sq;
2504 /* Special case for char in string */
2505 if (is_stringobject(w)) {
2506 register char *s, *end;
2507 register char c;
2508 if (!is_stringobject(v) || getstringsize(v) != 1) {
2509 err_setstr(TypeError,
2510 "string member test needs char left operand");
2511 return -1;
2512 }
2513 c = getstringvalue(v)[0];
2514 s = getstringvalue(w);
2515 end = s + getstringsize(w);
2516 while (s < end) {
2517 if (c == *s++)
2518 return 1;
2519 }
2520 return 0;
2521 }
2522 sq = w->ob_type->tp_as_sequence;
2523 if (sq == NULL) {
2524 err_setstr(TypeError,
2525 "'in' or 'not in' needs sequence right argument");
2526 return -1;
2527 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002528 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002530 if (x == NULL) {
2531 if (err_occurred() == IndexError) {
2532 err_clear();
2533 break;
2534 }
2535 return -1;
2536 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002537 cmp = cmpobject(v, x);
2538 XDECREF(x);
2539 if (cmp == 0)
2540 return 1;
2541 }
2542 return 0;
2543}
2544
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002546cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002547 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 register object *v;
2549 register object *w;
2550{
2551 register int cmp;
2552 register int res = 0;
2553 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002554 case IS:
2555 case IS_NOT:
2556 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002557 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558 res = !res;
2559 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560 case IN:
2561 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002562 res = cmp_member(v, w);
2563 if (res < 0)
2564 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002565 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002566 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567 break;
2568 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 break;
2571 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002572 cmp = cmpobject(v, w);
2573 switch (op) {
2574 case LT: res = cmp < 0; break;
2575 case LE: res = cmp <= 0; break;
2576 case EQ: res = cmp == 0; break;
2577 case NE: res = cmp != 0; break;
2578 case GT: res = cmp > 0; break;
2579 case GE: res = cmp >= 0; break;
2580 /* XXX no default? (res is initialized to 0 though) */
2581 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 }
2583 v = res ? True : False;
2584 INCREF(v);
2585 return v;
2586}
2587
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588static int
2589import_from(locals, v, name)
2590 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002591 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002592 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002593{
2594 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002595 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002596 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002597 return -1;
2598 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002599 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002600 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002601 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002602 object *name, *value;
2603 pos = 0;
2604 while (mappinggetnext(w, &pos, &name, &value)) {
2605 if (!is_stringobject(name) ||
2606 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002607 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002608 if (is_accessobject(value)) {
2609 value = getaccessvalue(value, (object *)NULL);
2610 if (value == NULL) {
2611 err_clear();
2612 continue;
2613 }
2614 }
2615 else
2616 INCREF(value);
2617 err = dict2insert(locals, name, value);
2618 DECREF(value);
2619 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002620 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002621 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002622 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002623 }
2624 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002625 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002627 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002628 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002629 getstringvalue(name));
2630 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002631 return -1;
2632 }
2633 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002634 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002635 }
2636}
2637
2638static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002639build_class(methods, bases, name)
2640 object *methods; /* dictionary */
2641 object *bases; /* tuple containing classes */
2642 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002643{
Guido van Rossum25831651993-05-19 14:50:45 +00002644 int i;
2645 if (!is_tupleobject(bases)) {
2646 err_setstr(SystemError, "build_class with non-tuple bases");
2647 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002648 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002649 if (gettuplesize(bases) > 0) {
2650 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002651 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002652 /* Call the base's *type*, if it is callable.
2653 This code is a hook for Donald Beaudry's type extensions.
2654 In unexended Python it will never be triggered since its
2655 types are not callable. */
2656 if (base->ob_type->ob_type->tp_call) {
2657 object *args;
2658 object *class;
2659 args = mkvalue("(OOO)", name, bases, methods);
2660 class = call_object((object *)base->ob_type, args);
2661 DECREF(args);
2662 return class;
2663 }
2664 }
Guido van Rossum25831651993-05-19 14:50:45 +00002665 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002667 return NULL;
2668 }
Guido van Rossum25831651993-05-19 14:50:45 +00002669 if (!is_stringobject(name)) {
2670 err_setstr(SystemError, "build_class witn non-string name");
2671 return NULL;
2672 }
2673 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002674 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002675 if (!is_classobject(base)) {
2676 err_setstr(TypeError,
2677 "base is not a class object");
2678 return NULL;
2679 }
2680 }
2681 return newclassobject(bases, methods, name);
2682}
2683
2684static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002685access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002686 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002687 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002688 frameobject *f;
2689{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002690 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002691 object *value, *ac;
2692 typeobject *type;
2693 int fastind, ret;
2694 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002695 if (f->f_localmap == NULL)
2696 value = dict2lookup(f->f_locals, name);
2697 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002698 object *map = f->f_localmap;
2699 value = NULL;
2700 for (fastind = gettuplesize(map); --fastind >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002701 object *fname = GETTUPLEITEM(map, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002702 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002703 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002704 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002705 }
2706 }
2707 }
2708 if (value && is_accessobject(value)) {
2709 err_setstr(AccessError, "can't override access");
2710 return -1;
2711 }
2712 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002713 if (value != NULL && value != None)
2714 type = value->ob_type;
2715 else
2716 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002717 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002718 if (ac == NULL)
2719 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002720 if (fastind >= 0)
2721 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002722 else {
2723 ret = dict2insert(f->f_locals, name, ac);
2724 DECREF(ac);
2725 }
2726 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002727}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002728
2729static int
2730exec_statement(prog, globals, locals)
2731 object *prog;
2732 object *globals;
2733 object *locals;
2734{
2735 char *s;
2736 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002737 object *v;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002738
2739 if (is_tupleobject(prog) && globals == None && locals == None &&
2740 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2741 /* Backward compatibility hack */
2742 globals = gettupleitem(prog, 1);
2743 if (n == 3)
2744 locals = gettupleitem(prog, 2);
2745 prog = gettupleitem(prog, 0);
2746 }
2747 if (globals == None) {
2748 globals = getglobals();
2749 if (locals == None)
2750 locals = getlocals();
2751 }
2752 else if (locals == None)
2753 locals = globals;
2754 if (!is_stringobject(prog) &&
2755 !is_codeobject(prog) &&
2756 !is_fileobject(prog)) {
2757 err_setstr(TypeError,
2758 "exec 1st arg must be string, code or file object");
2759 return -1;
2760 }
2761 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2762 err_setstr(TypeError,
2763 "exec 2nd/3rd args must be dict or None");
2764 return -1;
2765 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002766 if (dictlookup(globals, "__builtins__") == NULL)
2767 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002768 if (is_codeobject(prog)) {
2769 if (eval_code((codeobject *) prog, globals, locals,
2770 (object *)NULL, (object *)NULL) == NULL)
2771 return -1;
2772 return 0;
2773 }
2774 if (is_fileobject(prog)) {
2775 FILE *fp = getfilefile(prog);
2776 char *name = getstringvalue(getfilename(prog));
2777 if (run_file(fp, name, file_input, globals, locals) == NULL)
2778 return -1;
2779 return 0;
2780 }
2781 s = getstringvalue(prog);
2782 if (strlen(s) != getstringsize(prog)) {
2783 err_setstr(ValueError, "embedded '\\0' in exec string");
2784 return -1;
2785 }
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002786 if ((v = run_string(s, file_input, globals, locals)) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002787 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002788 DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002789 return 0;
2790}
Guido van Rossum24c13741995-02-14 09:42:43 +00002791
2792/* Hack for Ken Manheimer */
2793static object *
2794find_from_args(f, nexti)
2795 frameobject *f;
2796 int nexti;
2797{
2798 int opcode;
2799 int oparg;
2800 object *list, *name;
2801 unsigned char *next_instr;
2802
2803 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2804 opcode = (*next_instr++);
2805 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002806 INCREF(None);
2807 return None;
2808 }
2809
2810 list = newlistobject(0);
2811 if (list == NULL)
2812 return NULL;
2813
2814 do {
2815 oparg = (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]);
2816 name = Getnamev(f, oparg);
2817 if (addlistitem(list, name) < 0) {
2818 DECREF(list);
2819 break;
2820 }
2821 opcode = (*next_instr++);
2822 } while (opcode == IMPORT_FROM);
2823
2824 return list;
2825}