blob: 35c89988c0bbb3f61cfae05ccab567d9439797b6 [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 *));
85static object *mul PROTO((object *, object *));
86static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000087static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000088static object *neg PROTO((object *));
89static object *pos PROTO((object *));
90static object *not PROTO((object *));
91static object *invert PROTO((object *));
92static object *lshift PROTO((object *, object *));
93static object *rshift PROTO((object *, object *));
94static object *and PROTO((object *, object *));
95static object *xor PROTO((object *, object *));
96static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000097static object *call_builtin PROTO((object *, object *, object *));
98static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000099static object *apply_subscript PROTO((object *, object *));
100static object *loop_subscript PROTO((object *, object *));
101static int slice_index PROTO((object *, int, int *));
102static object *apply_slice PROTO((object *, object *, object *));
103static int assign_subscript PROTO((object *, object *, object *));
104static int assign_slice PROTO((object *, object *, object *, object *));
105static int cmp_exception PROTO((object *, object *));
106static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +0000107static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000108static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000109static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +0000110static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000111static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000112static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000113
114
Guido van Rossum0a066c01992-03-27 17:29:15 +0000115/* Pointer to current frame, used to link new frames to */
116
Guido van Rossum374a9221991-04-04 10:40:29 +0000117static frameobject *current_frame;
118
Guido van Rossume59214e1994-08-30 08:01:59 +0000119#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000120
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121#include <errno.h>
122#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000123
Guido van Rossuma9672091994-09-14 13:31:22 +0000124static type_lock interpreter_lock = 0;
125static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126
127void
128init_save_thread()
129{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000131 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132 interpreter_lock = allocate_lock();
133 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000134 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000136
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137#endif
138
Guido van Rossumff4949e1992-08-05 19:58:53 +0000139/* Functions save_thread and restore_thread are always defined so
140 dynamically loaded modules needn't be compiled separately for use
141 with and without threads: */
142
Guido van Rossum04691fc1992-08-12 15:35:34 +0000143object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144save_thread()
145{
Guido van Rossume59214e1994-08-30 08:01:59 +0000146#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000147 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000148 object *res;
149 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000150 current_frame = NULL;
151 release_lock(interpreter_lock);
152 return res;
153 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000154#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000155 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156}
157
158void
159restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000160 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000161{
Guido van Rossume59214e1994-08-30 08:01:59 +0000162#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163 if (interpreter_lock) {
164 int err;
165 err = errno;
166 acquire_lock(interpreter_lock, 1);
167 errno = err;
168 current_frame = (frameobject *)x;
169 }
170#endif
171}
172
173
Guido van Rossuma9672091994-09-14 13:31:22 +0000174/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
175 signal handlers or Mac I/O completion routines) can schedule calls
176 to a function to be called synchronously.
177 The synchronous function is called with one void* argument.
178 It should return 0 for success or -1 for failure -- failure should
179 be accompanied by an exception.
180
181 If registry succeeds, the registry function returns 0; if it fails
182 (e.g. due to too many pending calls) it returns -1 (without setting
183 an exception condition).
184
185 Note that because registry may occur from within signal handlers,
186 or other asynchronous events, calling malloc() is unsafe!
187
188#ifdef WITH_THREAD
189 Any thread can schedule pending calls, but only the main thread
190 will execute them.
191#endif
192
193 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
194 There are two possible race conditions:
195 (1) nested asynchronous registry calls;
196 (2) registry calls made while pending calls are being processed.
197 While (1) is very unlikely, (2) is a real possibility.
198 The current code is safe against (2), but not against (1).
199 The safety against (2) is derived from the fact that only one
200 thread (the main thread) ever takes things out of the queue.
201*/
202
203#define NPENDINGCALLS 32
204static struct {
205 int (*func) PROTO((ANY *));
206 ANY *arg;
207} pendingcalls[NPENDINGCALLS];
208static volatile int pendingfirst = 0;
209static volatile int pendinglast = 0;
210
211int
212Py_AddPendingCall(func, arg)
213 int (*func) PROTO((ANY *));
214 ANY *arg;
215{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000216 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000217 int i, j;
218 /* XXX Begin critical section */
219 /* XXX If you want this to be safe against nested
220 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000221 if (busy)
222 return -1;
223 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000224 i = pendinglast;
225 j = (i + 1) % NPENDINGCALLS;
226 if (j == pendingfirst)
227 return -1; /* Queue full */
228 pendingcalls[i].func = func;
229 pendingcalls[i].arg = arg;
230 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000231 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000232 /* XXX End critical section */
233 return 0;
234}
235
Guido van Rossum180d7b41994-09-29 09:45:57 +0000236int
237Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000238{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000239 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240#ifdef WITH_THREAD
241 if (get_thread_ident() != main_thread)
242 return 0;
243#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 if (busy)
245 return 0;
246 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000247 for (;;) {
248 int i;
249 int (*func) PROTO((ANY *));
250 ANY *arg;
251 i = pendingfirst;
252 if (i == pendinglast)
253 break; /* Queue empty */
254 func = pendingcalls[i].func;
255 arg = pendingcalls[i].arg;
256 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000257 if (func(arg) < 0) {
258 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000260 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000261 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000263 return 0;
264}
265
266
Guido van Rossum374a9221991-04-04 10:40:29 +0000267/* Status code for main loop (reason for stack unwind) */
268
269enum why_code {
270 WHY_NOT, /* No error */
271 WHY_EXCEPTION, /* Exception occurred */
272 WHY_RERAISE, /* Exception re-raised by 'finally' */
273 WHY_RETURN, /* 'return' statement */
274 WHY_BREAK /* 'break' statement */
275};
276
277
Guido van Rossum681d79a1995-07-18 14:51:37 +0000278/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000279
280object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000281eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000282 codeobject *co;
283 object *globals;
284 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000285{
286 return eval_code2(co,
287 globals, locals,
288 (object **)NULL, 0,
289 (object **)NULL, 0,
290 (object **)NULL, 0,
291 (object *)NULL);
292}
293
294
295/* Interpreter main loop */
296
297static object *
298eval_code2(co, globals, locals,
299 args, argcount, kws, kwcount, defs, defcount, owner)
300 codeobject *co;
301 object *globals;
302 object *locals;
303 object **args;
304 int argcount;
305 object **kws; /* length: 2*kwcount */
306 int kwcount;
307 object **defs;
308 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000309 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000310{
311 register unsigned char *next_instr;
312 register int opcode; /* Current opcode */
313 register int oparg; /* Current opcode argument, if any */
314 register object **stack_pointer;
315 register enum why_code why; /* Reason for block stack unwind */
316 register int err; /* Error status -- nonzero if error */
317 register object *x; /* Result object -- NULL if error */
318 register object *v; /* Temporary objects popped off stack */
319 register object *w;
320 register object *u;
321 register object *t;
322 register frameobject *f; /* Current frame */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000323 register object **fastlocals;
324 object *retval; /* Return value */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000325 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000326#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000327 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000328#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +0000329#if defined(DEBUG) || defined(LLTRACE)
330 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000331 char *filename = getstringvalue(co->co_filename);
332#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000333
334/* Code access macros */
335
336#define GETCONST(i) Getconst(f, i)
337#define GETNAME(i) Getname(f, i)
338#define GETNAMEV(i) Getnamev(f, i)
339#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
340#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
341#define NEXTOP() (*next_instr++)
342#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
343#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
344#define JUMPBY(x) (next_instr += (x))
345
346/* Stack manipulation macros */
347
348#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
349#define EMPTY() (STACK_LEVEL() == 0)
350#define TOP() (stack_pointer[-1])
351#define BASIC_PUSH(v) (*stack_pointer++ = (v))
352#define BASIC_POP() (*--stack_pointer)
353
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000354#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
355 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
356
Guido van Rossum96a42c81992-01-12 02:29:51 +0000357#ifdef LLTRACE
358#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
359#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000360#else
361#define PUSH(v) BASIC_PUSH(v)
362#define POP() BASIC_POP()
363#endif
364
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365/* Local variable macros */
366
367#define GETLOCAL(i) (fastlocals[i])
368#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
369 GETLOCAL(i) = value; } while (0)
370
371 if (globals == NULL) {
372 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000373 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000374 }
375
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000376#ifdef LLTRACE
377 lltrace = dictlookup(globals, "__lltrace__") != NULL;
378#endif
379
Guido van Rossum374a9221991-04-04 10:40:29 +0000380 f = newframeobject(
381 current_frame, /*back*/
382 co, /*code*/
383 globals, /*globals*/
384 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000385 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000386 50, /*nvalues*/
387 20); /*nblocks*/
388 if (f == NULL)
389 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390
Guido van Rossum374a9221991-04-04 10:40:29 +0000391 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000392
Guido van Rossum681d79a1995-07-18 14:51:37 +0000393 if (co->co_nlocals > 0)
394 fastlocals = ((listobject *)f->f_fastlocals)->ob_item;
395
396 if (co->co_argcount > 0 ||
397 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
398 int i;
399 int n = argcount;
400 object *kwdict = NULL;
401 if (co->co_flags & CO_VARKEYWORDS) {
402 kwdict = newmappingobject();
403 if (kwdict == NULL)
404 goto fail;
405 }
406 if (argcount > co->co_argcount) {
407 if (!(co->co_flags & CO_VARARGS)) {
408 err_setstr(TypeError, "too many arguments");
409 goto fail;
410 }
411 n = co->co_argcount;
412 }
413 for (i = 0; i < n; i++) {
414 x = args[i];
415 INCREF(x);
416 SETLOCAL(i, x);
417 }
418 if (co->co_flags & CO_VARARGS) {
419 u = newtupleobject(argcount - n);
420 for (i = n; i < argcount; i++) {
421 x = args[i];
422 INCREF(x);
423 SETTUPLEITEM(u, i-n, x);
424 }
425 SETLOCAL(co->co_argcount, u);
426 }
427 for (i = 0; i < kwcount; i++) {
428 object *keyword = kws[2*i];
429 object *value = kws[2*i + 1];
430 int j;
431 /* XXX slow -- speed up using dictionary? */
432 for (j = 0; j < co->co_argcount; j++) {
433 object *nm = GETTUPLEITEM(co->co_varnames, j);
434 if (cmpobject(keyword, nm) == 0)
435 break;
436 }
437 if (j >= co->co_argcount) {
438 if (kwdict == NULL) {
439 err_setval(KeyError/*XXX*/, keyword);
440 goto fail;
441 }
442 mappinginsert(kwdict, keyword, value);
443 }
444 else {
445 if (GETLOCAL(j) != NULL) {
446 err_setstr(TypeError,
447 "keyword parameter redefined");
448 goto fail;
449 }
450 INCREF(value);
451 SETLOCAL(j, value);
452 }
453 }
454 if (argcount < co->co_argcount) {
455 int m = co->co_argcount - defcount;
456 for (i = argcount; i < m; i++) {
457 if (GETLOCAL(i) == NULL) {
458 err_setstr(TypeError,
459 "not enough arguments");
460 goto fail;
461 }
462 }
463 if (n > m)
464 i = n - m;
465 else
466 i = 0;
467 for (; i < defcount; i++) {
468 if (GETLOCAL(m+i) == NULL) {
469 object *def = defs[i];
470 INCREF(def);
471 SETLOCAL(m+i, def);
472 }
473 }
474 }
475 if (kwdict != NULL) {
476 i = co->co_argcount;
477 if (co->co_flags & CO_VARARGS)
478 i++;
479 SETLOCAL(i, kwdict);
480 }
481 if (0) {
482 fail:
483 XDECREF(kwdict);
484 goto fail2;
485 }
486 }
487 else {
488 if (argcount > 0 || kwcount > 0) {
489 err_setstr(TypeError, "no arguments expected");
490 fail2:
491 current_frame = f->f_back;
492 DECREF(f);
493 return NULL;
494 }
495 }
496
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000497 if (sys_trace != NULL) {
498 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000499 be called on *every* entry to a code block.
500 Its return value, if not None, is a function that
501 will be called at the start of each executed line
502 of code. (Actually, the function must return
503 itself in order to continue tracing.)
504 The trace functions are called with three arguments:
505 a pointer to the current frame, a string indicating
506 why the function is called, and an argument which
507 depends on the situation. The global trace function
508 (sys.trace) is also called whenever an exception
509 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 if (call_trace(&sys_trace, &f->f_trace, f, "call",
511 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000512 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000513 current_frame = f->f_back;
514 DECREF(f);
515 return NULL;
516 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000517 }
518
519 if (sys_profile != NULL) {
520 /* Similar for sys_profile, except it needn't return
521 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000522 if (call_trace(&sys_profile, (object**)0, f, "call",
523 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000524 current_frame = f->f_back;
525 DECREF(f);
526 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 }
528 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000529
Guido van Rossum374a9221991-04-04 10:40:29 +0000530 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000531 stack_pointer = f->f_valuestack;
532
Guido van Rossum374a9221991-04-04 10:40:29 +0000533 why = WHY_NOT;
534 err = 0;
535 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000536
537 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000538 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000539
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540 /* Do periodic things.
541 Doing this every time through the loop would add
542 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000543 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000544
Guido van Rossuma9672091994-09-14 13:31:22 +0000545 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000546 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000547 why = WHY_EXCEPTION;
548 goto on_error;
549 }
550 }
551
Guido van Rossum374a9221991-04-04 10:40:29 +0000552 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000553 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000554 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000555 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000556 goto on_error;
557 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000558
Guido van Rossume59214e1994-08-30 08:01:59 +0000559#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560 if (interpreter_lock) {
561 /* Give another thread a chance */
562
563 current_frame = NULL;
564 release_lock(interpreter_lock);
565
566 /* Other threads may run now */
567
568 acquire_lock(interpreter_lock, 1);
569 current_frame = f;
570 }
571#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000572 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000573
Guido van Rossum374a9221991-04-04 10:40:29 +0000574 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000575
576#ifdef DEBUG
577 f->f_lasti = INSTR_OFFSET();
578#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000579
580 opcode = NEXTOP();
581 if (HAS_ARG(opcode))
582 oparg = NEXTARG();
583
Guido van Rossum96a42c81992-01-12 02:29:51 +0000584#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 /* Instruction tracing */
586
Guido van Rossum96a42c81992-01-12 02:29:51 +0000587 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000588 if (HAS_ARG(opcode)) {
589 printf("%d: %d, %d\n",
590 (int) (INSTR_OFFSET() - 3),
591 opcode, oparg);
592 }
593 else {
594 printf("%d: %d\n",
595 (int) (INSTR_OFFSET() - 1), opcode);
596 }
597 }
598#endif
599
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000600 if (!CHECK_STACK(3)) {
601 x = NULL;
602 break;
603 }
604
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 /* Main switch on opcode */
606
607 switch (opcode) {
608
609 /* BEWARE!
610 It is essential that any operation that fails sets either
611 x to NULL, err to nonzero, or why to anything but WHY_NOT,
612 and that no operation that succeeds does this! */
613
614 /* case STOP_CODE: this is an error! */
615
616 case POP_TOP:
617 v = POP();
618 DECREF(v);
619 break;
620
621 case ROT_TWO:
622 v = POP();
623 w = POP();
624 PUSH(v);
625 PUSH(w);
626 break;
627
628 case ROT_THREE:
629 v = POP();
630 w = POP();
631 x = POP();
632 PUSH(v);
633 PUSH(x);
634 PUSH(w);
635 break;
636
637 case DUP_TOP:
638 v = TOP();
639 INCREF(v);
640 PUSH(v);
641 break;
642
643 case UNARY_POSITIVE:
644 v = POP();
645 x = pos(v);
646 DECREF(v);
647 PUSH(x);
648 break;
649
650 case UNARY_NEGATIVE:
651 v = POP();
652 x = neg(v);
653 DECREF(v);
654 PUSH(x);
655 break;
656
657 case UNARY_NOT:
658 v = POP();
659 x = not(v);
660 DECREF(v);
661 PUSH(x);
662 break;
663
664 case UNARY_CONVERT:
665 v = POP();
666 x = reprobject(v);
667 DECREF(v);
668 PUSH(x);
669 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000670
671 case UNARY_INVERT:
672 v = POP();
673 x = invert(v);
674 DECREF(v);
675 PUSH(x);
676 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000677
678 case BINARY_MULTIPLY:
679 w = POP();
680 v = POP();
681 x = mul(v, w);
682 DECREF(v);
683 DECREF(w);
684 PUSH(x);
685 break;
686
687 case BINARY_DIVIDE:
688 w = POP();
689 v = POP();
690 x = divide(v, w);
691 DECREF(v);
692 DECREF(w);
693 PUSH(x);
694 break;
695
696 case BINARY_MODULO:
697 w = POP();
698 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000699 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 DECREF(v);
701 DECREF(w);
702 PUSH(x);
703 break;
704
705 case BINARY_ADD:
706 w = POP();
707 v = POP();
708 x = add(v, w);
709 DECREF(v);
710 DECREF(w);
711 PUSH(x);
712 break;
713
714 case BINARY_SUBTRACT:
715 w = POP();
716 v = POP();
717 x = sub(v, w);
718 DECREF(v);
719 DECREF(w);
720 PUSH(x);
721 break;
722
723 case BINARY_SUBSCR:
724 w = POP();
725 v = POP();
726 x = apply_subscript(v, w);
727 DECREF(v);
728 DECREF(w);
729 PUSH(x);
730 break;
731
Guido van Rossum7928cd71991-10-24 14:59:31 +0000732 case BINARY_LSHIFT:
733 w = POP();
734 v = POP();
735 x = lshift(v, w);
736 DECREF(v);
737 DECREF(w);
738 PUSH(x);
739 break;
740
741 case BINARY_RSHIFT:
742 w = POP();
743 v = POP();
744 x = rshift(v, w);
745 DECREF(v);
746 DECREF(w);
747 PUSH(x);
748 break;
749
750 case BINARY_AND:
751 w = POP();
752 v = POP();
753 x = and(v, w);
754 DECREF(v);
755 DECREF(w);
756 PUSH(x);
757 break;
758
759 case BINARY_XOR:
760 w = POP();
761 v = POP();
762 x = xor(v, w);
763 DECREF(v);
764 DECREF(w);
765 PUSH(x);
766 break;
767
768 case BINARY_OR:
769 w = POP();
770 v = POP();
771 x = or(v, w);
772 DECREF(v);
773 DECREF(w);
774 PUSH(x);
775 break;
776
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 case SLICE+0:
778 case SLICE+1:
779 case SLICE+2:
780 case SLICE+3:
781 if ((opcode-SLICE) & 2)
782 w = POP();
783 else
784 w = NULL;
785 if ((opcode-SLICE) & 1)
786 v = POP();
787 else
788 v = NULL;
789 u = POP();
790 x = apply_slice(u, v, w);
791 DECREF(u);
792 XDECREF(v);
793 XDECREF(w);
794 PUSH(x);
795 break;
796
797 case STORE_SLICE+0:
798 case STORE_SLICE+1:
799 case STORE_SLICE+2:
800 case STORE_SLICE+3:
801 if ((opcode-STORE_SLICE) & 2)
802 w = POP();
803 else
804 w = NULL;
805 if ((opcode-STORE_SLICE) & 1)
806 v = POP();
807 else
808 v = NULL;
809 u = POP();
810 t = POP();
811 err = assign_slice(u, v, w, t); /* u[v:w] = t */
812 DECREF(t);
813 DECREF(u);
814 XDECREF(v);
815 XDECREF(w);
816 break;
817
818 case DELETE_SLICE+0:
819 case DELETE_SLICE+1:
820 case DELETE_SLICE+2:
821 case DELETE_SLICE+3:
822 if ((opcode-DELETE_SLICE) & 2)
823 w = POP();
824 else
825 w = NULL;
826 if ((opcode-DELETE_SLICE) & 1)
827 v = POP();
828 else
829 v = NULL;
830 u = POP();
831 err = assign_slice(u, v, w, (object *)NULL);
832 /* del u[v:w] */
833 DECREF(u);
834 XDECREF(v);
835 XDECREF(w);
836 break;
837
838 case STORE_SUBSCR:
839 w = POP();
840 v = POP();
841 u = POP();
842 /* v[w] = u */
843 err = assign_subscript(v, w, u);
844 DECREF(u);
845 DECREF(v);
846 DECREF(w);
847 break;
848
849 case DELETE_SUBSCR:
850 w = POP();
851 v = POP();
852 /* del v[w] */
853 err = assign_subscript(v, w, (object *)NULL);
854 DECREF(v);
855 DECREF(w);
856 break;
857
858 case PRINT_EXPR:
859 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000861 /* Before printing, also assign to '_' */
862 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000863 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000864 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000866 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000867 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000868 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 flushline();
870 }
871 DECREF(v);
872 break;
873
874 case PRINT_ITEM:
875 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000876 w = sysget("stdout");
877 if (softspace(w, 1))
878 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000879 err = writeobject(v, w, PRINT_RAW);
880 if (err == 0 && is_stringobject(v)) {
881 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000882 char *s = getstringvalue(v);
883 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000884 if (len > 0 &&
885 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000886 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000887 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000888 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 DECREF(v);
890 break;
891
892 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000893 x = sysget("stdout");
894 if (x == NULL)
895 err_setstr(RuntimeError, "lost sys.stdout");
896 else {
897 writestring("\n", x);
898 softspace(x, 0);
899 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 break;
901
902 case BREAK_LOOP:
903 why = WHY_BREAK;
904 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000905
Guido van Rossumf10570b1995-07-07 22:53:21 +0000906 case RAISE_VARARGS:
907 u = v = w = NULL;
908 switch (oparg) {
909 case 3:
910 u = POP(); /* traceback */
911 if (u == None) {
912 DECREF(u);
913 u = NULL;
914 }
Guido van Rossum9d78d8d1995-09-18 21:29:36 +0000915 else if (!PyTraceBack_Check(u)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000916 err_setstr(TypeError,
917 "raise 3rd arg must be traceback or None");
918 goto raise_error;
919 }
920 /* Fallthrough */
921 case 2:
922 v = POP(); /* value */
923 /* Fallthrough */
924 case 1:
925 w = POP(); /* exc */
926 break;
927 default:
928 err_setstr(SystemError,
929 "bad RAISE_VARARGS oparg");
930 goto raise_error;
931 }
932 if (v == NULL) {
933 v = None;
934 INCREF(v);
935 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000936 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000937 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000938 t = w;
939 w = GETTUPLEITEM(w, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000940 INCREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000941 DECREF(t);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000942 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000943 if (is_stringobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000944 ;
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000945 } else if (is_classobject(w)) {
946 if (!is_instanceobject(v)
947 || !issubclass((object*)((instanceobject*)v)->in_class,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000948 w)) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000949 err_setstr(TypeError,
950 "a class exception must have a value that is an instance of the class");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000951 goto raise_error;
952 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000953 } else if (is_instanceobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000954 if (v != None) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000955 err_setstr(TypeError,
956 "an instance exception may not have a separate value");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000957 goto raise_error;
958 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000959 else {
960 DECREF(v);
961 v = w;
962 w = (object*) ((instanceobject*)w)->in_class;
963 INCREF(w);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000964 }
Guido van Rossumf10570b1995-07-07 22:53:21 +0000965 }
966 else {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000967 err_setstr(TypeError,
968 "exceptions must be strings, classes, or instances");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000969 goto raise_error;
970 }
971 err_restore(w, v, u);
972 if (u == NULL)
973 why = WHY_EXCEPTION;
974 else
975 why = WHY_RERAISE;
976 break;
977 raise_error:
978 XDECREF(v);
979 XDECREF(w);
980 XDECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 why = WHY_EXCEPTION;
982 break;
983
984 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000985 if ((x = f->f_locals) == NULL) {
986 err_setstr(SystemError, "no locals");
987 break;
988 }
989 INCREF(x);
990 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000991 break;
992
993 case RETURN_VALUE:
994 retval = POP();
995 why = WHY_RETURN;
996 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000997
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000998 case EXEC_STMT:
999 w = POP();
1000 v = POP();
1001 u = POP();
1002 err = exec_statement(u, v, w);
1003 DECREF(u);
1004 DECREF(v);
1005 DECREF(w);
1006 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001007
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 case POP_BLOCK:
1009 {
1010 block *b = pop_block(f);
1011 while (STACK_LEVEL() > b->b_level) {
1012 v = POP();
1013 DECREF(v);
1014 }
1015 }
1016 break;
1017
1018 case END_FINALLY:
1019 v = POP();
1020 if (is_intobject(v)) {
1021 why = (enum why_code) getintvalue(v);
1022 if (why == WHY_RETURN)
1023 retval = POP();
1024 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001025 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001027 u = POP();
1028 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001030 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 }
1032 else if (v != None) {
1033 err_setstr(SystemError,
1034 "'finally' pops bad exception");
1035 why = WHY_EXCEPTION;
1036 }
1037 DECREF(v);
1038 break;
1039
1040 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001041 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001042 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001043 w = POP();
1044 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001046 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 DECREF(v);
1048 DECREF(w);
1049 break;
1050
1051 case STORE_NAME:
1052 w = GETNAMEV(oparg);
1053 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001054 if ((x = f->f_locals) == NULL) {
1055 err_setstr(SystemError, "no locals");
1056 break;
1057 }
1058 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001059 if (u == NULL) {
1060 if (defmode != 0) {
1061 if (v != None)
1062 u = (object *)v->ob_type;
1063 else
1064 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001065 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001066 (typeobject *)u,
1067 defmode);
1068 DECREF(v);
1069 if (x == NULL)
1070 break;
1071 v = x;
1072 }
1073 }
1074 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001075 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001076 DECREF(v);
1077 break;
1078 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001079 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001080 DECREF(v);
1081 break;
1082
1083 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001084 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001085 if ((x = f->f_locals) == NULL) {
1086 err_setstr(SystemError, "no locals");
1087 break;
1088 }
1089 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001090 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001091 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001092 (object *)NULL);
1093 break;
1094 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001095 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001096 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001098
1099#ifdef CASE_TOO_BIG
1100 default: switch (opcode) {
1101#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001102
1103 case UNPACK_TUPLE:
1104 v = POP();
1105 if (!is_tupleobject(v)) {
1106 err_setstr(TypeError, "unpack non-tuple");
1107 why = WHY_EXCEPTION;
1108 }
1109 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001110 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 "unpack tuple of wrong size");
1112 why = WHY_EXCEPTION;
1113 }
1114 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001115 if (!CHECK_STACK(oparg)) {
1116 x = NULL;
1117 break;
1118 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001120 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 INCREF(w);
1122 PUSH(w);
1123 }
1124 }
1125 DECREF(v);
1126 break;
1127
1128 case UNPACK_LIST:
1129 v = POP();
1130 if (!is_listobject(v)) {
1131 err_setstr(TypeError, "unpack non-list");
1132 why = WHY_EXCEPTION;
1133 }
1134 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001135 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 "unpack list of wrong size");
1137 why = WHY_EXCEPTION;
1138 }
1139 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001140 if (!CHECK_STACK(oparg)) {
1141 x = NULL;
1142 break;
1143 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 for (; --oparg >= 0; ) {
1145 w = getlistitem(v, oparg);
1146 INCREF(w);
1147 PUSH(w);
1148 }
1149 }
1150 DECREF(v);
1151 break;
1152
1153 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001154 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 v = POP();
1156 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001157 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 DECREF(v);
1159 DECREF(u);
1160 break;
1161
1162 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001163 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001165 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 DECREF(v);
1167 break;
1168
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001169 case STORE_GLOBAL:
1170 w = GETNAMEV(oparg);
1171 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001172 if (f->f_locals != NULL) {
1173 u = dict2lookup(f->f_locals, w);
1174 if (u != NULL && is_accessobject(u)) {
1175 err = setaccessvalue(u, f->f_globals,
1176 v);
1177 DECREF(v);
1178 break;
1179 }
Guido van Rossum25831651993-05-19 14:50:45 +00001180 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001181 err = dict2insert(f->f_globals, w, v);
1182 DECREF(v);
1183 break;
1184
1185 case DELETE_GLOBAL:
1186 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001187 if (f->f_locals != NULL) {
1188 u = dict2lookup(f->f_locals, w);
1189 if (u != NULL && is_accessobject(u)) {
1190 err = setaccessvalue(u, f->f_globals,
1191 (object *)NULL);
1192 break;
1193 }
Guido van Rossum25831651993-05-19 14:50:45 +00001194 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001195 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001196 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001197 break;
1198
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 case LOAD_CONST:
1200 x = GETCONST(oparg);
1201 INCREF(x);
1202 PUSH(x);
1203 break;
1204
1205 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001206 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001207 if ((x = f->f_locals) == NULL) {
1208 err_setstr(SystemError, "no locals");
1209 break;
1210 }
1211 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001213 err_clear();
1214 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001216 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001217 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001218 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001219 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 break;
1221 }
1222 }
1223 }
Guido van Rossum25831651993-05-19 14:50:45 +00001224 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001225 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001226 if (x == NULL)
1227 break;
1228 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001229 else
1230 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 PUSH(x);
1232 break;
1233
1234 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001235 w = GETNAMEV(oparg);
1236 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001238 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001239 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001241 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
1243 }
1244 }
Guido van Rossum25831651993-05-19 14:50:45 +00001245 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001246 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001247 if (x == NULL)
1248 break;
1249 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001250 else
1251 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 PUSH(x);
1253 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001254
1255#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001257 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001258 if ((x = f->f_locals) == NULL) {
1259 err_setstr(SystemError, "no locals");
1260 break;
1261 }
1262 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001264 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
1266 }
Guido van Rossum25831651993-05-19 14:50:45 +00001267 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001268 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001269 if (x == NULL)
1270 break;
1271 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001272 else
1273 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 PUSH(x);
1275 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001276#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001277
1278 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001279 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001280 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001281 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001282 gettupleitem(co->co_varnames,
1283 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001284 break;
1285 }
Guido van Rossum25831651993-05-19 14:50:45 +00001286 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001287 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001288 if (x == NULL)
1289 break;
1290 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001291 else
1292 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001293 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001294 break;
1295
1296 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001297 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001298 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001299 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001300 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001301 DECREF(v);
1302 break;
1303 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001304 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001305 break;
1306
1307 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001308 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001309 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001310 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001311 gettupleitem(co->co_varnames,
1312 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001313 break;
1314 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001315 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001316 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001317 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001318 break;
1319 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001320 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001321 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001322
1323 case BUILD_TUPLE:
1324 x = newtupleobject(oparg);
1325 if (x != NULL) {
1326 for (; --oparg >= 0;) {
1327 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001328 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 }
1330 PUSH(x);
1331 }
1332 break;
1333
1334 case BUILD_LIST:
1335 x = newlistobject(oparg);
1336 if (x != NULL) {
1337 for (; --oparg >= 0;) {
1338 w = POP();
1339 err = setlistitem(x, oparg, w);
1340 if (err != 0)
1341 break;
1342 }
1343 PUSH(x);
1344 }
1345 break;
1346
1347 case BUILD_MAP:
1348 x = newdictobject();
1349 PUSH(x);
1350 break;
1351
1352 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001353 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001355 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 DECREF(v);
1357 PUSH(x);
1358 break;
1359
1360 case COMPARE_OP:
1361 w = POP();
1362 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001363 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 DECREF(v);
1365 DECREF(w);
1366 PUSH(x);
1367 break;
1368
1369 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001371 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372 if (x == NULL) {
1373 err_setstr(ImportError,
1374 "__import__ not found");
1375 break;
1376 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001377 if (is_methodobject(x)) {
1378 u = None;
1379 INCREF(u);
1380 }
1381 else {
1382 u = find_from_args(f, INSTR_OFFSET());
1383 if (u == NULL) {
1384 x = u;
1385 break;
1386 }
1387 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001388 w = mkvalue("(OOOO)",
1389 w,
1390 f->f_globals,
1391 f->f_locals == NULL ? None : f->f_locals,
1392 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001393 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001394 if (w == NULL) {
1395 x = NULL;
1396 break;
1397 }
1398 x = call_object(x, w);
1399 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001400 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
1402
1403 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001404 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001406 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001407 if ((x = f->f_locals) == NULL) {
1408 err_setstr(SystemError, "no locals");
1409 break;
1410 }
1411 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001412 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001414
1415 case ACCESS_MODE:
1416 v = POP();
1417 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001418 if (getstringvalue(w)[0] == '*')
1419 defmode = getintvalue(v);
1420 else
1421 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001422 DECREF(v);
1423 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001424
1425 case JUMP_FORWARD:
1426 JUMPBY(oparg);
1427 break;
1428
1429 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001430 err = testbool(TOP());
1431 if (err > 0)
1432 err = 0;
1433 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 JUMPBY(oparg);
1435 break;
1436
1437 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001438 err = testbool(TOP());
1439 if (err > 0) {
1440 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001442 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 break;
1444
1445 case JUMP_ABSOLUTE:
1446 JUMPTO(oparg);
1447 break;
1448
1449 case FOR_LOOP:
1450 /* for v in s: ...
1451 On entry: stack contains s, i.
1452 On exit: stack contains s, i+1, s[i];
1453 but if loop exhausted:
1454 s, i are popped, and we jump */
1455 w = POP(); /* Loop index */
1456 v = POP(); /* Sequence object */
1457 u = loop_subscript(v, w);
1458 if (u != NULL) {
1459 PUSH(v);
1460 x = newintobject(getintvalue(w)+1);
1461 PUSH(x);
1462 DECREF(w);
1463 PUSH(u);
1464 }
1465 else {
1466 DECREF(v);
1467 DECREF(w);
1468 /* A NULL can mean "s exhausted"
1469 but also an error: */
1470 if (err_occurred())
1471 why = WHY_EXCEPTION;
1472 else
1473 JUMPBY(oparg);
1474 }
1475 break;
1476
1477 case SETUP_LOOP:
1478 case SETUP_EXCEPT:
1479 case SETUP_FINALLY:
1480 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1481 STACK_LEVEL());
1482 break;
1483
1484 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001485#ifdef LLTRACE
1486 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001487 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001488#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001489 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001490 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001491 /* Trace each line of code reached */
1492 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001493 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001494 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001495 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497
1498 case CALL_FUNCTION:
1499 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001500 int na = oparg & 0xff;
1501 int nk = (oparg>>8) & 0xff;
1502 int n = na + 2*nk;
1503 object **pfunc = stack_pointer - n - 1;
1504 object *func = *pfunc;
1505 object *self = NULL;
1506 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001507 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508 if (is_instancemethodobject(func)) {
1509 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001510 class = instancemethodgetclass(func);
1511 func = instancemethodgetfunc(func);
1512 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001513 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001514 INCREF(self);
1515 DECREF(*pfunc);
1516 *pfunc = self;
1517 na++;
1518 n++;
1519 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 else {
1521 /* Unbound methods must be
1522 called with an instance of
1523 the class (or a derived
1524 class) as first argument */
1525 if (na > 0 &&
1526 (self = stack_pointer[-n])
1527 != NULL &&
1528 is_instanceobject(self) &&
1529 issubclass(
1530 (object *)
1531 (((instanceobject *)self)
1532 ->in_class),
1533 class))
1534 /* Handy-dandy */ ;
1535 else {
1536 err_setstr(TypeError,
1537 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001538 x = NULL;
1539 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001540 }
1541 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001542 }
1543 else
1544 INCREF(func);
1545 if (is_funcobject(func)) {
1546 object *co = getfunccode(func);
1547 object *globals = getfuncglobals(func);
1548 object *argdefs = PyFunction_GetDefaults(func);
1549 object **d;
1550 int nd;
1551 if (argdefs != NULL) {
1552 d = &GETTUPLEITEM(argdefs, 0);
1553 nd = ((tupleobject *)argdefs)->ob_size;
1554 }
1555 else {
1556 d = NULL;
1557 nd = 0;
1558 }
1559 x = eval_code2(
1560 (codeobject *)co,
1561 globals, (object *)NULL,
1562 stack_pointer-n, na,
1563 stack_pointer-2*nk, nk,
1564 d, nd,
1565 class);
1566 }
1567 else {
1568 object *args = newtupleobject(na);
1569 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001570 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001571 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001572 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001573 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001574 if (nk > 0) {
1575 kwdict = newdictobject();
1576 if (kwdict == NULL) {
1577 x = NULL;
1578 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001579 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001580 err = 0;
1581 while (--nk >= 0) {
1582 object *value = POP();
1583 object *key = POP();
1584 err = mappinginsert(
1585 kwdict, key, value);
1586 if (err) {
1587 DECREF(key);
1588 DECREF(value);
1589 break;
1590 }
1591 }
1592 if (err) {
1593 DECREF(args);
1594 DECREF(kwdict);
1595 break;
1596 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001597 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001598 while (--na >= 0) {
1599 w = POP();
1600 SETTUPLEITEM(args, na, w);
1601 }
1602 x = PyEval_CallObjectWithKeywords(
1603 func, args, kwdict);
1604 DECREF(args);
1605 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 }
1607 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 while (stack_pointer > pfunc) {
1609 w = POP();
1610 DECREF(w);
1611 }
1612 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001613 break;
1614 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001615
Guido van Rossum681d79a1995-07-18 14:51:37 +00001616 case MAKE_FUNCTION:
1617 v = POP(); /* code object */
1618 x = newfuncobject(v, f->f_globals);
1619 DECREF(v);
1620 /* XXX Maybe this should be a separate opcode? */
1621 if (x != NULL && oparg > 0) {
1622 v = newtupleobject(oparg);
1623 if (v == NULL) {
1624 DECREF(x);
1625 x = NULL;
1626 break;
1627 }
1628 while (--oparg >= 0) {
1629 w = POP();
1630 SETTUPLEITEM(v, oparg, w);
1631 }
1632 err = PyFunction_SetDefaults(x, v);
1633 DECREF(v);
1634 }
1635 PUSH(x);
1636 break;
1637
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 default:
1639 fprintf(stderr,
1640 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001641 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001642 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 why = WHY_EXCEPTION;
1644 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001645
1646#ifdef CASE_TOO_BIG
1647 }
1648#endif
1649
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 } /* switch */
1651
1652 on_error:
1653
1654 /* Quickly continue if no error occurred */
1655
1656 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001657 if (err == 0 && x != NULL) {
1658#ifdef CHECKEXC
1659 if (err_occurred())
1660 fprintf(stderr,
1661 "XXX undetected error\n");
1662 else
1663#endif
1664 continue; /* Normal, fast path */
1665 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 why = WHY_EXCEPTION;
1667 x = None;
1668 err = 0;
1669 }
1670
Guido van Rossum801dcae1992-04-08 11:32:32 +00001671#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 /* Double-check exception status */
1673
1674 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1675 if (!err_occurred()) {
1676 fprintf(stderr, "XXX ghost error\n");
1677 err_setstr(SystemError, "ghost error");
1678 why = WHY_EXCEPTION;
1679 }
1680 }
1681 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001682 if (err_occurred()) {
1683 fprintf(stderr,
1684 "XXX undetected error (why=%d)\n",
1685 why);
1686 why = WHY_EXCEPTION;
1687 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 }
1689#endif
1690
1691 /* Log traceback info if this is a real exception */
1692
1693 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001694 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 f->f_lasti -= 2;
1697 tb_here(f);
1698
Guido van Rossume59214e1994-08-30 08:01:59 +00001699 if (f->f_trace)
1700 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001701 if (sys_profile)
1702 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 }
1704
1705 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1706
1707 if (why == WHY_RERAISE)
1708 why = WHY_EXCEPTION;
1709
1710 /* Unwind stacks if a (pseudo) exception occurred */
1711
1712 while (why != WHY_NOT && f->f_iblock > 0) {
1713 block *b = pop_block(f);
1714 while (STACK_LEVEL() > b->b_level) {
1715 v = POP();
1716 XDECREF(v);
1717 }
1718 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1719 why = WHY_NOT;
1720 JUMPTO(b->b_handler);
1721 break;
1722 }
1723 if (b->b_type == SETUP_FINALLY ||
1724 b->b_type == SETUP_EXCEPT &&
1725 why == WHY_EXCEPTION) {
1726 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001727 object *exc, *val, *tb;
1728 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 if (val == NULL) {
1730 val = None;
1731 INCREF(val);
1732 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 /* Make the raw exception data
1734 available to the handler,
1735 so a program can emulate the
1736 Python main loop. Don't do
1737 this for 'finally'. */
1738 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001739 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 sysset("exc_value", val);
1741 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001743 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 PUSH(val);
1745 PUSH(exc);
1746 }
1747 else {
1748 if (why == WHY_RETURN)
1749 PUSH(retval);
1750 v = newintobject((long)why);
1751 PUSH(v);
1752 }
1753 why = WHY_NOT;
1754 JUMPTO(b->b_handler);
1755 break;
1756 }
1757 } /* unwind stack */
1758
1759 /* End the loop if we still have an error (or return) */
1760
1761 if (why != WHY_NOT)
1762 break;
1763
1764 } /* main loop */
1765
1766 /* Pop remaining stack entries */
1767
1768 while (!EMPTY()) {
1769 v = POP();
1770 XDECREF(v);
1771 }
1772
Guido van Rossum96a42c81992-01-12 02:29:51 +00001773 if (why != WHY_RETURN)
1774 retval = NULL;
1775
Guido van Rossume59214e1994-08-30 08:01:59 +00001776 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001777 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001778 if (call_trace(&f->f_trace, &f->f_trace, f,
1779 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001780 XDECREF(retval);
1781 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001782 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001783 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001784 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001785 }
1786
1787 if (sys_profile && why == WHY_RETURN) {
1788 if (call_trace(&sys_profile, (object**)0,
1789 f, "return", retval)) {
1790 XDECREF(retval);
1791 retval = NULL;
1792 why = WHY_EXCEPTION;
1793 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001794 }
1795
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001797
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 current_frame = f->f_back;
1799 DECREF(f);
1800
Guido van Rossum96a42c81992-01-12 02:29:51 +00001801 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001802}
1803
Guido van Rossum96a42c81992-01-12 02:29:51 +00001804#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001805static int
1806prtrace(v, str)
1807 object *v;
1808 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001809{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001810 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001811 if (printobject(v, stdout, 0) != 0)
1812 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001813 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001817static void
1818call_exc_trace(p_trace, p_newtrace, f)
1819 object **p_trace, **p_newtrace;
1820 frameobject *f;
1821{
1822 object *type, *value, *traceback, *arg;
1823 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001824 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001825 if (value == NULL) {
1826 value = None;
1827 INCREF(value);
1828 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001829 arg = mkvalue("(OOO)", type, value, traceback);
1830 if (arg == NULL) {
1831 err_restore(type, value, traceback);
1832 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001833 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001834 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1835 DECREF(arg);
1836 if (err == 0)
1837 err_restore(type, value, traceback);
1838 else {
1839 XDECREF(type);
1840 XDECREF(value);
1841 XDECREF(traceback);
1842 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001843}
1844
1845static int
1846call_trace(p_trace, p_newtrace, f, msg, arg)
1847 object **p_trace; /* in/out; may not be NULL;
1848 may not point to NULL variable initially */
1849 object **p_newtrace; /* in/out; may be NULL;
1850 may point to NULL variable;
1851 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852 frameobject *f;
1853 char *msg;
1854 object *arg;
1855{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001856 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001857 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001858 static int tracing = 0;
1859
1860 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001861 /* Don't do recursive traces */
1862 if (p_newtrace) {
1863 XDECREF(*p_newtrace);
1864 *p_newtrace = NULL;
1865 }
1866 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001867 }
1868
Guido van Rossumf10570b1995-07-07 22:53:21 +00001869 args = newtupleobject(3);
1870 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001871 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001872 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001873 if (what == NULL)
1874 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001875 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001876 SETTUPLEITEM(args, 0, (object *)f);
1877 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001878 if (arg == NULL)
1879 arg = None;
1880 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001881 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001882 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001883 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001884 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001885 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001886 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001887 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001888 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001889 if (res == NULL) {
1890 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001891 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001892 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001893 *p_trace = NULL;
1894 if (p_newtrace) {
1895 XDECREF(*p_newtrace);
1896 *p_newtrace = NULL;
1897 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001898 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001899 }
1900 else {
1901 if (p_newtrace) {
1902 XDECREF(*p_newtrace);
1903 if (res == None)
1904 *p_newtrace = NULL;
1905 else {
1906 INCREF(res);
1907 *p_newtrace = res;
1908 }
1909 }
1910 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001911 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001912 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001913}
1914
Guido van Rossum3f5da241990-12-20 15:06:42 +00001915object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001916getbuiltins()
1917{
1918 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001919 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001920 else
1921 return current_frame->f_builtins;
1922}
1923
1924object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001925getlocals()
1926{
1927 if (current_frame == NULL)
1928 return NULL;
1929 fast_2_locals(current_frame);
1930 return current_frame->f_locals;
1931}
1932
1933object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001934getglobals()
1935{
1936 if (current_frame == NULL)
1937 return NULL;
1938 else
1939 return current_frame->f_globals;
1940}
1941
Guido van Rossum81daa321993-05-20 14:24:46 +00001942object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001943getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001944{
1945 if (current_frame == NULL)
1946 return NULL;
1947 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001948 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001949}
1950
Guido van Rossume59214e1994-08-30 08:01:59 +00001951object *
1952getframe()
1953{
1954 return (object *)current_frame;
1955}
1956
Guido van Rossum6135a871995-01-09 17:53:26 +00001957int
1958getrestricted()
1959{
1960 return current_frame == NULL ? 0 : current_frame->f_restricted;
1961}
1962
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964flushline()
1965{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001966 object *f = sysget("stdout");
1967 if (softspace(f, 0))
1968 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969}
1970
Guido van Rossum3f5da241990-12-20 15:06:42 +00001971
Guido van Rossum06186511995-01-07 12:40:10 +00001972#define BINOP(opname, ropname, thisfunc) \
1973 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1974 ; \
1975 else \
1976 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001977
1978
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001980or(v, w)
1981 object *v, *w;
1982{
Guido van Rossum06186511995-01-07 12:40:10 +00001983 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001984 if (v->ob_type->tp_as_number != NULL) {
1985 object *x;
1986 object * (*f) FPROTO((object *, object *));
1987 if (coerce(&v, &w) != 0)
1988 return NULL;
1989 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1990 x = (*f)(v, w);
1991 DECREF(v);
1992 DECREF(w);
1993 if (f != NULL)
1994 return x;
1995 }
1996 err_setstr(TypeError, "bad operand type(s) for |");
1997 return NULL;
1998}
1999
2000static object *
2001xor(v, w)
2002 object *v, *w;
2003{
Guido van Rossum06186511995-01-07 12:40:10 +00002004 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002005 if (v->ob_type->tp_as_number != NULL) {
2006 object *x;
2007 object * (*f) FPROTO((object *, object *));
2008 if (coerce(&v, &w) != 0)
2009 return NULL;
2010 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2011 x = (*f)(v, w);
2012 DECREF(v);
2013 DECREF(w);
2014 if (f != NULL)
2015 return x;
2016 }
2017 err_setstr(TypeError, "bad operand type(s) for ^");
2018 return NULL;
2019}
2020
2021static object *
2022and(v, w)
2023 object *v, *w;
2024{
Guido van Rossum06186511995-01-07 12:40:10 +00002025 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002026 if (v->ob_type->tp_as_number != NULL) {
2027 object *x;
2028 object * (*f) FPROTO((object *, object *));
2029 if (coerce(&v, &w) != 0)
2030 return NULL;
2031 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2032 x = (*f)(v, w);
2033 DECREF(v);
2034 DECREF(w);
2035 if (f != NULL)
2036 return x;
2037 }
2038 err_setstr(TypeError, "bad operand type(s) for &");
2039 return NULL;
2040}
2041
2042static object *
2043lshift(v, w)
2044 object *v, *w;
2045{
Guido van Rossum06186511995-01-07 12:40:10 +00002046 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002047 if (v->ob_type->tp_as_number != NULL) {
2048 object *x;
2049 object * (*f) FPROTO((object *, object *));
2050 if (coerce(&v, &w) != 0)
2051 return NULL;
2052 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2053 x = (*f)(v, w);
2054 DECREF(v);
2055 DECREF(w);
2056 if (f != NULL)
2057 return x;
2058 }
2059 err_setstr(TypeError, "bad operand type(s) for <<");
2060 return NULL;
2061}
2062
2063static object *
2064rshift(v, w)
2065 object *v, *w;
2066{
Guido van Rossum06186511995-01-07 12:40:10 +00002067 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002068 if (v->ob_type->tp_as_number != NULL) {
2069 object *x;
2070 object * (*f) FPROTO((object *, object *));
2071 if (coerce(&v, &w) != 0)
2072 return NULL;
2073 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2074 x = (*f)(v, w);
2075 DECREF(v);
2076 DECREF(w);
2077 if (f != NULL)
2078 return x;
2079 }
2080 err_setstr(TypeError, "bad operand type(s) for >>");
2081 return NULL;
2082}
2083
2084static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002085add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 object *v, *w;
2087{
Guido van Rossum06186511995-01-07 12:40:10 +00002088 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002089 if (v->ob_type->tp_as_sequence != NULL)
2090 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2091 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002092 object *x;
2093 if (coerce(&v, &w) != 0)
2094 return NULL;
2095 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2096 DECREF(v);
2097 DECREF(w);
2098 return x;
2099 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002100 err_setstr(TypeError, "bad operand type(s) for +");
2101 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102}
2103
2104static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002106 object *v, *w;
2107{
Guido van Rossum06186511995-01-07 12:40:10 +00002108 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002109 if (v->ob_type->tp_as_number != NULL) {
2110 object *x;
2111 if (coerce(&v, &w) != 0)
2112 return NULL;
2113 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2114 DECREF(v);
2115 DECREF(w);
2116 return x;
2117 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002118 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119 return NULL;
2120}
2121
2122static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002123mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124 object *v, *w;
2125{
2126 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002127 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002128 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002129 if (tp->tp_as_number != NULL &&
2130 w->ob_type->tp_as_sequence != NULL &&
2131 !is_instanceobject(v)) {
2132 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 object *tmp = v;
2134 v = w;
2135 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002136 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002138 if (tp->tp_as_number != NULL) {
2139 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002140 if (is_instanceobject(v)) {
2141 /* Instances of user-defined classes get their
2142 other argument uncoerced, so they may
2143 implement sequence*number as well as
2144 number*number. */
2145 INCREF(v);
2146 INCREF(w);
2147 }
2148 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002149 return NULL;
2150 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2151 DECREF(v);
2152 DECREF(w);
2153 return x;
2154 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 if (tp->tp_as_sequence != NULL) {
2156 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002157 err_setstr(TypeError,
2158 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 return NULL;
2160 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161 return (*tp->tp_as_sequence->sq_repeat)
2162 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002164 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 return NULL;
2166}
2167
2168static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002169divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 object *v, *w;
2171{
Guido van Rossum06186511995-01-07 12:40:10 +00002172 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002173 if (v->ob_type->tp_as_number != NULL) {
2174 object *x;
2175 if (coerce(&v, &w) != 0)
2176 return NULL;
2177 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2178 DECREF(v);
2179 DECREF(w);
2180 return x;
2181 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002182 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 return NULL;
2184}
2185
2186static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002187mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 object *v, *w;
2189{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002190 if (is_stringobject(v)) {
2191 return formatstring(v, w);
2192 }
Guido van Rossum06186511995-01-07 12:40:10 +00002193 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002194 if (v->ob_type->tp_as_number != NULL) {
2195 object *x;
2196 if (coerce(&v, &w) != 0)
2197 return NULL;
2198 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2199 DECREF(v);
2200 DECREF(w);
2201 return x;
2202 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002203 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 return NULL;
2205}
2206
2207static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002208neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209 object *v;
2210{
2211 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002212 return (*v->ob_type->tp_as_number->nb_negative)(v);
2213 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 return NULL;
2215}
2216
2217static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 object *v;
2220{
2221 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002222 return (*v->ob_type->tp_as_number->nb_positive)(v);
2223 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 return NULL;
2225}
2226
2227static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002228invert(v)
2229 object *v;
2230{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002231 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002232 if (v->ob_type->tp_as_number != NULL &&
2233 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2234 return (*f)(v);
2235 err_setstr(TypeError, "bad operand type(s) for unary ~");
2236 return NULL;
2237}
2238
2239static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002240not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 object *v;
2242{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002243 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002244 object *w;
2245 if (outcome < 0)
2246 return NULL;
2247 if (outcome == 0)
2248 w = True;
2249 else
2250 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002251 INCREF(w);
2252 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253}
Guido van Rossum234f9421993-06-17 12:35:49 +00002254
2255
Guido van Rossum681d79a1995-07-18 14:51:37 +00002256/* External interface to call any callable object.
2257 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002258
2259object *
2260call_object(func, arg)
2261 object *func;
2262 object *arg;
2263{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002264 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2265}
Guido van Rossume59214e1994-08-30 08:01:59 +00002266
Guido van Rossum681d79a1995-07-18 14:51:37 +00002267object *
2268PyEval_CallObjectWithKeywords(func, arg, kw)
2269 object *func;
2270 object *arg;
2271 object *kw;
2272{
2273 ternaryfunc call;
2274 object *result;
2275
2276 if (arg == NULL)
2277 arg = newtupleobject(0);
2278 else if (!is_tupleobject(arg)) {
2279 err_setstr(TypeError, "argument list must be a tuple");
2280 return NULL;
2281 }
2282 else
2283 INCREF(arg);
2284
Guido van Rossume3e61c11995-08-04 04:14:47 +00002285 if (kw != NULL && !is_dictobject(kw)) {
2286 err_setstr(TypeError, "keyword list must be a dictionary");
2287 return NULL;
2288 }
2289
Guido van Rossum681d79a1995-07-18 14:51:37 +00002290 if (call = func->ob_type->tp_call)
2291 result = (*call)(func, arg, kw);
2292 else if (is_instancemethodobject(func) || is_funcobject(func))
2293 result = call_function(func, arg, kw);
2294 else
2295 result = call_builtin(func, arg, kw);
2296
2297 DECREF(arg);
2298
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002299 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002300 err_setstr(SystemError,
2301 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002302
2303 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002304}
2305
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002307call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002310 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 if (is_methodobject(func)) {
2313 method meth = getmethod(func);
2314 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002315 int flags = getflags(func);
2316 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002317 int size = gettuplesize(arg);
2318 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002319 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002320 else if (size == 0)
2321 arg = NULL;
2322 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002323 if (flags & METH_KEYWORDS)
2324 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002325 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002326 err_setstr(TypeError,
2327 "this function takes no keyword arguments");
2328 return NULL;
2329 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002330 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 }
2332 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002333 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002335 if (is_instanceobject(func)) {
2336 object *res, *call = getattr(func,"__call__");
2337 if (call == NULL) {
2338 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002339 err_setstr(AttributeError,
2340 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002341 return NULL;
2342 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002343 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002344 DECREF(call);
2345 return res;
2346 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 return NULL;
2349}
2350
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002352call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002355 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002357 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002358 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002359 object **d, **k;
2360 int nk, nd;
2361 object *result;
2362
2363 if (kw != NULL && !is_dictobject(kw)) {
2364 err_badcall();
2365 return NULL;
2366 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367
Guido van Rossume8122f11991-05-05 20:03:07 +00002368 if (is_instancemethodobject(func)) {
2369 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002370 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002371 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002372 if (self == NULL) {
2373 /* Unbound methods must be called with an instance of
2374 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002375 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002376 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002377 if (self != NULL &&
2378 is_instanceobject(self) &&
2379 issubclass((object *)
2380 (((instanceobject *)self)->in_class),
2381 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002382 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002383 else
2384 self = NULL;
2385 }
2386 if (self == NULL) {
2387 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002388 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002389 return NULL;
2390 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002392 }
2393 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002394 int argcount = gettuplesize(arg);
2395 object *newarg = newtupleobject(argcount + 1);
2396 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002397 if (newarg == NULL)
2398 return NULL;
2399 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002400 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002401 for (i = 0; i < argcount; i++) {
2402 object *v = GETTUPLEITEM(arg, i);
2403 XINCREF(v);
2404 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002405 }
2406 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 }
2408 }
2409 else {
2410 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 return NULL;
2413 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002414 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416
2417 argdefs = PyFunction_GetDefaults(func);
2418 if (argdefs != NULL && is_tupleobject(argdefs)) {
2419 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2420 nd = gettuplesize(argdefs);
2421 }
2422 else {
2423 d = NULL;
2424 nd = 0;
2425 }
2426
2427 if (kw != NULL) {
2428 int pos, i;
2429 nk = getmappingsize(kw);
2430 k = NEW(object *, 2*nk);
2431 if (k == NULL) {
2432 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002433 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002435 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002436 pos = i = 0;
2437 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2438 i += 2;
2439 nk = i/2;
2440 /* XXX This is broken if the caller deletes dict items! */
2441 }
2442 else {
2443 k = NULL;
2444 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446
Guido van Rossum681d79a1995-07-18 14:51:37 +00002447 result = eval_code2(
2448 (codeobject *)getfunccode(func),
2449 getfuncglobals(func), (object *)NULL,
2450 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2451 k, nk,
2452 d, nd,
2453 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454
Guido van Rossum681d79a1995-07-18 14:51:37 +00002455 DECREF(arg);
2456 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457
Guido van Rossum681d79a1995-07-18 14:51:37 +00002458 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459}
2460
2461static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 object *v, *w;
2464{
2465 typeobject *tp = v->ob_type;
2466 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002467 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 return NULL;
2469 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002470 if (tp->tp_as_mapping != NULL) {
2471 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2472 }
2473 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 int i;
2475 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002476 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 return NULL;
2478 }
2479 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002480 if (i < 0) {
2481 int len = (*tp->tp_as_sequence->sq_length)(v);
2482 if (len < 0)
2483 return NULL;
2484 i += len;
2485 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488}
2489
2490static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492 object *v, *w;
2493{
2494 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002495 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 return NULL;
2499 }
2500 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002501 v = (*sq->sq_item)(v, i);
2502 if (v)
2503 return v;
2504 if (err_occurred() == IndexError)
2505 err_clear();
2506 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507}
2508
2509static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511 object *v;
2512 int isize;
2513 int *pi;
2514{
2515 if (v != NULL) {
2516 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517 err_setstr(TypeError, "slice index must be int");
2518 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 }
2520 *pi = getintvalue(v);
2521 if (*pi < 0)
2522 *pi += isize;
2523 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525}
2526
2527static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002528apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 object *u, *v, *w;
2530{
2531 typeobject *tp = u->ob_type;
2532 int ilow, ihigh, isize;
2533 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002534 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 return NULL;
2536 }
2537 ilow = 0;
2538 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002539 if (isize < 0)
2540 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002541 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002543 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002545 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547
2548static int
2549assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 object *w;
2551 object *key;
2552 object *v;
2553{
2554 typeobject *tp = w->ob_type;
2555 sequence_methods *sq;
2556 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002557 int (*func1)();
2558 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002559 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002560 (func1 = mp->mp_ass_subscript) != NULL) {
2561 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002562 }
2563 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002564 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002566 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002567 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002570 else {
2571 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002572 if (i < 0) {
2573 int len = (*sq->sq_length)(w);
2574 if (len < 0)
2575 return -1;
2576 i += len;
2577 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002578 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002579 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002582 err_setstr(TypeError,
2583 "can't assign to this subscripted object");
2584 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586}
2587
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588static int
2589assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 object *u, *v, *w, *x;
2591{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002594 if (sq == NULL) {
2595 err_setstr(TypeError, "assign to slice of non-sequence");
2596 return -1;
2597 }
2598 if (sq == NULL || sq->sq_ass_slice == NULL) {
2599 err_setstr(TypeError, "unassignable slice");
2600 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 }
2602 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002604 if (isize < 0)
2605 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606 if (slice_index(v, isize, &ilow) != 0)
2607 return -1;
2608 if (slice_index(w, isize, &ihigh) != 0)
2609 return -1;
2610 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611}
2612
2613static int
2614cmp_exception(err, v)
2615 object *err, *v;
2616{
2617 if (is_tupleobject(v)) {
2618 int i, n;
2619 n = gettuplesize(v);
2620 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002621 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002622 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 return 1;
2624 }
2625 return 0;
2626 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002627 if (is_classobject(v) && is_classobject(err))
2628 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002629 return err == v;
2630}
2631
Guido van Rossum3f5da241990-12-20 15:06:42 +00002632static int
2633cmp_member(v, w)
2634 object *v, *w;
2635{
Guido van Rossume59214e1994-08-30 08:01:59 +00002636 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002637 object *x;
2638 sequence_methods *sq;
2639 /* Special case for char in string */
2640 if (is_stringobject(w)) {
2641 register char *s, *end;
2642 register char c;
2643 if (!is_stringobject(v) || getstringsize(v) != 1) {
2644 err_setstr(TypeError,
2645 "string member test needs char left operand");
2646 return -1;
2647 }
2648 c = getstringvalue(v)[0];
2649 s = getstringvalue(w);
2650 end = s + getstringsize(w);
2651 while (s < end) {
2652 if (c == *s++)
2653 return 1;
2654 }
2655 return 0;
2656 }
2657 sq = w->ob_type->tp_as_sequence;
2658 if (sq == NULL) {
2659 err_setstr(TypeError,
2660 "'in' or 'not in' needs sequence right argument");
2661 return -1;
2662 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002663 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002665 if (x == NULL) {
2666 if (err_occurred() == IndexError) {
2667 err_clear();
2668 break;
2669 }
2670 return -1;
2671 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002672 cmp = cmpobject(v, x);
2673 XDECREF(x);
2674 if (cmp == 0)
2675 return 1;
2676 }
2677 return 0;
2678}
2679
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002681cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002682 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683 register object *v;
2684 register object *w;
2685{
2686 register int cmp;
2687 register int res = 0;
2688 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002689 case IS:
2690 case IS_NOT:
2691 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002692 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002693 res = !res;
2694 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695 case IN:
2696 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002697 res = cmp_member(v, w);
2698 if (res < 0)
2699 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002700 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002701 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 break;
2703 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002704 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 break;
2706 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002707 cmp = cmpobject(v, w);
2708 switch (op) {
2709 case LT: res = cmp < 0; break;
2710 case LE: res = cmp <= 0; break;
2711 case EQ: res = cmp == 0; break;
2712 case NE: res = cmp != 0; break;
2713 case GT: res = cmp > 0; break;
2714 case GE: res = cmp >= 0; break;
2715 /* XXX no default? (res is initialized to 0 though) */
2716 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 }
2718 v = res ? True : False;
2719 INCREF(v);
2720 return v;
2721}
2722
Guido van Rossum3f5da241990-12-20 15:06:42 +00002723static int
2724import_from(locals, v, name)
2725 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002726 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002727 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002728{
2729 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002730 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002731 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002732 return -1;
2733 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002734 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002735 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002736 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002737 object *name, *value;
2738 pos = 0;
2739 while (mappinggetnext(w, &pos, &name, &value)) {
2740 if (!is_stringobject(name) ||
2741 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002742 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002743 if (is_accessobject(value)) {
2744 value = getaccessvalue(value, (object *)NULL);
2745 if (value == NULL) {
2746 err_clear();
2747 continue;
2748 }
2749 }
2750 else
2751 INCREF(value);
2752 err = dict2insert(locals, name, value);
2753 DECREF(value);
2754 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002755 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002756 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002757 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002758 }
2759 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002760 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002761 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002762 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002763 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002764 getstringvalue(name));
2765 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002766 return -1;
2767 }
2768 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002769 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002770 }
2771}
2772
2773static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002774build_class(methods, bases, name)
2775 object *methods; /* dictionary */
2776 object *bases; /* tuple containing classes */
2777 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002778{
Guido van Rossum25831651993-05-19 14:50:45 +00002779 int i;
2780 if (!is_tupleobject(bases)) {
2781 err_setstr(SystemError, "build_class with non-tuple bases");
2782 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002783 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002784 if (gettuplesize(bases) > 0) {
2785 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002786 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002787 /* Call the base's *type*, if it is callable.
2788 This code is a hook for Donald Beaudry's type extensions.
2789 In unexended Python it will never be triggered since its
2790 types are not callable. */
2791 if (base->ob_type->ob_type->tp_call) {
2792 object *args;
2793 object *class;
2794 args = mkvalue("(OOO)", name, bases, methods);
2795 class = call_object((object *)base->ob_type, args);
2796 DECREF(args);
2797 return class;
2798 }
2799 }
Guido van Rossum25831651993-05-19 14:50:45 +00002800 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002801 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002802 return NULL;
2803 }
Guido van Rossum25831651993-05-19 14:50:45 +00002804 if (!is_stringobject(name)) {
2805 err_setstr(SystemError, "build_class witn non-string name");
2806 return NULL;
2807 }
2808 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002809 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002810 if (!is_classobject(base)) {
2811 err_setstr(TypeError,
2812 "base is not a class object");
2813 return NULL;
2814 }
2815 }
2816 return newclassobject(bases, methods, name);
2817}
2818
2819static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002820access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002821 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002822 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002823 frameobject *f;
2824{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002825 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002826 object *value, *ac;
2827 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002828 int ret;
2829 fast_2_locals(f);
2830 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002831 if (value && is_accessobject(value)) {
2832 err_setstr(AccessError, "can't override access");
2833 return -1;
2834 }
2835 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002836 if (value != NULL && value != None)
2837 type = value->ob_type;
2838 else
2839 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002840 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002841 if (ac == NULL)
2842 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002843 ret = mappinginsert(f->f_locals, name, ac);
2844 DECREF(ac);
2845 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002846 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002847}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002848
2849static int
2850exec_statement(prog, globals, locals)
2851 object *prog;
2852 object *globals;
2853 object *locals;
2854{
2855 char *s;
2856 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002857 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002858 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002859
2860 if (is_tupleobject(prog) && globals == None && locals == None &&
2861 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2862 /* Backward compatibility hack */
2863 globals = gettupleitem(prog, 1);
2864 if (n == 3)
2865 locals = gettupleitem(prog, 2);
2866 prog = gettupleitem(prog, 0);
2867 }
2868 if (globals == None) {
2869 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002870 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002871 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002872 plain = 1;
2873 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002874 }
2875 else if (locals == None)
2876 locals = globals;
2877 if (!is_stringobject(prog) &&
2878 !is_codeobject(prog) &&
2879 !is_fileobject(prog)) {
2880 err_setstr(TypeError,
2881 "exec 1st arg must be string, code or file object");
2882 return -1;
2883 }
2884 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2885 err_setstr(TypeError,
2886 "exec 2nd/3rd args must be dict or None");
2887 return -1;
2888 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002889 if (dictlookup(globals, "__builtins__") == NULL)
2890 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002891 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002892 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002893 return -1;
2894 return 0;
2895 }
2896 if (is_fileobject(prog)) {
2897 FILE *fp = getfilefile(prog);
2898 char *name = getstringvalue(getfilename(prog));
2899 if (run_file(fp, name, file_input, globals, locals) == NULL)
2900 return -1;
2901 return 0;
2902 }
2903 s = getstringvalue(prog);
2904 if (strlen(s) != getstringsize(prog)) {
2905 err_setstr(ValueError, "embedded '\\0' in exec string");
2906 return -1;
2907 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002908 v = run_string(s, file_input, globals, locals);
2909 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002910 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002911 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002912 if (plain)
2913 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002914 return 0;
2915}
Guido van Rossum24c13741995-02-14 09:42:43 +00002916
Guido van Rossum681d79a1995-07-18 14:51:37 +00002917/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002918static object *
2919find_from_args(f, nexti)
2920 frameobject *f;
2921 int nexti;
2922{
2923 int opcode;
2924 int oparg;
2925 object *list, *name;
2926 unsigned char *next_instr;
2927
2928 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2929 opcode = (*next_instr++);
2930 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002931 INCREF(None);
2932 return None;
2933 }
2934
2935 list = newlistobject(0);
2936 if (list == NULL)
2937 return NULL;
2938
2939 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002940 oparg = (next_instr[1]<<8) + next_instr[0];
2941 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002942 name = Getnamev(f, oparg);
2943 if (addlistitem(list, name) < 0) {
2944 DECREF(list);
2945 break;
2946 }
2947 opcode = (*next_instr++);
2948 } while (opcode == IMPORT_FROM);
2949
2950 return list;
2951}