blob: cb9bb8a78c8bd3d3efe54e27c49bab0e72ce0b9a [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;
785 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 }
877 else if (is_stringobject(v)) {
878 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; ) {
980 w = gettupleitem(v, oparg);
981 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 Rossum6f5afc91993-02-05 09:46:15 +00001006#ifdef COMPAT_HACKS
1007/* Implement various compatibility hacks (for 0.9.4 or earlier):
1008 (a) f(a,b,...) accepts f((1,2,...))
1009 (b) f((a,b,...)) accepts f(1,2,...)
1010 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
1011*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001012 if (n == 1 && oparg != 1) {
1013 /* Rule (a) */
1014 w = gettupleitem(v, 0);
1015 if (is_tupleobject(w)) {
1016 INCREF(w);
1017 DECREF(v);
1018 v = w;
1019 n = gettuplesize(v);
1020 }
1021 }
1022 else if (n != 1 && oparg == 1) {
1023 /* Rule (b) */
1024 PUSH(v);
1025 break;
1026 /* Don't fall through */
1027 }
1028 else if (n > 2 && oparg == 2) {
1029 /* Rule (c) */
1030 int i;
1031 w = newtupleobject(n-1);
1032 u = newtupleobject(2);
1033 if (u == NULL || w == NULL) {
1034 XDECREF(w);
1035 XDECREF(u);
1036 DECREF(v);
1037 why = WHY_EXCEPTION;
1038 break;
1039 }
1040 t = gettupleitem(v, 0);
1041 INCREF(t);
1042 settupleitem(u, 0, t);
1043 for (i = 1; i < n; i++) {
1044 t = gettupleitem(v, i);
1045 INCREF(t);
1046 settupleitem(w, i-1, t);
1047 }
1048 settupleitem(u, 1, w);
1049 DECREF(v);
1050 v = u;
1051 n = 2;
1052 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001053#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001054 if (n != oparg) {
1055 err_setstr(TypeError,
1056 "arg count mismatch");
1057 why = WHY_EXCEPTION;
1058 DECREF(v);
1059 break;
1060 }
1061 PUSH(v);
1062 }
1063 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 case UNPACK_TUPLE:
1065 v = POP();
1066 if (!is_tupleobject(v)) {
1067 err_setstr(TypeError, "unpack non-tuple");
1068 why = WHY_EXCEPTION;
1069 }
1070 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001071 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 "unpack tuple of wrong size");
1073 why = WHY_EXCEPTION;
1074 }
1075 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001076 if (!CHECK_STACK(oparg)) {
1077 x = NULL;
1078 break;
1079 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001080 for (; --oparg >= 0; ) {
1081 w = gettupleitem(v, oparg);
1082 INCREF(w);
1083 PUSH(w);
1084 }
1085 }
1086 DECREF(v);
1087 break;
1088
1089 case UNPACK_LIST:
1090 v = POP();
1091 if (!is_listobject(v)) {
1092 err_setstr(TypeError, "unpack non-list");
1093 why = WHY_EXCEPTION;
1094 }
1095 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001096 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 "unpack list of wrong size");
1098 why = WHY_EXCEPTION;
1099 }
1100 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001101 if (!CHECK_STACK(oparg)) {
1102 x = NULL;
1103 break;
1104 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 for (; --oparg >= 0; ) {
1106 w = getlistitem(v, oparg);
1107 INCREF(w);
1108 PUSH(w);
1109 }
1110 }
1111 DECREF(v);
1112 break;
1113
1114 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 v = POP();
1117 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001118 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 DECREF(v);
1120 DECREF(u);
1121 break;
1122
1123 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001124 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001125 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001126 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001127 DECREF(v);
1128 break;
1129
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001130 case STORE_GLOBAL:
1131 w = GETNAMEV(oparg);
1132 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001133 u = dict2lookup(f->f_locals, w);
1134 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001135 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001136 DECREF(v);
1137 break;
1138 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001139 err = dict2insert(f->f_globals, w, v);
1140 DECREF(v);
1141 break;
1142
1143 case DELETE_GLOBAL:
1144 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001145 u = dict2lookup(f->f_locals, w);
1146 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001147 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001148 (object *)NULL);
1149 break;
1150 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001151 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001152 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001153 break;
1154
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 case LOAD_CONST:
1156 x = GETCONST(oparg);
1157 INCREF(x);
1158 PUSH(x);
1159 break;
1160
1161 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001162 w = GETNAMEV(oparg);
1163 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001165 err_clear();
1166 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001168 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001169 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001171 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 break;
1173 }
1174 }
1175 }
Guido van Rossum25831651993-05-19 14:50:45 +00001176 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001177 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001178 if (x == NULL)
1179 break;
1180 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001181 else
1182 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 PUSH(x);
1184 break;
1185
1186 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001187 w = GETNAMEV(oparg);
1188 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001190 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001191 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001193 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 break;
1195 }
1196 }
Guido van Rossum25831651993-05-19 14:50:45 +00001197 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001198 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001199 if (x == NULL)
1200 break;
1201 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001202 else
1203 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 PUSH(x);
1205 break;
1206
1207 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001208 w = GETNAMEV(oparg);
1209 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001211 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 break;
1213 }
Guido van Rossum25831651993-05-19 14:50:45 +00001214 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001215 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001216 if (x == NULL)
1217 break;
1218 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001219 else
1220 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 PUSH(x);
1222 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001223
1224 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001225 x = GETCONST(oparg);
1226 if (x == None)
1227 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001228 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001229 err_setstr(SystemError, "bad RESERVE_FAST");
1230 x = NULL;
1231 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001232 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001233 XDECREF(f->f_fastlocals);
1234 XDECREF(f->f_localmap);
1235 INCREF(x);
1236 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001237 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001238 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001239 break;
1240
1241 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001242 x = GETLISTITEM(fastlocals, oparg);
1243 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001244 err_setval(NameError,
1245 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001246 break;
1247 }
Guido van Rossum25831651993-05-19 14:50:45 +00001248 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001249 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001250 if (x == NULL)
1251 break;
1252 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001253 else
1254 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001255 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001256 break;
1257
1258 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001259 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001260 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001261 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001262 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001263 DECREF(v);
1264 break;
1265 }
Guido van Rossum25831651993-05-19 14:50:45 +00001266 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001267 XDECREF(w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001268 break;
1269
1270 case DELETE_FAST:
1271 x = GETLISTITEM(fastlocals, oparg);
1272 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001273 err_setval(NameError,
1274 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001275 break;
1276 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001277 if (x != NULL && is_accessobject(x)) {
1278 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001279 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001280 break;
1281 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001282 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 DECREF(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001284 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001285
1286 case BUILD_TUPLE:
1287 x = newtupleobject(oparg);
1288 if (x != NULL) {
1289 for (; --oparg >= 0;) {
1290 w = POP();
1291 err = settupleitem(x, oparg, w);
1292 if (err != 0)
1293 break;
1294 }
1295 PUSH(x);
1296 }
1297 break;
1298
1299 case BUILD_LIST:
1300 x = newlistobject(oparg);
1301 if (x != NULL) {
1302 for (; --oparg >= 0;) {
1303 w = POP();
1304 err = setlistitem(x, oparg, w);
1305 if (err != 0)
1306 break;
1307 }
1308 PUSH(x);
1309 }
1310 break;
1311
1312 case BUILD_MAP:
1313 x = newdictobject();
1314 PUSH(x);
1315 break;
1316
1317 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001318 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001320 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 DECREF(v);
1322 PUSH(x);
1323 break;
1324
1325 case COMPARE_OP:
1326 w = POP();
1327 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001328 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 DECREF(v);
1330 DECREF(w);
1331 PUSH(x);
1332 break;
1333
1334 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001335 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001336 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001337 if (x == NULL) {
1338 err_setstr(ImportError,
1339 "__import__ not found");
1340 break;
1341 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001342 if (is_methodobject(x)) {
1343 u = None;
1344 INCREF(u);
1345 }
1346 else {
1347 u = find_from_args(f, INSTR_OFFSET());
1348 if (u == NULL) {
1349 x = u;
1350 break;
1351 }
1352 }
1353 w = mkvalue("(OOOO)", w, f->f_globals, f->f_locals, u);
1354 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001355 if (w == NULL) {
1356 x = NULL;
1357 break;
1358 }
1359 x = call_object(x, w);
1360 DECREF(w);
1361 if (x)
1362 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 break;
1364
1365 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001366 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001368 fast_2_locals(f);
Guido van Rossumdf62e441991-08-16 08:56:04 +00001369 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001370 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001372
1373 case ACCESS_MODE:
1374 v = POP();
1375 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001376 if (getstringvalue(w)[0] == '*')
1377 defmode = getintvalue(v);
1378 else
1379 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001380 DECREF(v);
1381 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001382
1383 case JUMP_FORWARD:
1384 JUMPBY(oparg);
1385 break;
1386
1387 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001388 err = testbool(TOP());
1389 if (err > 0)
1390 err = 0;
1391 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 JUMPBY(oparg);
1393 break;
1394
1395 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001396 err = testbool(TOP());
1397 if (err > 0) {
1398 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001400 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
1402
1403 case JUMP_ABSOLUTE:
1404 JUMPTO(oparg);
1405 break;
1406
1407 case FOR_LOOP:
1408 /* for v in s: ...
1409 On entry: stack contains s, i.
1410 On exit: stack contains s, i+1, s[i];
1411 but if loop exhausted:
1412 s, i are popped, and we jump */
1413 w = POP(); /* Loop index */
1414 v = POP(); /* Sequence object */
1415 u = loop_subscript(v, w);
1416 if (u != NULL) {
1417 PUSH(v);
1418 x = newintobject(getintvalue(w)+1);
1419 PUSH(x);
1420 DECREF(w);
1421 PUSH(u);
1422 }
1423 else {
1424 DECREF(v);
1425 DECREF(w);
1426 /* A NULL can mean "s exhausted"
1427 but also an error: */
1428 if (err_occurred())
1429 why = WHY_EXCEPTION;
1430 else
1431 JUMPBY(oparg);
1432 }
1433 break;
1434
1435 case SETUP_LOOP:
1436 case SETUP_EXCEPT:
1437 case SETUP_FINALLY:
1438 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1439 STACK_LEVEL());
1440 break;
1441
1442 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001443#ifdef LLTRACE
1444 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001445 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001447 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001448 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001449 /* Trace each line of code reached */
1450 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001451 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001452 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001453 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 break;
1455
1456 default:
1457 fprintf(stderr,
1458 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001459 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 err_setstr(SystemError, "eval_code: unknown opcode");
1461 why = WHY_EXCEPTION;
1462 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001463
1464#ifdef CASE_TOO_BIG
1465 }
1466#endif
1467
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 } /* switch */
1469
1470 on_error:
1471
1472 /* Quickly continue if no error occurred */
1473
1474 if (why == WHY_NOT) {
1475 if (err == 0 && x != NULL)
1476 continue; /* Normal, fast path */
1477 why = WHY_EXCEPTION;
1478 x = None;
1479 err = 0;
1480 }
1481
Guido van Rossum801dcae1992-04-08 11:32:32 +00001482#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 /* Double-check exception status */
1484
1485 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1486 if (!err_occurred()) {
1487 fprintf(stderr, "XXX ghost error\n");
1488 err_setstr(SystemError, "ghost error");
1489 why = WHY_EXCEPTION;
1490 }
1491 }
1492 else {
Guido van Rossum69d9eb91994-11-10 22:41:15 +00001493 if (err_occurred())
1494 fatal("XXX undetected error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 }
1496#endif
1497
1498 /* Log traceback info if this is a real exception */
1499
1500 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001501 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001503 f->f_lasti -= 2;
1504 tb_here(f);
1505
Guido van Rossume59214e1994-08-30 08:01:59 +00001506 if (f->f_trace)
1507 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001508 if (sys_profile)
1509 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 }
1511
1512 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1513
1514 if (why == WHY_RERAISE)
1515 why = WHY_EXCEPTION;
1516
1517 /* Unwind stacks if a (pseudo) exception occurred */
1518
1519 while (why != WHY_NOT && f->f_iblock > 0) {
1520 block *b = pop_block(f);
1521 while (STACK_LEVEL() > b->b_level) {
1522 v = POP();
1523 XDECREF(v);
1524 }
1525 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1526 why = WHY_NOT;
1527 JUMPTO(b->b_handler);
1528 break;
1529 }
1530 if (b->b_type == SETUP_FINALLY ||
1531 b->b_type == SETUP_EXCEPT &&
1532 why == WHY_EXCEPTION) {
1533 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001534 object *exc, *val, *tb;
1535 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 if (val == NULL) {
1537 val = None;
1538 INCREF(val);
1539 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 /* Make the raw exception data
1541 available to the handler,
1542 so a program can emulate the
1543 Python main loop. Don't do
1544 this for 'finally'. */
1545 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001546 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 sysset("exc_value", val);
1548 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001549 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001550 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 PUSH(val);
1552 PUSH(exc);
1553 }
1554 else {
1555 if (why == WHY_RETURN)
1556 PUSH(retval);
1557 v = newintobject((long)why);
1558 PUSH(v);
1559 }
1560 why = WHY_NOT;
1561 JUMPTO(b->b_handler);
1562 break;
1563 }
1564 } /* unwind stack */
1565
1566 /* End the loop if we still have an error (or return) */
1567
1568 if (why != WHY_NOT)
1569 break;
1570
1571 } /* main loop */
1572
1573 /* Pop remaining stack entries */
1574
1575 while (!EMPTY()) {
1576 v = POP();
1577 XDECREF(v);
1578 }
1579
Guido van Rossum96a42c81992-01-12 02:29:51 +00001580 if (why != WHY_RETURN)
1581 retval = NULL;
1582
Guido van Rossume59214e1994-08-30 08:01:59 +00001583 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001584 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001585 if (call_trace(&f->f_trace, &f->f_trace, f,
1586 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001587 XDECREF(retval);
1588 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001589 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001590 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001591 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001592 }
1593
1594 if (sys_profile && why == WHY_RETURN) {
1595 if (call_trace(&sys_profile, (object**)0,
1596 f, "return", retval)) {
1597 XDECREF(retval);
1598 retval = NULL;
1599 why = WHY_EXCEPTION;
1600 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001601 }
1602
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 /* Restore previous frame and release the current one */
1604
1605 current_frame = f->f_back;
1606 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001607
1608 if (needmerge)
1609 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001610
Guido van Rossum96a42c81992-01-12 02:29:51 +00001611 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001612}
1613
Guido van Rossum96a42c81992-01-12 02:29:51 +00001614#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001615static int
1616prtrace(v, str)
1617 object *v;
1618 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001620 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001621 if (printobject(v, stdout, 0) != 0)
1622 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001625#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001627static void
1628call_exc_trace(p_trace, p_newtrace, f)
1629 object **p_trace, **p_newtrace;
1630 frameobject *f;
1631{
1632 object *type, *value, *traceback, *arg;
1633 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001634 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001635 if (value == NULL) {
1636 value = None;
1637 INCREF(value);
1638 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001639 arg = mkvalue("(OOO)", type, value, traceback);
1640 if (arg == NULL) {
1641 err_restore(type, value, traceback);
1642 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001643 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001644 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1645 DECREF(arg);
1646 if (err == 0)
1647 err_restore(type, value, traceback);
1648 else {
1649 XDECREF(type);
1650 XDECREF(value);
1651 XDECREF(traceback);
1652 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001653}
1654
1655static int
1656call_trace(p_trace, p_newtrace, f, msg, arg)
1657 object **p_trace; /* in/out; may not be NULL;
1658 may not point to NULL variable initially */
1659 object **p_newtrace; /* in/out; may be NULL;
1660 may point to NULL variable;
1661 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001662 frameobject *f;
1663 char *msg;
1664 object *arg;
1665{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001666 object *arglist, *what;
1667 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001668 static int tracing = 0;
1669
1670 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001671 /* Don't do recursive traces */
1672 if (p_newtrace) {
1673 XDECREF(*p_newtrace);
1674 *p_newtrace = NULL;
1675 }
1676 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001677 }
1678
1679 arglist = newtupleobject(3);
1680 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001681 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001682 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001683 if (what == NULL)
1684 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001685 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001686 settupleitem(arglist, 0, (object *)f);
1687 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001688 if (arg == NULL)
1689 arg = None;
1690 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001691 settupleitem(arglist, 2, arg);
1692 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001693 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001694 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001695 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001697 cleanup:
1698 XDECREF(arglist);
1699 if (res == NULL) {
1700 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001701 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001702 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001703 *p_trace = NULL;
1704 if (p_newtrace) {
1705 XDECREF(*p_newtrace);
1706 *p_newtrace = NULL;
1707 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001708 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001709 }
1710 else {
1711 if (p_newtrace) {
1712 XDECREF(*p_newtrace);
1713 if (res == None)
1714 *p_newtrace = NULL;
1715 else {
1716 INCREF(res);
1717 *p_newtrace = res;
1718 }
1719 }
1720 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001721 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001722 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001723}
1724
Guido van Rossum3f5da241990-12-20 15:06:42 +00001725object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001726getbuiltins()
1727{
1728 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001729 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001730 else
1731 return current_frame->f_builtins;
1732}
1733
1734object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001735getlocals()
1736{
1737 if (current_frame == NULL)
1738 return NULL;
1739 fast_2_locals(current_frame);
1740 return current_frame->f_locals;
1741}
1742
1743object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001744getglobals()
1745{
1746 if (current_frame == NULL)
1747 return NULL;
1748 else
1749 return current_frame->f_globals;
1750}
1751
Guido van Rossum81daa321993-05-20 14:24:46 +00001752object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001753getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001754{
1755 if (current_frame == NULL)
1756 return NULL;
1757 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001758 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001759}
1760
Guido van Rossume59214e1994-08-30 08:01:59 +00001761object *
1762getframe()
1763{
1764 return (object *)current_frame;
1765}
1766
Guido van Rossum6135a871995-01-09 17:53:26 +00001767int
1768getrestricted()
1769{
1770 return current_frame == NULL ? 0 : current_frame->f_restricted;
1771}
1772
Guido van Rossum3f5da241990-12-20 15:06:42 +00001773void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774flushline()
1775{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001776 object *f = sysget("stdout");
1777 if (softspace(f, 0))
1778 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001779}
1780
Guido van Rossum3f5da241990-12-20 15:06:42 +00001781
Guido van Rossum06186511995-01-07 12:40:10 +00001782#define BINOP(opname, ropname, thisfunc) \
1783 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1784 ; \
1785 else \
1786 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001787
1788
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001789static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001790or(v, w)
1791 object *v, *w;
1792{
Guido van Rossum06186511995-01-07 12:40:10 +00001793 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001794 if (v->ob_type->tp_as_number != NULL) {
1795 object *x;
1796 object * (*f) FPROTO((object *, object *));
1797 if (coerce(&v, &w) != 0)
1798 return NULL;
1799 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1800 x = (*f)(v, w);
1801 DECREF(v);
1802 DECREF(w);
1803 if (f != NULL)
1804 return x;
1805 }
1806 err_setstr(TypeError, "bad operand type(s) for |");
1807 return NULL;
1808}
1809
1810static object *
1811xor(v, w)
1812 object *v, *w;
1813{
Guido van Rossum06186511995-01-07 12:40:10 +00001814 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001815 if (v->ob_type->tp_as_number != NULL) {
1816 object *x;
1817 object * (*f) FPROTO((object *, object *));
1818 if (coerce(&v, &w) != 0)
1819 return NULL;
1820 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1821 x = (*f)(v, w);
1822 DECREF(v);
1823 DECREF(w);
1824 if (f != NULL)
1825 return x;
1826 }
1827 err_setstr(TypeError, "bad operand type(s) for ^");
1828 return NULL;
1829}
1830
1831static object *
1832and(v, w)
1833 object *v, *w;
1834{
Guido van Rossum06186511995-01-07 12:40:10 +00001835 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001836 if (v->ob_type->tp_as_number != NULL) {
1837 object *x;
1838 object * (*f) FPROTO((object *, object *));
1839 if (coerce(&v, &w) != 0)
1840 return NULL;
1841 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1842 x = (*f)(v, w);
1843 DECREF(v);
1844 DECREF(w);
1845 if (f != NULL)
1846 return x;
1847 }
1848 err_setstr(TypeError, "bad operand type(s) for &");
1849 return NULL;
1850}
1851
1852static object *
1853lshift(v, w)
1854 object *v, *w;
1855{
Guido van Rossum06186511995-01-07 12:40:10 +00001856 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001857 if (v->ob_type->tp_as_number != NULL) {
1858 object *x;
1859 object * (*f) FPROTO((object *, object *));
1860 if (coerce(&v, &w) != 0)
1861 return NULL;
1862 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1863 x = (*f)(v, w);
1864 DECREF(v);
1865 DECREF(w);
1866 if (f != NULL)
1867 return x;
1868 }
1869 err_setstr(TypeError, "bad operand type(s) for <<");
1870 return NULL;
1871}
1872
1873static object *
1874rshift(v, w)
1875 object *v, *w;
1876{
Guido van Rossum06186511995-01-07 12:40:10 +00001877 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001878 if (v->ob_type->tp_as_number != NULL) {
1879 object *x;
1880 object * (*f) FPROTO((object *, object *));
1881 if (coerce(&v, &w) != 0)
1882 return NULL;
1883 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1884 x = (*f)(v, w);
1885 DECREF(v);
1886 DECREF(w);
1887 if (f != NULL)
1888 return x;
1889 }
1890 err_setstr(TypeError, "bad operand type(s) for >>");
1891 return NULL;
1892}
1893
1894static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001895add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001896 object *v, *w;
1897{
Guido van Rossum06186511995-01-07 12:40:10 +00001898 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001899 if (v->ob_type->tp_as_sequence != NULL)
1900 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1901 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001902 object *x;
1903 if (coerce(&v, &w) != 0)
1904 return NULL;
1905 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1906 DECREF(v);
1907 DECREF(w);
1908 return x;
1909 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001910 err_setstr(TypeError, "bad operand type(s) for +");
1911 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912}
1913
1914static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 object *v, *w;
1917{
Guido van Rossum06186511995-01-07 12:40:10 +00001918 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001919 if (v->ob_type->tp_as_number != NULL) {
1920 object *x;
1921 if (coerce(&v, &w) != 0)
1922 return NULL;
1923 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1924 DECREF(v);
1925 DECREF(w);
1926 return x;
1927 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001928 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001929 return NULL;
1930}
1931
1932static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001933mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 object *v, *w;
1935{
1936 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001937 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00001938 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00001939 if (tp->tp_as_number != NULL &&
1940 w->ob_type->tp_as_sequence != NULL &&
1941 !is_instanceobject(v)) {
1942 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 object *tmp = v;
1944 v = w;
1945 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001946 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001948 if (tp->tp_as_number != NULL) {
1949 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001950 if (is_instanceobject(v)) {
1951 /* Instances of user-defined classes get their
1952 other argument uncoerced, so they may
1953 implement sequence*number as well as
1954 number*number. */
1955 INCREF(v);
1956 INCREF(w);
1957 }
1958 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001959 return NULL;
1960 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1961 DECREF(v);
1962 DECREF(w);
1963 return x;
1964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 if (tp->tp_as_sequence != NULL) {
1966 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001967 err_setstr(TypeError,
1968 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 return NULL;
1970 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001971 return (*tp->tp_as_sequence->sq_repeat)
1972 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001974 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 return NULL;
1976}
1977
1978static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001979divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 object *v, *w;
1981{
Guido van Rossum06186511995-01-07 12:40:10 +00001982 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001983 if (v->ob_type->tp_as_number != NULL) {
1984 object *x;
1985 if (coerce(&v, &w) != 0)
1986 return NULL;
1987 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1988 DECREF(v);
1989 DECREF(w);
1990 return x;
1991 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001992 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 return NULL;
1994}
1995
1996static object *
Guido van Rossum06186511995-01-07 12:40:10 +00001997mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998 object *v, *w;
1999{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000 if (is_stringobject(v)) {
2001 return formatstring(v, w);
2002 }
Guido van Rossum06186511995-01-07 12:40:10 +00002003 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002004 if (v->ob_type->tp_as_number != NULL) {
2005 object *x;
2006 if (coerce(&v, &w) != 0)
2007 return NULL;
2008 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2009 DECREF(v);
2010 DECREF(w);
2011 return x;
2012 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002013 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 return NULL;
2015}
2016
2017static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002018neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 object *v;
2020{
2021 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002022 return (*v->ob_type->tp_as_number->nb_negative)(v);
2023 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024 return NULL;
2025}
2026
2027static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002028pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002029 object *v;
2030{
2031 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002032 return (*v->ob_type->tp_as_number->nb_positive)(v);
2033 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034 return NULL;
2035}
2036
2037static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002038invert(v)
2039 object *v;
2040{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002041 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002042 if (v->ob_type->tp_as_number != NULL &&
2043 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2044 return (*f)(v);
2045 err_setstr(TypeError, "bad operand type(s) for unary ~");
2046 return NULL;
2047}
2048
2049static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002050not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 object *v;
2052{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002053 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002054 object *w;
2055 if (outcome < 0)
2056 return NULL;
2057 if (outcome == 0)
2058 w = True;
2059 else
2060 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002061 INCREF(w);
2062 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063}
Guido van Rossum234f9421993-06-17 12:35:49 +00002064
2065
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002066/* External interface to call any callable object. The arg may be NULL. */
2067
2068object *
2069call_object(func, arg)
2070 object *func;
2071 object *arg;
2072{
Guido van Rossume59214e1994-08-30 08:01:59 +00002073 binaryfunc call;
2074 object *result;
2075
2076 if (call = func->ob_type->tp_call) {
2077 int size = gettuplesize(arg);
2078 if (arg) {
2079 size = gettuplesize(arg);
2080 if (size == 1)
2081 arg = gettupleitem(arg, 0);
2082 else if (size == 0)
2083 arg = NULL;
2084 }
2085 result = (*call)(func, arg);
2086 }
2087 else if (is_instancemethodobject(func) || is_funcobject(func))
2088 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002089 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002090 result = call_builtin(func, arg);
2091
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002092 if (result == NULL && !err_occurred())
2093 fatal("null result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002094
2095 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002096}
2097
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002099call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 if (is_methodobject(func)) {
2104 method meth = getmethod(func);
2105 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002106 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2107 int size = gettuplesize(arg);
2108 if (size == 1)
2109 arg = gettupleitem(arg, 0);
2110 else if (size == 0)
2111 arg = NULL;
2112 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002113 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 }
2115 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002116 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002118 if (is_instanceobject(func)) {
2119 object *res, *call = getattr(func,"__call__");
2120 if (call == NULL) {
2121 err_clear();
2122 err_setstr(AttributeError, "no __call__ method defined");
2123 return NULL;
2124 }
2125 res = call_object(call, arg);
2126 DECREF(call);
2127 return res;
2128 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002129 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 return NULL;
2131}
2132
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002134call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002136 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138 object *newarg = NULL;
2139 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002140 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002142 object *argdefs;
2143 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144
Guido van Rossume8122f11991-05-05 20:03:07 +00002145 if (is_instancemethodobject(func)) {
2146 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002147 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002148 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002149 if (self == NULL) {
2150 /* Unbound methods must be called with an instance of
2151 the class (or a derived class) as first argument */
2152 if (arg != NULL && is_tupleobject(arg) &&
2153 gettuplesize(arg) >= 1) {
2154 self = gettupleitem(arg, 0);
2155 if (self != NULL &&
2156 is_instanceobject(self) &&
2157 issubclass((object *)
2158 (((instanceobject *)self)->in_class),
2159 class))
2160 /* self = self */ ;
2161 else
2162 self = NULL;
2163 }
2164 if (self == NULL) {
2165 err_setstr(TypeError,
2166 "unbound method must be called with class instance argument");
2167 return NULL;
2168 }
2169 }
2170 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002171 if (arg == NULL)
2172 argcount = 0;
2173 else if (is_tupleobject(arg))
2174 argcount = gettuplesize(arg);
2175 else
2176 argcount = 1;
2177 newarg = newtupleobject(argcount + 1);
2178 if (newarg == NULL)
2179 return NULL;
2180 INCREF(self);
2181 settupleitem(newarg, 0, self);
2182 if (arg != NULL && !is_tupleobject(arg)) {
2183 INCREF(arg);
2184 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002185 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002186 else {
2187 int i;
2188 object *v;
2189 for (i = 0; i < argcount; i++) {
2190 v = gettupleitem(arg, i);
2191 XINCREF(v);
2192 settupleitem(newarg, i+1, v);
2193 }
2194 }
2195 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 }
2197 }
2198 else {
2199 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 return NULL;
2202 }
2203 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002204
2205 argdefs = getfuncargstuff(func, &argcount);
2206 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2207 int actualcount, j;
2208 /* Process default arguments */
2209 if (argcount & 0x4000)
2210 argcount ^= 0x4000;
2211 actualcount = gettuplesize(arg);
2212 j = gettuplesize(argdefs) - (argcount - actualcount);
2213 if (actualcount < argcount && j >= 0) {
2214 int i;
2215 object *v;
2216 if (newarg == NULL)
2217 INCREF(arg);
2218 newarg = newtupleobject(argcount);
2219 if (newarg == NULL) {
2220 DECREF(arg);
2221 return NULL;
2222 }
2223 for (i = 0; i < actualcount; i++) {
2224 v = gettupleitem(arg, i);
2225 XINCREF(v);
2226 settupleitem(newarg, i, v);
2227 }
2228 for (; i < argcount; i++, j++) {
2229 v = gettupleitem(argdefs, j);
2230 XINCREF(v);
2231 settupleitem(newarg, i, v);
2232 }
2233 DECREF(arg);
2234 arg = newarg;
2235 }
2236 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238 co = getfunccode(func);
2239 if (co == NULL) {
2240 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 return NULL;
2242 }
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002243 if (!is_codeobject(co))
2244 fatal("XXX Bad code");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002245 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002247 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 return NULL;
2249 }
2250
Guido van Rossum3f5da241990-12-20 15:06:42 +00002251 newglobals = getfuncglobals(func);
2252 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253
Guido van Rossum81daa321993-05-20 14:24:46 +00002254 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256 DECREF(newlocals);
2257 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258
Guido van Rossum3f5da241990-12-20 15:06:42 +00002259 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260
2261 return v;
2262}
2263
2264static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002265apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 object *v, *w;
2267{
2268 typeobject *tp = v->ob_type;
2269 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002270 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 return NULL;
2272 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002273 if (tp->tp_as_mapping != NULL) {
2274 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2275 }
2276 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 int i;
2278 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002279 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 return NULL;
2281 }
2282 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002283 if (i < 0) {
2284 int len = (*tp->tp_as_sequence->sq_length)(v);
2285 if (len < 0)
2286 return NULL;
2287 i += len;
2288 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002289 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291}
2292
2293static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002294loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 object *v, *w;
2296{
2297 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002298 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002300 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 return NULL;
2302 }
2303 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002304 v = (*sq->sq_item)(v, i);
2305 if (v)
2306 return v;
2307 if (err_occurred() == IndexError)
2308 err_clear();
2309 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310}
2311
2312static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 object *v;
2315 int isize;
2316 int *pi;
2317{
2318 if (v != NULL) {
2319 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002320 err_setstr(TypeError, "slice index must be int");
2321 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 }
2323 *pi = getintvalue(v);
2324 if (*pi < 0)
2325 *pi += isize;
2326 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002327 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328}
2329
2330static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002331apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 object *u, *v, *w;
2333{
2334 typeobject *tp = u->ob_type;
2335 int ilow, ihigh, isize;
2336 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002337 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 return NULL;
2339 }
2340 ilow = 0;
2341 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002342 if (isize < 0)
2343 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002344 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002346 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002348 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002350
2351static int
2352assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 object *w;
2354 object *key;
2355 object *v;
2356{
2357 typeobject *tp = w->ob_type;
2358 sequence_methods *sq;
2359 mapping_methods *mp;
2360 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002361 if ((mp = tp->tp_as_mapping) != NULL &&
2362 (func = mp->mp_ass_subscript) != NULL) {
2363 return (*func)(w, key, v);
2364 }
2365 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 (func = sq->sq_ass_item) != NULL) {
2367 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002369 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002372 else {
2373 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002374 if (i < 0) {
2375 int len = (*sq->sq_length)(w);
2376 if (len < 0)
2377 return -1;
2378 i += len;
2379 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002380 return (*func)(w, i, v);
2381 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002384 err_setstr(TypeError,
2385 "can't assign to this subscripted object");
2386 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388}
2389
Guido van Rossum3f5da241990-12-20 15:06:42 +00002390static int
2391assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 object *u, *v, *w, *x;
2393{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002396 if (sq == NULL) {
2397 err_setstr(TypeError, "assign to slice of non-sequence");
2398 return -1;
2399 }
2400 if (sq == NULL || sq->sq_ass_slice == NULL) {
2401 err_setstr(TypeError, "unassignable slice");
2402 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 }
2404 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002406 if (isize < 0)
2407 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408 if (slice_index(v, isize, &ilow) != 0)
2409 return -1;
2410 if (slice_index(w, isize, &ihigh) != 0)
2411 return -1;
2412 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413}
2414
2415static int
2416cmp_exception(err, v)
2417 object *err, *v;
2418{
2419 if (is_tupleobject(v)) {
2420 int i, n;
2421 n = gettuplesize(v);
2422 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002423 /* Test recursively */
2424 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 return 1;
2426 }
2427 return 0;
2428 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002429 if (is_classobject(v) && is_classobject(err))
2430 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 return err == v;
2432}
2433
Guido van Rossum3f5da241990-12-20 15:06:42 +00002434static int
2435cmp_member(v, w)
2436 object *v, *w;
2437{
Guido van Rossume59214e1994-08-30 08:01:59 +00002438 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002439 object *x;
2440 sequence_methods *sq;
2441 /* Special case for char in string */
2442 if (is_stringobject(w)) {
2443 register char *s, *end;
2444 register char c;
2445 if (!is_stringobject(v) || getstringsize(v) != 1) {
2446 err_setstr(TypeError,
2447 "string member test needs char left operand");
2448 return -1;
2449 }
2450 c = getstringvalue(v)[0];
2451 s = getstringvalue(w);
2452 end = s + getstringsize(w);
2453 while (s < end) {
2454 if (c == *s++)
2455 return 1;
2456 }
2457 return 0;
2458 }
2459 sq = w->ob_type->tp_as_sequence;
2460 if (sq == NULL) {
2461 err_setstr(TypeError,
2462 "'in' or 'not in' needs sequence right argument");
2463 return -1;
2464 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002465 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002467 if (x == NULL) {
2468 if (err_occurred() == IndexError) {
2469 err_clear();
2470 break;
2471 }
2472 return -1;
2473 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002474 cmp = cmpobject(v, x);
2475 XDECREF(x);
2476 if (cmp == 0)
2477 return 1;
2478 }
2479 return 0;
2480}
2481
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002483cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002484 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 register object *v;
2486 register object *w;
2487{
2488 register int cmp;
2489 register int res = 0;
2490 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491 case IS:
2492 case IS_NOT:
2493 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002494 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002495 res = !res;
2496 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497 case IN:
2498 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002499 res = cmp_member(v, w);
2500 if (res < 0)
2501 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002502 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002503 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 break;
2505 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 break;
2508 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002509 cmp = cmpobject(v, w);
2510 switch (op) {
2511 case LT: res = cmp < 0; break;
2512 case LE: res = cmp <= 0; break;
2513 case EQ: res = cmp == 0; break;
2514 case NE: res = cmp != 0; break;
2515 case GT: res = cmp > 0; break;
2516 case GE: res = cmp >= 0; break;
2517 /* XXX no default? (res is initialized to 0 though) */
2518 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 }
2520 v = res ? True : False;
2521 INCREF(v);
2522 return v;
2523}
2524
Guido van Rossum3f5da241990-12-20 15:06:42 +00002525static int
2526import_from(locals, v, name)
2527 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002528 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002529 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002530{
2531 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002532 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002533 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002534 return -1;
2535 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002536 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002537 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002538 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002539 object *name, *value;
2540 pos = 0;
2541 while (mappinggetnext(w, &pos, &name, &value)) {
2542 if (!is_stringobject(name) ||
2543 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002544 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002545 if (is_accessobject(value)) {
2546 value = getaccessvalue(value, (object *)NULL);
2547 if (value == NULL) {
2548 err_clear();
2549 continue;
2550 }
2551 }
2552 else
2553 INCREF(value);
2554 err = dict2insert(locals, name, value);
2555 DECREF(value);
2556 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002558 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002560 }
2561 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002562 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002563 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002564 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002565 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002566 getstringvalue(name));
2567 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568 return -1;
2569 }
2570 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002571 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002572 }
2573}
2574
2575static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002576build_class(methods, bases, name)
2577 object *methods; /* dictionary */
2578 object *bases; /* tuple containing classes */
2579 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002580{
Guido van Rossum25831651993-05-19 14:50:45 +00002581 int i;
2582 if (!is_tupleobject(bases)) {
2583 err_setstr(SystemError, "build_class with non-tuple bases");
2584 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002585 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002586 if (gettuplesize(bases) > 0) {
2587 object *base;
2588 base = gettupleitem(bases, 0);
2589 /* Call the base's *type*, if it is callable.
2590 This code is a hook for Donald Beaudry's type extensions.
2591 In unexended Python it will never be triggered since its
2592 types are not callable. */
2593 if (base->ob_type->ob_type->tp_call) {
2594 object *args;
2595 object *class;
2596 args = mkvalue("(OOO)", name, bases, methods);
2597 class = call_object((object *)base->ob_type, args);
2598 DECREF(args);
2599 return class;
2600 }
2601 }
Guido van Rossum25831651993-05-19 14:50:45 +00002602 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002604 return NULL;
2605 }
Guido van Rossum25831651993-05-19 14:50:45 +00002606 if (!is_stringobject(name)) {
2607 err_setstr(SystemError, "build_class witn non-string name");
2608 return NULL;
2609 }
2610 for (i = gettuplesize(bases); --i >= 0; ) {
2611 object *base = gettupleitem(bases, i);
2612 if (!is_classobject(base)) {
2613 err_setstr(TypeError,
2614 "base is not a class object");
2615 return NULL;
2616 }
2617 }
2618 return newclassobject(bases, methods, name);
2619}
2620
2621static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002622access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002623 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002624 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002625 frameobject *f;
2626{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002627 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002628 object *value, *ac;
2629 typeobject *type;
2630 int fastind, ret;
2631 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002632 if (f->f_localmap == NULL)
2633 value = dict2lookup(f->f_locals, name);
2634 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002635 object *map = f->f_localmap;
2636 value = NULL;
2637 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2638 object *fname = gettupleitem(map, fastind);
2639 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002640 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002641 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002642 }
2643 }
2644 }
2645 if (value && is_accessobject(value)) {
2646 err_setstr(AccessError, "can't override access");
2647 return -1;
2648 }
2649 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002650 if (value != NULL && value != None)
2651 type = value->ob_type;
2652 else
2653 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002654 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002655 if (ac == NULL)
2656 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002657 if (fastind >= 0)
2658 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002659 else {
2660 ret = dict2insert(f->f_locals, name, ac);
2661 DECREF(ac);
2662 }
2663 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002664}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002665
2666static int
2667exec_statement(prog, globals, locals)
2668 object *prog;
2669 object *globals;
2670 object *locals;
2671{
2672 char *s;
2673 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002674 object *v;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002675
2676 if (is_tupleobject(prog) && globals == None && locals == None &&
2677 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2678 /* Backward compatibility hack */
2679 globals = gettupleitem(prog, 1);
2680 if (n == 3)
2681 locals = gettupleitem(prog, 2);
2682 prog = gettupleitem(prog, 0);
2683 }
2684 if (globals == None) {
2685 globals = getglobals();
2686 if (locals == None)
2687 locals = getlocals();
2688 }
2689 else if (locals == None)
2690 locals = globals;
2691 if (!is_stringobject(prog) &&
2692 !is_codeobject(prog) &&
2693 !is_fileobject(prog)) {
2694 err_setstr(TypeError,
2695 "exec 1st arg must be string, code or file object");
2696 return -1;
2697 }
2698 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2699 err_setstr(TypeError,
2700 "exec 2nd/3rd args must be dict or None");
2701 return -1;
2702 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002703 if (dictlookup(globals, "__builtins__") == NULL)
2704 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002705 if (is_codeobject(prog)) {
2706 if (eval_code((codeobject *) prog, globals, locals,
2707 (object *)NULL, (object *)NULL) == NULL)
2708 return -1;
2709 return 0;
2710 }
2711 if (is_fileobject(prog)) {
2712 FILE *fp = getfilefile(prog);
2713 char *name = getstringvalue(getfilename(prog));
2714 if (run_file(fp, name, file_input, globals, locals) == NULL)
2715 return -1;
2716 return 0;
2717 }
2718 s = getstringvalue(prog);
2719 if (strlen(s) != getstringsize(prog)) {
2720 err_setstr(ValueError, "embedded '\\0' in exec string");
2721 return -1;
2722 }
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002723 if ((v = run_string(s, file_input, globals, locals)) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002724 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002725 DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002726 return 0;
2727}
Guido van Rossum24c13741995-02-14 09:42:43 +00002728
2729/* Hack for Ken Manheimer */
2730static object *
2731find_from_args(f, nexti)
2732 frameobject *f;
2733 int nexti;
2734{
2735 int opcode;
2736 int oparg;
2737 object *list, *name;
2738 unsigned char *next_instr;
2739
2740 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2741 opcode = (*next_instr++);
2742 if (opcode != IMPORT_FROM) {
2743 printf("next opcode: %d\n", opcode);
2744 INCREF(None);
2745 return None;
2746 }
2747
2748 list = newlistobject(0);
2749 if (list == NULL)
2750 return NULL;
2751
2752 do {
2753 oparg = (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]);
2754 name = Getnamev(f, oparg);
2755 if (addlistitem(list, name) < 0) {
2756 DECREF(list);
2757 break;
2758 }
2759 opcode = (*next_instr++);
2760 } while (opcode == IMPORT_FROM);
2761
2762 return list;
2763}