blob: d567c9d7910b959e82454b54ea260620c50c1b6a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossume59214e1994-08-30 08:01:59 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum34679b71993-01-26 13:33:44 +00003Amsterdam, The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000028
Guido van Rossum10dc2e81990-11-18 17:27:39 +000029#include "import.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#include "sysmodule.h"
31#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000032#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000033#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000035#include "opcode.h"
Guido van Rossum86cd6e61991-01-21 15:12:35 +000036#include "bltinmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "traceback.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000038#include "graminit.h"
39#include "pythonrun.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040
Guido van Rossumc6004111993-11-05 10:22:19 +000041#include <ctype.h>
42
Guido van Rossume59214e1994-08-30 08:01:59 +000043extern int suppress_print; /* Declared in pythonrun.c, set in pythonmain.c */
44
Guido van Rossum04691fc1992-08-12 15:35:34 +000045/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000046/* #define CASE_TOO_BIG 1 /**/
Guido van Rossum04691fc1992-08-12 15:35:34 +000047
Guido van Rossumacbe8da1993-04-15 15:33:52 +000048/* Turn this on if you want to debug the interpreter: */
49/* (This can be on even if NDEBUG is defined) */
50/* #define DEBUG 1 /**/
51
52#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000053/* For debugging the interpreter: */
54#define LLTRACE 1 /* Low-level trace feature */
55#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000056#endif
57
Guido van Rossum5b722181993-03-30 17:46:03 +000058
Guido van Rossum374a9221991-04-04 10:40:29 +000059/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000060
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
62static int prtrace PROTO((object *, char *));
63#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000064static void call_exc_trace PROTO((object **, object**, frameobject *));
65static int call_trace
66 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000067static object *add PROTO((object *, object *));
68static object *sub PROTO((object *, object *));
69static object *mul PROTO((object *, object *));
70static object *divide PROTO((object *, object *));
71static object *rem PROTO((object *, object *));
72static object *neg PROTO((object *));
73static object *pos PROTO((object *));
74static object *not PROTO((object *));
75static object *invert PROTO((object *));
76static object *lshift PROTO((object *, object *));
77static object *rshift PROTO((object *, object *));
78static object *and PROTO((object *, object *));
79static object *xor PROTO((object *, object *));
80static object *or PROTO((object *, object *));
81static object *call_builtin PROTO((object *, object *));
82static object *call_function PROTO((object *, object *));
83static object *apply_subscript PROTO((object *, object *));
84static object *loop_subscript PROTO((object *, object *));
85static int slice_index PROTO((object *, int, int *));
86static object *apply_slice PROTO((object *, object *, object *));
87static int assign_subscript PROTO((object *, object *, object *));
88static int assign_slice PROTO((object *, object *, object *, object *));
89static int cmp_exception PROTO((object *, object *));
90static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000091static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000092static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000093static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000094static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000095static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum0a066c01992-03-27 17:29:15 +000098/* Pointer to current frame, used to link new frames to */
99
Guido van Rossum374a9221991-04-04 10:40:29 +0000100static frameobject *current_frame;
101
Guido van Rossume59214e1994-08-30 08:01:59 +0000102#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000103
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000104#include <errno.h>
105#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000106
Guido van Rossuma9672091994-09-14 13:31:22 +0000107static type_lock interpreter_lock = 0;
108static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109
110void
111init_save_thread()
112{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000114 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000115 interpreter_lock = allocate_lock();
116 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000117 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000119
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120#endif
121
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122/* Functions save_thread and restore_thread are always defined so
123 dynamically loaded modules needn't be compiled separately for use
124 with and without threads: */
125
Guido van Rossum04691fc1992-08-12 15:35:34 +0000126object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127save_thread()
128{
Guido van Rossume59214e1994-08-30 08:01:59 +0000129#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000131 object *res;
132 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133 current_frame = NULL;
134 release_lock(interpreter_lock);
135 return res;
136 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000138 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139}
140
141void
142restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000143 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144{
Guido van Rossume59214e1994-08-30 08:01:59 +0000145#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 if (interpreter_lock) {
147 int err;
148 err = errno;
149 acquire_lock(interpreter_lock, 1);
150 errno = err;
151 current_frame = (frameobject *)x;
152 }
153#endif
154}
155
156
Guido van Rossuma9672091994-09-14 13:31:22 +0000157/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
158 signal handlers or Mac I/O completion routines) can schedule calls
159 to a function to be called synchronously.
160 The synchronous function is called with one void* argument.
161 It should return 0 for success or -1 for failure -- failure should
162 be accompanied by an exception.
163
164 If registry succeeds, the registry function returns 0; if it fails
165 (e.g. due to too many pending calls) it returns -1 (without setting
166 an exception condition).
167
168 Note that because registry may occur from within signal handlers,
169 or other asynchronous events, calling malloc() is unsafe!
170
171#ifdef WITH_THREAD
172 Any thread can schedule pending calls, but only the main thread
173 will execute them.
174#endif
175
176 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
177 There are two possible race conditions:
178 (1) nested asynchronous registry calls;
179 (2) registry calls made while pending calls are being processed.
180 While (1) is very unlikely, (2) is a real possibility.
181 The current code is safe against (2), but not against (1).
182 The safety against (2) is derived from the fact that only one
183 thread (the main thread) ever takes things out of the queue.
184*/
185
186#define NPENDINGCALLS 32
187static struct {
188 int (*func) PROTO((ANY *));
189 ANY *arg;
190} pendingcalls[NPENDINGCALLS];
191static volatile int pendingfirst = 0;
192static volatile int pendinglast = 0;
193
194int
195Py_AddPendingCall(func, arg)
196 int (*func) PROTO((ANY *));
197 ANY *arg;
198{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000199 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000200 int i, j;
201 /* XXX Begin critical section */
202 /* XXX If you want this to be safe against nested
203 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000204 if (busy)
205 return -1;
206 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000207 i = pendinglast;
208 j = (i + 1) % NPENDINGCALLS;
209 if (j == pendingfirst)
210 return -1; /* Queue full */
211 pendingcalls[i].func = func;
212 pendingcalls[i].arg = arg;
213 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000215 /* XXX End critical section */
216 return 0;
217}
218
Guido van Rossum180d7b41994-09-29 09:45:57 +0000219int
220Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000221{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000222 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000223#ifdef WITH_THREAD
224 if (get_thread_ident() != main_thread)
225 return 0;
226#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000227 if (busy)
228 return 0;
229 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000230 for (;;) {
231 int i;
232 int (*func) PROTO((ANY *));
233 ANY *arg;
234 i = pendingfirst;
235 if (i == pendinglast)
236 break; /* Queue empty */
237 func = pendingcalls[i].func;
238 arg = pendingcalls[i].arg;
239 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000240 if (func(arg) < 0) {
241 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000242 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000243 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 return 0;
247}
248
249
Guido van Rossum374a9221991-04-04 10:40:29 +0000250/* Status code for main loop (reason for stack unwind) */
251
252enum why_code {
253 WHY_NOT, /* No error */
254 WHY_EXCEPTION, /* Exception occurred */
255 WHY_RERAISE, /* Exception re-raised by 'finally' */
256 WHY_RETURN, /* 'return' statement */
257 WHY_BREAK /* 'break' statement */
258};
259
260
261/* Interpreter main loop */
262
263object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000264eval_code(co, globals, locals, owner, arg)
Guido van Rossum374a9221991-04-04 10:40:29 +0000265 codeobject *co;
266 object *globals;
267 object *locals;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000268 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000269 object *arg;
270{
271 register unsigned char *next_instr;
272 register int opcode; /* Current opcode */
273 register int oparg; /* Current opcode argument, if any */
274 register object **stack_pointer;
275 register enum why_code why; /* Reason for block stack unwind */
276 register int err; /* Error status -- nonzero if error */
277 register object *x; /* Result object -- NULL if error */
278 register object *v; /* Temporary objects popped off stack */
279 register object *w;
280 register object *u;
281 register object *t;
282 register frameobject *f; /* Current frame */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000283 register listobject *fastlocals = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +0000284 object *retval; /* Return value iff why == WHY_RETURN */
285 char *name; /* Name used by some instructions */
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 Rossume59214e1994-08-30 08:01:59 +0000288 int ticker_count = 10; /* Check for intr every Nth instruction */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000289#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000290 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000291#endif
Guido van Rossum99bec951992-09-03 20:29:45 +0000292#ifdef DEBUG
293 /* Make it easier to find out where we are with dbx */
294 char *filename = getstringvalue(co->co_filename);
295#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000296
297/* Code access macros */
298
299#define GETCONST(i) Getconst(f, i)
300#define GETNAME(i) Getname(f, i)
301#define GETNAMEV(i) Getnamev(f, i)
302#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
303#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
304#define NEXTOP() (*next_instr++)
305#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
306#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
307#define JUMPBY(x) (next_instr += (x))
308
309/* Stack manipulation macros */
310
311#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
312#define EMPTY() (STACK_LEVEL() == 0)
313#define TOP() (stack_pointer[-1])
314#define BASIC_PUSH(v) (*stack_pointer++ = (v))
315#define BASIC_POP() (*--stack_pointer)
316
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000317#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
318 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
319
Guido van Rossum96a42c81992-01-12 02:29:51 +0000320#ifdef LLTRACE
321#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
322#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000323#else
324#define PUSH(v) BASIC_PUSH(v)
325#define POP() BASIC_POP()
326#endif
327
Guido van Rossum5b722181993-03-30 17:46:03 +0000328 if (globals == NULL) {
329 globals = getglobals();
330 if (locals == NULL) {
331 locals = getlocals();
332 needmerge = 1;
333 }
334 }
335 else {
336 if (locals == NULL)
337 locals = globals;
338 }
339
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000340#ifdef LLTRACE
341 lltrace = dictlookup(globals, "__lltrace__") != NULL;
342#endif
343
Guido van Rossum374a9221991-04-04 10:40:29 +0000344 f = newframeobject(
345 current_frame, /*back*/
346 co, /*code*/
347 globals, /*globals*/
348 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000349 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000350 50, /*nvalues*/
351 20); /*nblocks*/
352 if (f == NULL)
353 return NULL;
354
355 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000356
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000357 if (sys_trace != NULL) {
358 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000359 be called on *every* entry to a code block.
360 Its return value, if not None, is a function that
361 will be called at the start of each executed line
362 of code. (Actually, the function must return
363 itself in order to continue tracing.)
364 The trace functions are called with three arguments:
365 a pointer to the current frame, a string indicating
366 why the function is called, and an argument which
367 depends on the situation. The global trace function
368 (sys.trace) is also called whenever an exception
369 is detected. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000370 if (call_trace(&sys_trace, &f->f_trace, f, "call", arg)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000371 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000372 current_frame = f->f_back;
373 DECREF(f);
374 return NULL;
375 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000376 }
377
378 if (sys_profile != NULL) {
379 /* Similar for sys_profile, except it needn't return
380 itself and isn't called for "line" events */
381 if (call_trace(&sys_profile, (object**)0, f, "call", arg)) {
382 current_frame = f->f_back;
383 DECREF(f);
384 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000385 }
386 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000387
388 x = sysget("check_interval");
389 if (x != NULL && is_intobject(x))
390 ticker_count = getintvalue(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000391
392 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000393 stack_pointer = f->f_valuestack;
394
395 if (arg != NULL) {
396 INCREF(arg);
397 PUSH(arg);
398 }
399
400 why = WHY_NOT;
401 err = 0;
402 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000403
404 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000405 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000406
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000407 /* Do periodic things.
408 Doing this every time through the loop would add
409 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000410 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000411
Guido van Rossuma9672091994-09-14 13:31:22 +0000412 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000413 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000414 why = WHY_EXCEPTION;
415 goto on_error;
416 }
417 }
418
Guido van Rossum374a9221991-04-04 10:40:29 +0000419 if (--ticker < 0) {
Guido van Rossume59214e1994-08-30 08:01:59 +0000420 ticker = ticker_count;
421 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000422 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000423 goto on_error;
424 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000425
Guido van Rossume59214e1994-08-30 08:01:59 +0000426#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427 if (interpreter_lock) {
428 /* Give another thread a chance */
429
430 current_frame = NULL;
431 release_lock(interpreter_lock);
432
433 /* Other threads may run now */
434
435 acquire_lock(interpreter_lock, 1);
436 current_frame = f;
437 }
438#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000439 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440
Guido van Rossum374a9221991-04-04 10:40:29 +0000441 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000442
443#ifdef DEBUG
444 f->f_lasti = INSTR_OFFSET();
445#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000446
447 opcode = NEXTOP();
448 if (HAS_ARG(opcode))
449 oparg = NEXTARG();
450
Guido van Rossum96a42c81992-01-12 02:29:51 +0000451#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000452 /* Instruction tracing */
453
Guido van Rossum96a42c81992-01-12 02:29:51 +0000454 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000455 if (HAS_ARG(opcode)) {
456 printf("%d: %d, %d\n",
457 (int) (INSTR_OFFSET() - 3),
458 opcode, oparg);
459 }
460 else {
461 printf("%d: %d\n",
462 (int) (INSTR_OFFSET() - 1), opcode);
463 }
464 }
465#endif
466
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000467 if (!CHECK_STACK(3)) {
468 x = NULL;
469 break;
470 }
471
Guido van Rossum374a9221991-04-04 10:40:29 +0000472 /* Main switch on opcode */
473
474 switch (opcode) {
475
476 /* BEWARE!
477 It is essential that any operation that fails sets either
478 x to NULL, err to nonzero, or why to anything but WHY_NOT,
479 and that no operation that succeeds does this! */
480
481 /* case STOP_CODE: this is an error! */
482
483 case POP_TOP:
484 v = POP();
485 DECREF(v);
486 break;
487
488 case ROT_TWO:
489 v = POP();
490 w = POP();
491 PUSH(v);
492 PUSH(w);
493 break;
494
495 case ROT_THREE:
496 v = POP();
497 w = POP();
498 x = POP();
499 PUSH(v);
500 PUSH(x);
501 PUSH(w);
502 break;
503
504 case DUP_TOP:
505 v = TOP();
506 INCREF(v);
507 PUSH(v);
508 break;
509
510 case UNARY_POSITIVE:
511 v = POP();
512 x = pos(v);
513 DECREF(v);
514 PUSH(x);
515 break;
516
517 case UNARY_NEGATIVE:
518 v = POP();
519 x = neg(v);
520 DECREF(v);
521 PUSH(x);
522 break;
523
524 case UNARY_NOT:
525 v = POP();
526 x = not(v);
527 DECREF(v);
528 PUSH(x);
529 break;
530
531 case UNARY_CONVERT:
532 v = POP();
533 x = reprobject(v);
534 DECREF(v);
535 PUSH(x);
536 break;
537
538 case UNARY_CALL:
539 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000540 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000541 x = call_object(v, (object *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000542 DECREF(v);
543 PUSH(x);
544 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000545
546 case UNARY_INVERT:
547 v = POP();
548 x = invert(v);
549 DECREF(v);
550 PUSH(x);
551 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000552
553 case BINARY_MULTIPLY:
554 w = POP();
555 v = POP();
556 x = mul(v, w);
557 DECREF(v);
558 DECREF(w);
559 PUSH(x);
560 break;
561
562 case BINARY_DIVIDE:
563 w = POP();
564 v = POP();
565 x = divide(v, w);
566 DECREF(v);
567 DECREF(w);
568 PUSH(x);
569 break;
570
571 case BINARY_MODULO:
572 w = POP();
573 v = POP();
574 x = rem(v, w);
575 DECREF(v);
576 DECREF(w);
577 PUSH(x);
578 break;
579
580 case BINARY_ADD:
581 w = POP();
582 v = POP();
583 x = add(v, w);
584 DECREF(v);
585 DECREF(w);
586 PUSH(x);
587 break;
588
589 case BINARY_SUBTRACT:
590 w = POP();
591 v = POP();
592 x = sub(v, w);
593 DECREF(v);
594 DECREF(w);
595 PUSH(x);
596 break;
597
598 case BINARY_SUBSCR:
599 w = POP();
600 v = POP();
601 x = apply_subscript(v, w);
602 DECREF(v);
603 DECREF(w);
604 PUSH(x);
605 break;
606
607 case BINARY_CALL:
608 w = POP();
609 v = POP();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000610 f->f_lasti = INSTR_OFFSET() - 1; /* For tracing */
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000611 x = call_object(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000612 DECREF(v);
613 DECREF(w);
614 PUSH(x);
615 break;
616
Guido van Rossum7928cd71991-10-24 14:59:31 +0000617 case BINARY_LSHIFT:
618 w = POP();
619 v = POP();
620 x = lshift(v, w);
621 DECREF(v);
622 DECREF(w);
623 PUSH(x);
624 break;
625
626 case BINARY_RSHIFT:
627 w = POP();
628 v = POP();
629 x = rshift(v, w);
630 DECREF(v);
631 DECREF(w);
632 PUSH(x);
633 break;
634
635 case BINARY_AND:
636 w = POP();
637 v = POP();
638 x = and(v, w);
639 DECREF(v);
640 DECREF(w);
641 PUSH(x);
642 break;
643
644 case BINARY_XOR:
645 w = POP();
646 v = POP();
647 x = xor(v, w);
648 DECREF(v);
649 DECREF(w);
650 PUSH(x);
651 break;
652
653 case BINARY_OR:
654 w = POP();
655 v = POP();
656 x = or(v, w);
657 DECREF(v);
658 DECREF(w);
659 PUSH(x);
660 break;
661
Guido van Rossum374a9221991-04-04 10:40:29 +0000662 case SLICE+0:
663 case SLICE+1:
664 case SLICE+2:
665 case SLICE+3:
666 if ((opcode-SLICE) & 2)
667 w = POP();
668 else
669 w = NULL;
670 if ((opcode-SLICE) & 1)
671 v = POP();
672 else
673 v = NULL;
674 u = POP();
675 x = apply_slice(u, v, w);
676 DECREF(u);
677 XDECREF(v);
678 XDECREF(w);
679 PUSH(x);
680 break;
681
682 case STORE_SLICE+0:
683 case STORE_SLICE+1:
684 case STORE_SLICE+2:
685 case STORE_SLICE+3:
686 if ((opcode-STORE_SLICE) & 2)
687 w = POP();
688 else
689 w = NULL;
690 if ((opcode-STORE_SLICE) & 1)
691 v = POP();
692 else
693 v = NULL;
694 u = POP();
695 t = POP();
696 err = assign_slice(u, v, w, t); /* u[v:w] = t */
697 DECREF(t);
698 DECREF(u);
699 XDECREF(v);
700 XDECREF(w);
701 break;
702
703 case DELETE_SLICE+0:
704 case DELETE_SLICE+1:
705 case DELETE_SLICE+2:
706 case DELETE_SLICE+3:
707 if ((opcode-DELETE_SLICE) & 2)
708 w = POP();
709 else
710 w = NULL;
711 if ((opcode-DELETE_SLICE) & 1)
712 v = POP();
713 else
714 v = NULL;
715 u = POP();
716 err = assign_slice(u, v, w, (object *)NULL);
717 /* del u[v:w] */
718 DECREF(u);
719 XDECREF(v);
720 XDECREF(w);
721 break;
722
723 case STORE_SUBSCR:
724 w = POP();
725 v = POP();
726 u = POP();
727 /* v[w] = u */
728 err = assign_subscript(v, w, u);
729 DECREF(u);
730 DECREF(v);
731 DECREF(w);
732 break;
733
734 case DELETE_SUBSCR:
735 w = POP();
736 v = POP();
737 /* del v[w] */
738 err = assign_subscript(v, w, (object *)NULL);
739 DECREF(v);
740 DECREF(w);
741 break;
742
743 case PRINT_EXPR:
744 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000746 /* Before printing, also assign to '_' */
747 if (v != None &&
748 (err = setbuiltin("_", v)) == 0 &&
749 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000751 x = sysget("stdout");
752 softspace(x, 1);
753 err = writeobject(v, x, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 flushline();
755 }
756 DECREF(v);
757 break;
758
759 case PRINT_ITEM:
760 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000761 w = sysget("stdout");
762 if (softspace(w, 1))
763 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000764 err = writeobject(v, w, PRINT_RAW);
765 if (err == 0 && is_stringobject(v)) {
766 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 char *s = getstringvalue(v);
768 int len = getstringsize(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000769 if (len > 0 && isspace(s[len-1]) &&
770 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000771 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 DECREF(v);
774 break;
775
776 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000777 x = sysget("stdout");
778 if (x == NULL)
779 err_setstr(RuntimeError, "lost sys.stdout");
780 else {
781 writestring("\n", x);
782 softspace(x, 0);
783 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
786 case BREAK_LOOP:
787 why = WHY_BREAK;
788 break;
789
790 case RAISE_EXCEPTION:
791 v = POP();
792 w = POP();
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000793 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000794 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000795 u = w;
796 w = gettupleitem(u, 0);
797 DECREF(u);
798 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 if (!is_stringobject(w))
800 err_setstr(TypeError,
801 "exceptions must be strings");
802 else
803 err_setval(w, v);
804 DECREF(v);
805 DECREF(w);
806 why = WHY_EXCEPTION;
807 break;
808
809 case LOAD_LOCALS:
810 v = f->f_locals;
811 INCREF(v);
812 PUSH(v);
813 break;
814
815 case RETURN_VALUE:
816 retval = POP();
817 why = WHY_RETURN;
818 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000819
820 case LOAD_GLOBALS:
821 v = f->f_locals;
822 INCREF(v);
823 PUSH(v);
824 break;
825
826 case EXEC_STMT:
827 w = POP();
828 v = POP();
829 u = POP();
830 err = exec_statement(u, v, w);
831 DECREF(u);
832 DECREF(v);
833 DECREF(w);
834 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case BUILD_FUNCTION:
837 v = POP();
838 x = newfuncobject(v, f->f_globals);
839 DECREF(v);
840 PUSH(x);
841 break;
Guido van Rossume59214e1994-08-30 08:01:59 +0000842
843 case SET_FUNC_ARGS:
844 v = POP(); /* The function */
845 w = POP(); /* The argument list */
846 err = setfuncargstuff(v, oparg, w);
847 PUSH(v);
848 DECREF(w);
849 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850
851 case POP_BLOCK:
852 {
853 block *b = pop_block(f);
854 while (STACK_LEVEL() > b->b_level) {
855 v = POP();
856 DECREF(v);
857 }
858 }
859 break;
860
861 case END_FINALLY:
862 v = POP();
863 if (is_intobject(v)) {
864 why = (enum why_code) getintvalue(v);
865 if (why == WHY_RETURN)
866 retval = POP();
867 }
868 else if (is_stringobject(v)) {
869 w = POP();
870 err_setval(v, w);
871 DECREF(w);
872 w = POP();
873 tb_store(w);
874 DECREF(w);
875 why = WHY_RERAISE;
876 }
877 else if (v != None) {
878 err_setstr(SystemError,
879 "'finally' pops bad exception");
880 why = WHY_EXCEPTION;
881 }
882 DECREF(v);
883 break;
884
885 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +0000886 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000888 w = POP();
889 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +0000891 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 DECREF(v);
893 DECREF(w);
894 break;
895
896 case STORE_NAME:
897 w = GETNAMEV(oparg);
898 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +0000899 u = dict2lookup(f->f_locals, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +0000900 if (u == NULL) {
901 if (defmode != 0) {
902 if (v != None)
903 u = (object *)v->ob_type;
904 else
905 u = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000906 x = newaccessobject(v, f->f_locals,
Guido van Rossumb3f72581993-05-21 19:56:10 +0000907 (typeobject *)u,
908 defmode);
909 DECREF(v);
910 if (x == NULL)
911 break;
912 v = x;
913 }
914 }
915 else if (is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000916 err = setaccessvalue(u, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +0000917 DECREF(v);
918 break;
919 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 err = dict2insert(f->f_locals, w, v);
921 DECREF(v);
922 break;
923
924 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +0000925 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +0000926 u = dict2lookup(f->f_locals, w);
927 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000928 err = setaccessvalue(u, f->f_locals,
Guido van Rossum25831651993-05-19 14:50:45 +0000929 (object *)NULL);
930 break;
931 }
Guido van Rossumdf62e441991-08-16 08:56:04 +0000932 if ((err = dict2remove(f->f_locals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +0000933 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +0000935
936#ifdef CASE_TOO_BIG
937 default: switch (opcode) {
938#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000939
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000940 case UNPACK_VARARG:
941 if (EMPTY()) {
942 err_setstr(TypeError,
943 "no argument list");
944 why = WHY_EXCEPTION;
945 break;
946 }
947 v = POP();
948 if (!is_tupleobject(v)) {
949 err_setstr(TypeError,
950 "bad argument list");
951 why = WHY_EXCEPTION;
952 }
953 else if (gettuplesize(v) < oparg) {
954 err_setstr(TypeError,
955 "not enough arguments");
956 why = WHY_EXCEPTION;
957 }
958 else if (oparg == 0) {
959 PUSH(v);
960 break;
961 }
962 else {
963 x = gettupleslice(v, oparg, gettuplesize(v));
964 if (x != NULL) {
965 PUSH(x);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000966 if (!CHECK_STACK(oparg)) {
967 x = NULL;
968 break;
969 }
Guido van Rossum6a3f9a81992-01-14 18:29:20 +0000970 for (; --oparg >= 0; ) {
971 w = gettupleitem(v, oparg);
972 INCREF(w);
973 PUSH(w);
974 }
975 }
976 }
977 DECREF(v);
978 break;
979
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000980 case UNPACK_ARG:
Guido van Rossum9c7b8611991-12-16 13:04:47 +0000981 {
982 int n;
983 if (EMPTY()) {
984 err_setstr(TypeError,
985 "no argument list");
986 why = WHY_EXCEPTION;
987 break;
988 }
989 v = POP();
990 if (!is_tupleobject(v)) {
991 err_setstr(TypeError,
992 "bad argument list");
993 why = WHY_EXCEPTION;
994 break;
995 }
996 n = gettuplesize(v);
Guido van Rossum6f5afc91993-02-05 09:46:15 +0000997#ifdef COMPAT_HACKS
998/* Implement various compatibility hacks (for 0.9.4 or earlier):
999 (a) f(a,b,...) accepts f((1,2,...))
1000 (b) f((a,b,...)) accepts f(1,2,...)
1001 (c) f(self,(a,b,...)) accepts f(x,1,2,...)
1002*/
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001003 if (n == 1 && oparg != 1) {
1004 /* Rule (a) */
1005 w = gettupleitem(v, 0);
1006 if (is_tupleobject(w)) {
1007 INCREF(w);
1008 DECREF(v);
1009 v = w;
1010 n = gettuplesize(v);
1011 }
1012 }
1013 else if (n != 1 && oparg == 1) {
1014 /* Rule (b) */
1015 PUSH(v);
1016 break;
1017 /* Don't fall through */
1018 }
1019 else if (n > 2 && oparg == 2) {
1020 /* Rule (c) */
1021 int i;
1022 w = newtupleobject(n-1);
1023 u = newtupleobject(2);
1024 if (u == NULL || w == NULL) {
1025 XDECREF(w);
1026 XDECREF(u);
1027 DECREF(v);
1028 why = WHY_EXCEPTION;
1029 break;
1030 }
1031 t = gettupleitem(v, 0);
1032 INCREF(t);
1033 settupleitem(u, 0, t);
1034 for (i = 1; i < n; i++) {
1035 t = gettupleitem(v, i);
1036 INCREF(t);
1037 settupleitem(w, i-1, t);
1038 }
1039 settupleitem(u, 1, w);
1040 DECREF(v);
1041 v = u;
1042 n = 2;
1043 }
Guido van Rossum5f59d601992-12-14 16:59:51 +00001044#endif /* Disabled compatibility hacks */
Guido van Rossum9c7b8611991-12-16 13:04:47 +00001045 if (n != oparg) {
1046 err_setstr(TypeError,
1047 "arg count mismatch");
1048 why = WHY_EXCEPTION;
1049 DECREF(v);
1050 break;
1051 }
1052 PUSH(v);
1053 }
1054 /* Fall through */
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 case UNPACK_TUPLE:
1056 v = POP();
1057 if (!is_tupleobject(v)) {
1058 err_setstr(TypeError, "unpack non-tuple");
1059 why = WHY_EXCEPTION;
1060 }
1061 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001062 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 "unpack tuple of wrong size");
1064 why = WHY_EXCEPTION;
1065 }
1066 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001067 if (!CHECK_STACK(oparg)) {
1068 x = NULL;
1069 break;
1070 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 for (; --oparg >= 0; ) {
1072 w = gettupleitem(v, oparg);
1073 INCREF(w);
1074 PUSH(w);
1075 }
1076 }
1077 DECREF(v);
1078 break;
1079
1080 case UNPACK_LIST:
1081 v = POP();
1082 if (!is_listobject(v)) {
1083 err_setstr(TypeError, "unpack non-list");
1084 why = WHY_EXCEPTION;
1085 }
1086 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001087 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001088 "unpack list of wrong size");
1089 why = WHY_EXCEPTION;
1090 }
1091 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001092 if (!CHECK_STACK(oparg)) {
1093 x = NULL;
1094 break;
1095 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 for (; --oparg >= 0; ) {
1097 w = getlistitem(v, oparg);
1098 INCREF(w);
1099 PUSH(w);
1100 }
1101 }
1102 DECREF(v);
1103 break;
1104
1105 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001106 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 v = POP();
1108 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001109 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 DECREF(v);
1111 DECREF(u);
1112 break;
1113
1114 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001117 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 DECREF(v);
1119 break;
1120
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001121 case STORE_GLOBAL:
1122 w = GETNAMEV(oparg);
1123 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001124 u = dict2lookup(f->f_locals, w);
1125 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001126 err = setaccessvalue(u, f->f_globals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001127 DECREF(v);
1128 break;
1129 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001130 err = dict2insert(f->f_globals, w, v);
1131 DECREF(v);
1132 break;
1133
1134 case DELETE_GLOBAL:
1135 w = GETNAMEV(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001136 u = dict2lookup(f->f_locals, w);
1137 if (u != NULL && is_accessobject(u)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001138 err = setaccessvalue(u, f->f_globals,
Guido van Rossum25831651993-05-19 14:50:45 +00001139 (object *)NULL);
1140 break;
1141 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001142 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001143 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001144 break;
1145
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 case LOAD_CONST:
1147 x = GETCONST(oparg);
1148 INCREF(x);
1149 PUSH(x);
1150 break;
1151
1152 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001153 w = GETNAMEV(oparg);
1154 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001156 err_clear();
1157 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001159 err_clear();
1160 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001162 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 break;
1164 }
1165 }
1166 }
Guido van Rossum25831651993-05-19 14:50:45 +00001167 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001168 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001169 if (x == NULL)
1170 break;
1171 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001172 else
1173 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 PUSH(x);
1175 break;
1176
1177 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001178 w = GETNAMEV(oparg);
1179 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001181 err_clear();
1182 x = getbuiltin(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001184 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 break;
1186 }
1187 }
Guido van Rossum25831651993-05-19 14:50:45 +00001188 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001189 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001190 if (x == NULL)
1191 break;
1192 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001193 else
1194 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 PUSH(x);
1196 break;
1197
1198 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001199 w = GETNAMEV(oparg);
1200 x = dict2lookup(f->f_locals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001202 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 break;
1204 }
Guido van Rossum25831651993-05-19 14:50:45 +00001205 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001206 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001207 if (x == NULL)
1208 break;
1209 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001210 else
1211 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 PUSH(x);
1213 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001214
1215 case RESERVE_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001216 x = GETCONST(oparg);
1217 if (x == None)
1218 break;
Guido van Rossume59214e1994-08-30 08:01:59 +00001219 if (x == NULL || !is_tupleobject(x)) {
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001220 err_setstr(SystemError, "bad RESERVE_FAST");
1221 x = NULL;
1222 break;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001223 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001224 XDECREF(f->f_fastlocals);
1225 XDECREF(f->f_localmap);
1226 INCREF(x);
1227 f->f_localmap = x;
Guido van Rossume59214e1994-08-30 08:01:59 +00001228 f->f_fastlocals = x = newlistobject(gettuplesize(x));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001229 fastlocals = (listobject *) x;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001230 break;
1231
1232 case LOAD_FAST:
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001233 x = GETLISTITEM(fastlocals, oparg);
1234 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001235 err_setval(NameError,
1236 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001237 break;
1238 }
Guido van Rossum25831651993-05-19 14:50:45 +00001239 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001240 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001241 if (x == NULL)
1242 break;
1243 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001244 else
1245 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001246 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001247 break;
1248
1249 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001250 v = POP();
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001251 w = GETLISTITEM(fastlocals, oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001252 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001253 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001254 DECREF(v);
1255 break;
1256 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001257 XDECREF(w);
Guido van Rossum25831651993-05-19 14:50:45 +00001258 GETLISTITEM(fastlocals, oparg) = v;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001259 break;
1260
1261 case DELETE_FAST:
1262 x = GETLISTITEM(fastlocals, oparg);
1263 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001264 err_setval(NameError,
1265 gettupleitem(f->f_localmap, oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001266 break;
1267 }
Guido van Rossume59214e1994-08-30 08:01:59 +00001268 if (x != NULL && is_accessobject(x)) {
1269 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001270 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001271 break;
1272 }
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001273 DECREF(x);
1274 GETLISTITEM(fastlocals, oparg) = NULL;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001275 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001276
1277 case BUILD_TUPLE:
1278 x = newtupleobject(oparg);
1279 if (x != NULL) {
1280 for (; --oparg >= 0;) {
1281 w = POP();
1282 err = settupleitem(x, oparg, w);
1283 if (err != 0)
1284 break;
1285 }
1286 PUSH(x);
1287 }
1288 break;
1289
1290 case BUILD_LIST:
1291 x = newlistobject(oparg);
1292 if (x != NULL) {
1293 for (; --oparg >= 0;) {
1294 w = POP();
1295 err = setlistitem(x, oparg, w);
1296 if (err != 0)
1297 break;
1298 }
1299 PUSH(x);
1300 }
1301 break;
1302
1303 case BUILD_MAP:
1304 x = newdictobject();
1305 PUSH(x);
1306 break;
1307
1308 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001309 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001311 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 DECREF(v);
1313 PUSH(x);
1314 break;
1315
1316 case COMPARE_OP:
1317 w = POP();
1318 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001319 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 DECREF(v);
1321 DECREF(w);
1322 PUSH(x);
1323 break;
1324
1325 case IMPORT_NAME:
1326 name = GETNAME(oparg);
1327 x = import_module(name);
1328 XINCREF(x);
1329 PUSH(x);
1330 break;
1331
1332 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001333 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 v = TOP();
Guido van Rossumdf62e441991-08-16 08:56:04 +00001335 err = import_from(f->f_locals, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001336 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001337 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001338
1339 case ACCESS_MODE:
1340 v = POP();
1341 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001342 if (getstringvalue(w)[0] == '*')
1343 defmode = getintvalue(v);
1344 else
1345 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001346 DECREF(v);
1347 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001348
1349 case JUMP_FORWARD:
1350 JUMPBY(oparg);
1351 break;
1352
1353 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001354 err = testbool(TOP());
1355 if (err > 0)
1356 err = 0;
1357 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 JUMPBY(oparg);
1359 break;
1360
1361 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001362 err = testbool(TOP());
1363 if (err > 0) {
1364 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001366 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 break;
1368
1369 case JUMP_ABSOLUTE:
1370 JUMPTO(oparg);
1371 break;
1372
1373 case FOR_LOOP:
1374 /* for v in s: ...
1375 On entry: stack contains s, i.
1376 On exit: stack contains s, i+1, s[i];
1377 but if loop exhausted:
1378 s, i are popped, and we jump */
1379 w = POP(); /* Loop index */
1380 v = POP(); /* Sequence object */
1381 u = loop_subscript(v, w);
1382 if (u != NULL) {
1383 PUSH(v);
1384 x = newintobject(getintvalue(w)+1);
1385 PUSH(x);
1386 DECREF(w);
1387 PUSH(u);
1388 }
1389 else {
1390 DECREF(v);
1391 DECREF(w);
1392 /* A NULL can mean "s exhausted"
1393 but also an error: */
1394 if (err_occurred())
1395 why = WHY_EXCEPTION;
1396 else
1397 JUMPBY(oparg);
1398 }
1399 break;
1400
1401 case SETUP_LOOP:
1402 case SETUP_EXCEPT:
1403 case SETUP_FINALLY:
1404 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1405 STACK_LEVEL());
1406 break;
1407
1408 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001409#ifdef LLTRACE
1410 if (lltrace)
Guido van Rossum374a9221991-04-04 10:40:29 +00001411 printf("--- Line %d ---\n", oparg);
1412#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001413 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001414 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001415 /* Trace each line of code reached */
1416 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001417 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001418 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001419 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 break;
1421
1422 default:
1423 fprintf(stderr,
1424 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001425 f->f_lineno, opcode);
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 err_setstr(SystemError, "eval_code: unknown opcode");
1427 why = WHY_EXCEPTION;
1428 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001429
1430#ifdef CASE_TOO_BIG
1431 }
1432#endif
1433
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 } /* switch */
1435
1436 on_error:
1437
1438 /* Quickly continue if no error occurred */
1439
1440 if (why == WHY_NOT) {
1441 if (err == 0 && x != NULL)
1442 continue; /* Normal, fast path */
1443 why = WHY_EXCEPTION;
1444 x = None;
1445 err = 0;
1446 }
1447
Guido van Rossum801dcae1992-04-08 11:32:32 +00001448#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 /* Double-check exception status */
1450
1451 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1452 if (!err_occurred()) {
1453 fprintf(stderr, "XXX ghost error\n");
1454 err_setstr(SystemError, "ghost error");
1455 why = WHY_EXCEPTION;
1456 }
1457 }
1458 else {
1459 if (err_occurred()) {
1460 fprintf(stderr, "XXX undetected error\n");
Guido van Rossum99bec951992-09-03 20:29:45 +00001461 abort();
1462 /* NOTREACHED */
Guido van Rossum374a9221991-04-04 10:40:29 +00001463 why = WHY_EXCEPTION;
1464 }
1465 }
1466#endif
1467
1468 /* Log traceback info if this is a real exception */
1469
1470 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001471 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001473 f->f_lasti -= 2;
1474 tb_here(f);
1475
Guido van Rossume59214e1994-08-30 08:01:59 +00001476 if (f->f_trace)
1477 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001478 if (sys_profile)
1479 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 }
1481
1482 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1483
1484 if (why == WHY_RERAISE)
1485 why = WHY_EXCEPTION;
1486
1487 /* Unwind stacks if a (pseudo) exception occurred */
1488
1489 while (why != WHY_NOT && f->f_iblock > 0) {
1490 block *b = pop_block(f);
1491 while (STACK_LEVEL() > b->b_level) {
1492 v = POP();
1493 XDECREF(v);
1494 }
1495 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1496 why = WHY_NOT;
1497 JUMPTO(b->b_handler);
1498 break;
1499 }
1500 if (b->b_type == SETUP_FINALLY ||
1501 b->b_type == SETUP_EXCEPT &&
1502 why == WHY_EXCEPTION) {
1503 if (why == WHY_EXCEPTION) {
1504 object *exc, *val;
1505 err_get(&exc, &val);
1506 if (val == NULL) {
1507 val = None;
1508 INCREF(val);
1509 }
1510 v = tb_fetch();
1511 /* Make the raw exception data
1512 available to the handler,
1513 so a program can emulate the
1514 Python main loop. Don't do
1515 this for 'finally'. */
1516 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 sysset("exc_traceback", v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001518 sysset("exc_value", val);
1519 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 }
1521 PUSH(v);
1522 PUSH(val);
1523 PUSH(exc);
1524 }
1525 else {
1526 if (why == WHY_RETURN)
1527 PUSH(retval);
1528 v = newintobject((long)why);
1529 PUSH(v);
1530 }
1531 why = WHY_NOT;
1532 JUMPTO(b->b_handler);
1533 break;
1534 }
1535 } /* unwind stack */
1536
1537 /* End the loop if we still have an error (or return) */
1538
1539 if (why != WHY_NOT)
1540 break;
1541
1542 } /* main loop */
1543
1544 /* Pop remaining stack entries */
1545
1546 while (!EMPTY()) {
1547 v = POP();
1548 XDECREF(v);
1549 }
1550
Guido van Rossum96a42c81992-01-12 02:29:51 +00001551 if (why != WHY_RETURN)
1552 retval = NULL;
1553
Guido van Rossume59214e1994-08-30 08:01:59 +00001554 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001555 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001556 if (call_trace(&f->f_trace, &f->f_trace, f,
1557 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001558 XDECREF(retval);
1559 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001560 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001561 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001562 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001563 }
1564
1565 if (sys_profile && why == WHY_RETURN) {
1566 if (call_trace(&sys_profile, (object**)0,
1567 f, "return", retval)) {
1568 XDECREF(retval);
1569 retval = NULL;
1570 why = WHY_EXCEPTION;
1571 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001572 }
1573
Guido van Rossum374a9221991-04-04 10:40:29 +00001574 /* Restore previous frame and release the current one */
1575
1576 current_frame = f->f_back;
1577 DECREF(f);
Guido van Rossum5b722181993-03-30 17:46:03 +00001578
1579 if (needmerge)
1580 locals_2_fast(current_frame, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581
Guido van Rossum96a42c81992-01-12 02:29:51 +00001582 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001583}
1584
Guido van Rossum96a42c81992-01-12 02:29:51 +00001585#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001586static int
1587prtrace(v, str)
1588 object *v;
1589 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001591 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001592 if (printobject(v, stdout, 0) != 0)
1593 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001594 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001595}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001598static void
1599call_exc_trace(p_trace, p_newtrace, f)
1600 object **p_trace, **p_newtrace;
1601 frameobject *f;
1602{
1603 object *type, *value, *traceback, *arg;
1604 int err;
1605 err_get(&type, &value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001606 if (value == NULL) {
1607 value = None;
1608 INCREF(value);
1609 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001610 traceback = tb_fetch();
1611 arg = newtupleobject(3);
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001612 if (arg == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001613 goto cleanup;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001614 settupleitem(arg, 0, type);
1615 settupleitem(arg, 1, value);
1616 settupleitem(arg, 2, traceback);
1617 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001618 if (!err) {
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001619 cleanup:
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001620 /* Restore original exception */
1621 err_setval(type, value);
1622 tb_store(traceback);
1623 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001624 XDECREF(arg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001625}
1626
1627static int
1628call_trace(p_trace, p_newtrace, f, msg, arg)
1629 object **p_trace; /* in/out; may not be NULL;
1630 may not point to NULL variable initially */
1631 object **p_newtrace; /* in/out; may be NULL;
1632 may point to NULL variable;
1633 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001634 frameobject *f;
1635 char *msg;
1636 object *arg;
1637{
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001638 object *arglist, *what;
1639 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001640 static int tracing = 0;
1641
1642 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001643 /* Don't do recursive traces */
1644 if (p_newtrace) {
1645 XDECREF(*p_newtrace);
1646 *p_newtrace = NULL;
1647 }
1648 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001649 }
1650
1651 arglist = newtupleobject(3);
1652 if (arglist == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001653 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001654 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001655 if (what == NULL)
1656 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001657 INCREF(f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001658 settupleitem(arglist, 0, (object *)f);
1659 settupleitem(arglist, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001660 if (arg == NULL)
1661 arg = None;
1662 INCREF(arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001663 settupleitem(arglist, 2, arg);
1664 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001665 fast_2_locals(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001666 res = call_object(*p_trace, arglist); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001667 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001668 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001669 cleanup:
1670 XDECREF(arglist);
1671 if (res == NULL) {
1672 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001673 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001674 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001675 *p_trace = NULL;
1676 if (p_newtrace) {
1677 XDECREF(*p_newtrace);
1678 *p_newtrace = NULL;
1679 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001680 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001681 }
1682 else {
1683 if (p_newtrace) {
1684 XDECREF(*p_newtrace);
1685 if (res == None)
1686 *p_newtrace = NULL;
1687 else {
1688 INCREF(res);
1689 *p_newtrace = res;
1690 }
1691 }
1692 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001693 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001694 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001695}
1696
Guido van Rossum3f5da241990-12-20 15:06:42 +00001697object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001698getlocals()
1699{
1700 if (current_frame == NULL)
1701 return NULL;
1702 fast_2_locals(current_frame);
1703 return current_frame->f_locals;
1704}
1705
1706object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001707getglobals()
1708{
1709 if (current_frame == NULL)
1710 return NULL;
1711 else
1712 return current_frame->f_globals;
1713}
1714
Guido van Rossum81daa321993-05-20 14:24:46 +00001715object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001716getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001717{
1718 if (current_frame == NULL)
1719 return NULL;
1720 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001721 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001722}
1723
Guido van Rossume59214e1994-08-30 08:01:59 +00001724object *
1725getframe()
1726{
1727 return (object *)current_frame;
1728}
1729
Guido van Rossum3f5da241990-12-20 15:06:42 +00001730void
Guido van Rossum3165fe61992-09-25 21:59:05 +00001731printtraceback(f)
1732 object *f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733{
1734 object *v = tb_fetch();
1735 if (v != NULL) {
Guido van Rossum3165fe61992-09-25 21:59:05 +00001736 tb_print(v, f);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001737 DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001738 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739}
1740
1741
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742void
1743flushline()
1744{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001745 object *f = sysget("stdout");
1746 if (softspace(f, 0))
1747 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001748}
1749
Guido van Rossum3f5da241990-12-20 15:06:42 +00001750
Guido van Rossum180d7b41994-09-29 09:45:57 +00001751#define BINOP(opname, ropname) \
1752 do { \
1753 if (is_instanceobject(v) || is_instanceobject(w)) \
1754 return instancebinop(v, w, opname, ropname); \
1755 } while (0)
1756
1757
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001758static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001759or(v, w)
1760 object *v, *w;
1761{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001762 BINOP("__or__", "__ror__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001763 if (v->ob_type->tp_as_number != NULL) {
1764 object *x;
1765 object * (*f) FPROTO((object *, object *));
1766 if (coerce(&v, &w) != 0)
1767 return NULL;
1768 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1769 x = (*f)(v, w);
1770 DECREF(v);
1771 DECREF(w);
1772 if (f != NULL)
1773 return x;
1774 }
1775 err_setstr(TypeError, "bad operand type(s) for |");
1776 return NULL;
1777}
1778
1779static object *
1780xor(v, w)
1781 object *v, *w;
1782{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001783 BINOP("__xor__", "__rxor__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001784 if (v->ob_type->tp_as_number != NULL) {
1785 object *x;
1786 object * (*f) FPROTO((object *, object *));
1787 if (coerce(&v, &w) != 0)
1788 return NULL;
1789 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1790 x = (*f)(v, w);
1791 DECREF(v);
1792 DECREF(w);
1793 if (f != NULL)
1794 return x;
1795 }
1796 err_setstr(TypeError, "bad operand type(s) for ^");
1797 return NULL;
1798}
1799
1800static object *
1801and(v, w)
1802 object *v, *w;
1803{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001804 BINOP("__and__", "__rand__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001805 if (v->ob_type->tp_as_number != NULL) {
1806 object *x;
1807 object * (*f) FPROTO((object *, object *));
1808 if (coerce(&v, &w) != 0)
1809 return NULL;
1810 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
1811 x = (*f)(v, w);
1812 DECREF(v);
1813 DECREF(w);
1814 if (f != NULL)
1815 return x;
1816 }
1817 err_setstr(TypeError, "bad operand type(s) for &");
1818 return NULL;
1819}
1820
1821static object *
1822lshift(v, w)
1823 object *v, *w;
1824{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001825 BINOP("__lshift__", "__rshift__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001826 if (v->ob_type->tp_as_number != NULL) {
1827 object *x;
1828 object * (*f) FPROTO((object *, object *));
1829 if (coerce(&v, &w) != 0)
1830 return NULL;
1831 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
1832 x = (*f)(v, w);
1833 DECREF(v);
1834 DECREF(w);
1835 if (f != NULL)
1836 return x;
1837 }
1838 err_setstr(TypeError, "bad operand type(s) for <<");
1839 return NULL;
1840}
1841
1842static object *
1843rshift(v, w)
1844 object *v, *w;
1845{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001846 BINOP("__rshift__", "__rrshift__");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001847 if (v->ob_type->tp_as_number != NULL) {
1848 object *x;
1849 object * (*f) FPROTO((object *, object *));
1850 if (coerce(&v, &w) != 0)
1851 return NULL;
1852 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
1853 x = (*f)(v, w);
1854 DECREF(v);
1855 DECREF(w);
1856 if (f != NULL)
1857 return x;
1858 }
1859 err_setstr(TypeError, "bad operand type(s) for >>");
1860 return NULL;
1861}
1862
1863static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865 object *v, *w;
1866{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001867 BINOP("__add__", "__radd__");
Guido van Rossume6eefc21992-08-14 12:06:52 +00001868 if (v->ob_type->tp_as_sequence != NULL)
1869 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
1870 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001871 object *x;
1872 if (coerce(&v, &w) != 0)
1873 return NULL;
1874 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
1875 DECREF(v);
1876 DECREF(w);
1877 return x;
1878 }
Guido van Rossum34679b71993-01-26 13:33:44 +00001879 err_setstr(TypeError, "bad operand type(s) for +");
1880 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881}
1882
1883static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001884sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001885 object *v, *w;
1886{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001887 BINOP("__sub__", "__rsub__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001888 if (v->ob_type->tp_as_number != NULL) {
1889 object *x;
1890 if (coerce(&v, &w) != 0)
1891 return NULL;
1892 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
1893 DECREF(v);
1894 DECREF(w);
1895 return x;
1896 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001897 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898 return NULL;
1899}
1900
1901static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001902mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001903 object *v, *w;
1904{
1905 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001906 tp = v->ob_type;
Guido van Rossum180d7b41994-09-29 09:45:57 +00001907 BINOP("__mul__", "__rmul__");
Guido van Rossume6eefc21992-08-14 12:06:52 +00001908 if (tp->tp_as_number != NULL &&
1909 w->ob_type->tp_as_sequence != NULL &&
1910 !is_instanceobject(v)) {
1911 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 object *tmp = v;
1913 v = w;
1914 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001915 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001917 if (tp->tp_as_number != NULL) {
1918 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00001919 if (is_instanceobject(v)) {
1920 /* Instances of user-defined classes get their
1921 other argument uncoerced, so they may
1922 implement sequence*number as well as
1923 number*number. */
1924 INCREF(v);
1925 INCREF(w);
1926 }
1927 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001928 return NULL;
1929 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
1930 DECREF(v);
1931 DECREF(w);
1932 return x;
1933 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 if (tp->tp_as_sequence != NULL) {
1935 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936 err_setstr(TypeError,
1937 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 return NULL;
1939 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001940 return (*tp->tp_as_sequence->sq_repeat)
1941 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001943 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001944 return NULL;
1945}
1946
1947static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00001948divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949 object *v, *w;
1950{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001951 BINOP("__div__", "__rdiv__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001952 if (v->ob_type->tp_as_number != NULL) {
1953 object *x;
1954 if (coerce(&v, &w) != 0)
1955 return NULL;
1956 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
1957 DECREF(v);
1958 DECREF(w);
1959 return x;
1960 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 return NULL;
1963}
1964
1965static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001966rem(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967 object *v, *w;
1968{
Guido van Rossum180d7b41994-09-29 09:45:57 +00001969 BINOP("__mod__", "__rmod__");
Guido van Rossum89d55ca1991-07-01 18:43:13 +00001970 if (v->ob_type->tp_as_number != NULL) {
1971 object *x;
1972 if (coerce(&v, &w) != 0)
1973 return NULL;
1974 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
1975 DECREF(v);
1976 DECREF(w);
1977 return x;
1978 }
Guido van Rossume5372401993-03-16 12:15:04 +00001979 if (is_stringobject(v)) {
1980 return formatstring(v, w);
1981 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 return NULL;
1984}
1985
1986static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001987neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 object *v;
1989{
1990 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001991 return (*v->ob_type->tp_as_number->nb_negative)(v);
1992 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993 return NULL;
1994}
1995
1996static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001997pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998 object *v;
1999{
2000 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002001 return (*v->ob_type->tp_as_number->nb_positive)(v);
2002 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 return NULL;
2004}
2005
2006static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002007invert(v)
2008 object *v;
2009{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002010 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002011 if (v->ob_type->tp_as_number != NULL &&
2012 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2013 return (*f)(v);
2014 err_setstr(TypeError, "bad operand type(s) for unary ~");
2015 return NULL;
2016}
2017
2018static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 object *v;
2021{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002022 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002023 object *w;
2024 if (outcome < 0)
2025 return NULL;
2026 if (outcome == 0)
2027 w = True;
2028 else
2029 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002030 INCREF(w);
2031 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032}
Guido van Rossum234f9421993-06-17 12:35:49 +00002033
2034
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002035/* External interface to call any callable object. The arg may be NULL. */
2036
2037object *
2038call_object(func, arg)
2039 object *func;
2040 object *arg;
2041{
Guido van Rossume59214e1994-08-30 08:01:59 +00002042 binaryfunc call;
2043 object *result;
2044
2045 if (call = func->ob_type->tp_call) {
2046 int size = gettuplesize(arg);
2047 if (arg) {
2048 size = gettuplesize(arg);
2049 if (size == 1)
2050 arg = gettupleitem(arg, 0);
2051 else if (size == 0)
2052 arg = NULL;
2053 }
2054 result = (*call)(func, arg);
2055 }
2056 else if (is_instancemethodobject(func) || is_funcobject(func))
2057 result = call_function(func, arg);
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002058 else
Guido van Rossume59214e1994-08-30 08:01:59 +00002059 result = call_builtin(func, arg);
2060
2061 if (result == NULL && !err_occurred()) {
2062 fprintf(stderr, "null result without error in call_object\n");
2063 abort();
2064 }
2065
2066 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002067}
2068
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002070call_builtin(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002072 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 if (is_methodobject(func)) {
2075 method meth = getmethod(func);
2076 object *self = getself(func);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002077 if (!getvarargs(func) && arg != NULL && is_tupleobject(arg)) {
2078 int size = gettuplesize(arg);
2079 if (size == 1)
2080 arg = gettupleitem(arg, 0);
2081 else if (size == 0)
2082 arg = NULL;
2083 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 }
2086 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002087 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002089 if (is_instanceobject(func)) {
2090 object *res, *call = getattr(func,"__call__");
2091 if (call == NULL) {
2092 err_clear();
2093 err_setstr(AttributeError, "no __call__ method defined");
2094 return NULL;
2095 }
2096 res = call_object(call, arg);
2097 DECREF(call);
2098 return res;
2099 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 return NULL;
2102}
2103
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105call_function(func, arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107 object *arg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002109 object *newarg = NULL;
2110 object *newlocals, *newglobals;
Guido van Rossum81daa321993-05-20 14:24:46 +00002111 object *class = NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002112 object *co, *v;
Guido van Rossume59214e1994-08-30 08:01:59 +00002113 object *argdefs;
2114 int argcount;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115
Guido van Rossume8122f11991-05-05 20:03:07 +00002116 if (is_instancemethodobject(func)) {
2117 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002118 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002119 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002120 if (self == NULL) {
2121 /* Unbound methods must be called with an instance of
2122 the class (or a derived class) as first argument */
2123 if (arg != NULL && is_tupleobject(arg) &&
2124 gettuplesize(arg) >= 1) {
2125 self = gettupleitem(arg, 0);
2126 if (self != NULL &&
2127 is_instanceobject(self) &&
2128 issubclass((object *)
2129 (((instanceobject *)self)->in_class),
2130 class))
2131 /* self = self */ ;
2132 else
2133 self = NULL;
2134 }
2135 if (self == NULL) {
2136 err_setstr(TypeError,
2137 "unbound method must be called with class instance argument");
2138 return NULL;
2139 }
2140 }
2141 else {
Guido van Rossum81daa321993-05-20 14:24:46 +00002142 if (arg == NULL)
2143 argcount = 0;
2144 else if (is_tupleobject(arg))
2145 argcount = gettuplesize(arg);
2146 else
2147 argcount = 1;
2148 newarg = newtupleobject(argcount + 1);
2149 if (newarg == NULL)
2150 return NULL;
2151 INCREF(self);
2152 settupleitem(newarg, 0, self);
2153 if (arg != NULL && !is_tupleobject(arg)) {
2154 INCREF(arg);
2155 settupleitem(newarg, 1, arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002156 }
Guido van Rossum81daa321993-05-20 14:24:46 +00002157 else {
2158 int i;
2159 object *v;
2160 for (i = 0; i < argcount; i++) {
2161 v = gettupleitem(arg, i);
2162 XINCREF(v);
2163 settupleitem(newarg, i+1, v);
2164 }
2165 }
2166 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 }
2168 }
2169 else {
2170 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002171 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 return NULL;
2173 }
2174 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002175
2176 argdefs = getfuncargstuff(func, &argcount);
2177 if (argdefs != NULL && arg != NULL && is_tupleobject(arg)) {
2178 int actualcount, j;
2179 /* Process default arguments */
2180 if (argcount & 0x4000)
2181 argcount ^= 0x4000;
2182 actualcount = gettuplesize(arg);
2183 j = gettuplesize(argdefs) - (argcount - actualcount);
2184 if (actualcount < argcount && j >= 0) {
2185 int i;
2186 object *v;
2187 if (newarg == NULL)
2188 INCREF(arg);
2189 newarg = newtupleobject(argcount);
2190 if (newarg == NULL) {
2191 DECREF(arg);
2192 return NULL;
2193 }
2194 for (i = 0; i < actualcount; i++) {
2195 v = gettupleitem(arg, i);
2196 XINCREF(v);
2197 settupleitem(newarg, i, v);
2198 }
2199 for (; i < argcount; i++, j++) {
2200 v = gettupleitem(argdefs, j);
2201 XINCREF(v);
2202 settupleitem(newarg, i, v);
2203 }
2204 DECREF(arg);
2205 arg = newarg;
2206 }
2207 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209 co = getfunccode(func);
2210 if (co == NULL) {
2211 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 return NULL;
2213 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 if (!is_codeobject(co)) {
2215 fprintf(stderr, "XXX Bad code\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002216 abort();
2217 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218 newlocals = newdictobject();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 if (newlocals == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002220 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 return NULL;
2222 }
2223
Guido van Rossum3f5da241990-12-20 15:06:42 +00002224 newglobals = getfuncglobals(func);
2225 INCREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226
Guido van Rossum81daa321993-05-20 14:24:46 +00002227 v = eval_code((codeobject *)co, newglobals, newlocals, class, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228
Guido van Rossum3f5da241990-12-20 15:06:42 +00002229 DECREF(newlocals);
2230 DECREF(newglobals);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232 XDECREF(newarg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233
2234 return v;
2235}
2236
2237static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 object *v, *w;
2240{
2241 typeobject *tp = v->ob_type;
2242 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002243 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 return NULL;
2245 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002246 if (tp->tp_as_mapping != NULL) {
2247 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2248 }
2249 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250 int i;
2251 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 return NULL;
2254 }
2255 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002256 if (i < 0) {
2257 int len = (*tp->tp_as_sequence->sq_length)(v);
2258 if (len < 0)
2259 return NULL;
2260 i += len;
2261 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264}
2265
2266static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002267loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 object *v, *w;
2269{
2270 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002271 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002273 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 return NULL;
2275 }
2276 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002277 v = (*sq->sq_item)(v, i);
2278 if (v)
2279 return v;
2280 if (err_occurred() == IndexError)
2281 err_clear();
2282 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283}
2284
2285static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287 object *v;
2288 int isize;
2289 int *pi;
2290{
2291 if (v != NULL) {
2292 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293 err_setstr(TypeError, "slice index must be int");
2294 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 }
2296 *pi = getintvalue(v);
2297 if (*pi < 0)
2298 *pi += isize;
2299 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002300 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301}
2302
2303static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 object *u, *v, *w;
2306{
2307 typeobject *tp = u->ob_type;
2308 int ilow, ihigh, isize;
2309 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002310 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 return NULL;
2312 }
2313 ilow = 0;
2314 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002315 if (isize < 0)
2316 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002317 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002319 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002321 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002323
2324static int
2325assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 object *w;
2327 object *key;
2328 object *v;
2329{
2330 typeobject *tp = w->ob_type;
2331 sequence_methods *sq;
2332 mapping_methods *mp;
2333 int (*func)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002334 if ((mp = tp->tp_as_mapping) != NULL &&
2335 (func = mp->mp_ass_subscript) != NULL) {
2336 return (*func)(w, key, v);
2337 }
2338 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 (func = sq->sq_ass_item) != NULL) {
2340 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002341 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002342 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002345 else {
2346 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002347 if (i < 0) {
2348 int len = (*sq->sq_length)(w);
2349 if (len < 0)
2350 return -1;
2351 i += len;
2352 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002353 return (*func)(w, i, v);
2354 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 err_setstr(TypeError,
2358 "can't assign to this subscripted object");
2359 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361}
2362
Guido van Rossum3f5da241990-12-20 15:06:42 +00002363static int
2364assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 object *u, *v, *w, *x;
2366{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002367 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002369 if (sq == NULL) {
2370 err_setstr(TypeError, "assign to slice of non-sequence");
2371 return -1;
2372 }
2373 if (sq == NULL || sq->sq_ass_slice == NULL) {
2374 err_setstr(TypeError, "unassignable slice");
2375 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 }
2377 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002378 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002379 if (isize < 0)
2380 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 if (slice_index(v, isize, &ilow) != 0)
2382 return -1;
2383 if (slice_index(w, isize, &ihigh) != 0)
2384 return -1;
2385 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386}
2387
2388static int
2389cmp_exception(err, v)
2390 object *err, *v;
2391{
2392 if (is_tupleobject(v)) {
2393 int i, n;
2394 n = gettuplesize(v);
2395 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002396 /* Test recursively */
2397 if (cmp_exception(err, gettupleitem(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 return 1;
2399 }
2400 return 0;
2401 }
2402 return err == v;
2403}
2404
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405static int
2406cmp_member(v, w)
2407 object *v, *w;
2408{
Guido van Rossume59214e1994-08-30 08:01:59 +00002409 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002410 object *x;
2411 sequence_methods *sq;
2412 /* Special case for char in string */
2413 if (is_stringobject(w)) {
2414 register char *s, *end;
2415 register char c;
2416 if (!is_stringobject(v) || getstringsize(v) != 1) {
2417 err_setstr(TypeError,
2418 "string member test needs char left operand");
2419 return -1;
2420 }
2421 c = getstringvalue(v)[0];
2422 s = getstringvalue(w);
2423 end = s + getstringsize(w);
2424 while (s < end) {
2425 if (c == *s++)
2426 return 1;
2427 }
2428 return 0;
2429 }
2430 sq = w->ob_type->tp_as_sequence;
2431 if (sq == NULL) {
2432 err_setstr(TypeError,
2433 "'in' or 'not in' needs sequence right argument");
2434 return -1;
2435 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002436 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002438 if (x == NULL) {
2439 if (err_occurred() == IndexError) {
2440 err_clear();
2441 break;
2442 }
2443 return -1;
2444 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 cmp = cmpobject(v, x);
2446 XDECREF(x);
2447 if (cmp == 0)
2448 return 1;
2449 }
2450 return 0;
2451}
2452
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002454cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002455 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 register object *v;
2457 register object *w;
2458{
2459 register int cmp;
2460 register int res = 0;
2461 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 case IS:
2463 case IS_NOT:
2464 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002465 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 res = !res;
2467 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 case IN:
2469 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002470 res = cmp_member(v, w);
2471 if (res < 0)
2472 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002473 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002474 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 break;
2476 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002477 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 break;
2479 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002480 cmp = cmpobject(v, w);
2481 switch (op) {
2482 case LT: res = cmp < 0; break;
2483 case LE: res = cmp <= 0; break;
2484 case EQ: res = cmp == 0; break;
2485 case NE: res = cmp != 0; break;
2486 case GT: res = cmp > 0; break;
2487 case GE: res = cmp >= 0; break;
2488 /* XXX no default? (res is initialized to 0 though) */
2489 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
2491 v = res ? True : False;
2492 INCREF(v);
2493 return v;
2494}
2495
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496static int
2497import_from(locals, v, name)
2498 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002499 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002500 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002501{
2502 object *w, *x;
2503 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002504 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002505 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002506 object *name, *value;
2507 pos = 0;
2508 while (mappinggetnext(w, &pos, &name, &value)) {
2509 if (!is_stringobject(name) ||
2510 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002511 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002512 if (is_accessobject(value)) {
2513 value = getaccessvalue(value, (object *)NULL);
2514 if (value == NULL) {
2515 err_clear();
2516 continue;
2517 }
2518 }
2519 else
2520 INCREF(value);
2521 err = dict2insert(locals, name, value);
2522 DECREF(value);
2523 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002525 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002526 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002527 }
2528 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002529 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002530 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002531 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002532 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002533 getstringvalue(name));
2534 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002535 return -1;
2536 }
2537 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002538 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002539 }
2540}
2541
2542static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002543build_class(methods, bases, name)
2544 object *methods; /* dictionary */
2545 object *bases; /* tuple containing classes */
2546 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002547{
Guido van Rossum25831651993-05-19 14:50:45 +00002548 int i;
2549 if (!is_tupleobject(bases)) {
2550 err_setstr(SystemError, "build_class with non-tuple bases");
2551 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002552 }
Guido van Rossum25831651993-05-19 14:50:45 +00002553 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002554 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002555 return NULL;
2556 }
Guido van Rossum25831651993-05-19 14:50:45 +00002557 if (!is_stringobject(name)) {
2558 err_setstr(SystemError, "build_class witn non-string name");
2559 return NULL;
2560 }
2561 for (i = gettuplesize(bases); --i >= 0; ) {
2562 object *base = gettupleitem(bases, i);
2563 if (!is_classobject(base)) {
2564 err_setstr(TypeError,
2565 "base is not a class object");
2566 return NULL;
2567 }
2568 }
2569 return newclassobject(bases, methods, name);
2570}
2571
2572static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002573access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002574 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002575 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002576 frameobject *f;
2577{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002578 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002579 object *value, *ac;
2580 typeobject *type;
2581 int fastind, ret;
2582 fastind = -1;
Guido van Rossum25831651993-05-19 14:50:45 +00002583 if (f->f_localmap == NULL)
2584 value = dict2lookup(f->f_locals, name);
2585 else {
Guido van Rossume59214e1994-08-30 08:01:59 +00002586 object *map = f->f_localmap;
2587 value = NULL;
2588 for (fastind = gettuplesize(map); --fastind >= 0; ) {
2589 object *fname = gettupleitem(map, fastind);
2590 if (cmpobject(name, fname) == 0) {
Guido van Rossum81daa321993-05-20 14:24:46 +00002591 value = getlistitem(f->f_fastlocals, fastind);
Guido van Rossume59214e1994-08-30 08:01:59 +00002592 break;
Guido van Rossum25831651993-05-19 14:50:45 +00002593 }
2594 }
2595 }
2596 if (value && is_accessobject(value)) {
2597 err_setstr(AccessError, "can't override access");
2598 return -1;
2599 }
2600 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002601 if (value != NULL && value != None)
2602 type = value->ob_type;
2603 else
2604 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002605 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002606 if (ac == NULL)
2607 return -1;
Guido van Rossum81daa321993-05-20 14:24:46 +00002608 if (fastind >= 0)
2609 ret = setlistitem(f->f_fastlocals, fastind, ac);
Guido van Rossum25831651993-05-19 14:50:45 +00002610 else {
2611 ret = dict2insert(f->f_locals, name, ac);
2612 DECREF(ac);
2613 }
2614 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002615}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002616
2617static int
2618exec_statement(prog, globals, locals)
2619 object *prog;
2620 object *globals;
2621 object *locals;
2622{
2623 char *s;
2624 int n;
2625
2626 if (is_tupleobject(prog) && globals == None && locals == None &&
2627 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2628 /* Backward compatibility hack */
2629 globals = gettupleitem(prog, 1);
2630 if (n == 3)
2631 locals = gettupleitem(prog, 2);
2632 prog = gettupleitem(prog, 0);
2633 }
2634 if (globals == None) {
2635 globals = getglobals();
2636 if (locals == None)
2637 locals = getlocals();
2638 }
2639 else if (locals == None)
2640 locals = globals;
2641 if (!is_stringobject(prog) &&
2642 !is_codeobject(prog) &&
2643 !is_fileobject(prog)) {
2644 err_setstr(TypeError,
2645 "exec 1st arg must be string, code or file object");
2646 return -1;
2647 }
2648 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2649 err_setstr(TypeError,
2650 "exec 2nd/3rd args must be dict or None");
2651 return -1;
2652 }
2653 if (is_codeobject(prog)) {
2654 if (eval_code((codeobject *) prog, globals, locals,
2655 (object *)NULL, (object *)NULL) == NULL)
2656 return -1;
2657 return 0;
2658 }
2659 if (is_fileobject(prog)) {
2660 FILE *fp = getfilefile(prog);
2661 char *name = getstringvalue(getfilename(prog));
2662 if (run_file(fp, name, file_input, globals, locals) == NULL)
2663 return -1;
2664 return 0;
2665 }
2666 s = getstringvalue(prog);
2667 if (strlen(s) != getstringsize(prog)) {
2668 err_setstr(ValueError, "embedded '\\0' in exec string");
2669 return -1;
2670 }
2671 if (run_string(s, file_input, globals, locals) == NULL)
2672 return -1;
2673 return 0;
2674}