blob: 2b501c79e39e8fb84d0c6c49e79d69d8df1e7e2b [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 Rossum681d79a1995-07-18 14:51:37 +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;
1030 }
1031 else if (v != None) {
1032 err_setstr(SystemError,
1033 "'finally' pops bad exception");
1034 why = WHY_EXCEPTION;
1035 }
1036 DECREF(v);
1037 break;
1038
1039 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001040 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001042 w = POP();
1043 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001045 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 DECREF(v);
1047 DECREF(w);
1048 break;
1049
1050 case STORE_NAME:
1051 w = GETNAMEV(oparg);
1052 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001053 if ((x = f->f_locals) == NULL) {
1054 err_setstr(SystemError, "no locals");
1055 break;
1056 }
1057 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001058 if (u == NULL) {
1059 if (defmode != 0) {
1060 if (v != None)
1061 u = (object *)v->ob_type;
1062 else
1063 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001064 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001065 (typeobject *)u,
1066 defmode);
1067 DECREF(v);
1068 if (x == NULL)
1069 break;
1070 v = x;
1071 }
1072 }
1073 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001074 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001075 DECREF(v);
1076 break;
1077 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001078 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001079 DECREF(v);
1080 break;
1081
1082 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001083 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001084 if ((x = f->f_locals) == NULL) {
1085 err_setstr(SystemError, "no locals");
1086 break;
1087 }
1088 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001089 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001090 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001091 (object *)NULL);
1092 break;
1093 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001094 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001095 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001097
1098#ifdef CASE_TOO_BIG
1099 default: switch (opcode) {
1100#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001101
1102 case UNPACK_TUPLE:
1103 v = POP();
1104 if (!is_tupleobject(v)) {
1105 err_setstr(TypeError, "unpack non-tuple");
1106 why = WHY_EXCEPTION;
1107 }
1108 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001109 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 "unpack tuple of wrong size");
1111 why = WHY_EXCEPTION;
1112 }
1113 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001114 if (!CHECK_STACK(oparg)) {
1115 x = NULL;
1116 break;
1117 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001119 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 INCREF(w);
1121 PUSH(w);
1122 }
1123 }
1124 DECREF(v);
1125 break;
1126
1127 case UNPACK_LIST:
1128 v = POP();
1129 if (!is_listobject(v)) {
1130 err_setstr(TypeError, "unpack non-list");
1131 why = WHY_EXCEPTION;
1132 }
1133 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001134 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 "unpack list of wrong size");
1136 why = WHY_EXCEPTION;
1137 }
1138 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001139 if (!CHECK_STACK(oparg)) {
1140 x = NULL;
1141 break;
1142 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 for (; --oparg >= 0; ) {
1144 w = getlistitem(v, oparg);
1145 INCREF(w);
1146 PUSH(w);
1147 }
1148 }
1149 DECREF(v);
1150 break;
1151
1152 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001153 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 v = POP();
1155 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001156 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 DECREF(v);
1158 DECREF(u);
1159 break;
1160
1161 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001162 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001164 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 DECREF(v);
1166 break;
1167
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001168 case STORE_GLOBAL:
1169 w = GETNAMEV(oparg);
1170 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001171 if (f->f_locals != NULL) {
1172 u = dict2lookup(f->f_locals, w);
1173 if (u != NULL && is_accessobject(u)) {
1174 err = setaccessvalue(u, f->f_globals,
1175 v);
1176 DECREF(v);
1177 break;
1178 }
Guido van Rossum25831651993-05-19 14:50:45 +00001179 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001180 err = dict2insert(f->f_globals, w, v);
1181 DECREF(v);
1182 break;
1183
1184 case DELETE_GLOBAL:
1185 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001186 if (f->f_locals != NULL) {
1187 u = dict2lookup(f->f_locals, w);
1188 if (u != NULL && is_accessobject(u)) {
1189 err = setaccessvalue(u, f->f_globals,
1190 (object *)NULL);
1191 break;
1192 }
Guido van Rossum25831651993-05-19 14:50:45 +00001193 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001194 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001195 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001196 break;
1197
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 case LOAD_CONST:
1199 x = GETCONST(oparg);
1200 INCREF(x);
1201 PUSH(x);
1202 break;
1203
1204 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001205 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001206 if ((x = f->f_locals) == NULL) {
1207 err_setstr(SystemError, "no locals");
1208 break;
1209 }
1210 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001212 err_clear();
1213 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001215 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001216 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001217 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001218 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001219 break;
1220 }
1221 }
1222 }
Guido van Rossum25831651993-05-19 14:50:45 +00001223 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001224 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001225 if (x == NULL)
1226 break;
1227 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001228 else
1229 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 PUSH(x);
1231 break;
1232
1233 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001234 w = GETNAMEV(oparg);
1235 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001237 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001238 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001240 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 break;
1242 }
1243 }
Guido van Rossum25831651993-05-19 14:50:45 +00001244 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001245 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001246 if (x == NULL)
1247 break;
1248 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001249 else
1250 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 PUSH(x);
1252 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001253
1254#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001256 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001257 if ((x = f->f_locals) == NULL) {
1258 err_setstr(SystemError, "no locals");
1259 break;
1260 }
1261 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001263 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
1265 }
Guido van Rossum25831651993-05-19 14:50:45 +00001266 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001267 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001268 if (x == NULL)
1269 break;
1270 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001271 else
1272 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 PUSH(x);
1274 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001275#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001276
1277 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001278 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001279 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001280 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001281 gettupleitem(co->co_varnames,
1282 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001283 break;
1284 }
Guido van Rossum25831651993-05-19 14:50:45 +00001285 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001286 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001287 if (x == NULL)
1288 break;
1289 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001290 else
1291 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001292 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001293 break;
1294
1295 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001296 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001297 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001298 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001299 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001300 DECREF(v);
1301 break;
1302 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001304 break;
1305
1306 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001307 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001308 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001309 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001310 gettupleitem(co->co_varnames,
1311 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001312 break;
1313 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001314 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001315 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001316 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001317 break;
1318 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001320 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001321
1322 case BUILD_TUPLE:
1323 x = newtupleobject(oparg);
1324 if (x != NULL) {
1325 for (; --oparg >= 0;) {
1326 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001327 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 }
1329 PUSH(x);
1330 }
1331 break;
1332
1333 case BUILD_LIST:
1334 x = newlistobject(oparg);
1335 if (x != NULL) {
1336 for (; --oparg >= 0;) {
1337 w = POP();
1338 err = setlistitem(x, oparg, w);
1339 if (err != 0)
1340 break;
1341 }
1342 PUSH(x);
1343 }
1344 break;
1345
1346 case BUILD_MAP:
1347 x = newdictobject();
1348 PUSH(x);
1349 break;
1350
1351 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001352 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001354 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 DECREF(v);
1356 PUSH(x);
1357 break;
1358
1359 case COMPARE_OP:
1360 w = POP();
1361 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001362 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 DECREF(v);
1364 DECREF(w);
1365 PUSH(x);
1366 break;
1367
1368 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001370 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371 if (x == NULL) {
1372 err_setstr(ImportError,
1373 "__import__ not found");
1374 break;
1375 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001376 if (is_methodobject(x)) {
1377 u = None;
1378 INCREF(u);
1379 }
1380 else {
1381 u = find_from_args(f, INSTR_OFFSET());
1382 if (u == NULL) {
1383 x = u;
1384 break;
1385 }
1386 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001387 w = mkvalue("(OOOO)",
1388 w,
1389 f->f_globals,
1390 f->f_locals == NULL ? None : f->f_locals,
1391 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001392 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001393 if (w == NULL) {
1394 x = NULL;
1395 break;
1396 }
1397 x = call_object(x, w);
1398 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001399 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 break;
1401
1402 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001403 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001405 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001406 if ((x = f->f_locals) == NULL) {
1407 err_setstr(SystemError, "no locals");
1408 break;
1409 }
1410 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001411 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001413
1414 case ACCESS_MODE:
1415 v = POP();
1416 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001417 if (getstringvalue(w)[0] == '*')
1418 defmode = getintvalue(v);
1419 else
1420 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001421 DECREF(v);
1422 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001423
1424 case JUMP_FORWARD:
1425 JUMPBY(oparg);
1426 break;
1427
1428 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001429 err = testbool(TOP());
1430 if (err > 0)
1431 err = 0;
1432 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 JUMPBY(oparg);
1434 break;
1435
1436 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001437 err = testbool(TOP());
1438 if (err > 0) {
1439 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001441 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 break;
1443
1444 case JUMP_ABSOLUTE:
1445 JUMPTO(oparg);
1446 break;
1447
1448 case FOR_LOOP:
1449 /* for v in s: ...
1450 On entry: stack contains s, i.
1451 On exit: stack contains s, i+1, s[i];
1452 but if loop exhausted:
1453 s, i are popped, and we jump */
1454 w = POP(); /* Loop index */
1455 v = POP(); /* Sequence object */
1456 u = loop_subscript(v, w);
1457 if (u != NULL) {
1458 PUSH(v);
1459 x = newintobject(getintvalue(w)+1);
1460 PUSH(x);
1461 DECREF(w);
1462 PUSH(u);
1463 }
1464 else {
1465 DECREF(v);
1466 DECREF(w);
1467 /* A NULL can mean "s exhausted"
1468 but also an error: */
1469 if (err_occurred())
1470 why = WHY_EXCEPTION;
1471 else
1472 JUMPBY(oparg);
1473 }
1474 break;
1475
1476 case SETUP_LOOP:
1477 case SETUP_EXCEPT:
1478 case SETUP_FINALLY:
1479 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1480 STACK_LEVEL());
1481 break;
1482
1483 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001484#ifdef LLTRACE
1485 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001486 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001487#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001488 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001489 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001490 /* Trace each line of code reached */
1491 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001492 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001493 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001494 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001496
1497 case CALL_FUNCTION:
1498 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001499 int na = oparg & 0xff;
1500 int nk = (oparg>>8) & 0xff;
1501 int n = na + 2*nk;
1502 object **pfunc = stack_pointer - n - 1;
1503 object *func = *pfunc;
1504 object *self = NULL;
1505 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001506 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001507 if (is_instancemethodobject(func)) {
1508 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001509 class = instancemethodgetclass(func);
1510 func = instancemethodgetfunc(func);
1511 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001513 INCREF(self);
1514 DECREF(*pfunc);
1515 *pfunc = self;
1516 na++;
1517 n++;
1518 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 else {
1520 /* Unbound methods must be
1521 called with an instance of
1522 the class (or a derived
1523 class) as first argument */
1524 if (na > 0 &&
1525 (self = stack_pointer[-n])
1526 != NULL &&
1527 is_instanceobject(self) &&
1528 issubclass(
1529 (object *)
1530 (((instanceobject *)self)
1531 ->in_class),
1532 class))
1533 /* Handy-dandy */ ;
1534 else {
1535 err_setstr(TypeError,
1536 "unbound method must be called with class instance 1st argument");
1537 return NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001538 }
1539 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001540 }
1541 else
1542 INCREF(func);
1543 if (is_funcobject(func)) {
1544 object *co = getfunccode(func);
1545 object *globals = getfuncglobals(func);
1546 object *argdefs = PyFunction_GetDefaults(func);
1547 object **d;
1548 int nd;
1549 if (argdefs != NULL) {
1550 d = &GETTUPLEITEM(argdefs, 0);
1551 nd = ((tupleobject *)argdefs)->ob_size;
1552 }
1553 else {
1554 d = NULL;
1555 nd = 0;
1556 }
1557 x = eval_code2(
1558 (codeobject *)co,
1559 globals, (object *)NULL,
1560 stack_pointer-n, na,
1561 stack_pointer-2*nk, nk,
1562 d, nd,
1563 class);
1564 }
1565 else {
1566 object *args = newtupleobject(na);
1567 object *kwdict = NULL;
1568 if (args == NULL)
1569 x = NULL;
1570 else if (nk > 0) {
1571 err_setstr(SystemError,
1572 "calling built-in with keywords not yet implemented");
1573 x = NULL;
1574 }
1575 else {
1576 while (--na >= 0) {
1577 w = POP();
1578 SETTUPLEITEM(args, na, w);
1579 }
1580 x = call_object(func, args);
1581 DECREF(args);
1582 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001583 }
1584 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001585 while (stack_pointer > pfunc) {
1586 w = POP();
1587 DECREF(w);
1588 }
1589 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001590 break;
1591 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001592
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 case MAKE_FUNCTION:
1594 v = POP(); /* code object */
1595 x = newfuncobject(v, f->f_globals);
1596 DECREF(v);
1597 /* XXX Maybe this should be a separate opcode? */
1598 if (x != NULL && oparg > 0) {
1599 v = newtupleobject(oparg);
1600 if (v == NULL) {
1601 DECREF(x);
1602 x = NULL;
1603 break;
1604 }
1605 while (--oparg >= 0) {
1606 w = POP();
1607 SETTUPLEITEM(v, oparg, w);
1608 }
1609 err = PyFunction_SetDefaults(x, v);
1610 DECREF(v);
1611 }
1612 PUSH(x);
1613 break;
1614
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 default:
1616 fprintf(stderr,
1617 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001618 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001619 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001620 why = WHY_EXCEPTION;
1621 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001622
1623#ifdef CASE_TOO_BIG
1624 }
1625#endif
1626
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 } /* switch */
1628
1629 on_error:
1630
1631 /* Quickly continue if no error occurred */
1632
1633 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001634 if (err == 0 && x != NULL) {
1635#ifdef CHECKEXC
1636 if (err_occurred())
1637 fprintf(stderr,
1638 "XXX undetected error\n");
1639 else
1640#endif
1641 continue; /* Normal, fast path */
1642 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001643 why = WHY_EXCEPTION;
1644 x = None;
1645 err = 0;
1646 }
1647
Guido van Rossum801dcae1992-04-08 11:32:32 +00001648#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 /* Double-check exception status */
1650
1651 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1652 if (!err_occurred()) {
1653 fprintf(stderr, "XXX ghost error\n");
1654 err_setstr(SystemError, "ghost error");
1655 why = WHY_EXCEPTION;
1656 }
1657 }
1658 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659 if (err_occurred()) {
1660 fprintf(stderr,
1661 "XXX undetected error (why=%d)\n",
1662 why);
1663 why = WHY_EXCEPTION;
1664 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 }
1666#endif
1667
1668 /* Log traceback info if this is a real exception */
1669
1670 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001671 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001673 f->f_lasti -= 2;
1674 tb_here(f);
1675
Guido van Rossume59214e1994-08-30 08:01:59 +00001676 if (f->f_trace)
1677 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001678 if (sys_profile)
1679 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 }
1681
1682 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1683
1684 if (why == WHY_RERAISE)
1685 why = WHY_EXCEPTION;
1686
1687 /* Unwind stacks if a (pseudo) exception occurred */
1688
1689 while (why != WHY_NOT && f->f_iblock > 0) {
1690 block *b = pop_block(f);
1691 while (STACK_LEVEL() > b->b_level) {
1692 v = POP();
1693 XDECREF(v);
1694 }
1695 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1696 why = WHY_NOT;
1697 JUMPTO(b->b_handler);
1698 break;
1699 }
1700 if (b->b_type == SETUP_FINALLY ||
1701 b->b_type == SETUP_EXCEPT &&
1702 why == WHY_EXCEPTION) {
1703 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001704 object *exc, *val, *tb;
1705 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 if (val == NULL) {
1707 val = None;
1708 INCREF(val);
1709 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 /* Make the raw exception data
1711 available to the handler,
1712 so a program can emulate the
1713 Python main loop. Don't do
1714 this for 'finally'. */
1715 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001716 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 sysset("exc_value", val);
1718 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001720 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 PUSH(val);
1722 PUSH(exc);
1723 }
1724 else {
1725 if (why == WHY_RETURN)
1726 PUSH(retval);
1727 v = newintobject((long)why);
1728 PUSH(v);
1729 }
1730 why = WHY_NOT;
1731 JUMPTO(b->b_handler);
1732 break;
1733 }
1734 } /* unwind stack */
1735
1736 /* End the loop if we still have an error (or return) */
1737
1738 if (why != WHY_NOT)
1739 break;
1740
1741 } /* main loop */
1742
1743 /* Pop remaining stack entries */
1744
1745 while (!EMPTY()) {
1746 v = POP();
1747 XDECREF(v);
1748 }
1749
Guido van Rossum96a42c81992-01-12 02:29:51 +00001750 if (why != WHY_RETURN)
1751 retval = NULL;
1752
Guido van Rossume59214e1994-08-30 08:01:59 +00001753 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001754 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001755 if (call_trace(&f->f_trace, &f->f_trace, f,
1756 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001757 XDECREF(retval);
1758 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001759 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001760 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001761 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001762 }
1763
1764 if (sys_profile && why == WHY_RETURN) {
1765 if (call_trace(&sys_profile, (object**)0,
1766 f, "return", retval)) {
1767 XDECREF(retval);
1768 retval = NULL;
1769 why = WHY_EXCEPTION;
1770 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001771 }
1772
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001774
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 current_frame = f->f_back;
1776 DECREF(f);
1777
Guido van Rossum96a42c81992-01-12 02:29:51 +00001778 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001779}
1780
Guido van Rossum96a42c81992-01-12 02:29:51 +00001781#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001782static int
1783prtrace(v, str)
1784 object *v;
1785 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001787 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001788 if (printobject(v, stdout, 0) != 0)
1789 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001790 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001792#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001793
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001794static void
1795call_exc_trace(p_trace, p_newtrace, f)
1796 object **p_trace, **p_newtrace;
1797 frameobject *f;
1798{
1799 object *type, *value, *traceback, *arg;
1800 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001801 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001802 if (value == NULL) {
1803 value = None;
1804 INCREF(value);
1805 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001806 arg = mkvalue("(OOO)", type, value, traceback);
1807 if (arg == NULL) {
1808 err_restore(type, value, traceback);
1809 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001810 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001811 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1812 DECREF(arg);
1813 if (err == 0)
1814 err_restore(type, value, traceback);
1815 else {
1816 XDECREF(type);
1817 XDECREF(value);
1818 XDECREF(traceback);
1819 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001820}
1821
1822static int
1823call_trace(p_trace, p_newtrace, f, msg, arg)
1824 object **p_trace; /* in/out; may not be NULL;
1825 may not point to NULL variable initially */
1826 object **p_newtrace; /* in/out; may be NULL;
1827 may point to NULL variable;
1828 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001829 frameobject *f;
1830 char *msg;
1831 object *arg;
1832{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001833 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001834 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001835 static int tracing = 0;
1836
1837 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001838 /* Don't do recursive traces */
1839 if (p_newtrace) {
1840 XDECREF(*p_newtrace);
1841 *p_newtrace = NULL;
1842 }
1843 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001844 }
1845
Guido van Rossumf10570b1995-07-07 22:53:21 +00001846 args = newtupleobject(3);
1847 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001848 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001849 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001850 if (what == NULL)
1851 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001853 SETTUPLEITEM(args, 0, (object *)f);
1854 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001855 if (arg == NULL)
1856 arg = None;
1857 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001858 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001859 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001860 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001861 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001862 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001863 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001864 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001865 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001866 if (res == NULL) {
1867 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001868 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001869 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001870 *p_trace = NULL;
1871 if (p_newtrace) {
1872 XDECREF(*p_newtrace);
1873 *p_newtrace = NULL;
1874 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001875 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001876 }
1877 else {
1878 if (p_newtrace) {
1879 XDECREF(*p_newtrace);
1880 if (res == None)
1881 *p_newtrace = NULL;
1882 else {
1883 INCREF(res);
1884 *p_newtrace = res;
1885 }
1886 }
1887 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001888 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001889 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001890}
1891
Guido van Rossum3f5da241990-12-20 15:06:42 +00001892object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001893getbuiltins()
1894{
1895 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001896 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001897 else
1898 return current_frame->f_builtins;
1899}
1900
1901object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001902getlocals()
1903{
1904 if (current_frame == NULL)
1905 return NULL;
1906 fast_2_locals(current_frame);
1907 return current_frame->f_locals;
1908}
1909
1910object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911getglobals()
1912{
1913 if (current_frame == NULL)
1914 return NULL;
1915 else
1916 return current_frame->f_globals;
1917}
1918
Guido van Rossum81daa321993-05-20 14:24:46 +00001919object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001920getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001921{
1922 if (current_frame == NULL)
1923 return NULL;
1924 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001925 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001926}
1927
Guido van Rossume59214e1994-08-30 08:01:59 +00001928object *
1929getframe()
1930{
1931 return (object *)current_frame;
1932}
1933
Guido van Rossum6135a871995-01-09 17:53:26 +00001934int
1935getrestricted()
1936{
1937 return current_frame == NULL ? 0 : current_frame->f_restricted;
1938}
1939
Guido van Rossum3f5da241990-12-20 15:06:42 +00001940void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001941flushline()
1942{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001943 object *f = sysget("stdout");
1944 if (softspace(f, 0))
1945 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001946}
1947
Guido van Rossum3f5da241990-12-20 15:06:42 +00001948
Guido van Rossum06186511995-01-07 12:40:10 +00001949#define BINOP(opname, ropname, thisfunc) \
1950 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1951 ; \
1952 else \
1953 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001954
1955
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001957or(v, w)
1958 object *v, *w;
1959{
Guido van Rossum06186511995-01-07 12:40:10 +00001960 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001961 if (v->ob_type->tp_as_number != NULL) {
1962 object *x;
1963 object * (*f) FPROTO((object *, object *));
1964 if (coerce(&v, &w) != 0)
1965 return NULL;
1966 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1967 x = (*f)(v, w);
1968 DECREF(v);
1969 DECREF(w);
1970 if (f != NULL)
1971 return x;
1972 }
1973 err_setstr(TypeError, "bad operand type(s) for |");
1974 return NULL;
1975}
1976
1977static object *
1978xor(v, w)
1979 object *v, *w;
1980{
Guido van Rossum06186511995-01-07 12:40:10 +00001981 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001982 if (v->ob_type->tp_as_number != NULL) {
1983 object *x;
1984 object * (*f) FPROTO((object *, object *));
1985 if (coerce(&v, &w) != 0)
1986 return NULL;
1987 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
1988 x = (*f)(v, w);
1989 DECREF(v);
1990 DECREF(w);
1991 if (f != NULL)
1992 return x;
1993 }
1994 err_setstr(TypeError, "bad operand type(s) for ^");
1995 return NULL;
1996}
1997
1998static object *
1999and(v, w)
2000 object *v, *w;
2001{
Guido van Rossum06186511995-01-07 12:40:10 +00002002 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002003 if (v->ob_type->tp_as_number != NULL) {
2004 object *x;
2005 object * (*f) FPROTO((object *, object *));
2006 if (coerce(&v, &w) != 0)
2007 return NULL;
2008 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2009 x = (*f)(v, w);
2010 DECREF(v);
2011 DECREF(w);
2012 if (f != NULL)
2013 return x;
2014 }
2015 err_setstr(TypeError, "bad operand type(s) for &");
2016 return NULL;
2017}
2018
2019static object *
2020lshift(v, w)
2021 object *v, *w;
2022{
Guido van Rossum06186511995-01-07 12:40:10 +00002023 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002024 if (v->ob_type->tp_as_number != NULL) {
2025 object *x;
2026 object * (*f) FPROTO((object *, object *));
2027 if (coerce(&v, &w) != 0)
2028 return NULL;
2029 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2030 x = (*f)(v, w);
2031 DECREF(v);
2032 DECREF(w);
2033 if (f != NULL)
2034 return x;
2035 }
2036 err_setstr(TypeError, "bad operand type(s) for <<");
2037 return NULL;
2038}
2039
2040static object *
2041rshift(v, w)
2042 object *v, *w;
2043{
Guido van Rossum06186511995-01-07 12:40:10 +00002044 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002045 if (v->ob_type->tp_as_number != NULL) {
2046 object *x;
2047 object * (*f) FPROTO((object *, object *));
2048 if (coerce(&v, &w) != 0)
2049 return NULL;
2050 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2051 x = (*f)(v, w);
2052 DECREF(v);
2053 DECREF(w);
2054 if (f != NULL)
2055 return x;
2056 }
2057 err_setstr(TypeError, "bad operand type(s) for >>");
2058 return NULL;
2059}
2060
2061static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002062add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 object *v, *w;
2064{
Guido van Rossum06186511995-01-07 12:40:10 +00002065 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002066 if (v->ob_type->tp_as_sequence != NULL)
2067 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2068 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002069 object *x;
2070 if (coerce(&v, &w) != 0)
2071 return NULL;
2072 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2073 DECREF(v);
2074 DECREF(w);
2075 return x;
2076 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002077 err_setstr(TypeError, "bad operand type(s) for +");
2078 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079}
2080
2081static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 object *v, *w;
2084{
Guido van Rossum06186511995-01-07 12:40:10 +00002085 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002086 if (v->ob_type->tp_as_number != NULL) {
2087 object *x;
2088 if (coerce(&v, &w) != 0)
2089 return NULL;
2090 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2091 DECREF(v);
2092 DECREF(w);
2093 return x;
2094 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002095 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 return NULL;
2097}
2098
2099static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 object *v, *w;
2102{
2103 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002104 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002105 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002106 if (tp->tp_as_number != NULL &&
2107 w->ob_type->tp_as_sequence != NULL &&
2108 !is_instanceobject(v)) {
2109 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 object *tmp = v;
2111 v = w;
2112 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002113 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002115 if (tp->tp_as_number != NULL) {
2116 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002117 if (is_instanceobject(v)) {
2118 /* Instances of user-defined classes get their
2119 other argument uncoerced, so they may
2120 implement sequence*number as well as
2121 number*number. */
2122 INCREF(v);
2123 INCREF(w);
2124 }
2125 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002126 return NULL;
2127 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2128 DECREF(v);
2129 DECREF(w);
2130 return x;
2131 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132 if (tp->tp_as_sequence != NULL) {
2133 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002134 err_setstr(TypeError,
2135 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 return NULL;
2137 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138 return (*tp->tp_as_sequence->sq_repeat)
2139 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 return NULL;
2143}
2144
2145static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002146divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147 object *v, *w;
2148{
Guido van Rossum06186511995-01-07 12:40:10 +00002149 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002150 if (v->ob_type->tp_as_number != NULL) {
2151 object *x;
2152 if (coerce(&v, &w) != 0)
2153 return NULL;
2154 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2155 DECREF(v);
2156 DECREF(w);
2157 return x;
2158 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002159 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 return NULL;
2161}
2162
2163static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002164mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 object *v, *w;
2166{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002167 if (is_stringobject(v)) {
2168 return formatstring(v, w);
2169 }
Guido van Rossum06186511995-01-07 12:40:10 +00002170 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002171 if (v->ob_type->tp_as_number != NULL) {
2172 object *x;
2173 if (coerce(&v, &w) != 0)
2174 return NULL;
2175 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2176 DECREF(v);
2177 DECREF(w);
2178 return x;
2179 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002180 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 return NULL;
2182}
2183
2184static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002185neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 object *v;
2187{
2188 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002189 return (*v->ob_type->tp_as_number->nb_negative)(v);
2190 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191 return NULL;
2192}
2193
2194static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002195pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 object *v;
2197{
2198 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002199 return (*v->ob_type->tp_as_number->nb_positive)(v);
2200 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 return NULL;
2202}
2203
2204static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002205invert(v)
2206 object *v;
2207{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002208 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002209 if (v->ob_type->tp_as_number != NULL &&
2210 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2211 return (*f)(v);
2212 err_setstr(TypeError, "bad operand type(s) for unary ~");
2213 return NULL;
2214}
2215
2216static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002217not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 object *v;
2219{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002220 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002221 object *w;
2222 if (outcome < 0)
2223 return NULL;
2224 if (outcome == 0)
2225 w = True;
2226 else
2227 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002228 INCREF(w);
2229 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230}
Guido van Rossum234f9421993-06-17 12:35:49 +00002231
2232
Guido van Rossum681d79a1995-07-18 14:51:37 +00002233/* External interface to call any callable object.
2234 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002235
2236object *
2237call_object(func, arg)
2238 object *func;
2239 object *arg;
2240{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002241 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2242}
Guido van Rossume59214e1994-08-30 08:01:59 +00002243
Guido van Rossum681d79a1995-07-18 14:51:37 +00002244object *
2245PyEval_CallObjectWithKeywords(func, arg, kw)
2246 object *func;
2247 object *arg;
2248 object *kw;
2249{
2250 ternaryfunc call;
2251 object *result;
2252
2253 if (arg == NULL)
2254 arg = newtupleobject(0);
2255 else if (!is_tupleobject(arg)) {
2256 err_setstr(TypeError, "argument list must be a tuple");
2257 return NULL;
2258 }
2259 else
2260 INCREF(arg);
2261
2262 if (call = func->ob_type->tp_call)
2263 result = (*call)(func, arg, kw);
2264 else if (is_instancemethodobject(func) || is_funcobject(func))
2265 result = call_function(func, arg, kw);
2266 else
2267 result = call_builtin(func, arg, kw);
2268
2269 DECREF(arg);
2270
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002271 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002272 err_setstr(SystemError,
2273 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002274
2275 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002276}
2277
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002279call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002282 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002284 if (kw != NULL) {
2285 err_setstr(SystemError,
2286 "calling built-in with keywords not yet implemented");
2287 return NULL;
2288 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 if (is_methodobject(func)) {
2290 method meth = getmethod(func);
2291 object *self = getself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002292 if (!getvarargs(func)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002293 int size = gettuplesize(arg);
2294 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002295 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002296 else if (size == 0)
2297 arg = NULL;
2298 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002299 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 }
2301 if (is_classobject(func)) {
Guido van Rossum25831651993-05-19 14:50:45 +00002302 return newinstanceobject(func, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002304 if (is_instanceobject(func)) {
2305 object *res, *call = getattr(func,"__call__");
2306 if (call == NULL) {
2307 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308 err_setstr(AttributeError,
2309 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002310 return NULL;
2311 }
2312 res = call_object(call, arg);
2313 DECREF(call);
2314 return res;
2315 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002316 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317 return NULL;
2318}
2319
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002321call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002323 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002324 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002326 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002327 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328 object **d, **k;
2329 int nk, nd;
2330 object *result;
2331
2332 if (kw != NULL && !is_dictobject(kw)) {
2333 err_badcall();
2334 return NULL;
2335 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336
Guido van Rossume8122f11991-05-05 20:03:07 +00002337 if (is_instancemethodobject(func)) {
2338 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002339 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002340 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002341 if (self == NULL) {
2342 /* Unbound methods must be called with an instance of
2343 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002344 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002345 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002346 if (self != NULL &&
2347 is_instanceobject(self) &&
2348 issubclass((object *)
2349 (((instanceobject *)self)->in_class),
2350 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002352 else
2353 self = NULL;
2354 }
2355 if (self == NULL) {
2356 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002357 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002358 return NULL;
2359 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002361 }
2362 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002363 int argcount = gettuplesize(arg);
2364 object *newarg = newtupleobject(argcount + 1);
2365 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002366 if (newarg == NULL)
2367 return NULL;
2368 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002369 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002370 for (i = 0; i < argcount; i++) {
2371 object *v = GETTUPLEITEM(arg, i);
2372 XINCREF(v);
2373 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002374 }
2375 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 }
2377 }
2378 else {
2379 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 return NULL;
2382 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002383 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002385
2386 argdefs = PyFunction_GetDefaults(func);
2387 if (argdefs != NULL && is_tupleobject(argdefs)) {
2388 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2389 nd = gettuplesize(argdefs);
2390 }
2391 else {
2392 d = NULL;
2393 nd = 0;
2394 }
2395
2396 if (kw != NULL) {
2397 int pos, i;
2398 nk = getmappingsize(kw);
2399 k = NEW(object *, 2*nk);
2400 if (k == NULL) {
2401 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002402 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002403 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002404 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405 pos = i = 0;
2406 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2407 i += 2;
2408 nk = i/2;
2409 /* XXX This is broken if the caller deletes dict items! */
2410 }
2411 else {
2412 k = NULL;
2413 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416 result = eval_code2(
2417 (codeobject *)getfunccode(func),
2418 getfuncglobals(func), (object *)NULL,
2419 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2420 k, nk,
2421 d, nd,
2422 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 DECREF(arg);
2425 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426
Guido van Rossum681d79a1995-07-18 14:51:37 +00002427 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428}
2429
2430static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002431apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432 object *v, *w;
2433{
2434 typeobject *tp = v->ob_type;
2435 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002436 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 return NULL;
2438 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002439 if (tp->tp_as_mapping != NULL) {
2440 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2441 }
2442 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 int i;
2444 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 return NULL;
2447 }
2448 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002449 if (i < 0) {
2450 int len = (*tp->tp_as_sequence->sq_length)(v);
2451 if (len < 0)
2452 return NULL;
2453 i += len;
2454 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457}
2458
2459static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 object *v, *w;
2462{
2463 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002464 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 return NULL;
2468 }
2469 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002470 v = (*sq->sq_item)(v, i);
2471 if (v)
2472 return v;
2473 if (err_occurred() == IndexError)
2474 err_clear();
2475 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476}
2477
2478static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480 object *v;
2481 int isize;
2482 int *pi;
2483{
2484 if (v != NULL) {
2485 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486 err_setstr(TypeError, "slice index must be int");
2487 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488 }
2489 *pi = getintvalue(v);
2490 if (*pi < 0)
2491 *pi += isize;
2492 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002493 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494}
2495
2496static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 object *u, *v, *w;
2499{
2500 typeobject *tp = u->ob_type;
2501 int ilow, ihigh, isize;
2502 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002503 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 return NULL;
2505 }
2506 ilow = 0;
2507 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002508 if (isize < 0)
2509 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002512 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516
2517static int
2518assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 object *w;
2520 object *key;
2521 object *v;
2522{
2523 typeobject *tp = w->ob_type;
2524 sequence_methods *sq;
2525 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002526 int (*func1)();
2527 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002528 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002529 (func1 = mp->mp_ass_subscript) != NULL) {
2530 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002531 }
2532 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002533 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002535 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002536 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002537 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002539 else {
2540 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002541 if (i < 0) {
2542 int len = (*sq->sq_length)(w);
2543 if (len < 0)
2544 return -1;
2545 i += len;
2546 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002547 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002548 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002551 err_setstr(TypeError,
2552 "can't assign to this subscripted object");
2553 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555}
2556
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557static int
2558assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559 object *u, *v, *w, *x;
2560{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002563 if (sq == NULL) {
2564 err_setstr(TypeError, "assign to slice of non-sequence");
2565 return -1;
2566 }
2567 if (sq == NULL || sq->sq_ass_slice == NULL) {
2568 err_setstr(TypeError, "unassignable slice");
2569 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 }
2571 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002572 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002573 if (isize < 0)
2574 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 if (slice_index(v, isize, &ilow) != 0)
2576 return -1;
2577 if (slice_index(w, isize, &ihigh) != 0)
2578 return -1;
2579 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580}
2581
2582static int
2583cmp_exception(err, v)
2584 object *err, *v;
2585{
2586 if (is_tupleobject(v)) {
2587 int i, n;
2588 n = gettuplesize(v);
2589 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002590 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002591 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 return 1;
2593 }
2594 return 0;
2595 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002596 if (is_classobject(v) && is_classobject(err))
2597 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 return err == v;
2599}
2600
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601static int
2602cmp_member(v, w)
2603 object *v, *w;
2604{
Guido van Rossume59214e1994-08-30 08:01:59 +00002605 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606 object *x;
2607 sequence_methods *sq;
2608 /* Special case for char in string */
2609 if (is_stringobject(w)) {
2610 register char *s, *end;
2611 register char c;
2612 if (!is_stringobject(v) || getstringsize(v) != 1) {
2613 err_setstr(TypeError,
2614 "string member test needs char left operand");
2615 return -1;
2616 }
2617 c = getstringvalue(v)[0];
2618 s = getstringvalue(w);
2619 end = s + getstringsize(w);
2620 while (s < end) {
2621 if (c == *s++)
2622 return 1;
2623 }
2624 return 0;
2625 }
2626 sq = w->ob_type->tp_as_sequence;
2627 if (sq == NULL) {
2628 err_setstr(TypeError,
2629 "'in' or 'not in' needs sequence right argument");
2630 return -1;
2631 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002632 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002634 if (x == NULL) {
2635 if (err_occurred() == IndexError) {
2636 err_clear();
2637 break;
2638 }
2639 return -1;
2640 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002641 cmp = cmpobject(v, x);
2642 XDECREF(x);
2643 if (cmp == 0)
2644 return 1;
2645 }
2646 return 0;
2647}
2648
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002651 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 register object *v;
2653 register object *w;
2654{
2655 register int cmp;
2656 register int res = 0;
2657 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002658 case IS:
2659 case IS_NOT:
2660 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002661 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662 res = !res;
2663 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 case IN:
2665 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666 res = cmp_member(v, w);
2667 if (res < 0)
2668 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002669 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002670 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 break;
2672 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002673 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 break;
2675 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002676 cmp = cmpobject(v, w);
2677 switch (op) {
2678 case LT: res = cmp < 0; break;
2679 case LE: res = cmp <= 0; break;
2680 case EQ: res = cmp == 0; break;
2681 case NE: res = cmp != 0; break;
2682 case GT: res = cmp > 0; break;
2683 case GE: res = cmp >= 0; break;
2684 /* XXX no default? (res is initialized to 0 though) */
2685 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 }
2687 v = res ? True : False;
2688 INCREF(v);
2689 return v;
2690}
2691
Guido van Rossum3f5da241990-12-20 15:06:42 +00002692static int
2693import_from(locals, v, name)
2694 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002695 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002696 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002697{
2698 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002699 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002700 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002701 return -1;
2702 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002703 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002704 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002705 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002706 object *name, *value;
2707 pos = 0;
2708 while (mappinggetnext(w, &pos, &name, &value)) {
2709 if (!is_stringobject(name) ||
2710 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002711 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002712 if (is_accessobject(value)) {
2713 value = getaccessvalue(value, (object *)NULL);
2714 if (value == NULL) {
2715 err_clear();
2716 continue;
2717 }
2718 }
2719 else
2720 INCREF(value);
2721 err = dict2insert(locals, name, value);
2722 DECREF(value);
2723 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002724 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002725 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002726 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002727 }
2728 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002729 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002731 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002732 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002733 getstringvalue(name));
2734 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002735 return -1;
2736 }
2737 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002738 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002739 }
2740}
2741
2742static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002743build_class(methods, bases, name)
2744 object *methods; /* dictionary */
2745 object *bases; /* tuple containing classes */
2746 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002747{
Guido van Rossum25831651993-05-19 14:50:45 +00002748 int i;
2749 if (!is_tupleobject(bases)) {
2750 err_setstr(SystemError, "build_class with non-tuple bases");
2751 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002752 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002753 if (gettuplesize(bases) > 0) {
2754 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002755 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002756 /* Call the base's *type*, if it is callable.
2757 This code is a hook for Donald Beaudry's type extensions.
2758 In unexended Python it will never be triggered since its
2759 types are not callable. */
2760 if (base->ob_type->ob_type->tp_call) {
2761 object *args;
2762 object *class;
2763 args = mkvalue("(OOO)", name, bases, methods);
2764 class = call_object((object *)base->ob_type, args);
2765 DECREF(args);
2766 return class;
2767 }
2768 }
Guido van Rossum25831651993-05-19 14:50:45 +00002769 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002770 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002771 return NULL;
2772 }
Guido van Rossum25831651993-05-19 14:50:45 +00002773 if (!is_stringobject(name)) {
2774 err_setstr(SystemError, "build_class witn non-string name");
2775 return NULL;
2776 }
2777 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002778 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002779 if (!is_classobject(base)) {
2780 err_setstr(TypeError,
2781 "base is not a class object");
2782 return NULL;
2783 }
2784 }
2785 return newclassobject(bases, methods, name);
2786}
2787
2788static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002789access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002790 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002791 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002792 frameobject *f;
2793{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002794 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002795 object *value, *ac;
2796 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002797 int ret;
2798 fast_2_locals(f);
2799 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002800 if (value && is_accessobject(value)) {
2801 err_setstr(AccessError, "can't override access");
2802 return -1;
2803 }
2804 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002805 if (value != NULL && value != None)
2806 type = value->ob_type;
2807 else
2808 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002809 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002810 if (ac == NULL)
2811 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002812 ret = mappinginsert(f->f_locals, name, ac);
2813 DECREF(ac);
2814 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002815 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002816}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002817
2818static int
2819exec_statement(prog, globals, locals)
2820 object *prog;
2821 object *globals;
2822 object *locals;
2823{
2824 char *s;
2825 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002826 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002827 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002828
2829 if (is_tupleobject(prog) && globals == None && locals == None &&
2830 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2831 /* Backward compatibility hack */
2832 globals = gettupleitem(prog, 1);
2833 if (n == 3)
2834 locals = gettupleitem(prog, 2);
2835 prog = gettupleitem(prog, 0);
2836 }
2837 if (globals == None) {
2838 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002839 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002840 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002841 plain = 1;
2842 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002843 }
2844 else if (locals == None)
2845 locals = globals;
2846 if (!is_stringobject(prog) &&
2847 !is_codeobject(prog) &&
2848 !is_fileobject(prog)) {
2849 err_setstr(TypeError,
2850 "exec 1st arg must be string, code or file object");
2851 return -1;
2852 }
2853 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2854 err_setstr(TypeError,
2855 "exec 2nd/3rd args must be dict or None");
2856 return -1;
2857 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002858 if (dictlookup(globals, "__builtins__") == NULL)
2859 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002860 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002861 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002862 return -1;
2863 return 0;
2864 }
2865 if (is_fileobject(prog)) {
2866 FILE *fp = getfilefile(prog);
2867 char *name = getstringvalue(getfilename(prog));
2868 if (run_file(fp, name, file_input, globals, locals) == NULL)
2869 return -1;
2870 return 0;
2871 }
2872 s = getstringvalue(prog);
2873 if (strlen(s) != getstringsize(prog)) {
2874 err_setstr(ValueError, "embedded '\\0' in exec string");
2875 return -1;
2876 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002877 v = run_string(s, file_input, globals, locals);
2878 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002879 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002880 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002881 if (plain)
2882 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002883 return 0;
2884}
Guido van Rossum24c13741995-02-14 09:42:43 +00002885
Guido van Rossum681d79a1995-07-18 14:51:37 +00002886/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002887static object *
2888find_from_args(f, nexti)
2889 frameobject *f;
2890 int nexti;
2891{
2892 int opcode;
2893 int oparg;
2894 object *list, *name;
2895 unsigned char *next_instr;
2896
2897 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2898 opcode = (*next_instr++);
2899 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002900 INCREF(None);
2901 return None;
2902 }
2903
2904 list = newlistobject(0);
2905 if (list == NULL)
2906 return NULL;
2907
2908 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002909 oparg = (next_instr[1]<<8) + next_instr[0];
2910 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002911 name = Getnamev(f, oparg);
2912 if (addlistitem(list, name) < 0) {
2913 DECREF(list);
2914 break;
2915 }
2916 opcode = (*next_instr++);
2917 } while (opcode == IMPORT_FROM);
2918
2919 return list;
2920}