blob: 6e026fd006a8f2131815400b99390cd6e8a28b30 [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 Rossum99bec951992-09-03 20:29:45 +0000291#ifdef DEBUG
292 /* 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;
778
779 case RAISE_EXCEPTION:
780 v = POP();
781 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000782 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000783 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000784 u = w;
Guido van Rossum8d617a61995-03-09 12:12:11 +0000785 w = GETTUPLEITEM(u, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000786 INCREF(w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000787 DECREF(u);
788 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000789 if (is_stringobject(w)) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 err_setval(w, v);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000791 } else if (is_classobject(w)) {
792 if (!is_instanceobject(v)
793 || !issubclass((object*)((instanceobject*)v)->in_class,
794 w))
795 err_setstr(TypeError,
796 "a class exception must have a value that is an instance of the class");
797 else
798 err_setval(w,v);
799 } else if (is_instanceobject(w)) {
800 if (v != None)
801 err_setstr(TypeError,
802 "an instance exception may not have a separate value");
803 else {
804 DECREF(v);
805 v = w;
806 w = (object*) ((instanceobject*)w)->in_class;
807 INCREF(w);
808 err_setval(w, v);
809 }
810 } else
811 err_setstr(TypeError,
812 "exceptions must be strings, classes, or instances");
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 DECREF(v);
814 DECREF(w);
815 why = WHY_EXCEPTION;
816 break;
817
818 case LOAD_LOCALS:
819 v = f->f_locals;
820 INCREF(v);
821 PUSH(v);
822 break;
823
824 case RETURN_VALUE:
825 retval = POP();
826 why = WHY_RETURN;
827 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000828
829 case LOAD_GLOBALS:
830 v = f->f_locals;
831 INCREF(v);
832 PUSH(v);
833 break;
834
835 case EXEC_STMT:
836 w = POP();
837 v = POP();
838 u = POP();
839 err = exec_statement(u, v, w);
840 DECREF(u);
841 DECREF(v);
842 DECREF(w);
843 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 case BUILD_FUNCTION:
846 v = POP();
847 x = newfuncobject(v, f->f_globals);
848 DECREF(v);
849 PUSH(x);
850 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000851
852 case SET_FUNC_ARGS:
853 v = POP(); /* The function */
854 w = POP(); /* The argument list */
855 err = setfuncargstuff(v, oparg, w);
856 PUSH(v);
857 DECREF(w);
858 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000859
860 case POP_BLOCK:
861 {
862 block *b = pop_block(f);
863 while (STACK_LEVEL() > b->b_level) {
864 v = POP();
865 DECREF(v);
866 }
867 }
868 break;
869
870 case END_FINALLY:
871 v = POP();
872 if (is_intobject(v)) {
873 why = (enum why_code) getintvalue(v);
874 if (why == WHY_RETURN)
875 retval = POP();
876 }
Guido van Rossum1d339e81995-02-17 15:04:21 +0000877 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 w = POP();
879 err_setval(v, w);
880 DECREF(w);
881 w = POP();
882 tb_store(w);
883 DECREF(w);
884 why = WHY_RERAISE;
885 }
886 else if (v != None) {
887 err_setstr(SystemError,
888 "'finally' pops bad exception");
889 why = WHY_EXCEPTION;
890 }
891 DECREF(v);
892 break;
893
894 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000895 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000897 w = POP();
898 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000900 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 DECREF(v);
902 DECREF(w);
903 break;
904
905 case STORE_NAME:
906 w = GETNAMEV(oparg);
907 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000908 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000909 if (u == NULL) {
910 if (defmode != 0) {
911 if (v != None)
912 u = (object *)v->ob_type;
913 else
914 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000915 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000916 (typeobject *)u,
917 defmode);
918 DECREF(v);
919 if (x == NULL)
920 break;
921 v = x;
922 }
923 }
924 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000925 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000926 DECREF(v);
927 break;
928 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 err = dict2insert(f->f_locals, w, v);
930 DECREF(v);
931 break;
932
933 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000934 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000935 u = dict2lookup(f->f_locals, w);
936 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000937 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000938 (object *)NULL);
939 break;
940 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000941 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000942 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000944
945#ifdef CASE_TOO_BIG
946 default: switch (opcode) {
947#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000948
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000949 case UNPACK_VARARG:
950 if (EMPTY()) {
951 err_setstr(TypeError,
952 "no argument list");
953 why = WHY_EXCEPTION;
954 break;
955 }
956 v = POP();
957 if (!is_tupleobject(v)) {
958 err_setstr(TypeError,
959 "bad argument list");
960 why = WHY_EXCEPTION;
961 }
962 else if (gettuplesize(v) < oparg) {
963 err_setstr(TypeError,
964 "not enough arguments");
965 why = WHY_EXCEPTION;
966 }
967 else if (oparg == 0) {
968 PUSH(v);
969 break;
970 }
971 else {
972 x = gettupleslice(v, oparg, gettuplesize(v));
973 if (x != NULL) {
974 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000975 if (!CHECK_STACK(oparg)) {
976 x = NULL;
977 break;
978 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000979 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +0000980 w = GETTUPLEITEM(v, oparg);
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000981 INCREF(w);
982 PUSH(w);
983 }
984 }
985 }
986 DECREF(v);
987 break;
988
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000989 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000990 {
991 int n;
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 break;
1004 }
1005 n = gettuplesize(v);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001006 if (n != oparg) {
1007 err_setstr(TypeError,
1008 "arg count mismatch");
1009 why = WHY_EXCEPTION;
1010 DECREF(v);
1011 break;
1012 }
1013 PUSH(v);
1014 }
1015 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 case UNPACK_TUPLE:
1017 v = POP();
1018 if (!is_tupleobject(v)) {
1019 err_setstr(TypeError, "unpack non-tuple");
1020 why = WHY_EXCEPTION;
1021 }
1022 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001023 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001024 "unpack tuple of wrong size");
1025 why = WHY_EXCEPTION;
1026 }
1027 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001028 if (!CHECK_STACK(oparg)) {
1029 x = NULL;
1030 break;
1031 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001033 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 INCREF(w);
1035 PUSH(w);
1036 }
1037 }
1038 DECREF(v);
1039 break;
1040
1041 case UNPACK_LIST:
1042 v = POP();
1043 if (!is_listobject(v)) {
1044 err_setstr(TypeError, "unpack non-list");
1045 why = WHY_EXCEPTION;
1046 }
1047 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001048 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 "unpack list of wrong size");
1050 why = WHY_EXCEPTION;
1051 }
1052 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001053 if (!CHECK_STACK(oparg)) {
1054 x = NULL;
1055 break;
1056 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001057 for (; --oparg >= 0; ) {
1058 w = getlistitem(v, oparg);
1059 INCREF(w);
1060 PUSH(w);
1061 }
1062 }
1063 DECREF(v);
1064 break;
1065
1066 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001067 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001068 v = POP();
1069 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001070 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 DECREF(v);
1072 DECREF(u);
1073 break;
1074
1075 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001076 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001078 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001079 DECREF(v);
1080 break;
1081
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001082 case STORE_GLOBAL:
1083 w = GETNAMEV(oparg);
1084 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001085 u = dict2lookup(f->f_locals, w);
1086 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001087 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001088 DECREF(v);
1089 break;
1090 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001091 err = dict2insert(f->f_globals, w, v);
1092 DECREF(v);
1093 break;
1094
1095 case DELETE_GLOBAL:
1096 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001097 u = dict2lookup(f->f_locals, w);
1098 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001099 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001100 (object *)NULL);
1101 break;
1102 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001103 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001104 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001105 break;
1106
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 case LOAD_CONST:
1108 x = GETCONST(oparg);
1109 INCREF(x);
1110 PUSH(x);
1111 break;
1112
1113 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001114 w = GETNAMEV(oparg);
1115 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001117 err_clear();
1118 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001120 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001121 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001123 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 break;
1125 }
1126 }
1127 }
Guido van Rossum25831651993-05-19 14:50:45 +00001128 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001129 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001130 if (x == NULL)
1131 break;
1132 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001133 else
1134 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 PUSH(x);
1136 break;
1137
1138 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001139 w = GETNAMEV(oparg);
1140 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001141 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001142 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001143 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001145 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 break;
1147 }
1148 }
Guido van Rossum25831651993-05-19 14:50:45 +00001149 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001150 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001151 if (x == NULL)
1152 break;
1153 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001154 else
1155 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 PUSH(x);
1157 break;
1158
1159 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001160 w = GETNAMEV(oparg);
1161 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001163 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 break;
1165 }
Guido van Rossum25831651993-05-19 14:50:45 +00001166 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001167 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001168 if (x == NULL)
1169 break;
1170 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001171 else
1172 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 PUSH(x);
1174 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001175
1176 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001177 x = GETCONST(oparg);
1178 if (x == None)
1179 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001180 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001181 err_setstr(SystemError, "bad RESERVE_FAST");
1182 x = NULL;
1183 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001184 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001185 XDECREF(f->f_fastlocals);
1186 XDECREF(f->f_localmap);
1187 INCREF(x);
1188 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001189 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001190 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001191 break;
1192
1193 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001194 x = GETLISTITEM(fastlocals, oparg);
1195 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001196 err_setval(NameError,
1197 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001198 break;
1199 }
Guido van Rossum25831651993-05-19 14:50:45 +00001200 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001201 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001202 if (x == NULL)
1203 break;
1204 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001205 else
1206 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001207 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001208 break;
1209
1210 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001211 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001212 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001213 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001214 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001215 DECREF(v);
1216 break;
1217 }
Guido van Rossum25831651993-05-19 14:50:45 +00001218 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001220 break;
1221
1222 case DELETE_FAST:
1223 x = GETLISTITEM(fastlocals, oparg);
1224 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001225 err_setval(NameError,
1226 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001227 break;
1228 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001229 if (x != NULL && is_accessobject(x)) {
1230 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001231 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001232 break;
1233 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001234 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001235 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001236 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001237
1238 case BUILD_TUPLE:
1239 x = newtupleobject(oparg);
1240 if (x != NULL) {
1241 for (; --oparg >= 0;) {
1242 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001243 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 }
1245 PUSH(x);
1246 }
1247 break;
1248
1249 case BUILD_LIST:
1250 x = newlistobject(oparg);
1251 if (x != NULL) {
1252 for (; --oparg >= 0;) {
1253 w = POP();
1254 err = setlistitem(x, oparg, w);
1255 if (err != 0)
1256 break;
1257 }
1258 PUSH(x);
1259 }
1260 break;
1261
1262 case BUILD_MAP:
1263 x = newdictobject();
1264 PUSH(x);
1265 break;
1266
1267 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001268 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001270 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001271 DECREF(v);
1272 PUSH(x);
1273 break;
1274
1275 case COMPARE_OP:
1276 w = POP();
1277 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001278 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 DECREF(v);
1280 DECREF(w);
1281 PUSH(x);
1282 break;
1283
1284 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001285 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001286 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287 if (x == NULL) {
1288 err_setstr(ImportError,
1289 "__import__ not found");
1290 break;
1291 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001292 if (is_methodobject(x)) {
1293 u = None;
1294 INCREF(u);
1295 }
1296 else {
1297 u = find_from_args(f, INSTR_OFFSET());
1298 if (u == NULL) {
1299 x = u;
1300 break;
1301 }
1302 }
1303 w = mkvalue("(OOOO)", w, f->f_globals, f->f_locals, u);
1304 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001305 if (w == NULL) {
1306 x = NULL;
1307 break;
1308 }
1309 x = call_object(x, w);
1310 DECREF(w);
1311 if (x)
1312 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 break;
1314
1315 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001316 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001318 fast_2_locals(f);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001319 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001320 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001322
1323 case ACCESS_MODE:
1324 v = POP();
1325 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001326 if (getstringvalue(w)[0] == '*')
1327 defmode = getintvalue(v);
1328 else
1329 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001330 DECREF(v);
1331 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332
1333 case JUMP_FORWARD:
1334 JUMPBY(oparg);
1335 break;
1336
1337 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001338 err = testbool(TOP());
1339 if (err > 0)
1340 err = 0;
1341 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 JUMPBY(oparg);
1343 break;
1344
1345 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001346 err = testbool(TOP());
1347 if (err > 0) {
1348 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001350 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 break;
1352
1353 case JUMP_ABSOLUTE:
1354 JUMPTO(oparg);
1355 break;
1356
1357 case FOR_LOOP:
1358 /* for v in s: ...
1359 On entry: stack contains s, i.
1360 On exit: stack contains s, i+1, s[i];
1361 but if loop exhausted:
1362 s, i are popped, and we jump */
1363 w = POP(); /* Loop index */
1364 v = POP(); /* Sequence object */
1365 u = loop_subscript(v, w);
1366 if (u != NULL) {
1367 PUSH(v);
1368 x = newintobject(getintvalue(w)+1);
1369 PUSH(x);
1370 DECREF(w);
1371 PUSH(u);
1372 }
1373 else {
1374 DECREF(v);
1375 DECREF(w);
1376 /* A NULL can mean "s exhausted"
1377 but also an error: */
1378 if (err_occurred())
1379 why = WHY_EXCEPTION;
1380 else
1381 JUMPBY(oparg);
1382 }
1383 break;
1384
1385 case SETUP_LOOP:
1386 case SETUP_EXCEPT:
1387 case SETUP_FINALLY:
1388 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1389 STACK_LEVEL());
1390 break;
1391
1392 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001393#ifdef LLTRACE
1394 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001395 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001397 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001398 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001399 /* Trace each line of code reached */
1400 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001401 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001402 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001403 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 break;
1405
1406 default:
1407 fprintf(stderr,
1408 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001409 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 err_setstr(SystemError, "eval_code: unknown opcode");
1411 why = WHY_EXCEPTION;
1412 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001413
1414#ifdef CASE_TOO_BIG
1415 }
1416#endif
1417
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 } /* switch */
1419
1420 on_error:
1421
1422 /* Quickly continue if no error occurred */
1423
1424 if (why == WHY_NOT) {
1425 if (err == 0 && x != NULL)
1426 continue; /* Normal, fast path */
1427 why = WHY_EXCEPTION;
1428 x = None;
1429 err = 0;
1430 }
1431
Guido van Rossum801dcae1992-04-08 11:32:32 +00001432#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 /* Double-check exception status */
1434
1435 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1436 if (!err_occurred()) {
1437 fprintf(stderr, "XXX ghost error\n");
1438 err_setstr(SystemError, "ghost error");
1439 why = WHY_EXCEPTION;
1440 }
1441 }
1442 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001443 if (err_occurred())
1444 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 }
1446#endif
1447
1448 /* Log traceback info if this is a real exception */
1449
1450 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001451 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001453 f->f_lasti -= 2;
1454 tb_here(f);
1455
Guido van Rossume59214e1994-08-30 08:01:59 +00001456 if (f->f_trace)
1457 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001458 if (sys_profile)
1459 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 }
1461
1462 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1463
1464 if (why == WHY_RERAISE)
1465 why = WHY_EXCEPTION;
1466
1467 /* Unwind stacks if a (pseudo) exception occurred */
1468
1469 while (why != WHY_NOT && f->f_iblock > 0) {
1470 block *b = pop_block(f);
1471 while (STACK_LEVEL() > b->b_level) {
1472 v = POP();
1473 XDECREF(v);
1474 }
1475 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1476 why = WHY_NOT;
1477 JUMPTO(b->b_handler);
1478 break;
1479 }
1480 if (b->b_type == SETUP_FINALLY ||
1481 b->b_type == SETUP_EXCEPT &&
1482 why == WHY_EXCEPTION) {
1483 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001484 object *exc, *val, *tb;
1485 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001486 if (val == NULL) {
1487 val = None;
1488 INCREF(val);
1489 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001490 /* Make the raw exception data
1491 available to the handler,
1492 so a program can emulate the
1493 Python main loop. Don't do
1494 this for 'finally'. */
1495 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001496 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 sysset("exc_value", val);
1498 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001500 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 PUSH(val);
1502 PUSH(exc);
1503 }
1504 else {
1505 if (why == WHY_RETURN)
1506 PUSH(retval);
1507 v = newintobject((long)why);
1508 PUSH(v);
1509 }
1510 why = WHY_NOT;
1511 JUMPTO(b->b_handler);
1512 break;
1513 }
1514 } /* unwind stack */
1515
1516 /* End the loop if we still have an error (or return) */
1517
1518 if (why != WHY_NOT)
1519 break;
1520
1521 } /* main loop */
1522
1523 /* Pop remaining stack entries */
1524
1525 while (!EMPTY()) {
1526 v = POP();
1527 XDECREF(v);
1528 }
1529
Guido van Rossum96a42c81992-01-12 02:29:51 +00001530 if (why != WHY_RETURN)
1531 retval = NULL;
1532
Guido van Rossume59214e1994-08-30 08:01:59 +00001533 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001534 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001535 if (call_trace(&f->f_trace, &f->f_trace, f,
1536 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001537 XDECREF(retval);
1538 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001539 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001540 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001541 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001542 }
1543
1544 if (sys_profile && why == WHY_RETURN) {
1545 if (call_trace(&sys_profile, (object**)0,
1546 f, "return", retval)) {
1547 XDECREF(retval);
1548 retval = NULL;
1549 why = WHY_EXCEPTION;
1550 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001551 }
1552
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 /* Restore previous frame and release the current one */
1554
1555 current_frame = f->f_back;
1556 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001557
1558 if (needmerge)
1559 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560
Guido van Rossum96a42c81992-01-12 02:29:51 +00001561 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001562}
1563
Guido van Rossum96a42c81992-01-12 02:29:51 +00001564#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565static int
1566prtrace(v, str)
1567 object *v;
1568 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001571 if (printobject(v, stdout, 0) != 0)
1572 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001573 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001575#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001577static void
1578call_exc_trace(p_trace, p_newtrace, f)
1579 object **p_trace, **p_newtrace;
1580 frameobject *f;
1581{
1582 object *type, *value, *traceback, *arg;
1583 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001584 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001585 if (value == NULL) {
1586 value = None;
1587 INCREF(value);
1588 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001589 arg = mkvalue("(OOO)", type, value, traceback);
1590 if (arg == NULL) {
1591 err_restore(type, value, traceback);
1592 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001593 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001594 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1595 DECREF(arg);
1596 if (err == 0)
1597 err_restore(type, value, traceback);
1598 else {
1599 XDECREF(type);
1600 XDECREF(value);
1601 XDECREF(traceback);
1602 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001603}
1604
1605static int
1606call_trace(p_trace, p_newtrace, f, msg, arg)
1607 object **p_trace; /* in/out; may not be NULL;
1608 may not point to NULL variable initially */
1609 object **p_newtrace; /* in/out; may be NULL;
1610 may point to NULL variable;
1611 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001612 frameobject *f;
1613 char *msg;
1614 object *arg;
1615{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001616 object *arglist, *what;
1617 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001618 static int tracing = 0;
1619
1620 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001621 /* Don't do recursive traces */
1622 if (p_newtrace) {
1623 XDECREF(*p_newtrace);
1624 *p_newtrace = NULL;
1625 }
1626 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001627 }
1628
1629 arglist = newtupleobject(3);
1630 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001631 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001632 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001633 if (what == NULL)
1634 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001635 INCREF(f);
Guido van Rossum8d617a61995-03-09 12:12:11 +00001636 SETTUPLEITEM(arglist, 0, (object *)f);
1637 SETTUPLEITEM(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001638 if (arg == NULL)
1639 arg = None;
1640 INCREF(arg);
Guido van Rossum8d617a61995-03-09 12:12:11 +00001641 SETTUPLEITEM(arglist, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001642 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001643 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001644 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001645 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001646 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001647 cleanup:
1648 XDECREF(arglist);
1649 if (res == NULL) {
1650 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001651 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001652 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001653 *p_trace = NULL;
1654 if (p_newtrace) {
1655 XDECREF(*p_newtrace);
1656 *p_newtrace = NULL;
1657 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001658 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001659 }
1660 else {
1661 if (p_newtrace) {
1662 XDECREF(*p_newtrace);
1663 if (res == None)
1664 *p_newtrace = NULL;
1665 else {
1666 INCREF(res);
1667 *p_newtrace = res;
1668 }
1669 }
1670 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001671 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001672 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001673}
1674
Guido van Rossum3f5da241990-12-20 15:06:42 +00001675object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001676getbuiltins()
1677{
1678 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001679 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001680 else
1681 return current_frame->f_builtins;
1682}
1683
1684object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001685getlocals()
1686{
1687 if (current_frame == NULL)
1688 return NULL;
1689 fast_2_locals(current_frame);
1690 return current_frame->f_locals;
1691}
1692
1693object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694getglobals()
1695{
1696 if (current_frame == NULL)
1697 return NULL;
1698 else
1699 return current_frame->f_globals;
1700}
1701
Guido van Rossum81daa321993-05-20 14:24:46 +00001702object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001703getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001704{
1705 if (current_frame == NULL)
1706 return NULL;
1707 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001708 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001709}
1710
Guido van Rossume59214e1994-08-30 08:01:59 +00001711object *
1712getframe()
1713{
1714 return (object *)current_frame;
1715}
1716
Guido van Rossum6135a871995-01-09 17:53:26 +00001717int
1718getrestricted()
1719{
1720 return current_frame == NULL ? 0 : current_frame->f_restricted;
1721}
1722
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724flushline()
1725{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001726 object *f = sysget("stdout");
1727 if (softspace(f, 0))
1728 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001729}
1730
Guido van Rossum3f5da241990-12-20 15:06:42 +00001731
Guido van Rossum06186511995-01-07 12:40:10 +00001732#define BINOP(opname, ropname, thisfunc) \
1733 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1734 ; \
1735 else \
1736 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001737
1738
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001740or(v, w)
1741 object *v, *w;
1742{
Guido van Rossum06186511995-01-07 12:40:10 +00001743 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001744 if (v->ob_type->tp_as_number != NULL) {
1745 object *x;
1746 object * (*f) FPROTO((object *, object *));
1747 if (coerce(&v, &w) != 0)
1748 return NULL;
1749 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1750 x = (*f)(v, w);
1751 DECREF(v);
1752 DECREF(w);
1753 if (f != NULL)
1754 return x;
1755 }
1756 err_setstr(TypeError, "bad operand type(s) for |");
1757 return NULL;
1758}
1759
1760static object *
1761xor(v, w)
1762 object *v, *w;
1763{
Guido van Rossum06186511995-01-07 12:40:10 +00001764 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001765 if (v->ob_type->tp_as_number != NULL) {
1766 object *x;
1767 object * (*f) FPROTO((object *, object *));
1768 if (coerce(&v, &w) != 0)
1769 return NULL;
1770 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1771 x = (*f)(v, w);
1772 DECREF(v);
1773 DECREF(w);
1774 if (f != NULL)
1775 return x;
1776 }
1777 err_setstr(TypeError, "bad operand type(s) for ^");
1778 return NULL;
1779}
1780
1781static object *
1782and(v, w)
1783 object *v, *w;
1784{
Guido van Rossum06186511995-01-07 12:40:10 +00001785 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001786 if (v->ob_type->tp_as_number != NULL) {
1787 object *x;
1788 object * (*f) FPROTO((object *, object *));
1789 if (coerce(&v, &w) != 0)
1790 return NULL;
1791 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1792 x = (*f)(v, w);
1793 DECREF(v);
1794 DECREF(w);
1795 if (f != NULL)
1796 return x;
1797 }
1798 err_setstr(TypeError, "bad operand type(s) for &");
1799 return NULL;
1800}
1801
1802static object *
1803lshift(v, w)
1804 object *v, *w;
1805{
Guido van Rossum06186511995-01-07 12:40:10 +00001806 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001807 if (v->ob_type->tp_as_number != NULL) {
1808 object *x;
1809 object * (*f) FPROTO((object *, object *));
1810 if (coerce(&v, &w) != 0)
1811 return NULL;
1812 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1813 x = (*f)(v, w);
1814 DECREF(v);
1815 DECREF(w);
1816 if (f != NULL)
1817 return x;
1818 }
1819 err_setstr(TypeError, "bad operand type(s) for <<");
1820 return NULL;
1821}
1822
1823static object *
1824rshift(v, w)
1825 object *v, *w;
1826{
Guido van Rossum06186511995-01-07 12:40:10 +00001827 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001828 if (v->ob_type->tp_as_number != NULL) {
1829 object *x;
1830 object * (*f) FPROTO((object *, object *));
1831 if (coerce(&v, &w) != 0)
1832 return NULL;
1833 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1834 x = (*f)(v, w);
1835 DECREF(v);
1836 DECREF(w);
1837 if (f != NULL)
1838 return x;
1839 }
1840 err_setstr(TypeError, "bad operand type(s) for >>");
1841 return NULL;
1842}
1843
1844static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001845add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 object *v, *w;
1847{
Guido van Rossum06186511995-01-07 12:40:10 +00001848 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001849 if (v->ob_type->tp_as_sequence != NULL)
1850 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1851 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001852 object *x;
1853 if (coerce(&v, &w) != 0)
1854 return NULL;
1855 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1856 DECREF(v);
1857 DECREF(w);
1858 return x;
1859 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001860 err_setstr(TypeError, "bad operand type(s) for +");
1861 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001862}
1863
1864static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001865sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866 object *v, *w;
1867{
Guido van Rossum06186511995-01-07 12:40:10 +00001868 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001869 if (v->ob_type->tp_as_number != NULL) {
1870 object *x;
1871 if (coerce(&v, &w) != 0)
1872 return NULL;
1873 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1874 DECREF(v);
1875 DECREF(w);
1876 return x;
1877 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001878 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001879 return NULL;
1880}
1881
1882static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001883mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884 object *v, *w;
1885{
1886 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001887 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001888 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001889 if (tp->tp_as_number != NULL &&
1890 w->ob_type->tp_as_sequence != NULL &&
1891 !is_instanceobject(v)) {
1892 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893 object *tmp = v;
1894 v = w;
1895 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001896 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001898 if (tp->tp_as_number != NULL) {
1899 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001900 if (is_instanceobject(v)) {
1901 /* Instances of user-defined classes get their
1902 other argument uncoerced, so they may
1903 implement sequence*number as well as
1904 number*number. */
1905 INCREF(v);
1906 INCREF(w);
1907 }
1908 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001909 return NULL;
1910 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1911 DECREF(v);
1912 DECREF(w);
1913 return x;
1914 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915 if (tp->tp_as_sequence != NULL) {
1916 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001917 err_setstr(TypeError,
1918 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 return NULL;
1920 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001921 return (*tp->tp_as_sequence->sq_repeat)
1922 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001924 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001925 return NULL;
1926}
1927
1928static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001929divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 object *v, *w;
1931{
Guido van Rossum06186511995-01-07 12:40:10 +00001932 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001933 if (v->ob_type->tp_as_number != NULL) {
1934 object *x;
1935 if (coerce(&v, &w) != 0)
1936 return NULL;
1937 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1938 DECREF(v);
1939 DECREF(w);
1940 return x;
1941 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001942 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 return NULL;
1944}
1945
1946static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001947mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948 object *v, *w;
1949{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001950 if (is_stringobject(v)) {
1951 return formatstring(v, w);
1952 }
Guido van Rossum06186511995-01-07 12:40:10 +00001953 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001954 if (v->ob_type->tp_as_number != NULL) {
1955 object *x;
1956 if (coerce(&v, &w) != 0)
1957 return NULL;
1958 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1959 DECREF(v);
1960 DECREF(w);
1961 return x;
1962 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964 return NULL;
1965}
1966
1967static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 object *v;
1970{
1971 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001972 return (*v->ob_type->tp_as_number->nb_negative)(v);
1973 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 return NULL;
1975}
1976
1977static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 object *v;
1980{
1981 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982 return (*v->ob_type->tp_as_number->nb_positive)(v);
1983 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 return NULL;
1985}
1986
1987static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001988invert(v)
1989 object *v;
1990{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00001991 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00001992 if (v->ob_type->tp_as_number != NULL &&
1993 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
1994 return (*f)(v);
1995 err_setstr(TypeError, "bad operand type(s) for unary ~");
1996 return NULL;
1997}
1998
1999static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 object *v;
2002{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002003 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002004 object *w;
2005 if (outcome < 0)
2006 return NULL;
2007 if (outcome == 0)
2008 w = True;
2009 else
2010 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002011 INCREF(w);
2012 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013}
Guido van Rossum234f9421993-06-17 12:35:49 +00002014
2015
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002016/* External interface to call any callable object. The arg may be NULL. */
2017
2018object *
2019call_object(func, arg)
2020 object *func;
2021 object *arg;
2022{
Guido van Rossume59214e1994-08-30 08:01:59 +00002023 binaryfunc call;
2024 object *result;
2025
2026 if (call = func->ob_type->tp_call) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002027#if 0
2028 /* XXX Why is this here??? */
Guido van Rossume59214e1994-08-30 08:01:59 +00002029 int size = gettuplesize(arg);
2030 if (arg) {
2031 size = gettuplesize(arg);
2032 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002033 arg = GETTUPLEITEM(arg, 0);
Guido van Rossume59214e1994-08-30 08:01:59 +00002034 else if (size == 0)
2035 arg = NULL;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002036 }
2037#endif
Guido van Rossume59214e1994-08-30 08:01:59 +00002038 result = (*call)(func, arg);
2039 }
2040 else if (is_instancemethodobject(func) || is_funcobject(func))
2041 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002042 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002043 result = call_builtin(func, arg);
2044
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002045 if (result == NULL && !err_occurred())
2046 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002047
2048 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002049}
2050
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002052call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002053 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002054 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 if (is_methodobject(func)) {
2057 method meth = getmethod(func);
2058 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002059 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2060 int size = gettuplesize(arg);
2061 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002062 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002063 else if (size == 0)
2064 arg = NULL;
2065 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 }
2068 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002069 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002071 if (is_instanceobject(func)) {
2072 object *res, *call = getattr(func,"__call__");
2073 if (call == NULL) {
2074 err_clear();
2075 err_setstr(AttributeError, "no __call__ method defined");
2076 return NULL;
2077 }
2078 res = call_object(call, arg);
2079 DECREF(call);
2080 return res;
2081 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 return NULL;
2084}
2085
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002087call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002089 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002091 object *newarg = NULL;
2092 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002093 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002095 object *argdefs;
2096 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097
Guido van Rossume8122f11991-05-05 20:03:07 +00002098 if (is_instancemethodobject(func)) {
2099 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002100 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002101 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002102 if (self == NULL) {
2103 /* Unbound methods must be called with an instance of
2104 the class (or a derived class) as first argument */
2105 if (arg != NULL && is_tupleobject(arg) &&
2106 gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002107 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002108 if (self != NULL &&
2109 is_instanceobject(self) &&
2110 issubclass((object *)
2111 (((instanceobject *)self)->in_class),
2112 class))
2113 /* self = self */ ;
2114 else
2115 self = NULL;
2116 }
2117 if (self == NULL) {
2118 err_setstr(TypeError,
2119 "unbound method must be called with class instance argument");
2120 return NULL;
2121 }
2122 }
2123 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002124 if (arg == NULL)
2125 argcount = 0;
2126 else if (is_tupleobject(arg))
2127 argcount = gettuplesize(arg);
2128 else
2129 argcount = 1;
2130 newarg = newtupleobject(argcount + 1);
2131 if (newarg == NULL)
2132 return NULL;
2133 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002134 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum81daa321993-05-20 14:24:46 +00002135 if (arg != NULL && !is_tupleobject(arg)) {
2136 INCREF(arg);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002137 SETTUPLEITEM(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002138 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002139 else {
2140 int i;
2141 object *v;
2142 for (i = 0; i < argcount; i++) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002143 v = GETTUPLEITEM(arg, i);
Guido van Rossum81daa321993-05-20 14:24:46 +00002144 XINCREF(v);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002145 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002146 }
2147 }
2148 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 }
2150 }
2151 else {
2152 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002153 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154 return NULL;
2155 }
2156 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002157
2158 argdefs = getfuncargstuff(func, &argcount);
2159 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2160 int actualcount, j;
2161 /* Process default arguments */
2162 if (argcount & 0x4000)
2163 argcount ^= 0x4000;
2164 actualcount = gettuplesize(arg);
2165 j = gettuplesize(argdefs) - (argcount - actualcount);
2166 if (actualcount < argcount && j >= 0) {
2167 int i;
2168 object *v;
2169 if (newarg == NULL)
2170 INCREF(arg);
2171 newarg = newtupleobject(argcount);
2172 if (newarg == NULL) {
2173 DECREF(arg);
2174 return NULL;
2175 }
2176 for (i = 0; i < actualcount; i++) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002177 v = GETTUPLEITEM(arg, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002178 XINCREF(v);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002179 SETTUPLEITEM(newarg, i, v);
Guido van Rossume59214e1994-08-30 08:01:59 +00002180 }
2181 for (; i < argcount; i++, j++) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002182 v = GETTUPLEITEM(argdefs, j);
Guido van Rossume59214e1994-08-30 08:01:59 +00002183 XINCREF(v);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002184 SETTUPLEITEM(newarg, i, v);
Guido van Rossume59214e1994-08-30 08:01:59 +00002185 }
2186 DECREF(arg);
2187 arg = newarg;
2188 }
2189 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 co = getfunccode(func);
2192 if (co == NULL) {
2193 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 return NULL;
2195 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002196 if (!is_codeobject(co))
2197 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002198 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 return NULL;
2202 }
2203
Guido van Rossum3f5da241990-12-20 15:06:42 +00002204 newglobals = getfuncglobals(func);
2205 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206
Guido van Rossum81daa321993-05-20 14:24:46 +00002207 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209 DECREF(newlocals);
2210 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211
Guido van Rossum3f5da241990-12-20 15:06:42 +00002212 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213
2214 return v;
2215}
2216
2217static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 object *v, *w;
2220{
2221 typeobject *tp = v->ob_type;
2222 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002223 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 return NULL;
2225 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002226 if (tp->tp_as_mapping != NULL) {
2227 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2228 }
2229 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 int i;
2231 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 return NULL;
2234 }
2235 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002236 if (i < 0) {
2237 int len = (*tp->tp_as_sequence->sq_length)(v);
2238 if (len < 0)
2239 return NULL;
2240 i += len;
2241 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244}
2245
2246static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002247loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 object *v, *w;
2249{
2250 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002251 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002253 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 return NULL;
2255 }
2256 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002257 v = (*sq->sq_item)(v, i);
2258 if (v)
2259 return v;
2260 if (err_occurred() == IndexError)
2261 err_clear();
2262 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263}
2264
2265static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002266slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 object *v;
2268 int isize;
2269 int *pi;
2270{
2271 if (v != NULL) {
2272 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002273 err_setstr(TypeError, "slice index must be int");
2274 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275 }
2276 *pi = getintvalue(v);
2277 if (*pi < 0)
2278 *pi += isize;
2279 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002280 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281}
2282
2283static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 object *u, *v, *w;
2286{
2287 typeobject *tp = u->ob_type;
2288 int ilow, ihigh, isize;
2289 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 return NULL;
2292 }
2293 ilow = 0;
2294 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002295 if (isize < 0)
2296 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002297 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002299 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002301 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002303
2304static int
2305assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 object *w;
2307 object *key;
2308 object *v;
2309{
2310 typeobject *tp = w->ob_type;
2311 sequence_methods *sq;
2312 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002313 int (*func1)();
2314 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002315 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002316 (func1 = mp->mp_ass_subscript) != NULL) {
2317 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002318 }
2319 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002320 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002322 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002323 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002324 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002326 else {
2327 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002328 if (i < 0) {
2329 int len = (*sq->sq_length)(w);
2330 if (len < 0)
2331 return -1;
2332 i += len;
2333 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002334 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002335 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002338 err_setstr(TypeError,
2339 "can't assign to this subscripted object");
2340 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342}
2343
Guido van Rossum3f5da241990-12-20 15:06:42 +00002344static int
2345assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 object *u, *v, *w, *x;
2347{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002348 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002350 if (sq == NULL) {
2351 err_setstr(TypeError, "assign to slice of non-sequence");
2352 return -1;
2353 }
2354 if (sq == NULL || sq->sq_ass_slice == NULL) {
2355 err_setstr(TypeError, "unassignable slice");
2356 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 }
2358 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002360 if (isize < 0)
2361 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002362 if (slice_index(v, isize, &ilow) != 0)
2363 return -1;
2364 if (slice_index(w, isize, &ihigh) != 0)
2365 return -1;
2366 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367}
2368
2369static int
2370cmp_exception(err, v)
2371 object *err, *v;
2372{
2373 if (is_tupleobject(v)) {
2374 int i, n;
2375 n = gettuplesize(v);
2376 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002377 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002378 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 return 1;
2380 }
2381 return 0;
2382 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002383 if (is_classobject(v) && is_classobject(err))
2384 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return err == v;
2386}
2387
Guido van Rossum3f5da241990-12-20 15:06:42 +00002388static int
2389cmp_member(v, w)
2390 object *v, *w;
2391{
Guido van Rossume59214e1994-08-30 08:01:59 +00002392 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002393 object *x;
2394 sequence_methods *sq;
2395 /* Special case for char in string */
2396 if (is_stringobject(w)) {
2397 register char *s, *end;
2398 register char c;
2399 if (!is_stringobject(v) || getstringsize(v) != 1) {
2400 err_setstr(TypeError,
2401 "string member test needs char left operand");
2402 return -1;
2403 }
2404 c = getstringvalue(v)[0];
2405 s = getstringvalue(w);
2406 end = s + getstringsize(w);
2407 while (s < end) {
2408 if (c == *s++)
2409 return 1;
2410 }
2411 return 0;
2412 }
2413 sq = w->ob_type->tp_as_sequence;
2414 if (sq == NULL) {
2415 err_setstr(TypeError,
2416 "'in' or 'not in' needs sequence right argument");
2417 return -1;
2418 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002419 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002420 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002421 if (x == NULL) {
2422 if (err_occurred() == IndexError) {
2423 err_clear();
2424 break;
2425 }
2426 return -1;
2427 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002428 cmp = cmpobject(v, x);
2429 XDECREF(x);
2430 if (cmp == 0)
2431 return 1;
2432 }
2433 return 0;
2434}
2435
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002438 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 register object *v;
2440 register object *w;
2441{
2442 register int cmp;
2443 register int res = 0;
2444 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 case IS:
2446 case IS_NOT:
2447 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002448 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002449 res = !res;
2450 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 case IN:
2452 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 res = cmp_member(v, w);
2454 if (res < 0)
2455 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002456 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002457 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 break;
2459 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 break;
2462 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002463 cmp = cmpobject(v, w);
2464 switch (op) {
2465 case LT: res = cmp < 0; break;
2466 case LE: res = cmp <= 0; break;
2467 case EQ: res = cmp == 0; break;
2468 case NE: res = cmp != 0; break;
2469 case GT: res = cmp > 0; break;
2470 case GE: res = cmp >= 0; break;
2471 /* XXX no default? (res is initialized to 0 though) */
2472 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473 }
2474 v = res ? True : False;
2475 INCREF(v);
2476 return v;
2477}
2478
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479static int
2480import_from(locals, v, name)
2481 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002482 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002483 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002484{
2485 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002486 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002487 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002488 return -1;
2489 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002490 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002491 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002492 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002493 object *name, *value;
2494 pos = 0;
2495 while (mappinggetnext(w, &pos, &name, &value)) {
2496 if (!is_stringobject(name) ||
2497 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002498 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002499 if (is_accessobject(value)) {
2500 value = getaccessvalue(value, (object *)NULL);
2501 if (value == NULL) {
2502 err_clear();
2503 continue;
2504 }
2505 }
2506 else
2507 INCREF(value);
2508 err = dict2insert(locals, name, value);
2509 DECREF(value);
2510 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002511 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002512 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002513 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002514 }
2515 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002516 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002518 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002519 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002520 getstringvalue(name));
2521 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002522 return -1;
2523 }
2524 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002525 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002526 }
2527}
2528
2529static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002530build_class(methods, bases, name)
2531 object *methods; /* dictionary */
2532 object *bases; /* tuple containing classes */
2533 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002534{
Guido van Rossum25831651993-05-19 14:50:45 +00002535 int i;
2536 if (!is_tupleobject(bases)) {
2537 err_setstr(SystemError, "build_class with non-tuple bases");
2538 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002539 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002540 if (gettuplesize(bases) > 0) {
2541 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002542 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002543 /* Call the base's *type*, if it is callable.
2544 This code is a hook for Donald Beaudry's type extensions.
2545 In unexended Python it will never be triggered since its
2546 types are not callable. */
2547 if (base->ob_type->ob_type->tp_call) {
2548 object *args;
2549 object *class;
2550 args = mkvalue("(OOO)", name, bases, methods);
2551 class = call_object((object *)base->ob_type, args);
2552 DECREF(args);
2553 return class;
2554 }
2555 }
Guido van Rossum25831651993-05-19 14:50:45 +00002556 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002558 return NULL;
2559 }
Guido van Rossum25831651993-05-19 14:50:45 +00002560 if (!is_stringobject(name)) {
2561 err_setstr(SystemError, "build_class witn non-string name");
2562 return NULL;
2563 }
2564 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002565 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002566 if (!is_classobject(base)) {
2567 err_setstr(TypeError,
2568 "base is not a class object");
2569 return NULL;
2570 }
2571 }
2572 return newclassobject(bases, methods, name);
2573}
2574
2575static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002576access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002577 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002578 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002579 frameobject *f;
2580{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002581 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002582 object *value, *ac;
2583 typeobject *type;
2584 int fastind, ret;
2585 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002586 if (f->f_localmap == NULL)
2587 value = dict2lookup(f->f_locals, name);
2588 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002589 object *map = f->f_localmap;
2590 value = NULL;
2591 for (fastind = gettuplesize(map); --fastind >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002592 object *fname = GETTUPLEITEM(map, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002593 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002594 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002595 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002596 }
2597 }
2598 }
2599 if (value && is_accessobject(value)) {
2600 err_setstr(AccessError, "can't override access");
2601 return -1;
2602 }
2603 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002604 if (value != NULL && value != None)
2605 type = value->ob_type;
2606 else
2607 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002608 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002609 if (ac == NULL)
2610 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002611 if (fastind >= 0)
2612 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002613 else {
2614 ret = dict2insert(f->f_locals, name, ac);
2615 DECREF(ac);
2616 }
2617 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002618}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002619
2620static int
2621exec_statement(prog, globals, locals)
2622 object *prog;
2623 object *globals;
2624 object *locals;
2625{
2626 char *s;
2627 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002628 object *v;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002629
2630 if (is_tupleobject(prog) && globals == None && locals == None &&
2631 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2632 /* Backward compatibility hack */
2633 globals = gettupleitem(prog, 1);
2634 if (n == 3)
2635 locals = gettupleitem(prog, 2);
2636 prog = gettupleitem(prog, 0);
2637 }
2638 if (globals == None) {
2639 globals = getglobals();
2640 if (locals == None)
2641 locals = getlocals();
2642 }
2643 else if (locals == None)
2644 locals = globals;
2645 if (!is_stringobject(prog) &&
2646 !is_codeobject(prog) &&
2647 !is_fileobject(prog)) {
2648 err_setstr(TypeError,
2649 "exec 1st arg must be string, code or file object");
2650 return -1;
2651 }
2652 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2653 err_setstr(TypeError,
2654 "exec 2nd/3rd args must be dict or None");
2655 return -1;
2656 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002657 if (dictlookup(globals, "__builtins__") == NULL)
2658 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002659 if (is_codeobject(prog)) {
2660 if (eval_code((codeobject *) prog, globals, locals,
2661 (object *)NULL, (object *)NULL) == NULL)
2662 return -1;
2663 return 0;
2664 }
2665 if (is_fileobject(prog)) {
2666 FILE *fp = getfilefile(prog);
2667 char *name = getstringvalue(getfilename(prog));
2668 if (run_file(fp, name, file_input, globals, locals) == NULL)
2669 return -1;
2670 return 0;
2671 }
2672 s = getstringvalue(prog);
2673 if (strlen(s) != getstringsize(prog)) {
2674 err_setstr(ValueError, "embedded '\\0' in exec string");
2675 return -1;
2676 }
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002677 if ((v = run_string(s, file_input, globals, locals)) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002678 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002679 DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002680 return 0;
2681}
Guido van Rossum24c13741995-02-14 09:42:43 +00002682
2683/* Hack for Ken Manheimer */
2684static object *
2685find_from_args(f, nexti)
2686 frameobject *f;
2687 int nexti;
2688{
2689 int opcode;
2690 int oparg;
2691 object *list, *name;
2692 unsigned char *next_instr;
2693
2694 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2695 opcode = (*next_instr++);
2696 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002697 INCREF(None);
2698 return None;
2699 }
2700
2701 list = newlistobject(0);
2702 if (list == NULL)
2703 return NULL;
2704
2705 do {
2706 oparg = (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]);
2707 name = Getnamev(f, oparg);
2708 if (addlistitem(list, name) < 0) {
2709 DECREF(list);
2710 break;
2711 }
2712 opcode = (*next_instr++);
2713 } while (opcode == IMPORT_FROM);
2714
2715 return list;
2716}