blob: fb3d1feb9fe1262ebbd9fc072097cc17974e8245 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum3f5da241990-12-20 15:06:42 +000025/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000026
Guido van Rossum681d79a1995-07-18 14:51:37 +000027/* XXX TO DO:
28 XXX how to pass arguments to call_trace?
29 XXX access stuff can probably dereference NULL locals?
30 XXX need to extend apply() to be able to pass keyword args
31 XXX need to be able to call built-in functions with keyword args
32 XXX speed up searching for keywords by using a dictionary
33 XXX unknown keyword shouldn't raise KeyError?
34 XXX document it!
35 */
36
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000038
Guido van Rossum10dc2e81990-11-18 17:27:39 +000039#include "import.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#include "sysmodule.h"
Guido van Rossum94390ec1995-01-12 11:37:57 +000041#include "bltinmodule.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000045#include "ceval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000046#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000047#include "traceback.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000048#include "graminit.h"
49#include "pythonrun.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000050
Guido van Rossumc6004111993-11-05 10:22:19 +000051#include <ctype.h>
52
Guido van Rossume59214e1994-08-30 08:01:59 +000053extern int suppress_print; /* Declared in pythonrun.c, set in pythonmain.c */
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossumacbe8da1993-04-15 15:33:52 +000058/* Turn this on if you want to debug the interpreter: */
59/* (This can be on even if NDEBUG is defined) */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000060/* #define DEBUG 1 */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000061
62#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000063/* For debugging the interpreter: */
64#define LLTRACE 1 /* Low-level trace feature */
65#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000066#endif
67
Guido van Rossum5b722181993-03-30 17:46:03 +000068
Guido van Rossum374a9221991-04-04 10:40:29 +000069/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000070
Guido van Rossum681d79a1995-07-18 14:51:37 +000071static object *eval_code2 PROTO((codeobject *,
72 object *, object *,
73 object **, int,
74 object **, int,
75 object **, int,
76 object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000077#ifdef LLTRACE
78static int prtrace PROTO((object *, char *));
79#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000080static void call_exc_trace PROTO((object **, object**, frameobject *));
81static int call_trace
82 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000083static object *add PROTO((object *, object *));
84static object *sub PROTO((object *, object *));
Guido van Rossum50564e81996-01-12 01:13:16 +000085static object *pow PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000086static object *mul PROTO((object *, object *));
87static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000088static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000089static object *neg PROTO((object *));
90static object *pos PROTO((object *));
91static object *not PROTO((object *));
92static object *invert PROTO((object *));
93static object *lshift PROTO((object *, object *));
94static object *rshift PROTO((object *, object *));
95static object *and PROTO((object *, object *));
96static object *xor PROTO((object *, object *));
97static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000098static object *call_builtin PROTO((object *, object *, object *));
99static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000100static object *apply_subscript PROTO((object *, object *));
101static object *loop_subscript PROTO((object *, object *));
102static int slice_index PROTO((object *, int, int *));
103static object *apply_slice PROTO((object *, object *, object *));
104static int assign_subscript PROTO((object *, object *, object *));
105static int assign_slice PROTO((object *, object *, object *, object *));
106static int cmp_exception PROTO((object *, object *));
107static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +0000108static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000109static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000110static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +0000111static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000112static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000113static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000114
115
Guido van Rossum0a066c01992-03-27 17:29:15 +0000116/* Pointer to current frame, used to link new frames to */
117
Guido van Rossum374a9221991-04-04 10:40:29 +0000118static frameobject *current_frame;
119
Guido van Rossume59214e1994-08-30 08:01:59 +0000120#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000121
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122#include <errno.h>
123#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000124
Guido van Rossuma9672091994-09-14 13:31:22 +0000125static type_lock interpreter_lock = 0;
126static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127
128void
129init_save_thread()
130{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000132 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133 interpreter_lock = allocate_lock();
134 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000135 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000136}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000137
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138#endif
139
Guido van Rossumff4949e1992-08-05 19:58:53 +0000140/* Functions save_thread and restore_thread are always defined so
141 dynamically loaded modules needn't be compiled separately for use
142 with and without threads: */
143
Guido van Rossum04691fc1992-08-12 15:35:34 +0000144object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145save_thread()
146{
Guido van Rossume59214e1994-08-30 08:01:59 +0000147#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000149 object *res;
150 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000151 current_frame = NULL;
152 release_lock(interpreter_lock);
153 return res;
154 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000155#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000156 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000157}
158
159void
160restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000161 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162{
Guido van Rossume59214e1994-08-30 08:01:59 +0000163#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164 if (interpreter_lock) {
165 int err;
166 err = errno;
167 acquire_lock(interpreter_lock, 1);
168 errno = err;
169 current_frame = (frameobject *)x;
170 }
171#endif
172}
173
174
Guido van Rossuma9672091994-09-14 13:31:22 +0000175/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
176 signal handlers or Mac I/O completion routines) can schedule calls
177 to a function to be called synchronously.
178 The synchronous function is called with one void* argument.
179 It should return 0 for success or -1 for failure -- failure should
180 be accompanied by an exception.
181
182 If registry succeeds, the registry function returns 0; if it fails
183 (e.g. due to too many pending calls) it returns -1 (without setting
184 an exception condition).
185
186 Note that because registry may occur from within signal handlers,
187 or other asynchronous events, calling malloc() is unsafe!
188
189#ifdef WITH_THREAD
190 Any thread can schedule pending calls, but only the main thread
191 will execute them.
192#endif
193
194 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
195 There are two possible race conditions:
196 (1) nested asynchronous registry calls;
197 (2) registry calls made while pending calls are being processed.
198 While (1) is very unlikely, (2) is a real possibility.
199 The current code is safe against (2), but not against (1).
200 The safety against (2) is derived from the fact that only one
201 thread (the main thread) ever takes things out of the queue.
202*/
203
204#define NPENDINGCALLS 32
205static struct {
206 int (*func) PROTO((ANY *));
207 ANY *arg;
208} pendingcalls[NPENDINGCALLS];
209static volatile int pendingfirst = 0;
210static volatile int pendinglast = 0;
211
212int
213Py_AddPendingCall(func, arg)
214 int (*func) PROTO((ANY *));
215 ANY *arg;
216{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000217 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000218 int i, j;
219 /* XXX Begin critical section */
220 /* XXX If you want this to be safe against nested
221 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000222 if (busy)
223 return -1;
224 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000225 i = pendinglast;
226 j = (i + 1) % NPENDINGCALLS;
227 if (j == pendingfirst)
228 return -1; /* Queue full */
229 pendingcalls[i].func = func;
230 pendingcalls[i].arg = arg;
231 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000232 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000233 /* XXX End critical section */
234 return 0;
235}
236
Guido van Rossum180d7b41994-09-29 09:45:57 +0000237int
238Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000239{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000240 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000241#ifdef WITH_THREAD
242 if (get_thread_ident() != main_thread)
243 return 0;
244#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 if (busy)
246 return 0;
247 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 for (;;) {
249 int i;
250 int (*func) PROTO((ANY *));
251 ANY *arg;
252 i = pendingfirst;
253 if (i == pendinglast)
254 break; /* Queue empty */
255 func = pendingcalls[i].func;
256 arg = pendingcalls[i].arg;
257 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000258 if (func(arg) < 0) {
259 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000260 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000261 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000262 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 return 0;
265}
266
267
Guido van Rossum374a9221991-04-04 10:40:29 +0000268/* Status code for main loop (reason for stack unwind) */
269
270enum why_code {
271 WHY_NOT, /* No error */
272 WHY_EXCEPTION, /* Exception occurred */
273 WHY_RERAISE, /* Exception re-raised by 'finally' */
274 WHY_RETURN, /* 'return' statement */
275 WHY_BREAK /* 'break' statement */
276};
277
278
Guido van Rossum681d79a1995-07-18 14:51:37 +0000279/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000280
281object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000282eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000283 codeobject *co;
284 object *globals;
285 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000286{
287 return eval_code2(co,
288 globals, locals,
289 (object **)NULL, 0,
290 (object **)NULL, 0,
291 (object **)NULL, 0,
292 (object *)NULL);
293}
294
295
296/* Interpreter main loop */
297
298static object *
299eval_code2(co, globals, locals,
300 args, argcount, kws, kwcount, defs, defcount, owner)
301 codeobject *co;
302 object *globals;
303 object *locals;
304 object **args;
305 int argcount;
306 object **kws; /* length: 2*kwcount */
307 int kwcount;
308 object **defs;
309 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000310 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000311{
312 register unsigned char *next_instr;
313 register int opcode; /* Current opcode */
314 register int oparg; /* Current opcode argument, if any */
315 register object **stack_pointer;
316 register enum why_code why; /* Reason for block stack unwind */
317 register int err; /* Error status -- nonzero if error */
318 register object *x; /* Result object -- NULL if error */
319 register object *v; /* Temporary objects popped off stack */
320 register object *w;
321 register object *u;
322 register object *t;
323 register frameobject *f; /* Current frame */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000324 register object **fastlocals;
325 object *retval; /* Return value */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000326 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000327#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000328 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000329#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +0000330#if defined(DEBUG) || defined(LLTRACE)
331 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000332 char *filename = getstringvalue(co->co_filename);
333#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000334
335/* Code access macros */
336
337#define GETCONST(i) Getconst(f, i)
338#define GETNAME(i) Getname(f, i)
339#define GETNAMEV(i) Getnamev(f, i)
340#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
341#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
342#define NEXTOP() (*next_instr++)
343#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
344#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
345#define JUMPBY(x) (next_instr += (x))
346
347/* Stack manipulation macros */
348
349#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
350#define EMPTY() (STACK_LEVEL() == 0)
351#define TOP() (stack_pointer[-1])
352#define BASIC_PUSH(v) (*stack_pointer++ = (v))
353#define BASIC_POP() (*--stack_pointer)
354
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000355#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
356 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
357
Guido van Rossum96a42c81992-01-12 02:29:51 +0000358#ifdef LLTRACE
359#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
360#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000361#else
362#define PUSH(v) BASIC_PUSH(v)
363#define POP() BASIC_POP()
364#endif
365
Guido van Rossum681d79a1995-07-18 14:51:37 +0000366/* Local variable macros */
367
368#define GETLOCAL(i) (fastlocals[i])
369#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
370 GETLOCAL(i) = value; } while (0)
371
372 if (globals == NULL) {
373 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000374 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000375 }
376
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000377#ifdef LLTRACE
378 lltrace = dictlookup(globals, "__lltrace__") != NULL;
379#endif
380
Guido van Rossum374a9221991-04-04 10:40:29 +0000381 f = newframeobject(
382 current_frame, /*back*/
383 co, /*code*/
384 globals, /*globals*/
385 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000386 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000387 50, /*nvalues*/
388 20); /*nblocks*/
389 if (f == NULL)
390 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000391
Guido van Rossum374a9221991-04-04 10:40:29 +0000392 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000393
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394 if (co->co_nlocals > 0)
395 fastlocals = ((listobject *)f->f_fastlocals)->ob_item;
396
397 if (co->co_argcount > 0 ||
398 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
399 int i;
400 int n = argcount;
401 object *kwdict = NULL;
402 if (co->co_flags & CO_VARKEYWORDS) {
403 kwdict = newmappingobject();
404 if (kwdict == NULL)
405 goto fail;
406 }
407 if (argcount > co->co_argcount) {
408 if (!(co->co_flags & CO_VARARGS)) {
409 err_setstr(TypeError, "too many arguments");
410 goto fail;
411 }
412 n = co->co_argcount;
413 }
414 for (i = 0; i < n; i++) {
415 x = args[i];
416 INCREF(x);
417 SETLOCAL(i, x);
418 }
419 if (co->co_flags & CO_VARARGS) {
420 u = newtupleobject(argcount - n);
421 for (i = n; i < argcount; i++) {
422 x = args[i];
423 INCREF(x);
424 SETTUPLEITEM(u, i-n, x);
425 }
426 SETLOCAL(co->co_argcount, u);
427 }
428 for (i = 0; i < kwcount; i++) {
429 object *keyword = kws[2*i];
430 object *value = kws[2*i + 1];
431 int j;
432 /* XXX slow -- speed up using dictionary? */
433 for (j = 0; j < co->co_argcount; j++) {
434 object *nm = GETTUPLEITEM(co->co_varnames, j);
435 if (cmpobject(keyword, nm) == 0)
436 break;
437 }
438 if (j >= co->co_argcount) {
439 if (kwdict == NULL) {
440 err_setval(KeyError/*XXX*/, keyword);
441 goto fail;
442 }
443 mappinginsert(kwdict, keyword, value);
444 }
445 else {
446 if (GETLOCAL(j) != NULL) {
447 err_setstr(TypeError,
448 "keyword parameter redefined");
449 goto fail;
450 }
451 INCREF(value);
452 SETLOCAL(j, value);
453 }
454 }
455 if (argcount < co->co_argcount) {
456 int m = co->co_argcount - defcount;
457 for (i = argcount; i < m; i++) {
458 if (GETLOCAL(i) == NULL) {
459 err_setstr(TypeError,
460 "not enough arguments");
461 goto fail;
462 }
463 }
464 if (n > m)
465 i = n - m;
466 else
467 i = 0;
468 for (; i < defcount; i++) {
469 if (GETLOCAL(m+i) == NULL) {
470 object *def = defs[i];
471 INCREF(def);
472 SETLOCAL(m+i, def);
473 }
474 }
475 }
476 if (kwdict != NULL) {
477 i = co->co_argcount;
478 if (co->co_flags & CO_VARARGS)
479 i++;
480 SETLOCAL(i, kwdict);
481 }
482 if (0) {
483 fail:
484 XDECREF(kwdict);
485 goto fail2;
486 }
487 }
488 else {
489 if (argcount > 0 || kwcount > 0) {
490 err_setstr(TypeError, "no arguments expected");
491 fail2:
492 current_frame = f->f_back;
493 DECREF(f);
494 return NULL;
495 }
496 }
497
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000498 if (sys_trace != NULL) {
499 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000500 be called on *every* entry to a code block.
501 Its return value, if not None, is a function that
502 will be called at the start of each executed line
503 of code. (Actually, the function must return
504 itself in order to continue tracing.)
505 The trace functions are called with three arguments:
506 a pointer to the current frame, a string indicating
507 why the function is called, and an argument which
508 depends on the situation. The global trace function
509 (sys.trace) is also called whenever an exception
510 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 if (call_trace(&sys_trace, &f->f_trace, f, "call",
512 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000513 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000514 current_frame = f->f_back;
515 DECREF(f);
516 return NULL;
517 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000518 }
519
520 if (sys_profile != NULL) {
521 /* Similar for sys_profile, except it needn't return
522 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 if (call_trace(&sys_profile, (object**)0, f, "call",
524 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000525 current_frame = f->f_back;
526 DECREF(f);
527 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000528 }
529 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000530
Guido van Rossum374a9221991-04-04 10:40:29 +0000531 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000532 stack_pointer = f->f_valuestack;
533
Guido van Rossum374a9221991-04-04 10:40:29 +0000534 why = WHY_NOT;
535 err = 0;
536 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000537
538 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000539 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000540
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541 /* Do periodic things.
542 Doing this every time through the loop would add
543 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000544 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000545
Guido van Rossuma9672091994-09-14 13:31:22 +0000546 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000547 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000548 why = WHY_EXCEPTION;
549 goto on_error;
550 }
551 }
552
Guido van Rossum374a9221991-04-04 10:40:29 +0000553 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000554 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000555 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000556 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000557 goto on_error;
558 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000559
Guido van Rossume59214e1994-08-30 08:01:59 +0000560#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000561 if (interpreter_lock) {
562 /* Give another thread a chance */
563
564 current_frame = NULL;
565 release_lock(interpreter_lock);
566
567 /* Other threads may run now */
568
569 acquire_lock(interpreter_lock, 1);
570 current_frame = f;
571 }
572#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000573 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000574
Guido van Rossum374a9221991-04-04 10:40:29 +0000575 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000576
577#ifdef DEBUG
578 f->f_lasti = INSTR_OFFSET();
579#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000580
581 opcode = NEXTOP();
582 if (HAS_ARG(opcode))
583 oparg = NEXTARG();
584
Guido van Rossum96a42c81992-01-12 02:29:51 +0000585#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 /* Instruction tracing */
587
Guido van Rossum96a42c81992-01-12 02:29:51 +0000588 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000589 if (HAS_ARG(opcode)) {
590 printf("%d: %d, %d\n",
591 (int) (INSTR_OFFSET() - 3),
592 opcode, oparg);
593 }
594 else {
595 printf("%d: %d\n",
596 (int) (INSTR_OFFSET() - 1), opcode);
597 }
598 }
599#endif
600
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000601 if (!CHECK_STACK(3)) {
602 x = NULL;
603 break;
604 }
605
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 /* Main switch on opcode */
607
608 switch (opcode) {
609
610 /* BEWARE!
611 It is essential that any operation that fails sets either
612 x to NULL, err to nonzero, or why to anything but WHY_NOT,
613 and that no operation that succeeds does this! */
614
615 /* case STOP_CODE: this is an error! */
616
617 case POP_TOP:
618 v = POP();
619 DECREF(v);
620 break;
621
622 case ROT_TWO:
623 v = POP();
624 w = POP();
625 PUSH(v);
626 PUSH(w);
627 break;
628
629 case ROT_THREE:
630 v = POP();
631 w = POP();
632 x = POP();
633 PUSH(v);
634 PUSH(x);
635 PUSH(w);
636 break;
637
638 case DUP_TOP:
639 v = TOP();
640 INCREF(v);
641 PUSH(v);
642 break;
643
644 case UNARY_POSITIVE:
645 v = POP();
646 x = pos(v);
647 DECREF(v);
648 PUSH(x);
649 break;
650
651 case UNARY_NEGATIVE:
652 v = POP();
653 x = neg(v);
654 DECREF(v);
655 PUSH(x);
656 break;
657
658 case UNARY_NOT:
659 v = POP();
660 x = not(v);
661 DECREF(v);
662 PUSH(x);
663 break;
664
665 case UNARY_CONVERT:
666 v = POP();
667 x = reprobject(v);
668 DECREF(v);
669 PUSH(x);
670 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000671
672 case UNARY_INVERT:
673 v = POP();
674 x = invert(v);
675 DECREF(v);
676 PUSH(x);
677 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000678
Guido van Rossum50564e81996-01-12 01:13:16 +0000679 case BINARY_POWER:
680 w = POP();
681 v = POP();
682 x = pow(v, w);
683 DECREF(v);
684 DECREF(w);
685 PUSH(x);
686 break;
687
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 case BINARY_MULTIPLY:
689 w = POP();
690 v = POP();
691 x = mul(v, w);
692 DECREF(v);
693 DECREF(w);
694 PUSH(x);
695 break;
696
697 case BINARY_DIVIDE:
698 w = POP();
699 v = POP();
700 x = divide(v, w);
701 DECREF(v);
702 DECREF(w);
703 PUSH(x);
704 break;
705
706 case BINARY_MODULO:
707 w = POP();
708 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000709 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 DECREF(v);
711 DECREF(w);
712 PUSH(x);
713 break;
714
715 case BINARY_ADD:
716 w = POP();
717 v = POP();
718 x = add(v, w);
719 DECREF(v);
720 DECREF(w);
721 PUSH(x);
722 break;
723
724 case BINARY_SUBTRACT:
725 w = POP();
726 v = POP();
727 x = sub(v, w);
728 DECREF(v);
729 DECREF(w);
730 PUSH(x);
731 break;
732
733 case BINARY_SUBSCR:
734 w = POP();
735 v = POP();
736 x = apply_subscript(v, w);
737 DECREF(v);
738 DECREF(w);
739 PUSH(x);
740 break;
741
Guido van Rossum7928cd71991-10-24 14:59:31 +0000742 case BINARY_LSHIFT:
743 w = POP();
744 v = POP();
745 x = lshift(v, w);
746 DECREF(v);
747 DECREF(w);
748 PUSH(x);
749 break;
750
751 case BINARY_RSHIFT:
752 w = POP();
753 v = POP();
754 x = rshift(v, w);
755 DECREF(v);
756 DECREF(w);
757 PUSH(x);
758 break;
759
760 case BINARY_AND:
761 w = POP();
762 v = POP();
763 x = and(v, w);
764 DECREF(v);
765 DECREF(w);
766 PUSH(x);
767 break;
768
769 case BINARY_XOR:
770 w = POP();
771 v = POP();
772 x = xor(v, w);
773 DECREF(v);
774 DECREF(w);
775 PUSH(x);
776 break;
777
778 case BINARY_OR:
779 w = POP();
780 v = POP();
781 x = or(v, w);
782 DECREF(v);
783 DECREF(w);
784 PUSH(x);
785 break;
786
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 case SLICE+0:
788 case SLICE+1:
789 case SLICE+2:
790 case SLICE+3:
791 if ((opcode-SLICE) & 2)
792 w = POP();
793 else
794 w = NULL;
795 if ((opcode-SLICE) & 1)
796 v = POP();
797 else
798 v = NULL;
799 u = POP();
800 x = apply_slice(u, v, w);
801 DECREF(u);
802 XDECREF(v);
803 XDECREF(w);
804 PUSH(x);
805 break;
806
807 case STORE_SLICE+0:
808 case STORE_SLICE+1:
809 case STORE_SLICE+2:
810 case STORE_SLICE+3:
811 if ((opcode-STORE_SLICE) & 2)
812 w = POP();
813 else
814 w = NULL;
815 if ((opcode-STORE_SLICE) & 1)
816 v = POP();
817 else
818 v = NULL;
819 u = POP();
820 t = POP();
821 err = assign_slice(u, v, w, t); /* u[v:w] = t */
822 DECREF(t);
823 DECREF(u);
824 XDECREF(v);
825 XDECREF(w);
826 break;
827
828 case DELETE_SLICE+0:
829 case DELETE_SLICE+1:
830 case DELETE_SLICE+2:
831 case DELETE_SLICE+3:
832 if ((opcode-DELETE_SLICE) & 2)
833 w = POP();
834 else
835 w = NULL;
836 if ((opcode-DELETE_SLICE) & 1)
837 v = POP();
838 else
839 v = NULL;
840 u = POP();
841 err = assign_slice(u, v, w, (object *)NULL);
842 /* del u[v:w] */
843 DECREF(u);
844 XDECREF(v);
845 XDECREF(w);
846 break;
847
848 case STORE_SUBSCR:
849 w = POP();
850 v = POP();
851 u = POP();
852 /* v[w] = u */
853 err = assign_subscript(v, w, u);
854 DECREF(u);
855 DECREF(v);
856 DECREF(w);
857 break;
858
859 case DELETE_SUBSCR:
860 w = POP();
861 v = POP();
862 /* del v[w] */
863 err = assign_subscript(v, w, (object *)NULL);
864 DECREF(v);
865 DECREF(w);
866 break;
867
868 case PRINT_EXPR:
869 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000871 /* Before printing, also assign to '_' */
872 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000873 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000874 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000875 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000876 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000877 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000878 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 flushline();
880 }
881 DECREF(v);
882 break;
883
884 case PRINT_ITEM:
885 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000886 w = sysget("stdout");
887 if (softspace(w, 1))
888 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000889 err = writeobject(v, w, PRINT_RAW);
890 if (err == 0 && is_stringobject(v)) {
891 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 char *s = getstringvalue(v);
893 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000894 if (len > 0 &&
895 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000896 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000897 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 DECREF(v);
900 break;
901
902 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000903 x = sysget("stdout");
904 if (x == NULL)
905 err_setstr(RuntimeError, "lost sys.stdout");
906 else {
907 writestring("\n", x);
908 softspace(x, 0);
909 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 break;
911
912 case BREAK_LOOP:
913 why = WHY_BREAK;
914 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000915
Guido van Rossumf10570b1995-07-07 22:53:21 +0000916 case RAISE_VARARGS:
917 u = v = w = NULL;
918 switch (oparg) {
919 case 3:
920 u = POP(); /* traceback */
921 if (u == None) {
922 DECREF(u);
923 u = NULL;
924 }
Guido van Rossum9d78d8d1995-09-18 21:29:36 +0000925 else if (!PyTraceBack_Check(u)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000926 err_setstr(TypeError,
927 "raise 3rd arg must be traceback or None");
928 goto raise_error;
929 }
930 /* Fallthrough */
931 case 2:
932 v = POP(); /* value */
933 /* Fallthrough */
934 case 1:
935 w = POP(); /* exc */
936 break;
937 default:
938 err_setstr(SystemError,
939 "bad RAISE_VARARGS oparg");
940 goto raise_error;
941 }
942 if (v == NULL) {
943 v = None;
944 INCREF(v);
945 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000946 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000947 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000948 t = w;
949 w = GETTUPLEITEM(w, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000950 INCREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000951 DECREF(t);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000952 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000953 if (is_stringobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000954 ;
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000955 } else if (is_classobject(w)) {
956 if (!is_instanceobject(v)
957 || !issubclass((object*)((instanceobject*)v)->in_class,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000958 w)) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000959 err_setstr(TypeError,
960 "a class exception must have a value that is an instance of the class");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000961 goto raise_error;
962 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000963 } else if (is_instanceobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000964 if (v != None) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000965 err_setstr(TypeError,
966 "an instance exception may not have a separate value");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000967 goto raise_error;
968 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000969 else {
970 DECREF(v);
971 v = w;
972 w = (object*) ((instanceobject*)w)->in_class;
973 INCREF(w);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000974 }
Guido van Rossumf10570b1995-07-07 22:53:21 +0000975 }
976 else {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000977 err_setstr(TypeError,
978 "exceptions must be strings, classes, or instances");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000979 goto raise_error;
980 }
981 err_restore(w, v, u);
982 if (u == NULL)
983 why = WHY_EXCEPTION;
984 else
985 why = WHY_RERAISE;
986 break;
987 raise_error:
988 XDECREF(v);
989 XDECREF(w);
990 XDECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 why = WHY_EXCEPTION;
992 break;
993
994 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000995 if ((x = f->f_locals) == NULL) {
996 err_setstr(SystemError, "no locals");
997 break;
998 }
999 INCREF(x);
1000 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 break;
1002
1003 case RETURN_VALUE:
1004 retval = POP();
1005 why = WHY_RETURN;
1006 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001007
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001008 case EXEC_STMT:
1009 w = POP();
1010 v = POP();
1011 u = POP();
1012 err = exec_statement(u, v, w);
1013 DECREF(u);
1014 DECREF(v);
1015 DECREF(w);
1016 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001017
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 case POP_BLOCK:
1019 {
1020 block *b = pop_block(f);
1021 while (STACK_LEVEL() > b->b_level) {
1022 v = POP();
1023 DECREF(v);
1024 }
1025 }
1026 break;
1027
1028 case END_FINALLY:
1029 v = POP();
1030 if (is_intobject(v)) {
1031 why = (enum why_code) getintvalue(v);
1032 if (why == WHY_RETURN)
1033 retval = POP();
1034 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001035 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001037 u = POP();
1038 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001040 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 }
1042 else if (v != None) {
1043 err_setstr(SystemError,
1044 "'finally' pops bad exception");
1045 why = WHY_EXCEPTION;
1046 }
1047 DECREF(v);
1048 break;
1049
1050 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001051 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001053 w = POP();
1054 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001056 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001057 DECREF(v);
1058 DECREF(w);
1059 break;
1060
1061 case STORE_NAME:
1062 w = GETNAMEV(oparg);
1063 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001064 if ((x = f->f_locals) == NULL) {
1065 err_setstr(SystemError, "no locals");
1066 break;
1067 }
1068 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001069 if (u == NULL) {
1070 if (defmode != 0) {
1071 if (v != None)
1072 u = (object *)v->ob_type;
1073 else
1074 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001075 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001076 (typeobject *)u,
1077 defmode);
1078 DECREF(v);
1079 if (x == NULL)
1080 break;
1081 v = x;
1082 }
1083 }
1084 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001085 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001086 DECREF(v);
1087 break;
1088 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001089 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001090 DECREF(v);
1091 break;
1092
1093 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001094 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001095 if ((x = f->f_locals) == NULL) {
1096 err_setstr(SystemError, "no locals");
1097 break;
1098 }
1099 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001100 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001101 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001102 (object *)NULL);
1103 break;
1104 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001105 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001106 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001108
1109#ifdef CASE_TOO_BIG
1110 default: switch (opcode) {
1111#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001112
1113 case UNPACK_TUPLE:
1114 v = POP();
1115 if (!is_tupleobject(v)) {
1116 err_setstr(TypeError, "unpack non-tuple");
1117 why = WHY_EXCEPTION;
1118 }
1119 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001120 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 "unpack tuple of wrong size");
1122 why = WHY_EXCEPTION;
1123 }
1124 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001125 if (!CHECK_STACK(oparg)) {
1126 x = NULL;
1127 break;
1128 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001130 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 INCREF(w);
1132 PUSH(w);
1133 }
1134 }
1135 DECREF(v);
1136 break;
1137
1138 case UNPACK_LIST:
1139 v = POP();
1140 if (!is_listobject(v)) {
1141 err_setstr(TypeError, "unpack non-list");
1142 why = WHY_EXCEPTION;
1143 }
1144 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001145 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 "unpack list of wrong size");
1147 why = WHY_EXCEPTION;
1148 }
1149 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001150 if (!CHECK_STACK(oparg)) {
1151 x = NULL;
1152 break;
1153 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 for (; --oparg >= 0; ) {
1155 w = getlistitem(v, oparg);
1156 INCREF(w);
1157 PUSH(w);
1158 }
1159 }
1160 DECREF(v);
1161 break;
1162
1163 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001164 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 v = POP();
1166 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001167 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 DECREF(v);
1169 DECREF(u);
1170 break;
1171
1172 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001173 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001175 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001176 DECREF(v);
1177 break;
1178
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001179 case STORE_GLOBAL:
1180 w = GETNAMEV(oparg);
1181 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001182 if (f->f_locals != NULL) {
1183 u = dict2lookup(f->f_locals, w);
1184 if (u != NULL && is_accessobject(u)) {
1185 err = setaccessvalue(u, f->f_globals,
1186 v);
1187 DECREF(v);
1188 break;
1189 }
Guido van Rossum25831651993-05-19 14:50:45 +00001190 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001191 err = dict2insert(f->f_globals, w, v);
1192 DECREF(v);
1193 break;
1194
1195 case DELETE_GLOBAL:
1196 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001197 if (f->f_locals != NULL) {
1198 u = dict2lookup(f->f_locals, w);
1199 if (u != NULL && is_accessobject(u)) {
1200 err = setaccessvalue(u, f->f_globals,
1201 (object *)NULL);
1202 break;
1203 }
Guido van Rossum25831651993-05-19 14:50:45 +00001204 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001205 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001206 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001207 break;
1208
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 case LOAD_CONST:
1210 x = GETCONST(oparg);
1211 INCREF(x);
1212 PUSH(x);
1213 break;
1214
1215 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001216 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001217 if ((x = f->f_locals) == NULL) {
1218 err_setstr(SystemError, "no locals");
1219 break;
1220 }
1221 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001223 err_clear();
1224 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001226 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001227 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001229 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 break;
1231 }
1232 }
1233 }
Guido van Rossum25831651993-05-19 14:50:45 +00001234 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001235 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001236 if (x == NULL)
1237 break;
1238 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001239 else
1240 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 PUSH(x);
1242 break;
1243
1244 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001245 w = GETNAMEV(oparg);
1246 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001248 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001249 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001251 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 break;
1253 }
1254 }
Guido van Rossum25831651993-05-19 14:50:45 +00001255 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001256 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001257 if (x == NULL)
1258 break;
1259 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001260 else
1261 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 PUSH(x);
1263 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001264
1265#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001267 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001268 if ((x = f->f_locals) == NULL) {
1269 err_setstr(SystemError, "no locals");
1270 break;
1271 }
1272 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001274 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 break;
1276 }
Guido van Rossum25831651993-05-19 14:50:45 +00001277 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001278 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001279 if (x == NULL)
1280 break;
1281 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001282 else
1283 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 PUSH(x);
1285 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001286#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001287
1288 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001289 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001290 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001291 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001292 gettupleitem(co->co_varnames,
1293 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001294 break;
1295 }
Guido van Rossum25831651993-05-19 14:50:45 +00001296 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001297 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001298 if (x == NULL)
1299 break;
1300 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001301 else
1302 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001303 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001304 break;
1305
1306 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001307 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001308 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001309 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001310 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001311 DECREF(v);
1312 break;
1313 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001314 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001315 break;
1316
1317 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001318 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001319 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001320 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001321 gettupleitem(co->co_varnames,
1322 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001323 break;
1324 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001325 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001326 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001327 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001328 break;
1329 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001330 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001331 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332
1333 case BUILD_TUPLE:
1334 x = newtupleobject(oparg);
1335 if (x != NULL) {
1336 for (; --oparg >= 0;) {
1337 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001338 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 }
1340 PUSH(x);
1341 }
1342 break;
1343
1344 case BUILD_LIST:
1345 x = newlistobject(oparg);
1346 if (x != NULL) {
1347 for (; --oparg >= 0;) {
1348 w = POP();
1349 err = setlistitem(x, oparg, w);
1350 if (err != 0)
1351 break;
1352 }
1353 PUSH(x);
1354 }
1355 break;
1356
1357 case BUILD_MAP:
1358 x = newdictobject();
1359 PUSH(x);
1360 break;
1361
1362 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001363 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001365 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 DECREF(v);
1367 PUSH(x);
1368 break;
1369
1370 case COMPARE_OP:
1371 w = POP();
1372 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001373 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 DECREF(v);
1375 DECREF(w);
1376 PUSH(x);
1377 break;
1378
1379 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001380 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001381 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001382 if (x == NULL) {
1383 err_setstr(ImportError,
1384 "__import__ not found");
1385 break;
1386 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001387 if (is_methodobject(x)) {
1388 u = None;
1389 INCREF(u);
1390 }
1391 else {
1392 u = find_from_args(f, INSTR_OFFSET());
1393 if (u == NULL) {
1394 x = u;
1395 break;
1396 }
1397 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001398 w = mkvalue("(OOOO)",
1399 w,
1400 f->f_globals,
1401 f->f_locals == NULL ? None : f->f_locals,
1402 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001403 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404 if (w == NULL) {
1405 x = NULL;
1406 break;
1407 }
1408 x = call_object(x, w);
1409 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001410 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001411 break;
1412
1413 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001414 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001416 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001417 if ((x = f->f_locals) == NULL) {
1418 err_setstr(SystemError, "no locals");
1419 break;
1420 }
1421 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001422 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001424
1425 case ACCESS_MODE:
1426 v = POP();
1427 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001428 if (getstringvalue(w)[0] == '*')
1429 defmode = getintvalue(v);
1430 else
1431 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001432 DECREF(v);
1433 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001434
1435 case JUMP_FORWARD:
1436 JUMPBY(oparg);
1437 break;
1438
1439 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001440 err = testbool(TOP());
1441 if (err > 0)
1442 err = 0;
1443 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 JUMPBY(oparg);
1445 break;
1446
1447 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001448 err = testbool(TOP());
1449 if (err > 0) {
1450 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001452 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001453 break;
1454
1455 case JUMP_ABSOLUTE:
1456 JUMPTO(oparg);
1457 break;
1458
1459 case FOR_LOOP:
1460 /* for v in s: ...
1461 On entry: stack contains s, i.
1462 On exit: stack contains s, i+1, s[i];
1463 but if loop exhausted:
1464 s, i are popped, and we jump */
1465 w = POP(); /* Loop index */
1466 v = POP(); /* Sequence object */
1467 u = loop_subscript(v, w);
1468 if (u != NULL) {
1469 PUSH(v);
1470 x = newintobject(getintvalue(w)+1);
1471 PUSH(x);
1472 DECREF(w);
1473 PUSH(u);
1474 }
1475 else {
1476 DECREF(v);
1477 DECREF(w);
1478 /* A NULL can mean "s exhausted"
1479 but also an error: */
1480 if (err_occurred())
1481 why = WHY_EXCEPTION;
1482 else
1483 JUMPBY(oparg);
1484 }
1485 break;
1486
1487 case SETUP_LOOP:
1488 case SETUP_EXCEPT:
1489 case SETUP_FINALLY:
1490 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1491 STACK_LEVEL());
1492 break;
1493
1494 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001495#ifdef LLTRACE
1496 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001497 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001498#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001499 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001500 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001501 /* Trace each line of code reached */
1502 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001503 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001504 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001505 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001507
1508 case CALL_FUNCTION:
1509 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001510 int na = oparg & 0xff;
1511 int nk = (oparg>>8) & 0xff;
1512 int n = na + 2*nk;
1513 object **pfunc = stack_pointer - n - 1;
1514 object *func = *pfunc;
1515 object *self = NULL;
1516 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001517 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001518 if (is_instancemethodobject(func)) {
1519 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 class = instancemethodgetclass(func);
1521 func = instancemethodgetfunc(func);
1522 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001523 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524 INCREF(self);
1525 DECREF(*pfunc);
1526 *pfunc = self;
1527 na++;
1528 n++;
1529 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001530 else {
1531 /* Unbound methods must be
1532 called with an instance of
1533 the class (or a derived
1534 class) as first argument */
1535 if (na > 0 &&
1536 (self = stack_pointer[-n])
1537 != NULL &&
1538 is_instanceobject(self) &&
1539 issubclass(
1540 (object *)
1541 (((instanceobject *)self)
1542 ->in_class),
1543 class))
1544 /* Handy-dandy */ ;
1545 else {
1546 err_setstr(TypeError,
1547 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001548 x = NULL;
1549 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 }
1551 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001552 }
1553 else
1554 INCREF(func);
1555 if (is_funcobject(func)) {
1556 object *co = getfunccode(func);
1557 object *globals = getfuncglobals(func);
1558 object *argdefs = PyFunction_GetDefaults(func);
1559 object **d;
1560 int nd;
1561 if (argdefs != NULL) {
1562 d = &GETTUPLEITEM(argdefs, 0);
1563 nd = ((tupleobject *)argdefs)->ob_size;
1564 }
1565 else {
1566 d = NULL;
1567 nd = 0;
1568 }
1569 x = eval_code2(
1570 (codeobject *)co,
1571 globals, (object *)NULL,
1572 stack_pointer-n, na,
1573 stack_pointer-2*nk, nk,
1574 d, nd,
1575 class);
1576 }
1577 else {
1578 object *args = newtupleobject(na);
1579 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001580 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001582 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001584 if (nk > 0) {
1585 kwdict = newdictobject();
1586 if (kwdict == NULL) {
1587 x = NULL;
1588 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001590 err = 0;
1591 while (--nk >= 0) {
1592 object *value = POP();
1593 object *key = POP();
1594 err = mappinginsert(
1595 kwdict, key, value);
1596 if (err) {
1597 DECREF(key);
1598 DECREF(value);
1599 break;
1600 }
1601 }
1602 if (err) {
1603 DECREF(args);
1604 DECREF(kwdict);
1605 break;
1606 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001607 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001608 while (--na >= 0) {
1609 w = POP();
1610 SETTUPLEITEM(args, na, w);
1611 }
1612 x = PyEval_CallObjectWithKeywords(
1613 func, args, kwdict);
1614 DECREF(args);
1615 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001616 }
1617 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 while (stack_pointer > pfunc) {
1619 w = POP();
1620 DECREF(w);
1621 }
1622 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001623 break;
1624 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001625
Guido van Rossum681d79a1995-07-18 14:51:37 +00001626 case MAKE_FUNCTION:
1627 v = POP(); /* code object */
1628 x = newfuncobject(v, f->f_globals);
1629 DECREF(v);
1630 /* XXX Maybe this should be a separate opcode? */
1631 if (x != NULL && oparg > 0) {
1632 v = newtupleobject(oparg);
1633 if (v == NULL) {
1634 DECREF(x);
1635 x = NULL;
1636 break;
1637 }
1638 while (--oparg >= 0) {
1639 w = POP();
1640 SETTUPLEITEM(v, oparg, w);
1641 }
1642 err = PyFunction_SetDefaults(x, v);
1643 DECREF(v);
1644 }
1645 PUSH(x);
1646 break;
1647
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 default:
1649 fprintf(stderr,
1650 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001651 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001652 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 why = WHY_EXCEPTION;
1654 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001655
1656#ifdef CASE_TOO_BIG
1657 }
1658#endif
1659
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 } /* switch */
1661
1662 on_error:
1663
1664 /* Quickly continue if no error occurred */
1665
1666 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001667 if (err == 0 && x != NULL) {
1668#ifdef CHECKEXC
1669 if (err_occurred())
1670 fprintf(stderr,
1671 "XXX undetected error\n");
1672 else
1673#endif
1674 continue; /* Normal, fast path */
1675 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 why = WHY_EXCEPTION;
1677 x = None;
1678 err = 0;
1679 }
1680
Guido van Rossum801dcae1992-04-08 11:32:32 +00001681#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 /* Double-check exception status */
1683
1684 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1685 if (!err_occurred()) {
1686 fprintf(stderr, "XXX ghost error\n");
1687 err_setstr(SystemError, "ghost error");
1688 why = WHY_EXCEPTION;
1689 }
1690 }
1691 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001692 if (err_occurred()) {
1693 fprintf(stderr,
1694 "XXX undetected error (why=%d)\n",
1695 why);
1696 why = WHY_EXCEPTION;
1697 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 }
1699#endif
1700
1701 /* Log traceback info if this is a real exception */
1702
1703 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001704 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001706 f->f_lasti -= 2;
1707 tb_here(f);
1708
Guido van Rossume59214e1994-08-30 08:01:59 +00001709 if (f->f_trace)
1710 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001711 if (sys_profile)
1712 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 }
1714
1715 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1716
1717 if (why == WHY_RERAISE)
1718 why = WHY_EXCEPTION;
1719
1720 /* Unwind stacks if a (pseudo) exception occurred */
1721
1722 while (why != WHY_NOT && f->f_iblock > 0) {
1723 block *b = pop_block(f);
1724 while (STACK_LEVEL() > b->b_level) {
1725 v = POP();
1726 XDECREF(v);
1727 }
1728 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1729 why = WHY_NOT;
1730 JUMPTO(b->b_handler);
1731 break;
1732 }
1733 if (b->b_type == SETUP_FINALLY ||
1734 b->b_type == SETUP_EXCEPT &&
1735 why == WHY_EXCEPTION) {
1736 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737 object *exc, *val, *tb;
1738 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 if (val == NULL) {
1740 val = None;
1741 INCREF(val);
1742 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 /* Make the raw exception data
1744 available to the handler,
1745 so a program can emulate the
1746 Python main loop. Don't do
1747 this for 'finally'. */
1748 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001749 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 sysset("exc_value", val);
1751 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 PUSH(val);
1755 PUSH(exc);
1756 }
1757 else {
1758 if (why == WHY_RETURN)
1759 PUSH(retval);
1760 v = newintobject((long)why);
1761 PUSH(v);
1762 }
1763 why = WHY_NOT;
1764 JUMPTO(b->b_handler);
1765 break;
1766 }
1767 } /* unwind stack */
1768
1769 /* End the loop if we still have an error (or return) */
1770
1771 if (why != WHY_NOT)
1772 break;
1773
1774 } /* main loop */
1775
1776 /* Pop remaining stack entries */
1777
1778 while (!EMPTY()) {
1779 v = POP();
1780 XDECREF(v);
1781 }
1782
Guido van Rossum96a42c81992-01-12 02:29:51 +00001783 if (why != WHY_RETURN)
1784 retval = NULL;
1785
Guido van Rossume59214e1994-08-30 08:01:59 +00001786 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001787 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001788 if (call_trace(&f->f_trace, &f->f_trace, f,
1789 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001790 XDECREF(retval);
1791 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001792 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001793 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001794 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001795 }
1796
1797 if (sys_profile && why == WHY_RETURN) {
1798 if (call_trace(&sys_profile, (object**)0,
1799 f, "return", retval)) {
1800 XDECREF(retval);
1801 retval = NULL;
1802 why = WHY_EXCEPTION;
1803 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001804 }
1805
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001807
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 current_frame = f->f_back;
1809 DECREF(f);
1810
Guido van Rossum96a42c81992-01-12 02:29:51 +00001811 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001812}
1813
Guido van Rossum96a42c81992-01-12 02:29:51 +00001814#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815static int
1816prtrace(v, str)
1817 object *v;
1818 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001819{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001820 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001821 if (printobject(v, stdout, 0) != 0)
1822 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001823 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001824}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001825#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001827static void
1828call_exc_trace(p_trace, p_newtrace, f)
1829 object **p_trace, **p_newtrace;
1830 frameobject *f;
1831{
1832 object *type, *value, *traceback, *arg;
1833 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001834 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001835 if (value == NULL) {
1836 value = None;
1837 INCREF(value);
1838 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001839 arg = mkvalue("(OOO)", type, value, traceback);
1840 if (arg == NULL) {
1841 err_restore(type, value, traceback);
1842 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001843 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001844 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1845 DECREF(arg);
1846 if (err == 0)
1847 err_restore(type, value, traceback);
1848 else {
1849 XDECREF(type);
1850 XDECREF(value);
1851 XDECREF(traceback);
1852 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001853}
1854
1855static int
1856call_trace(p_trace, p_newtrace, f, msg, arg)
1857 object **p_trace; /* in/out; may not be NULL;
1858 may not point to NULL variable initially */
1859 object **p_newtrace; /* in/out; may be NULL;
1860 may point to NULL variable;
1861 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001862 frameobject *f;
1863 char *msg;
1864 object *arg;
1865{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001866 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001867 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001868 static int tracing = 0;
1869
1870 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001871 /* Don't do recursive traces */
1872 if (p_newtrace) {
1873 XDECREF(*p_newtrace);
1874 *p_newtrace = NULL;
1875 }
1876 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001877 }
1878
Guido van Rossumf10570b1995-07-07 22:53:21 +00001879 args = newtupleobject(3);
1880 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001881 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001882 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001883 if (what == NULL)
1884 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001885 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001886 SETTUPLEITEM(args, 0, (object *)f);
1887 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001888 if (arg == NULL)
1889 arg = None;
1890 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001891 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001892 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001893 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001894 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001895 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001896 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001897 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001898 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001899 if (res == NULL) {
1900 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001901 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001902 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001903 *p_trace = NULL;
1904 if (p_newtrace) {
1905 XDECREF(*p_newtrace);
1906 *p_newtrace = NULL;
1907 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001908 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001909 }
1910 else {
1911 if (p_newtrace) {
1912 XDECREF(*p_newtrace);
1913 if (res == None)
1914 *p_newtrace = NULL;
1915 else {
1916 INCREF(res);
1917 *p_newtrace = res;
1918 }
1919 }
1920 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001921 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001922 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001923}
1924
Guido van Rossum3f5da241990-12-20 15:06:42 +00001925object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001926getbuiltins()
1927{
1928 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001929 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001930 else
1931 return current_frame->f_builtins;
1932}
1933
1934object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001935getlocals()
1936{
1937 if (current_frame == NULL)
1938 return NULL;
1939 fast_2_locals(current_frame);
1940 return current_frame->f_locals;
1941}
1942
1943object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001944getglobals()
1945{
1946 if (current_frame == NULL)
1947 return NULL;
1948 else
1949 return current_frame->f_globals;
1950}
1951
Guido van Rossum81daa321993-05-20 14:24:46 +00001952object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001953getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001954{
1955 if (current_frame == NULL)
1956 return NULL;
1957 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001958 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001959}
1960
Guido van Rossume59214e1994-08-30 08:01:59 +00001961object *
1962getframe()
1963{
1964 return (object *)current_frame;
1965}
1966
Guido van Rossum6135a871995-01-09 17:53:26 +00001967int
1968getrestricted()
1969{
1970 return current_frame == NULL ? 0 : current_frame->f_restricted;
1971}
1972
Guido van Rossum3f5da241990-12-20 15:06:42 +00001973void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974flushline()
1975{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001976 object *f = sysget("stdout");
1977 if (softspace(f, 0))
1978 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979}
1980
Guido van Rossum3f5da241990-12-20 15:06:42 +00001981
Guido van Rossum06186511995-01-07 12:40:10 +00001982#define BINOP(opname, ropname, thisfunc) \
1983 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1984 ; \
1985 else \
1986 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001987
1988
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001990or(v, w)
1991 object *v, *w;
1992{
Guido van Rossum06186511995-01-07 12:40:10 +00001993 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001994 if (v->ob_type->tp_as_number != NULL) {
1995 object *x;
1996 object * (*f) FPROTO((object *, object *));
1997 if (coerce(&v, &w) != 0)
1998 return NULL;
1999 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2000 x = (*f)(v, w);
2001 DECREF(v);
2002 DECREF(w);
2003 if (f != NULL)
2004 return x;
2005 }
2006 err_setstr(TypeError, "bad operand type(s) for |");
2007 return NULL;
2008}
2009
2010static object *
2011xor(v, w)
2012 object *v, *w;
2013{
Guido van Rossum06186511995-01-07 12:40:10 +00002014 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002015 if (v->ob_type->tp_as_number != NULL) {
2016 object *x;
2017 object * (*f) FPROTO((object *, object *));
2018 if (coerce(&v, &w) != 0)
2019 return NULL;
2020 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2021 x = (*f)(v, w);
2022 DECREF(v);
2023 DECREF(w);
2024 if (f != NULL)
2025 return x;
2026 }
2027 err_setstr(TypeError, "bad operand type(s) for ^");
2028 return NULL;
2029}
2030
2031static object *
2032and(v, w)
2033 object *v, *w;
2034{
Guido van Rossum06186511995-01-07 12:40:10 +00002035 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002036 if (v->ob_type->tp_as_number != NULL) {
2037 object *x;
2038 object * (*f) FPROTO((object *, object *));
2039 if (coerce(&v, &w) != 0)
2040 return NULL;
2041 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2042 x = (*f)(v, w);
2043 DECREF(v);
2044 DECREF(w);
2045 if (f != NULL)
2046 return x;
2047 }
2048 err_setstr(TypeError, "bad operand type(s) for &");
2049 return NULL;
2050}
2051
2052static object *
2053lshift(v, w)
2054 object *v, *w;
2055{
Guido van Rossum06186511995-01-07 12:40:10 +00002056 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002057 if (v->ob_type->tp_as_number != NULL) {
2058 object *x;
2059 object * (*f) FPROTO((object *, object *));
2060 if (coerce(&v, &w) != 0)
2061 return NULL;
2062 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2063 x = (*f)(v, w);
2064 DECREF(v);
2065 DECREF(w);
2066 if (f != NULL)
2067 return x;
2068 }
2069 err_setstr(TypeError, "bad operand type(s) for <<");
2070 return NULL;
2071}
2072
2073static object *
2074rshift(v, w)
2075 object *v, *w;
2076{
Guido van Rossum06186511995-01-07 12:40:10 +00002077 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002078 if (v->ob_type->tp_as_number != NULL) {
2079 object *x;
2080 object * (*f) FPROTO((object *, object *));
2081 if (coerce(&v, &w) != 0)
2082 return NULL;
2083 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2084 x = (*f)(v, w);
2085 DECREF(v);
2086 DECREF(w);
2087 if (f != NULL)
2088 return x;
2089 }
2090 err_setstr(TypeError, "bad operand type(s) for >>");
2091 return NULL;
2092}
2093
2094static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 object *v, *w;
2097{
Guido van Rossum06186511995-01-07 12:40:10 +00002098 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002099 if (v->ob_type->tp_as_sequence != NULL)
2100 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2101 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002102 object *x;
2103 if (coerce(&v, &w) != 0)
2104 return NULL;
2105 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2106 DECREF(v);
2107 DECREF(w);
2108 return x;
2109 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002110 err_setstr(TypeError, "bad operand type(s) for +");
2111 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112}
2113
2114static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002115sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 object *v, *w;
2117{
Guido van Rossum06186511995-01-07 12:40:10 +00002118 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002119 if (v->ob_type->tp_as_number != NULL) {
2120 object *x;
2121 if (coerce(&v, &w) != 0)
2122 return NULL;
2123 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2124 DECREF(v);
2125 DECREF(w);
2126 return x;
2127 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 return NULL;
2130}
2131
2132static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002133mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 object *v, *w;
2135{
2136 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002137 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002138 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002139 if (tp->tp_as_number != NULL &&
2140 w->ob_type->tp_as_sequence != NULL &&
2141 !is_instanceobject(v)) {
2142 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 object *tmp = v;
2144 v = w;
2145 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002146 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002148 if (tp->tp_as_number != NULL) {
2149 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002150 if (is_instanceobject(v)) {
2151 /* Instances of user-defined classes get their
2152 other argument uncoerced, so they may
2153 implement sequence*number as well as
2154 number*number. */
2155 INCREF(v);
2156 INCREF(w);
2157 }
2158 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002159 return NULL;
2160 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2161 DECREF(v);
2162 DECREF(w);
2163 return x;
2164 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 if (tp->tp_as_sequence != NULL) {
2166 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002167 err_setstr(TypeError,
2168 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 return NULL;
2170 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002171 return (*tp->tp_as_sequence->sq_repeat)
2172 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002174 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 return NULL;
2176}
2177
2178static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002179divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 object *v, *w;
2181{
Guido van Rossum06186511995-01-07 12:40:10 +00002182 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002183 if (v->ob_type->tp_as_number != NULL) {
2184 object *x;
2185 if (coerce(&v, &w) != 0)
2186 return NULL;
2187 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2188 DECREF(v);
2189 DECREF(w);
2190 return x;
2191 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002192 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 return NULL;
2194}
2195
2196static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002197mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 object *v, *w;
2199{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002200 if (is_stringobject(v)) {
2201 return formatstring(v, w);
2202 }
Guido van Rossum06186511995-01-07 12:40:10 +00002203 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002204 if (v->ob_type->tp_as_number != NULL) {
2205 object *x;
2206 if (coerce(&v, &w) != 0)
2207 return NULL;
2208 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2209 DECREF(v);
2210 DECREF(w);
2211 return x;
2212 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002213 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 return NULL;
2215}
2216
2217static object *
Guido van Rossum50564e81996-01-12 01:13:16 +00002218pow(v, w)
2219 object *v, *w;
2220{
2221 object *res;
2222 BINOP("__pow__", "__rpow__", pow);
2223 if (v->ob_type->tp_as_number == NULL ||
2224 w->ob_type->tp_as_number == NULL) {
2225 err_setstr(TypeError, "pow() requires numeric arguments");
2226 return NULL;
2227 }
2228 if (
2229#ifndef WITHOUT_COMPLEX
2230 !is_complexobject(v) &&
2231#endif
2232 is_floatobject(w) && getfloatvalue(v) < 0.0) {
2233 if (!err_occurred())
2234 err_setstr(ValueError, "negative number to float power");
2235 return NULL;
2236 }
2237 if (coerce(&v, &w) != 0)
2238 return NULL;
2239 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2240 DECREF(v);
2241 DECREF(w);
2242 return res;
2243}
2244
2245static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 object *v;
2248{
2249 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002250 return (*v->ob_type->tp_as_number->nb_negative)(v);
2251 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252 return NULL;
2253}
2254
2255static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257 object *v;
2258{
2259 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002260 return (*v->ob_type->tp_as_number->nb_positive)(v);
2261 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262 return NULL;
2263}
2264
2265static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002266invert(v)
2267 object *v;
2268{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002269 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002270 if (v->ob_type->tp_as_number != NULL &&
2271 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2272 return (*f)(v);
2273 err_setstr(TypeError, "bad operand type(s) for unary ~");
2274 return NULL;
2275}
2276
2277static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002278not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 object *v;
2280{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002282 object *w;
2283 if (outcome < 0)
2284 return NULL;
2285 if (outcome == 0)
2286 w = True;
2287 else
2288 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002289 INCREF(w);
2290 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291}
Guido van Rossum234f9421993-06-17 12:35:49 +00002292
2293
Guido van Rossum681d79a1995-07-18 14:51:37 +00002294/* External interface to call any callable object.
2295 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002296
2297object *
2298call_object(func, arg)
2299 object *func;
2300 object *arg;
2301{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002302 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2303}
Guido van Rossume59214e1994-08-30 08:01:59 +00002304
Guido van Rossum681d79a1995-07-18 14:51:37 +00002305object *
2306PyEval_CallObjectWithKeywords(func, arg, kw)
2307 object *func;
2308 object *arg;
2309 object *kw;
2310{
2311 ternaryfunc call;
2312 object *result;
2313
2314 if (arg == NULL)
2315 arg = newtupleobject(0);
2316 else if (!is_tupleobject(arg)) {
2317 err_setstr(TypeError, "argument list must be a tuple");
2318 return NULL;
2319 }
2320 else
2321 INCREF(arg);
2322
Guido van Rossume3e61c11995-08-04 04:14:47 +00002323 if (kw != NULL && !is_dictobject(kw)) {
2324 err_setstr(TypeError, "keyword list must be a dictionary");
2325 return NULL;
2326 }
2327
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328 if (call = func->ob_type->tp_call)
2329 result = (*call)(func, arg, kw);
2330 else if (is_instancemethodobject(func) || is_funcobject(func))
2331 result = call_function(func, arg, kw);
2332 else
2333 result = call_builtin(func, arg, kw);
2334
2335 DECREF(arg);
2336
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002337 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338 err_setstr(SystemError,
2339 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002340
2341 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002342}
2343
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002345call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002348 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 if (is_methodobject(func)) {
2351 method meth = getmethod(func);
2352 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002353 int flags = getflags(func);
2354 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002355 int size = gettuplesize(arg);
2356 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002357 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002358 else if (size == 0)
2359 arg = NULL;
2360 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002361 if (flags & METH_KEYWORDS)
2362 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002363 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002364 err_setstr(TypeError,
2365 "this function takes no keyword arguments");
2366 return NULL;
2367 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002368 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 }
2370 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002371 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002373 if (is_instanceobject(func)) {
2374 object *res, *call = getattr(func,"__call__");
2375 if (call == NULL) {
2376 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002377 err_setstr(AttributeError,
2378 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002379 return NULL;
2380 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002381 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002382 DECREF(call);
2383 return res;
2384 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 return NULL;
2387}
2388
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002390call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002393 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002396 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002397 object **d, **k;
2398 int nk, nd;
2399 object *result;
2400
2401 if (kw != NULL && !is_dictobject(kw)) {
2402 err_badcall();
2403 return NULL;
2404 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405
Guido van Rossume8122f11991-05-05 20:03:07 +00002406 if (is_instancemethodobject(func)) {
2407 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002408 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002409 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002410 if (self == NULL) {
2411 /* Unbound methods must be called with an instance of
2412 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002414 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002415 if (self != NULL &&
2416 is_instanceobject(self) &&
2417 issubclass((object *)
2418 (((instanceobject *)self)->in_class),
2419 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002420 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002421 else
2422 self = NULL;
2423 }
2424 if (self == NULL) {
2425 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002427 return NULL;
2428 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002429 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002430 }
2431 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432 int argcount = gettuplesize(arg);
2433 object *newarg = newtupleobject(argcount + 1);
2434 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002435 if (newarg == NULL)
2436 return NULL;
2437 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002438 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002439 for (i = 0; i < argcount; i++) {
2440 object *v = GETTUPLEITEM(arg, i);
2441 XINCREF(v);
2442 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002443 }
2444 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 }
2446 }
2447 else {
2448 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002449 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 return NULL;
2451 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002452 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002454
2455 argdefs = PyFunction_GetDefaults(func);
2456 if (argdefs != NULL && is_tupleobject(argdefs)) {
2457 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2458 nd = gettuplesize(argdefs);
2459 }
2460 else {
2461 d = NULL;
2462 nd = 0;
2463 }
2464
2465 if (kw != NULL) {
2466 int pos, i;
2467 nk = getmappingsize(kw);
2468 k = NEW(object *, 2*nk);
2469 if (k == NULL) {
2470 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002471 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002472 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002473 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002474 pos = i = 0;
2475 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2476 i += 2;
2477 nk = i/2;
2478 /* XXX This is broken if the caller deletes dict items! */
2479 }
2480 else {
2481 k = NULL;
2482 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002483 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484
Guido van Rossum681d79a1995-07-18 14:51:37 +00002485 result = eval_code2(
2486 (codeobject *)getfunccode(func),
2487 getfuncglobals(func), (object *)NULL,
2488 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2489 k, nk,
2490 d, nd,
2491 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492
Guido van Rossum681d79a1995-07-18 14:51:37 +00002493 DECREF(arg);
2494 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495
Guido van Rossum681d79a1995-07-18 14:51:37 +00002496 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497}
2498
2499static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501 object *v, *w;
2502{
2503 typeobject *tp = v->ob_type;
2504 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002505 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506 return NULL;
2507 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002508 if (tp->tp_as_mapping != NULL) {
2509 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2510 }
2511 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512 int i;
2513 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 return NULL;
2516 }
2517 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002518 if (i < 0) {
2519 int len = (*tp->tp_as_sequence->sq_length)(v);
2520 if (len < 0)
2521 return NULL;
2522 i += len;
2523 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526}
2527
2528static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 object *v, *w;
2531{
2532 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002533 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002535 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 return NULL;
2537 }
2538 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002539 v = (*sq->sq_item)(v, i);
2540 if (v)
2541 return v;
2542 if (err_occurred() == IndexError)
2543 err_clear();
2544 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545}
2546
2547static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002548slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 object *v;
2550 int isize;
2551 int *pi;
2552{
2553 if (v != NULL) {
2554 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002555 err_setstr(TypeError, "slice index must be int");
2556 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 }
2558 *pi = getintvalue(v);
2559 if (*pi < 0)
2560 *pi += isize;
2561 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002562 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563}
2564
2565static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002566apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567 object *u, *v, *w;
2568{
2569 typeobject *tp = u->ob_type;
2570 int ilow, ihigh, isize;
2571 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002572 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573 return NULL;
2574 }
2575 ilow = 0;
2576 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002577 if (isize < 0)
2578 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002581 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002583 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002585
2586static int
2587assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 object *w;
2589 object *key;
2590 object *v;
2591{
2592 typeobject *tp = w->ob_type;
2593 sequence_methods *sq;
2594 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002595 int (*func1)();
2596 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002597 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002598 (func1 = mp->mp_ass_subscript) != NULL) {
2599 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002600 }
2601 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002602 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002605 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002608 else {
2609 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002610 if (i < 0) {
2611 int len = (*sq->sq_length)(w);
2612 if (len < 0)
2613 return -1;
2614 i += len;
2615 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002616 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002617 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002620 err_setstr(TypeError,
2621 "can't assign to this subscripted object");
2622 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624}
2625
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626static int
2627assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 object *u, *v, *w, *x;
2629{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002630 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002632 if (sq == NULL) {
2633 err_setstr(TypeError, "assign to slice of non-sequence");
2634 return -1;
2635 }
2636 if (sq == NULL || sq->sq_ass_slice == NULL) {
2637 err_setstr(TypeError, "unassignable slice");
2638 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 }
2640 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002641 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002642 if (isize < 0)
2643 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002644 if (slice_index(v, isize, &ilow) != 0)
2645 return -1;
2646 if (slice_index(w, isize, &ihigh) != 0)
2647 return -1;
2648 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649}
2650
2651static int
2652cmp_exception(err, v)
2653 object *err, *v;
2654{
2655 if (is_tupleobject(v)) {
2656 int i, n;
2657 n = gettuplesize(v);
2658 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002659 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002660 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 return 1;
2662 }
2663 return 0;
2664 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002665 if (is_classobject(v) && is_classobject(err))
2666 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 return err == v;
2668}
2669
Guido van Rossum3f5da241990-12-20 15:06:42 +00002670static int
2671cmp_member(v, w)
2672 object *v, *w;
2673{
Guido van Rossume59214e1994-08-30 08:01:59 +00002674 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002675 object *x;
2676 sequence_methods *sq;
2677 /* Special case for char in string */
2678 if (is_stringobject(w)) {
2679 register char *s, *end;
2680 register char c;
2681 if (!is_stringobject(v) || getstringsize(v) != 1) {
2682 err_setstr(TypeError,
2683 "string member test needs char left operand");
2684 return -1;
2685 }
2686 c = getstringvalue(v)[0];
2687 s = getstringvalue(w);
2688 end = s + getstringsize(w);
2689 while (s < end) {
2690 if (c == *s++)
2691 return 1;
2692 }
2693 return 0;
2694 }
2695 sq = w->ob_type->tp_as_sequence;
2696 if (sq == NULL) {
2697 err_setstr(TypeError,
2698 "'in' or 'not in' needs sequence right argument");
2699 return -1;
2700 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002701 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002702 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002703 if (x == NULL) {
2704 if (err_occurred() == IndexError) {
2705 err_clear();
2706 break;
2707 }
2708 return -1;
2709 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002710 cmp = cmpobject(v, x);
2711 XDECREF(x);
2712 if (cmp == 0)
2713 return 1;
2714 }
2715 return 0;
2716}
2717
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002719cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002720 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721 register object *v;
2722 register object *w;
2723{
2724 register int cmp;
2725 register int res = 0;
2726 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002727 case IS:
2728 case IS_NOT:
2729 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002730 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002731 res = !res;
2732 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 case IN:
2734 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002735 res = cmp_member(v, w);
2736 if (res < 0)
2737 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002738 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002739 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002740 break;
2741 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002742 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 break;
2744 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002745 cmp = cmpobject(v, w);
2746 switch (op) {
2747 case LT: res = cmp < 0; break;
2748 case LE: res = cmp <= 0; break;
2749 case EQ: res = cmp == 0; break;
2750 case NE: res = cmp != 0; break;
2751 case GT: res = cmp > 0; break;
2752 case GE: res = cmp >= 0; break;
2753 /* XXX no default? (res is initialized to 0 though) */
2754 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 }
2756 v = res ? True : False;
2757 INCREF(v);
2758 return v;
2759}
2760
Guido van Rossum3f5da241990-12-20 15:06:42 +00002761static int
2762import_from(locals, v, name)
2763 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002764 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002765 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002766{
2767 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002768 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002769 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002770 return -1;
2771 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002772 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002773 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002774 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002775 object *name, *value;
2776 pos = 0;
2777 while (mappinggetnext(w, &pos, &name, &value)) {
2778 if (!is_stringobject(name) ||
2779 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002780 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002781 if (is_accessobject(value)) {
2782 value = getaccessvalue(value, (object *)NULL);
2783 if (value == NULL) {
2784 err_clear();
2785 continue;
2786 }
2787 }
2788 else
2789 INCREF(value);
2790 err = dict2insert(locals, name, value);
2791 DECREF(value);
2792 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002794 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002795 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002796 }
2797 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002798 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002800 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002801 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002802 getstringvalue(name));
2803 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002804 return -1;
2805 }
2806 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002807 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002808 }
2809}
2810
2811static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002812build_class(methods, bases, name)
2813 object *methods; /* dictionary */
2814 object *bases; /* tuple containing classes */
2815 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002816{
Guido van Rossum25831651993-05-19 14:50:45 +00002817 int i;
2818 if (!is_tupleobject(bases)) {
2819 err_setstr(SystemError, "build_class with non-tuple bases");
2820 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002821 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002822 if (gettuplesize(bases) > 0) {
2823 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002824 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002825 /* Call the base's *type*, if it is callable.
2826 This code is a hook for Donald Beaudry's type extensions.
2827 In unexended Python it will never be triggered since its
2828 types are not callable. */
2829 if (base->ob_type->ob_type->tp_call) {
2830 object *args;
2831 object *class;
2832 args = mkvalue("(OOO)", name, bases, methods);
2833 class = call_object((object *)base->ob_type, args);
2834 DECREF(args);
2835 return class;
2836 }
2837 }
Guido van Rossum25831651993-05-19 14:50:45 +00002838 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002839 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002840 return NULL;
2841 }
Guido van Rossum25831651993-05-19 14:50:45 +00002842 if (!is_stringobject(name)) {
2843 err_setstr(SystemError, "build_class witn non-string name");
2844 return NULL;
2845 }
2846 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002847 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002848 if (!is_classobject(base)) {
2849 err_setstr(TypeError,
2850 "base is not a class object");
2851 return NULL;
2852 }
2853 }
2854 return newclassobject(bases, methods, name);
2855}
2856
2857static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002858access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002859 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002860 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002861 frameobject *f;
2862{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002863 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002864 object *value, *ac;
2865 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002866 int ret;
2867 fast_2_locals(f);
2868 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002869 if (value && is_accessobject(value)) {
2870 err_setstr(AccessError, "can't override access");
2871 return -1;
2872 }
2873 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002874 if (value != NULL && value != None)
2875 type = value->ob_type;
2876 else
2877 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002878 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002879 if (ac == NULL)
2880 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002881 ret = mappinginsert(f->f_locals, name, ac);
2882 DECREF(ac);
2883 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002884 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002885}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002886
2887static int
2888exec_statement(prog, globals, locals)
2889 object *prog;
2890 object *globals;
2891 object *locals;
2892{
2893 char *s;
2894 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002895 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002896 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002897
2898 if (is_tupleobject(prog) && globals == None && locals == None &&
2899 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2900 /* Backward compatibility hack */
2901 globals = gettupleitem(prog, 1);
2902 if (n == 3)
2903 locals = gettupleitem(prog, 2);
2904 prog = gettupleitem(prog, 0);
2905 }
2906 if (globals == None) {
2907 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002908 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002909 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002910 plain = 1;
2911 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002912 }
2913 else if (locals == None)
2914 locals = globals;
2915 if (!is_stringobject(prog) &&
2916 !is_codeobject(prog) &&
2917 !is_fileobject(prog)) {
2918 err_setstr(TypeError,
2919 "exec 1st arg must be string, code or file object");
2920 return -1;
2921 }
2922 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2923 err_setstr(TypeError,
2924 "exec 2nd/3rd args must be dict or None");
2925 return -1;
2926 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002927 if (dictlookup(globals, "__builtins__") == NULL)
2928 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002929 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002930 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002931 return -1;
2932 return 0;
2933 }
2934 if (is_fileobject(prog)) {
2935 FILE *fp = getfilefile(prog);
2936 char *name = getstringvalue(getfilename(prog));
2937 if (run_file(fp, name, file_input, globals, locals) == NULL)
2938 return -1;
2939 return 0;
2940 }
2941 s = getstringvalue(prog);
2942 if (strlen(s) != getstringsize(prog)) {
2943 err_setstr(ValueError, "embedded '\\0' in exec string");
2944 return -1;
2945 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002946 v = run_string(s, file_input, globals, locals);
2947 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002948 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002949 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002950 if (plain)
2951 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002952 return 0;
2953}
Guido van Rossum24c13741995-02-14 09:42:43 +00002954
Guido van Rossum681d79a1995-07-18 14:51:37 +00002955/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002956static object *
2957find_from_args(f, nexti)
2958 frameobject *f;
2959 int nexti;
2960{
2961 int opcode;
2962 int oparg;
2963 object *list, *name;
2964 unsigned char *next_instr;
2965
2966 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2967 opcode = (*next_instr++);
2968 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002969 INCREF(None);
2970 return None;
2971 }
2972
2973 list = newlistobject(0);
2974 if (list == NULL)
2975 return NULL;
2976
2977 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002978 oparg = (next_instr[1]<<8) + next_instr[0];
2979 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002980 name = Getnamev(f, oparg);
2981 if (addlistitem(list, name) < 0) {
2982 DECREF(list);
2983 break;
2984 }
2985 opcode = (*next_instr++);
2986 } while (opcode == IMPORT_FROM);
2987
2988 return list;
2989}