blob: 5d0a8e4e33e02ec1dc76773dc062f35adc8a4ed8 [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;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001568 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001569 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001570 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001571 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001572 if (nk > 0) {
1573 kwdict = newdictobject();
1574 if (kwdict == NULL) {
1575 x = NULL;
1576 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001577 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001578 err = 0;
1579 while (--nk >= 0) {
1580 object *value = POP();
1581 object *key = POP();
1582 err = mappinginsert(
1583 kwdict, key, value);
1584 if (err) {
1585 DECREF(key);
1586 DECREF(value);
1587 break;
1588 }
1589 }
1590 if (err) {
1591 DECREF(args);
1592 DECREF(kwdict);
1593 break;
1594 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001595 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001596 while (--na >= 0) {
1597 w = POP();
1598 SETTUPLEITEM(args, na, w);
1599 }
1600 x = PyEval_CallObjectWithKeywords(
1601 func, args, kwdict);
1602 DECREF(args);
1603 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001604 }
1605 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 while (stack_pointer > pfunc) {
1607 w = POP();
1608 DECREF(w);
1609 }
1610 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001611 break;
1612 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001613
Guido van Rossum681d79a1995-07-18 14:51:37 +00001614 case MAKE_FUNCTION:
1615 v = POP(); /* code object */
1616 x = newfuncobject(v, f->f_globals);
1617 DECREF(v);
1618 /* XXX Maybe this should be a separate opcode? */
1619 if (x != NULL && oparg > 0) {
1620 v = newtupleobject(oparg);
1621 if (v == NULL) {
1622 DECREF(x);
1623 x = NULL;
1624 break;
1625 }
1626 while (--oparg >= 0) {
1627 w = POP();
1628 SETTUPLEITEM(v, oparg, w);
1629 }
1630 err = PyFunction_SetDefaults(x, v);
1631 DECREF(v);
1632 }
1633 PUSH(x);
1634 break;
1635
Guido van Rossum374a9221991-04-04 10:40:29 +00001636 default:
1637 fprintf(stderr,
1638 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001639 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001640 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 why = WHY_EXCEPTION;
1642 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001643
1644#ifdef CASE_TOO_BIG
1645 }
1646#endif
1647
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 } /* switch */
1649
1650 on_error:
1651
1652 /* Quickly continue if no error occurred */
1653
1654 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 if (err == 0 && x != NULL) {
1656#ifdef CHECKEXC
1657 if (err_occurred())
1658 fprintf(stderr,
1659 "XXX undetected error\n");
1660 else
1661#endif
1662 continue; /* Normal, fast path */
1663 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001664 why = WHY_EXCEPTION;
1665 x = None;
1666 err = 0;
1667 }
1668
Guido van Rossum801dcae1992-04-08 11:32:32 +00001669#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 /* Double-check exception status */
1671
1672 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1673 if (!err_occurred()) {
1674 fprintf(stderr, "XXX ghost error\n");
1675 err_setstr(SystemError, "ghost error");
1676 why = WHY_EXCEPTION;
1677 }
1678 }
1679 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001680 if (err_occurred()) {
1681 fprintf(stderr,
1682 "XXX undetected error (why=%d)\n",
1683 why);
1684 why = WHY_EXCEPTION;
1685 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 }
1687#endif
1688
1689 /* Log traceback info if this is a real exception */
1690
1691 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001692 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001694 f->f_lasti -= 2;
1695 tb_here(f);
1696
Guido van Rossume59214e1994-08-30 08:01:59 +00001697 if (f->f_trace)
1698 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001699 if (sys_profile)
1700 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 }
1702
1703 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1704
1705 if (why == WHY_RERAISE)
1706 why = WHY_EXCEPTION;
1707
1708 /* Unwind stacks if a (pseudo) exception occurred */
1709
1710 while (why != WHY_NOT && f->f_iblock > 0) {
1711 block *b = pop_block(f);
1712 while (STACK_LEVEL() > b->b_level) {
1713 v = POP();
1714 XDECREF(v);
1715 }
1716 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1717 why = WHY_NOT;
1718 JUMPTO(b->b_handler);
1719 break;
1720 }
1721 if (b->b_type == SETUP_FINALLY ||
1722 b->b_type == SETUP_EXCEPT &&
1723 why == WHY_EXCEPTION) {
1724 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001725 object *exc, *val, *tb;
1726 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 if (val == NULL) {
1728 val = None;
1729 INCREF(val);
1730 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 /* Make the raw exception data
1732 available to the handler,
1733 so a program can emulate the
1734 Python main loop. Don't do
1735 this for 'finally'. */
1736 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 sysset("exc_value", val);
1739 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001741 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 PUSH(val);
1743 PUSH(exc);
1744 }
1745 else {
1746 if (why == WHY_RETURN)
1747 PUSH(retval);
1748 v = newintobject((long)why);
1749 PUSH(v);
1750 }
1751 why = WHY_NOT;
1752 JUMPTO(b->b_handler);
1753 break;
1754 }
1755 } /* unwind stack */
1756
1757 /* End the loop if we still have an error (or return) */
1758
1759 if (why != WHY_NOT)
1760 break;
1761
1762 } /* main loop */
1763
1764 /* Pop remaining stack entries */
1765
1766 while (!EMPTY()) {
1767 v = POP();
1768 XDECREF(v);
1769 }
1770
Guido van Rossum96a42c81992-01-12 02:29:51 +00001771 if (why != WHY_RETURN)
1772 retval = NULL;
1773
Guido van Rossume59214e1994-08-30 08:01:59 +00001774 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001775 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001776 if (call_trace(&f->f_trace, &f->f_trace, f,
1777 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001778 XDECREF(retval);
1779 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001780 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001781 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001782 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001783 }
1784
1785 if (sys_profile && why == WHY_RETURN) {
1786 if (call_trace(&sys_profile, (object**)0,
1787 f, "return", retval)) {
1788 XDECREF(retval);
1789 retval = NULL;
1790 why = WHY_EXCEPTION;
1791 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001792 }
1793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001795
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 current_frame = f->f_back;
1797 DECREF(f);
1798
Guido van Rossum96a42c81992-01-12 02:29:51 +00001799 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001800}
1801
Guido van Rossum96a42c81992-01-12 02:29:51 +00001802#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001803static int
1804prtrace(v, str)
1805 object *v;
1806 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001808 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001809 if (printobject(v, stdout, 0) != 0)
1810 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001811 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001813#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001815static void
1816call_exc_trace(p_trace, p_newtrace, f)
1817 object **p_trace, **p_newtrace;
1818 frameobject *f;
1819{
1820 object *type, *value, *traceback, *arg;
1821 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001823 if (value == NULL) {
1824 value = None;
1825 INCREF(value);
1826 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001827 arg = mkvalue("(OOO)", type, value, traceback);
1828 if (arg == NULL) {
1829 err_restore(type, value, traceback);
1830 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001831 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001832 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1833 DECREF(arg);
1834 if (err == 0)
1835 err_restore(type, value, traceback);
1836 else {
1837 XDECREF(type);
1838 XDECREF(value);
1839 XDECREF(traceback);
1840 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001841}
1842
1843static int
1844call_trace(p_trace, p_newtrace, f, msg, arg)
1845 object **p_trace; /* in/out; may not be NULL;
1846 may not point to NULL variable initially */
1847 object **p_newtrace; /* in/out; may be NULL;
1848 may point to NULL variable;
1849 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001850 frameobject *f;
1851 char *msg;
1852 object *arg;
1853{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001854 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001855 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001856 static int tracing = 0;
1857
1858 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001859 /* Don't do recursive traces */
1860 if (p_newtrace) {
1861 XDECREF(*p_newtrace);
1862 *p_newtrace = NULL;
1863 }
1864 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001865 }
1866
Guido van Rossumf10570b1995-07-07 22:53:21 +00001867 args = newtupleobject(3);
1868 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001869 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001870 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001871 if (what == NULL)
1872 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001873 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001874 SETTUPLEITEM(args, 0, (object *)f);
1875 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001876 if (arg == NULL)
1877 arg = None;
1878 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001879 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001880 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001881 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001882 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001883 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001884 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001885 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001886 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001887 if (res == NULL) {
1888 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001889 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001890 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001891 *p_trace = NULL;
1892 if (p_newtrace) {
1893 XDECREF(*p_newtrace);
1894 *p_newtrace = NULL;
1895 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001896 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001897 }
1898 else {
1899 if (p_newtrace) {
1900 XDECREF(*p_newtrace);
1901 if (res == None)
1902 *p_newtrace = NULL;
1903 else {
1904 INCREF(res);
1905 *p_newtrace = res;
1906 }
1907 }
1908 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001909 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001910 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001911}
1912
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001914getbuiltins()
1915{
1916 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001917 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001918 else
1919 return current_frame->f_builtins;
1920}
1921
1922object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001923getlocals()
1924{
1925 if (current_frame == NULL)
1926 return NULL;
1927 fast_2_locals(current_frame);
1928 return current_frame->f_locals;
1929}
1930
1931object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001932getglobals()
1933{
1934 if (current_frame == NULL)
1935 return NULL;
1936 else
1937 return current_frame->f_globals;
1938}
1939
Guido van Rossum81daa321993-05-20 14:24:46 +00001940object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001941getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001942{
1943 if (current_frame == NULL)
1944 return NULL;
1945 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001946 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001947}
1948
Guido van Rossume59214e1994-08-30 08:01:59 +00001949object *
1950getframe()
1951{
1952 return (object *)current_frame;
1953}
1954
Guido van Rossum6135a871995-01-09 17:53:26 +00001955int
1956getrestricted()
1957{
1958 return current_frame == NULL ? 0 : current_frame->f_restricted;
1959}
1960
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962flushline()
1963{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001964 object *f = sysget("stdout");
1965 if (softspace(f, 0))
1966 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967}
1968
Guido van Rossum3f5da241990-12-20 15:06:42 +00001969
Guido van Rossum06186511995-01-07 12:40:10 +00001970#define BINOP(opname, ropname, thisfunc) \
1971 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1972 ; \
1973 else \
1974 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001975
1976
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001978or(v, w)
1979 object *v, *w;
1980{
Guido van Rossum06186511995-01-07 12:40:10 +00001981 BINOP("__or__", "__ror__", or);
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_or) != 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 *
1999xor(v, w)
2000 object *v, *w;
2001{
Guido van Rossum06186511995-01-07 12:40:10 +00002002 BINOP("__xor__", "__rxor__", xor);
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_xor) != 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 *
2020and(v, w)
2021 object *v, *w;
2022{
Guido van Rossum06186511995-01-07 12:40:10 +00002023 BINOP("__and__", "__rand__", and);
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_and) != 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 *
2041lshift(v, w)
2042 object *v, *w;
2043{
Guido van Rossum06186511995-01-07 12:40:10 +00002044 BINOP("__lshift__", "__rlshift__", lshift);
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_lshift) != 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 *
2062rshift(v, w)
2063 object *v, *w;
2064{
Guido van Rossum06186511995-01-07 12:40:10 +00002065 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002066 if (v->ob_type->tp_as_number != NULL) {
2067 object *x;
2068 object * (*f) FPROTO((object *, object *));
2069 if (coerce(&v, &w) != 0)
2070 return NULL;
2071 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2072 x = (*f)(v, w);
2073 DECREF(v);
2074 DECREF(w);
2075 if (f != NULL)
2076 return x;
2077 }
2078 err_setstr(TypeError, "bad operand type(s) for >>");
2079 return NULL;
2080}
2081
2082static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002083add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 object *v, *w;
2085{
Guido van Rossum06186511995-01-07 12:40:10 +00002086 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002087 if (v->ob_type->tp_as_sequence != NULL)
2088 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2089 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002090 object *x;
2091 if (coerce(&v, &w) != 0)
2092 return NULL;
2093 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2094 DECREF(v);
2095 DECREF(w);
2096 return x;
2097 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002098 err_setstr(TypeError, "bad operand type(s) for +");
2099 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100}
2101
2102static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 object *v, *w;
2105{
Guido van Rossum06186511995-01-07 12:40:10 +00002106 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002107 if (v->ob_type->tp_as_number != NULL) {
2108 object *x;
2109 if (coerce(&v, &w) != 0)
2110 return NULL;
2111 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2112 DECREF(v);
2113 DECREF(w);
2114 return x;
2115 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002116 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 return NULL;
2118}
2119
2120static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002121mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 object *v, *w;
2123{
2124 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002125 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002126 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002127 if (tp->tp_as_number != NULL &&
2128 w->ob_type->tp_as_sequence != NULL &&
2129 !is_instanceobject(v)) {
2130 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131 object *tmp = v;
2132 v = w;
2133 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002134 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002136 if (tp->tp_as_number != NULL) {
2137 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002138 if (is_instanceobject(v)) {
2139 /* Instances of user-defined classes get their
2140 other argument uncoerced, so they may
2141 implement sequence*number as well as
2142 number*number. */
2143 INCREF(v);
2144 INCREF(w);
2145 }
2146 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002147 return NULL;
2148 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2149 DECREF(v);
2150 DECREF(w);
2151 return x;
2152 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 if (tp->tp_as_sequence != NULL) {
2154 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002155 err_setstr(TypeError,
2156 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157 return NULL;
2158 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002159 return (*tp->tp_as_sequence->sq_repeat)
2160 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002162 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 return NULL;
2164}
2165
2166static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002167divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 object *v, *w;
2169{
Guido van Rossum06186511995-01-07 12:40:10 +00002170 BINOP("__div__", "__rdiv__", divide);
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_divide)(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 Rossum06186511995-01-07 12:40:10 +00002185mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 object *v, *w;
2187{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002188 if (is_stringobject(v)) {
2189 return formatstring(v, w);
2190 }
Guido van Rossum06186511995-01-07 12:40:10 +00002191 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002192 if (v->ob_type->tp_as_number != NULL) {
2193 object *x;
2194 if (coerce(&v, &w) != 0)
2195 return NULL;
2196 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2197 DECREF(v);
2198 DECREF(w);
2199 return x;
2200 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002201 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 return NULL;
2203}
2204
2205static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002206neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002207 object *v;
2208{
2209 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002210 return (*v->ob_type->tp_as_number->nb_negative)(v);
2211 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 return NULL;
2213}
2214
2215static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002216pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217 object *v;
2218{
2219 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002220 return (*v->ob_type->tp_as_number->nb_positive)(v);
2221 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222 return NULL;
2223}
2224
2225static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002226invert(v)
2227 object *v;
2228{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002229 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002230 if (v->ob_type->tp_as_number != NULL &&
2231 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2232 return (*f)(v);
2233 err_setstr(TypeError, "bad operand type(s) for unary ~");
2234 return NULL;
2235}
2236
2237static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 object *v;
2240{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002241 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002242 object *w;
2243 if (outcome < 0)
2244 return NULL;
2245 if (outcome == 0)
2246 w = True;
2247 else
2248 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002249 INCREF(w);
2250 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251}
Guido van Rossum234f9421993-06-17 12:35:49 +00002252
2253
Guido van Rossum681d79a1995-07-18 14:51:37 +00002254/* External interface to call any callable object.
2255 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002256
2257object *
2258call_object(func, arg)
2259 object *func;
2260 object *arg;
2261{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002262 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2263}
Guido van Rossume59214e1994-08-30 08:01:59 +00002264
Guido van Rossum681d79a1995-07-18 14:51:37 +00002265object *
2266PyEval_CallObjectWithKeywords(func, arg, kw)
2267 object *func;
2268 object *arg;
2269 object *kw;
2270{
2271 ternaryfunc call;
2272 object *result;
2273
2274 if (arg == NULL)
2275 arg = newtupleobject(0);
2276 else if (!is_tupleobject(arg)) {
2277 err_setstr(TypeError, "argument list must be a tuple");
2278 return NULL;
2279 }
2280 else
2281 INCREF(arg);
2282
2283 if (call = func->ob_type->tp_call)
2284 result = (*call)(func, arg, kw);
2285 else if (is_instancemethodobject(func) || is_funcobject(func))
2286 result = call_function(func, arg, kw);
2287 else
2288 result = call_builtin(func, arg, kw);
2289
2290 DECREF(arg);
2291
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002292 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002293 err_setstr(SystemError,
2294 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002295
2296 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002297}
2298
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002300call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002302 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002303 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 if (is_methodobject(func)) {
2306 method meth = getmethod(func);
2307 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002308 int flags = getflags(func);
2309 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002310 int size = gettuplesize(arg);
2311 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002312 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002313 else if (size == 0)
2314 arg = NULL;
2315 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002316 if (flags & METH_KEYWORDS)
2317 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
2318 if (kw != NULL) {
2319 err_setstr(TypeError,
2320 "this function takes no keyword arguments");
2321 return NULL;
2322 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002323 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 }
2325 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002326 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002328 if (is_instanceobject(func)) {
2329 object *res, *call = getattr(func,"__call__");
2330 if (call == NULL) {
2331 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002332 err_setstr(AttributeError,
2333 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002334 return NULL;
2335 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002336 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002337 DECREF(call);
2338 return res;
2339 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002340 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 return NULL;
2342}
2343
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002345call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002348 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002350 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002351 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002352 object **d, **k;
2353 int nk, nd;
2354 object *result;
2355
2356 if (kw != NULL && !is_dictobject(kw)) {
2357 err_badcall();
2358 return NULL;
2359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360
Guido van Rossume8122f11991-05-05 20:03:07 +00002361 if (is_instancemethodobject(func)) {
2362 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002363 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002364 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002365 if (self == NULL) {
2366 /* Unbound methods must be called with an instance of
2367 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002368 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002369 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002370 if (self != NULL &&
2371 is_instanceobject(self) &&
2372 issubclass((object *)
2373 (((instanceobject *)self)->in_class),
2374 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002375 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002376 else
2377 self = NULL;
2378 }
2379 if (self == NULL) {
2380 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002381 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002382 return NULL;
2383 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002384 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002385 }
2386 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002387 int argcount = gettuplesize(arg);
2388 object *newarg = newtupleobject(argcount + 1);
2389 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002390 if (newarg == NULL)
2391 return NULL;
2392 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002393 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002394 for (i = 0; i < argcount; i++) {
2395 object *v = GETTUPLEITEM(arg, i);
2396 XINCREF(v);
2397 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002398 }
2399 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 }
2401 }
2402 else {
2403 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 return NULL;
2406 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002407 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002409
2410 argdefs = PyFunction_GetDefaults(func);
2411 if (argdefs != NULL && is_tupleobject(argdefs)) {
2412 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2413 nd = gettuplesize(argdefs);
2414 }
2415 else {
2416 d = NULL;
2417 nd = 0;
2418 }
2419
2420 if (kw != NULL) {
2421 int pos, i;
2422 nk = getmappingsize(kw);
2423 k = NEW(object *, 2*nk);
2424 if (k == NULL) {
2425 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002426 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002427 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002428 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002429 pos = i = 0;
2430 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2431 i += 2;
2432 nk = i/2;
2433 /* XXX This is broken if the caller deletes dict items! */
2434 }
2435 else {
2436 k = NULL;
2437 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002438 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439
Guido van Rossum681d79a1995-07-18 14:51:37 +00002440 result = eval_code2(
2441 (codeobject *)getfunccode(func),
2442 getfuncglobals(func), (object *)NULL,
2443 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2444 k, nk,
2445 d, nd,
2446 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 DECREF(arg);
2449 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452}
2453
2454static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 object *v, *w;
2457{
2458 typeobject *tp = v->ob_type;
2459 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 return NULL;
2462 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002463 if (tp->tp_as_mapping != NULL) {
2464 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2465 }
2466 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 int i;
2468 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 return NULL;
2471 }
2472 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002473 if (i < 0) {
2474 int len = (*tp->tp_as_sequence->sq_length)(v);
2475 if (len < 0)
2476 return NULL;
2477 i += len;
2478 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481}
2482
2483static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002484loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 object *v, *w;
2486{
2487 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002488 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002490 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 return NULL;
2492 }
2493 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002494 v = (*sq->sq_item)(v, i);
2495 if (v)
2496 return v;
2497 if (err_occurred() == IndexError)
2498 err_clear();
2499 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500}
2501
2502static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002503slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 object *v;
2505 int isize;
2506 int *pi;
2507{
2508 if (v != NULL) {
2509 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510 err_setstr(TypeError, "slice index must be int");
2511 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512 }
2513 *pi = getintvalue(v);
2514 if (*pi < 0)
2515 *pi += isize;
2516 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518}
2519
2520static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522 object *u, *v, *w;
2523{
2524 typeobject *tp = u->ob_type;
2525 int ilow, ihigh, isize;
2526 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 return NULL;
2529 }
2530 ilow = 0;
2531 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002532 if (isize < 0)
2533 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002534 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002536 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002540
2541static int
2542assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543 object *w;
2544 object *key;
2545 object *v;
2546{
2547 typeobject *tp = w->ob_type;
2548 sequence_methods *sq;
2549 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002550 int (*func1)();
2551 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002552 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002553 (func1 = mp->mp_ass_subscript) != NULL) {
2554 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002555 }
2556 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002557 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002560 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002563 else {
2564 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002565 if (i < 0) {
2566 int len = (*sq->sq_length)(w);
2567 if (len < 0)
2568 return -1;
2569 i += len;
2570 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002571 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002572 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002573 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 err_setstr(TypeError,
2576 "can't assign to this subscripted object");
2577 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579}
2580
Guido van Rossum3f5da241990-12-20 15:06:42 +00002581static int
2582assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583 object *u, *v, *w, *x;
2584{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002585 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 if (sq == NULL) {
2588 err_setstr(TypeError, "assign to slice of non-sequence");
2589 return -1;
2590 }
2591 if (sq == NULL || sq->sq_ass_slice == NULL) {
2592 err_setstr(TypeError, "unassignable slice");
2593 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 }
2595 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002597 if (isize < 0)
2598 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599 if (slice_index(v, isize, &ilow) != 0)
2600 return -1;
2601 if (slice_index(w, isize, &ihigh) != 0)
2602 return -1;
2603 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604}
2605
2606static int
2607cmp_exception(err, v)
2608 object *err, *v;
2609{
2610 if (is_tupleobject(v)) {
2611 int i, n;
2612 n = gettuplesize(v);
2613 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002614 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002615 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 return 1;
2617 }
2618 return 0;
2619 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002620 if (is_classobject(v) && is_classobject(err))
2621 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 return err == v;
2623}
2624
Guido van Rossum3f5da241990-12-20 15:06:42 +00002625static int
2626cmp_member(v, w)
2627 object *v, *w;
2628{
Guido van Rossume59214e1994-08-30 08:01:59 +00002629 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002630 object *x;
2631 sequence_methods *sq;
2632 /* Special case for char in string */
2633 if (is_stringobject(w)) {
2634 register char *s, *end;
2635 register char c;
2636 if (!is_stringobject(v) || getstringsize(v) != 1) {
2637 err_setstr(TypeError,
2638 "string member test needs char left operand");
2639 return -1;
2640 }
2641 c = getstringvalue(v)[0];
2642 s = getstringvalue(w);
2643 end = s + getstringsize(w);
2644 while (s < end) {
2645 if (c == *s++)
2646 return 1;
2647 }
2648 return 0;
2649 }
2650 sq = w->ob_type->tp_as_sequence;
2651 if (sq == NULL) {
2652 err_setstr(TypeError,
2653 "'in' or 'not in' needs sequence right argument");
2654 return -1;
2655 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002656 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002657 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002658 if (x == NULL) {
2659 if (err_occurred() == IndexError) {
2660 err_clear();
2661 break;
2662 }
2663 return -1;
2664 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002665 cmp = cmpobject(v, x);
2666 XDECREF(x);
2667 if (cmp == 0)
2668 return 1;
2669 }
2670 return 0;
2671}
2672
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002674cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002675 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 register object *v;
2677 register object *w;
2678{
2679 register int cmp;
2680 register int res = 0;
2681 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002682 case IS:
2683 case IS_NOT:
2684 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002685 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002686 res = !res;
2687 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688 case IN:
2689 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002690 res = cmp_member(v, w);
2691 if (res < 0)
2692 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002693 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002694 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695 break;
2696 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002697 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002698 break;
2699 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002700 cmp = cmpobject(v, w);
2701 switch (op) {
2702 case LT: res = cmp < 0; break;
2703 case LE: res = cmp <= 0; break;
2704 case EQ: res = cmp == 0; break;
2705 case NE: res = cmp != 0; break;
2706 case GT: res = cmp > 0; break;
2707 case GE: res = cmp >= 0; break;
2708 /* XXX no default? (res is initialized to 0 though) */
2709 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 }
2711 v = res ? True : False;
2712 INCREF(v);
2713 return v;
2714}
2715
Guido van Rossum3f5da241990-12-20 15:06:42 +00002716static int
2717import_from(locals, v, name)
2718 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002719 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002720 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002721{
2722 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002723 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002724 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002725 return -1;
2726 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002727 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002728 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002729 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002730 object *name, *value;
2731 pos = 0;
2732 while (mappinggetnext(w, &pos, &name, &value)) {
2733 if (!is_stringobject(name) ||
2734 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002735 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002736 if (is_accessobject(value)) {
2737 value = getaccessvalue(value, (object *)NULL);
2738 if (value == NULL) {
2739 err_clear();
2740 continue;
2741 }
2742 }
2743 else
2744 INCREF(value);
2745 err = dict2insert(locals, name, value);
2746 DECREF(value);
2747 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002748 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002749 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002750 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002751 }
2752 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002753 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002754 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002755 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002756 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002757 getstringvalue(name));
2758 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759 return -1;
2760 }
2761 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002762 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002763 }
2764}
2765
2766static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002767build_class(methods, bases, name)
2768 object *methods; /* dictionary */
2769 object *bases; /* tuple containing classes */
2770 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002771{
Guido van Rossum25831651993-05-19 14:50:45 +00002772 int i;
2773 if (!is_tupleobject(bases)) {
2774 err_setstr(SystemError, "build_class with non-tuple bases");
2775 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002776 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002777 if (gettuplesize(bases) > 0) {
2778 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002779 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002780 /* Call the base's *type*, if it is callable.
2781 This code is a hook for Donald Beaudry's type extensions.
2782 In unexended Python it will never be triggered since its
2783 types are not callable. */
2784 if (base->ob_type->ob_type->tp_call) {
2785 object *args;
2786 object *class;
2787 args = mkvalue("(OOO)", name, bases, methods);
2788 class = call_object((object *)base->ob_type, args);
2789 DECREF(args);
2790 return class;
2791 }
2792 }
Guido van Rossum25831651993-05-19 14:50:45 +00002793 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002794 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002795 return NULL;
2796 }
Guido van Rossum25831651993-05-19 14:50:45 +00002797 if (!is_stringobject(name)) {
2798 err_setstr(SystemError, "build_class witn non-string name");
2799 return NULL;
2800 }
2801 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002802 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002803 if (!is_classobject(base)) {
2804 err_setstr(TypeError,
2805 "base is not a class object");
2806 return NULL;
2807 }
2808 }
2809 return newclassobject(bases, methods, name);
2810}
2811
2812static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002813access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002814 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002815 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002816 frameobject *f;
2817{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002818 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002819 object *value, *ac;
2820 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002821 int ret;
2822 fast_2_locals(f);
2823 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002824 if (value && is_accessobject(value)) {
2825 err_setstr(AccessError, "can't override access");
2826 return -1;
2827 }
2828 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002829 if (value != NULL && value != None)
2830 type = value->ob_type;
2831 else
2832 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002833 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002834 if (ac == NULL)
2835 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002836 ret = mappinginsert(f->f_locals, name, ac);
2837 DECREF(ac);
2838 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002839 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002840}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002841
2842static int
2843exec_statement(prog, globals, locals)
2844 object *prog;
2845 object *globals;
2846 object *locals;
2847{
2848 char *s;
2849 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002850 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002851 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002852
2853 if (is_tupleobject(prog) && globals == None && locals == None &&
2854 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2855 /* Backward compatibility hack */
2856 globals = gettupleitem(prog, 1);
2857 if (n == 3)
2858 locals = gettupleitem(prog, 2);
2859 prog = gettupleitem(prog, 0);
2860 }
2861 if (globals == None) {
2862 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002863 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002864 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002865 plain = 1;
2866 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002867 }
2868 else if (locals == None)
2869 locals = globals;
2870 if (!is_stringobject(prog) &&
2871 !is_codeobject(prog) &&
2872 !is_fileobject(prog)) {
2873 err_setstr(TypeError,
2874 "exec 1st arg must be string, code or file object");
2875 return -1;
2876 }
2877 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2878 err_setstr(TypeError,
2879 "exec 2nd/3rd args must be dict or None");
2880 return -1;
2881 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002882 if (dictlookup(globals, "__builtins__") == NULL)
2883 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002884 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002885 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002886 return -1;
2887 return 0;
2888 }
2889 if (is_fileobject(prog)) {
2890 FILE *fp = getfilefile(prog);
2891 char *name = getstringvalue(getfilename(prog));
2892 if (run_file(fp, name, file_input, globals, locals) == NULL)
2893 return -1;
2894 return 0;
2895 }
2896 s = getstringvalue(prog);
2897 if (strlen(s) != getstringsize(prog)) {
2898 err_setstr(ValueError, "embedded '\\0' in exec string");
2899 return -1;
2900 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002901 v = run_string(s, file_input, globals, locals);
2902 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002903 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002904 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002905 if (plain)
2906 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002907 return 0;
2908}
Guido van Rossum24c13741995-02-14 09:42:43 +00002909
Guido van Rossum681d79a1995-07-18 14:51:37 +00002910/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002911static object *
2912find_from_args(f, nexti)
2913 frameobject *f;
2914 int nexti;
2915{
2916 int opcode;
2917 int oparg;
2918 object *list, *name;
2919 unsigned char *next_instr;
2920
2921 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2922 opcode = (*next_instr++);
2923 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002924 INCREF(None);
2925 return None;
2926 }
2927
2928 list = newlistobject(0);
2929 if (list == NULL)
2930 return NULL;
2931
2932 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002933 oparg = (next_instr[1]<<8) + next_instr[0];
2934 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002935 name = Getnamev(f, oparg);
2936 if (addlistitem(list, name) < 0) {
2937 DECREF(list);
2938 break;
2939 }
2940 opcode = (*next_instr++);
2941 } while (opcode == IMPORT_FROM);
2942
2943 return list;
2944}