blob: a0e5eb22338264c7d4c62caf1416587fa08132b8 [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 "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000040#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "opcode.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000043#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000044
Guido van Rossumc6004111993-11-05 10:22:19 +000045#include <ctype.h>
46
Guido van Rossum04691fc1992-08-12 15:35:34 +000047/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000048/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000049
Guido van Rossumacbe8da1993-04-15 15:33:52 +000050/* Turn this on if you want to debug the interpreter: */
51/* (This can be on even if NDEBUG is defined) */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052/* #define DEBUG 1 */
Guido van Rossumacbe8da1993-04-15 15:33:52 +000053
54#if defined(DEBUG) || !defined(NDEBUG)
Guido van Rossum96a42c81992-01-12 02:29:51 +000055/* For debugging the interpreter: */
56#define LLTRACE 1 /* Low-level trace feature */
57#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000058#endif
59
Guido van Rossum5b722181993-03-30 17:46:03 +000060
Guido van Rossum374a9221991-04-04 10:40:29 +000061/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000062
Guido van Rossum681d79a1995-07-18 14:51:37 +000063static object *eval_code2 PROTO((codeobject *,
64 object *, object *,
65 object **, int,
66 object **, int,
67 object **, int,
68 object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000069#ifdef LLTRACE
70static int prtrace PROTO((object *, char *));
71#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000072static void call_exc_trace PROTO((object **, object**, frameobject *));
73static int call_trace
74 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075static object *add PROTO((object *, object *));
76static object *sub PROTO((object *, object *));
Guido van Rossum50564e81996-01-12 01:13:16 +000077static object *pow PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000078static object *mul PROTO((object *, object *));
79static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000080static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000081static object *neg PROTO((object *));
82static object *pos PROTO((object *));
83static object *not PROTO((object *));
84static object *invert PROTO((object *));
85static object *lshift PROTO((object *, object *));
86static object *rshift PROTO((object *, object *));
87static object *and PROTO((object *, object *));
88static object *xor PROTO((object *, object *));
89static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000090static object *call_builtin PROTO((object *, object *, object *));
91static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000092static object *apply_subscript PROTO((object *, object *));
93static object *loop_subscript PROTO((object *, object *));
94static int slice_index PROTO((object *, int, int *));
95static object *apply_slice PROTO((object *, object *, object *));
96static int assign_subscript PROTO((object *, object *, object *));
97static int assign_slice PROTO((object *, object *, object *, object *));
98static int cmp_exception PROTO((object *, object *));
99static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +0000100static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000101static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000102static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +0000103static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000104static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000105static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000106
107
Guido van Rossum0a066c01992-03-27 17:29:15 +0000108/* Pointer to current frame, used to link new frames to */
109
Guido van Rossum374a9221991-04-04 10:40:29 +0000110static frameobject *current_frame;
111
Guido van Rossume59214e1994-08-30 08:01:59 +0000112#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000113
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114#include <errno.h>
115#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000116
Guido van Rossuma9672091994-09-14 13:31:22 +0000117static type_lock interpreter_lock = 0;
118static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119
120void
121init_save_thread()
122{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000124 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125 interpreter_lock = allocate_lock();
126 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000127 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000129
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130#endif
131
Guido van Rossumff4949e1992-08-05 19:58:53 +0000132/* Functions save_thread and restore_thread are always defined so
133 dynamically loaded modules needn't be compiled separately for use
134 with and without threads: */
135
Guido van Rossum04691fc1992-08-12 15:35:34 +0000136object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137save_thread()
138{
Guido van Rossume59214e1994-08-30 08:01:59 +0000139#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000140 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000141 object *res;
142 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000143 current_frame = NULL;
144 release_lock(interpreter_lock);
145 return res;
146 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000147#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000148 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149}
150
151void
152restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000153 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000154{
Guido van Rossume59214e1994-08-30 08:01:59 +0000155#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156 if (interpreter_lock) {
157 int err;
158 err = errno;
159 acquire_lock(interpreter_lock, 1);
160 errno = err;
161 current_frame = (frameobject *)x;
162 }
163#endif
164}
165
166
Guido van Rossuma9672091994-09-14 13:31:22 +0000167/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
168 signal handlers or Mac I/O completion routines) can schedule calls
169 to a function to be called synchronously.
170 The synchronous function is called with one void* argument.
171 It should return 0 for success or -1 for failure -- failure should
172 be accompanied by an exception.
173
174 If registry succeeds, the registry function returns 0; if it fails
175 (e.g. due to too many pending calls) it returns -1 (without setting
176 an exception condition).
177
178 Note that because registry may occur from within signal handlers,
179 or other asynchronous events, calling malloc() is unsafe!
180
181#ifdef WITH_THREAD
182 Any thread can schedule pending calls, but only the main thread
183 will execute them.
184#endif
185
186 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
187 There are two possible race conditions:
188 (1) nested asynchronous registry calls;
189 (2) registry calls made while pending calls are being processed.
190 While (1) is very unlikely, (2) is a real possibility.
191 The current code is safe against (2), but not against (1).
192 The safety against (2) is derived from the fact that only one
193 thread (the main thread) ever takes things out of the queue.
194*/
195
196#define NPENDINGCALLS 32
197static struct {
198 int (*func) PROTO((ANY *));
199 ANY *arg;
200} pendingcalls[NPENDINGCALLS];
201static volatile int pendingfirst = 0;
202static volatile int pendinglast = 0;
203
204int
205Py_AddPendingCall(func, arg)
206 int (*func) PROTO((ANY *));
207 ANY *arg;
208{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000209 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000210 int i, j;
211 /* XXX Begin critical section */
212 /* XXX If you want this to be safe against nested
213 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 if (busy)
215 return -1;
216 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000217 i = pendinglast;
218 j = (i + 1) % NPENDINGCALLS;
219 if (j == pendingfirst)
220 return -1; /* Queue full */
221 pendingcalls[i].func = func;
222 pendingcalls[i].arg = arg;
223 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000224 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000225 /* XXX End critical section */
226 return 0;
227}
228
Guido van Rossum180d7b41994-09-29 09:45:57 +0000229int
230Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000231{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000232 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000233#ifdef WITH_THREAD
234 if (get_thread_ident() != main_thread)
235 return 0;
236#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000237 if (busy)
238 return 0;
239 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240 for (;;) {
241 int i;
242 int (*func) PROTO((ANY *));
243 ANY *arg;
244 i = pendingfirst;
245 if (i == pendinglast)
246 break; /* Queue empty */
247 func = pendingcalls[i].func;
248 arg = pendingcalls[i].arg;
249 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000250 if (func(arg) < 0) {
251 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000252 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000254 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 return 0;
257}
258
259
Guido van Rossum374a9221991-04-04 10:40:29 +0000260/* Status code for main loop (reason for stack unwind) */
261
262enum why_code {
263 WHY_NOT, /* No error */
264 WHY_EXCEPTION, /* Exception occurred */
265 WHY_RERAISE, /* Exception re-raised by 'finally' */
266 WHY_RETURN, /* 'return' statement */
267 WHY_BREAK /* 'break' statement */
268};
269
270
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000272
273object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000274eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000275 codeobject *co;
276 object *globals;
277 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000278{
279 return eval_code2(co,
280 globals, locals,
281 (object **)NULL, 0,
282 (object **)NULL, 0,
283 (object **)NULL, 0,
284 (object *)NULL);
285}
286
287
288/* Interpreter main loop */
289
290static object *
291eval_code2(co, globals, locals,
292 args, argcount, kws, kwcount, defs, defcount, owner)
293 codeobject *co;
294 object *globals;
295 object *locals;
296 object **args;
297 int argcount;
298 object **kws; /* length: 2*kwcount */
299 int kwcount;
300 object **defs;
301 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000302 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000303{
304 register unsigned char *next_instr;
305 register int opcode; /* Current opcode */
306 register int oparg; /* Current opcode argument, if any */
307 register object **stack_pointer;
308 register enum why_code why; /* Reason for block stack unwind */
309 register int err; /* Error status -- nonzero if error */
310 register object *x; /* Result object -- NULL if error */
311 register object *v; /* Temporary objects popped off stack */
312 register object *w;
313 register object *u;
314 register object *t;
315 register frameobject *f; /* Current frame */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316 register object **fastlocals;
317 object *retval; /* Return value */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000318 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000319#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000320 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000321#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +0000322#if defined(DEBUG) || defined(LLTRACE)
323 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000324 char *filename = getstringvalue(co->co_filename);
325#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000326
327/* Code access macros */
328
329#define GETCONST(i) Getconst(f, i)
330#define GETNAME(i) Getname(f, i)
331#define GETNAMEV(i) Getnamev(f, i)
332#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
333#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
334#define NEXTOP() (*next_instr++)
335#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
336#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
337#define JUMPBY(x) (next_instr += (x))
338
339/* Stack manipulation macros */
340
341#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
342#define EMPTY() (STACK_LEVEL() == 0)
343#define TOP() (stack_pointer[-1])
344#define BASIC_PUSH(v) (*stack_pointer++ = (v))
345#define BASIC_POP() (*--stack_pointer)
346
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000347#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
348 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
349
Guido van Rossum96a42c81992-01-12 02:29:51 +0000350#ifdef LLTRACE
351#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
352#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000353#else
354#define PUSH(v) BASIC_PUSH(v)
355#define POP() BASIC_POP()
356#endif
357
Guido van Rossum681d79a1995-07-18 14:51:37 +0000358/* Local variable macros */
359
360#define GETLOCAL(i) (fastlocals[i])
361#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
362 GETLOCAL(i) = value; } while (0)
363
364 if (globals == NULL) {
365 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000366 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000367 }
368
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000369#ifdef LLTRACE
370 lltrace = dictlookup(globals, "__lltrace__") != NULL;
371#endif
372
Guido van Rossum374a9221991-04-04 10:40:29 +0000373 f = newframeobject(
374 current_frame, /*back*/
375 co, /*code*/
376 globals, /*globals*/
377 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000378 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000379 50, /*nvalues*/
380 20); /*nblocks*/
381 if (f == NULL)
382 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000383
Guido van Rossum374a9221991-04-04 10:40:29 +0000384 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000385
Guido van Rossum681d79a1995-07-18 14:51:37 +0000386 if (co->co_nlocals > 0)
387 fastlocals = ((listobject *)f->f_fastlocals)->ob_item;
388
389 if (co->co_argcount > 0 ||
390 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
391 int i;
392 int n = argcount;
393 object *kwdict = NULL;
394 if (co->co_flags & CO_VARKEYWORDS) {
395 kwdict = newmappingobject();
396 if (kwdict == NULL)
397 goto fail;
398 }
399 if (argcount > co->co_argcount) {
400 if (!(co->co_flags & CO_VARARGS)) {
401 err_setstr(TypeError, "too many arguments");
402 goto fail;
403 }
404 n = co->co_argcount;
405 }
406 for (i = 0; i < n; i++) {
407 x = args[i];
408 INCREF(x);
409 SETLOCAL(i, x);
410 }
411 if (co->co_flags & CO_VARARGS) {
412 u = newtupleobject(argcount - n);
413 for (i = n; i < argcount; i++) {
414 x = args[i];
415 INCREF(x);
416 SETTUPLEITEM(u, i-n, x);
417 }
418 SETLOCAL(co->co_argcount, u);
419 }
420 for (i = 0; i < kwcount; i++) {
421 object *keyword = kws[2*i];
422 object *value = kws[2*i + 1];
423 int j;
424 /* XXX slow -- speed up using dictionary? */
425 for (j = 0; j < co->co_argcount; j++) {
426 object *nm = GETTUPLEITEM(co->co_varnames, j);
427 if (cmpobject(keyword, nm) == 0)
428 break;
429 }
430 if (j >= co->co_argcount) {
431 if (kwdict == NULL) {
432 err_setval(KeyError/*XXX*/, keyword);
433 goto fail;
434 }
435 mappinginsert(kwdict, keyword, value);
436 }
437 else {
438 if (GETLOCAL(j) != NULL) {
439 err_setstr(TypeError,
440 "keyword parameter redefined");
441 goto fail;
442 }
443 INCREF(value);
444 SETLOCAL(j, value);
445 }
446 }
447 if (argcount < co->co_argcount) {
448 int m = co->co_argcount - defcount;
449 for (i = argcount; i < m; i++) {
450 if (GETLOCAL(i) == NULL) {
451 err_setstr(TypeError,
452 "not enough arguments");
453 goto fail;
454 }
455 }
456 if (n > m)
457 i = n - m;
458 else
459 i = 0;
460 for (; i < defcount; i++) {
461 if (GETLOCAL(m+i) == NULL) {
462 object *def = defs[i];
463 INCREF(def);
464 SETLOCAL(m+i, def);
465 }
466 }
467 }
468 if (kwdict != NULL) {
469 i = co->co_argcount;
470 if (co->co_flags & CO_VARARGS)
471 i++;
472 SETLOCAL(i, kwdict);
473 }
474 if (0) {
475 fail:
476 XDECREF(kwdict);
477 goto fail2;
478 }
479 }
480 else {
481 if (argcount > 0 || kwcount > 0) {
482 err_setstr(TypeError, "no arguments expected");
483 fail2:
484 current_frame = f->f_back;
485 DECREF(f);
486 return NULL;
487 }
488 }
489
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000490 if (sys_trace != NULL) {
491 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000492 be called on *every* entry to a code block.
493 Its return value, if not None, is a function that
494 will be called at the start of each executed line
495 of code. (Actually, the function must return
496 itself in order to continue tracing.)
497 The trace functions are called with three arguments:
498 a pointer to the current frame, a string indicating
499 why the function is called, and an argument which
500 depends on the situation. The global trace function
501 (sys.trace) is also called whenever an exception
502 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 if (call_trace(&sys_trace, &f->f_trace, f, "call",
504 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000505 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000506 current_frame = f->f_back;
507 DECREF(f);
508 return NULL;
509 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000510 }
511
512 if (sys_profile != NULL) {
513 /* Similar for sys_profile, except it needn't return
514 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000515 if (call_trace(&sys_profile, (object**)0, f, "call",
516 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000517 current_frame = f->f_back;
518 DECREF(f);
519 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000520 }
521 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000522
Guido van Rossum374a9221991-04-04 10:40:29 +0000523 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000524 stack_pointer = f->f_valuestack;
525
Guido van Rossum374a9221991-04-04 10:40:29 +0000526 why = WHY_NOT;
527 err = 0;
528 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000529
530 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000531 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000532
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000533 /* Do periodic things.
534 Doing this every time through the loop would add
535 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000536 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000537
Guido van Rossuma9672091994-09-14 13:31:22 +0000538 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000539 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000540 why = WHY_EXCEPTION;
541 goto on_error;
542 }
543 }
544
Guido van Rossum374a9221991-04-04 10:40:29 +0000545 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000546 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000547 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000549 goto on_error;
550 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000551
Guido van Rossume59214e1994-08-30 08:01:59 +0000552#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553 if (interpreter_lock) {
554 /* Give another thread a chance */
555
556 current_frame = NULL;
557 release_lock(interpreter_lock);
558
559 /* Other threads may run now */
560
561 acquire_lock(interpreter_lock, 1);
562 current_frame = f;
563 }
564#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000565 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000566
Guido van Rossum374a9221991-04-04 10:40:29 +0000567 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000568
569#ifdef DEBUG
570 f->f_lasti = INSTR_OFFSET();
571#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000572
573 opcode = NEXTOP();
574 if (HAS_ARG(opcode))
575 oparg = NEXTARG();
576
Guido van Rossum96a42c81992-01-12 02:29:51 +0000577#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000578 /* Instruction tracing */
579
Guido van Rossum96a42c81992-01-12 02:29:51 +0000580 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000581 if (HAS_ARG(opcode)) {
582 printf("%d: %d, %d\n",
583 (int) (INSTR_OFFSET() - 3),
584 opcode, oparg);
585 }
586 else {
587 printf("%d: %d\n",
588 (int) (INSTR_OFFSET() - 1), opcode);
589 }
590 }
591#endif
592
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000593 if (!CHECK_STACK(3)) {
594 x = NULL;
595 break;
596 }
597
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 /* Main switch on opcode */
599
600 switch (opcode) {
601
602 /* BEWARE!
603 It is essential that any operation that fails sets either
604 x to NULL, err to nonzero, or why to anything but WHY_NOT,
605 and that no operation that succeeds does this! */
606
607 /* case STOP_CODE: this is an error! */
608
609 case POP_TOP:
610 v = POP();
611 DECREF(v);
612 break;
613
614 case ROT_TWO:
615 v = POP();
616 w = POP();
617 PUSH(v);
618 PUSH(w);
619 break;
620
621 case ROT_THREE:
622 v = POP();
623 w = POP();
624 x = POP();
625 PUSH(v);
626 PUSH(x);
627 PUSH(w);
628 break;
629
630 case DUP_TOP:
631 v = TOP();
632 INCREF(v);
633 PUSH(v);
634 break;
635
636 case UNARY_POSITIVE:
637 v = POP();
638 x = pos(v);
639 DECREF(v);
640 PUSH(x);
641 break;
642
643 case UNARY_NEGATIVE:
644 v = POP();
645 x = neg(v);
646 DECREF(v);
647 PUSH(x);
648 break;
649
650 case UNARY_NOT:
651 v = POP();
652 x = not(v);
653 DECREF(v);
654 PUSH(x);
655 break;
656
657 case UNARY_CONVERT:
658 v = POP();
659 x = reprobject(v);
660 DECREF(v);
661 PUSH(x);
662 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000663
664 case UNARY_INVERT:
665 v = POP();
666 x = invert(v);
667 DECREF(v);
668 PUSH(x);
669 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000670
Guido van Rossum50564e81996-01-12 01:13:16 +0000671 case BINARY_POWER:
672 w = POP();
673 v = POP();
674 x = pow(v, w);
675 DECREF(v);
676 DECREF(w);
677 PUSH(x);
678 break;
679
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 case BINARY_MULTIPLY:
681 w = POP();
682 v = POP();
683 x = mul(v, w);
684 DECREF(v);
685 DECREF(w);
686 PUSH(x);
687 break;
688
689 case BINARY_DIVIDE:
690 w = POP();
691 v = POP();
692 x = divide(v, w);
693 DECREF(v);
694 DECREF(w);
695 PUSH(x);
696 break;
697
698 case BINARY_MODULO:
699 w = POP();
700 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000701 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 DECREF(v);
703 DECREF(w);
704 PUSH(x);
705 break;
706
707 case BINARY_ADD:
708 w = POP();
709 v = POP();
710 x = add(v, w);
711 DECREF(v);
712 DECREF(w);
713 PUSH(x);
714 break;
715
716 case BINARY_SUBTRACT:
717 w = POP();
718 v = POP();
719 x = sub(v, w);
720 DECREF(v);
721 DECREF(w);
722 PUSH(x);
723 break;
724
725 case BINARY_SUBSCR:
726 w = POP();
727 v = POP();
728 x = apply_subscript(v, w);
729 DECREF(v);
730 DECREF(w);
731 PUSH(x);
732 break;
733
Guido van Rossum7928cd71991-10-24 14:59:31 +0000734 case BINARY_LSHIFT:
735 w = POP();
736 v = POP();
737 x = lshift(v, w);
738 DECREF(v);
739 DECREF(w);
740 PUSH(x);
741 break;
742
743 case BINARY_RSHIFT:
744 w = POP();
745 v = POP();
746 x = rshift(v, w);
747 DECREF(v);
748 DECREF(w);
749 PUSH(x);
750 break;
751
752 case BINARY_AND:
753 w = POP();
754 v = POP();
755 x = and(v, w);
756 DECREF(v);
757 DECREF(w);
758 PUSH(x);
759 break;
760
761 case BINARY_XOR:
762 w = POP();
763 v = POP();
764 x = xor(v, w);
765 DECREF(v);
766 DECREF(w);
767 PUSH(x);
768 break;
769
770 case BINARY_OR:
771 w = POP();
772 v = POP();
773 x = or(v, w);
774 DECREF(v);
775 DECREF(w);
776 PUSH(x);
777 break;
778
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 case SLICE+0:
780 case SLICE+1:
781 case SLICE+2:
782 case SLICE+3:
783 if ((opcode-SLICE) & 2)
784 w = POP();
785 else
786 w = NULL;
787 if ((opcode-SLICE) & 1)
788 v = POP();
789 else
790 v = NULL;
791 u = POP();
792 x = apply_slice(u, v, w);
793 DECREF(u);
794 XDECREF(v);
795 XDECREF(w);
796 PUSH(x);
797 break;
798
799 case STORE_SLICE+0:
800 case STORE_SLICE+1:
801 case STORE_SLICE+2:
802 case STORE_SLICE+3:
803 if ((opcode-STORE_SLICE) & 2)
804 w = POP();
805 else
806 w = NULL;
807 if ((opcode-STORE_SLICE) & 1)
808 v = POP();
809 else
810 v = NULL;
811 u = POP();
812 t = POP();
813 err = assign_slice(u, v, w, t); /* u[v:w] = t */
814 DECREF(t);
815 DECREF(u);
816 XDECREF(v);
817 XDECREF(w);
818 break;
819
820 case DELETE_SLICE+0:
821 case DELETE_SLICE+1:
822 case DELETE_SLICE+2:
823 case DELETE_SLICE+3:
824 if ((opcode-DELETE_SLICE) & 2)
825 w = POP();
826 else
827 w = NULL;
828 if ((opcode-DELETE_SLICE) & 1)
829 v = POP();
830 else
831 v = NULL;
832 u = POP();
833 err = assign_slice(u, v, w, (object *)NULL);
834 /* del u[v:w] */
835 DECREF(u);
836 XDECREF(v);
837 XDECREF(w);
838 break;
839
840 case STORE_SUBSCR:
841 w = POP();
842 v = POP();
843 u = POP();
844 /* v[w] = u */
845 err = assign_subscript(v, w, u);
846 DECREF(u);
847 DECREF(v);
848 DECREF(w);
849 break;
850
851 case DELETE_SUBSCR:
852 w = POP();
853 v = POP();
854 /* del v[w] */
855 err = assign_subscript(v, w, (object *)NULL);
856 DECREF(v);
857 DECREF(w);
858 break;
859
860 case PRINT_EXPR:
861 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000862 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000863 /* Before printing, also assign to '_' */
864 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000865 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000866 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000868 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000869 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000870 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 flushline();
872 }
873 DECREF(v);
874 break;
875
876 case PRINT_ITEM:
877 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000878 w = sysget("stdout");
879 if (softspace(w, 1))
880 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000881 err = writeobject(v, w, PRINT_RAW);
882 if (err == 0 && is_stringobject(v)) {
883 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 char *s = getstringvalue(v);
885 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000886 if (len > 0 &&
887 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000888 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000889 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 DECREF(v);
892 break;
893
894 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000895 x = sysget("stdout");
896 if (x == NULL)
897 err_setstr(RuntimeError, "lost sys.stdout");
898 else {
899 writestring("\n", x);
900 softspace(x, 0);
901 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 break;
903
904 case BREAK_LOOP:
905 why = WHY_BREAK;
906 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000907
Guido van Rossumf10570b1995-07-07 22:53:21 +0000908 case RAISE_VARARGS:
909 u = v = w = NULL;
910 switch (oparg) {
911 case 3:
912 u = POP(); /* traceback */
913 if (u == None) {
914 DECREF(u);
915 u = NULL;
916 }
Guido van Rossum9d78d8d1995-09-18 21:29:36 +0000917 else if (!PyTraceBack_Check(u)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000918 err_setstr(TypeError,
919 "raise 3rd arg must be traceback or None");
920 goto raise_error;
921 }
922 /* Fallthrough */
923 case 2:
924 v = POP(); /* value */
925 /* Fallthrough */
926 case 1:
927 w = POP(); /* exc */
928 break;
929 default:
930 err_setstr(SystemError,
931 "bad RAISE_VARARGS oparg");
932 goto raise_error;
933 }
934 if (v == NULL) {
935 v = None;
936 INCREF(v);
937 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000938 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000939 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000940 t = w;
941 w = GETTUPLEITEM(w, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000942 INCREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000943 DECREF(t);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000944 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000945 if (is_stringobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000946 ;
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000947 } else if (is_classobject(w)) {
948 if (!is_instanceobject(v)
949 || !issubclass((object*)((instanceobject*)v)->in_class,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000950 w)) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000951 err_setstr(TypeError,
952 "a class exception must have a value that is an instance of the class");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000953 goto raise_error;
954 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000955 } else if (is_instanceobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000956 if (v != None) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000957 err_setstr(TypeError,
958 "an instance exception may not have a separate value");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000959 goto raise_error;
960 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000961 else {
962 DECREF(v);
963 v = w;
964 w = (object*) ((instanceobject*)w)->in_class;
965 INCREF(w);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000966 }
Guido van Rossumf10570b1995-07-07 22:53:21 +0000967 }
968 else {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000969 err_setstr(TypeError,
970 "exceptions must be strings, classes, or instances");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000971 goto raise_error;
972 }
973 err_restore(w, v, u);
974 if (u == NULL)
975 why = WHY_EXCEPTION;
976 else
977 why = WHY_RERAISE;
978 break;
979 raise_error:
980 XDECREF(v);
981 XDECREF(w);
982 XDECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 why = WHY_EXCEPTION;
984 break;
985
986 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000987 if ((x = f->f_locals) == NULL) {
988 err_setstr(SystemError, "no locals");
989 break;
990 }
991 INCREF(x);
992 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 break;
994
995 case RETURN_VALUE:
996 retval = POP();
997 why = WHY_RETURN;
998 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000999
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001000 case EXEC_STMT:
1001 w = POP();
1002 v = POP();
1003 u = POP();
1004 err = exec_statement(u, v, w);
1005 DECREF(u);
1006 DECREF(v);
1007 DECREF(w);
1008 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001009
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 case POP_BLOCK:
1011 {
1012 block *b = pop_block(f);
1013 while (STACK_LEVEL() > b->b_level) {
1014 v = POP();
1015 DECREF(v);
1016 }
1017 }
1018 break;
1019
1020 case END_FINALLY:
1021 v = POP();
1022 if (is_intobject(v)) {
1023 why = (enum why_code) getintvalue(v);
1024 if (why == WHY_RETURN)
1025 retval = POP();
1026 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001027 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001029 u = POP();
1030 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001032 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 }
1034 else if (v != None) {
1035 err_setstr(SystemError,
1036 "'finally' pops bad exception");
1037 why = WHY_EXCEPTION;
1038 }
1039 DECREF(v);
1040 break;
1041
1042 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001043 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001045 w = POP();
1046 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001048 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 DECREF(v);
1050 DECREF(w);
1051 break;
1052
1053 case STORE_NAME:
1054 w = GETNAMEV(oparg);
1055 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001056 if ((x = f->f_locals) == NULL) {
1057 err_setstr(SystemError, "no locals");
1058 break;
1059 }
1060 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001061 if (u == NULL) {
1062 if (defmode != 0) {
1063 if (v != None)
1064 u = (object *)v->ob_type;
1065 else
1066 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001067 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001068 (typeobject *)u,
1069 defmode);
1070 DECREF(v);
1071 if (x == NULL)
1072 break;
1073 v = x;
1074 }
1075 }
1076 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001077 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001078 DECREF(v);
1079 break;
1080 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001081 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001082 DECREF(v);
1083 break;
1084
1085 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001086 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001087 if ((x = f->f_locals) == NULL) {
1088 err_setstr(SystemError, "no locals");
1089 break;
1090 }
1091 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001092 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001093 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001094 (object *)NULL);
1095 break;
1096 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001097 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001098 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001099 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001100
1101#ifdef CASE_TOO_BIG
1102 default: switch (opcode) {
1103#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001104
1105 case UNPACK_TUPLE:
1106 v = POP();
1107 if (!is_tupleobject(v)) {
1108 err_setstr(TypeError, "unpack non-tuple");
1109 why = WHY_EXCEPTION;
1110 }
1111 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001112 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 "unpack tuple of wrong size");
1114 why = WHY_EXCEPTION;
1115 }
1116 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001117 if (!CHECK_STACK(oparg)) {
1118 x = NULL;
1119 break;
1120 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001122 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 INCREF(w);
1124 PUSH(w);
1125 }
1126 }
1127 DECREF(v);
1128 break;
1129
1130 case UNPACK_LIST:
1131 v = POP();
1132 if (!is_listobject(v)) {
1133 err_setstr(TypeError, "unpack non-list");
1134 why = WHY_EXCEPTION;
1135 }
1136 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001137 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 "unpack list of wrong size");
1139 why = WHY_EXCEPTION;
1140 }
1141 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001142 if (!CHECK_STACK(oparg)) {
1143 x = NULL;
1144 break;
1145 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 for (; --oparg >= 0; ) {
1147 w = getlistitem(v, oparg);
1148 INCREF(w);
1149 PUSH(w);
1150 }
1151 }
1152 DECREF(v);
1153 break;
1154
1155 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001156 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 v = POP();
1158 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001159 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 DECREF(v);
1161 DECREF(u);
1162 break;
1163
1164 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001165 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001167 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 DECREF(v);
1169 break;
1170
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001171 case STORE_GLOBAL:
1172 w = GETNAMEV(oparg);
1173 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 if (f->f_locals != NULL) {
1175 u = dict2lookup(f->f_locals, w);
1176 if (u != NULL && is_accessobject(u)) {
1177 err = setaccessvalue(u, f->f_globals,
1178 v);
1179 DECREF(v);
1180 break;
1181 }
Guido van Rossum25831651993-05-19 14:50:45 +00001182 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001183 err = dict2insert(f->f_globals, w, v);
1184 DECREF(v);
1185 break;
1186
1187 case DELETE_GLOBAL:
1188 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001189 if (f->f_locals != NULL) {
1190 u = dict2lookup(f->f_locals, w);
1191 if (u != NULL && is_accessobject(u)) {
1192 err = setaccessvalue(u, f->f_globals,
1193 (object *)NULL);
1194 break;
1195 }
Guido van Rossum25831651993-05-19 14:50:45 +00001196 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001197 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001198 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001199 break;
1200
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 case LOAD_CONST:
1202 x = GETCONST(oparg);
1203 INCREF(x);
1204 PUSH(x);
1205 break;
1206
1207 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001208 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001209 if ((x = f->f_locals) == NULL) {
1210 err_setstr(SystemError, "no locals");
1211 break;
1212 }
1213 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001215 err_clear();
1216 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001217 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001218 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001219 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001221 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 break;
1223 }
1224 }
1225 }
Guido van Rossum25831651993-05-19 14:50:45 +00001226 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001227 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001228 if (x == NULL)
1229 break;
1230 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001231 else
1232 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 PUSH(x);
1234 break;
1235
1236 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001237 w = GETNAMEV(oparg);
1238 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001240 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001241 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001243 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
1245 }
1246 }
Guido van Rossum25831651993-05-19 14:50:45 +00001247 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001248 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001249 if (x == NULL)
1250 break;
1251 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001252 else
1253 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001254 PUSH(x);
1255 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001256
1257#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001259 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001260 if ((x = f->f_locals) == NULL) {
1261 err_setstr(SystemError, "no locals");
1262 break;
1263 }
1264 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001266 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 break;
1268 }
Guido van Rossum25831651993-05-19 14:50:45 +00001269 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001270 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001271 if (x == NULL)
1272 break;
1273 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001274 else
1275 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 PUSH(x);
1277 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001278#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001279
1280 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001281 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001282 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001283 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001284 gettupleitem(co->co_varnames,
1285 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001286 break;
1287 }
Guido van Rossum25831651993-05-19 14:50:45 +00001288 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001289 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001290 if (x == NULL)
1291 break;
1292 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001293 else
1294 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001295 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001296 break;
1297
1298 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001299 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001300 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001301 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001302 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001303 DECREF(v);
1304 break;
1305 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001307 break;
1308
1309 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001310 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001311 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001312 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001313 gettupleitem(co->co_varnames,
1314 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001315 break;
1316 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001317 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001318 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001319 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001320 break;
1321 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001322 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001323 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324
1325 case BUILD_TUPLE:
1326 x = newtupleobject(oparg);
1327 if (x != NULL) {
1328 for (; --oparg >= 0;) {
1329 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001330 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 }
1332 PUSH(x);
1333 }
1334 break;
1335
1336 case BUILD_LIST:
1337 x = newlistobject(oparg);
1338 if (x != NULL) {
1339 for (; --oparg >= 0;) {
1340 w = POP();
1341 err = setlistitem(x, oparg, w);
1342 if (err != 0)
1343 break;
1344 }
1345 PUSH(x);
1346 }
1347 break;
1348
1349 case BUILD_MAP:
1350 x = newdictobject();
1351 PUSH(x);
1352 break;
1353
1354 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001355 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001357 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 DECREF(v);
1359 PUSH(x);
1360 break;
1361
1362 case COMPARE_OP:
1363 w = POP();
1364 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001365 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 DECREF(v);
1367 DECREF(w);
1368 PUSH(x);
1369 break;
1370
1371 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001373 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001374 if (x == NULL) {
1375 err_setstr(ImportError,
1376 "__import__ not found");
1377 break;
1378 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001379 if (is_methodobject(x)) {
1380 u = None;
1381 INCREF(u);
1382 }
1383 else {
1384 u = find_from_args(f, INSTR_OFFSET());
1385 if (u == NULL) {
1386 x = u;
1387 break;
1388 }
1389 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001390 w = mkvalue("(OOOO)",
1391 w,
1392 f->f_globals,
1393 f->f_locals == NULL ? None : f->f_locals,
1394 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001395 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396 if (w == NULL) {
1397 x = NULL;
1398 break;
1399 }
1400 x = call_object(x, w);
1401 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001402 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 break;
1404
1405 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001406 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001408 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001409 if ((x = f->f_locals) == NULL) {
1410 err_setstr(SystemError, "no locals");
1411 break;
1412 }
1413 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001414 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001416
1417 case ACCESS_MODE:
1418 v = POP();
1419 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001420 if (getstringvalue(w)[0] == '*')
1421 defmode = getintvalue(v);
1422 else
1423 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001424 DECREF(v);
1425 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001426
1427 case JUMP_FORWARD:
1428 JUMPBY(oparg);
1429 break;
1430
1431 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001432 err = testbool(TOP());
1433 if (err > 0)
1434 err = 0;
1435 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 JUMPBY(oparg);
1437 break;
1438
1439 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001440 err = testbool(TOP());
1441 if (err > 0) {
1442 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001444 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
1446
1447 case JUMP_ABSOLUTE:
1448 JUMPTO(oparg);
1449 break;
1450
1451 case FOR_LOOP:
1452 /* for v in s: ...
1453 On entry: stack contains s, i.
1454 On exit: stack contains s, i+1, s[i];
1455 but if loop exhausted:
1456 s, i are popped, and we jump */
1457 w = POP(); /* Loop index */
1458 v = POP(); /* Sequence object */
1459 u = loop_subscript(v, w);
1460 if (u != NULL) {
1461 PUSH(v);
1462 x = newintobject(getintvalue(w)+1);
1463 PUSH(x);
1464 DECREF(w);
1465 PUSH(u);
1466 }
1467 else {
1468 DECREF(v);
1469 DECREF(w);
1470 /* A NULL can mean "s exhausted"
1471 but also an error: */
1472 if (err_occurred())
1473 why = WHY_EXCEPTION;
1474 else
1475 JUMPBY(oparg);
1476 }
1477 break;
1478
1479 case SETUP_LOOP:
1480 case SETUP_EXCEPT:
1481 case SETUP_FINALLY:
1482 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1483 STACK_LEVEL());
1484 break;
1485
1486 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001487#ifdef LLTRACE
1488 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001489 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001490#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001491 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001492 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001493 /* Trace each line of code reached */
1494 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001495 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001496 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001497 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001499
1500 case CALL_FUNCTION:
1501 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001502 int na = oparg & 0xff;
1503 int nk = (oparg>>8) & 0xff;
1504 int n = na + 2*nk;
1505 object **pfunc = stack_pointer - n - 1;
1506 object *func = *pfunc;
1507 object *self = NULL;
1508 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001510 if (is_instancemethodobject(func)) {
1511 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001512 class = instancemethodgetclass(func);
1513 func = instancemethodgetfunc(func);
1514 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001516 INCREF(self);
1517 DECREF(*pfunc);
1518 *pfunc = self;
1519 na++;
1520 n++;
1521 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001522 else {
1523 /* Unbound methods must be
1524 called with an instance of
1525 the class (or a derived
1526 class) as first argument */
1527 if (na > 0 &&
1528 (self = stack_pointer[-n])
1529 != NULL &&
1530 is_instanceobject(self) &&
1531 issubclass(
1532 (object *)
1533 (((instanceobject *)self)
1534 ->in_class),
1535 class))
1536 /* Handy-dandy */ ;
1537 else {
1538 err_setstr(TypeError,
1539 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001540 x = NULL;
1541 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001542 }
1543 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001544 }
1545 else
1546 INCREF(func);
1547 if (is_funcobject(func)) {
1548 object *co = getfunccode(func);
1549 object *globals = getfuncglobals(func);
1550 object *argdefs = PyFunction_GetDefaults(func);
1551 object **d;
1552 int nd;
1553 if (argdefs != NULL) {
1554 d = &GETTUPLEITEM(argdefs, 0);
1555 nd = ((tupleobject *)argdefs)->ob_size;
1556 }
1557 else {
1558 d = NULL;
1559 nd = 0;
1560 }
1561 x = eval_code2(
1562 (codeobject *)co,
1563 globals, (object *)NULL,
1564 stack_pointer-n, na,
1565 stack_pointer-2*nk, nk,
1566 d, nd,
1567 class);
1568 }
1569 else {
1570 object *args = newtupleobject(na);
1571 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001572 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001573 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001574 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001576 if (nk > 0) {
1577 kwdict = newdictobject();
1578 if (kwdict == NULL) {
1579 x = NULL;
1580 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001582 err = 0;
1583 while (--nk >= 0) {
1584 object *value = POP();
1585 object *key = POP();
1586 err = mappinginsert(
1587 kwdict, key, value);
1588 if (err) {
1589 DECREF(key);
1590 DECREF(value);
1591 break;
1592 }
1593 }
1594 if (err) {
1595 DECREF(args);
1596 DECREF(kwdict);
1597 break;
1598 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001599 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001600 while (--na >= 0) {
1601 w = POP();
1602 SETTUPLEITEM(args, na, w);
1603 }
1604 x = PyEval_CallObjectWithKeywords(
1605 func, args, kwdict);
1606 DECREF(args);
1607 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001608 }
1609 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001610 while (stack_pointer > pfunc) {
1611 w = POP();
1612 DECREF(w);
1613 }
1614 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615 break;
1616 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001617
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 case MAKE_FUNCTION:
1619 v = POP(); /* code object */
1620 x = newfuncobject(v, f->f_globals);
1621 DECREF(v);
1622 /* XXX Maybe this should be a separate opcode? */
1623 if (x != NULL && oparg > 0) {
1624 v = newtupleobject(oparg);
1625 if (v == NULL) {
1626 DECREF(x);
1627 x = NULL;
1628 break;
1629 }
1630 while (--oparg >= 0) {
1631 w = POP();
1632 SETTUPLEITEM(v, oparg, w);
1633 }
1634 err = PyFunction_SetDefaults(x, v);
1635 DECREF(v);
1636 }
1637 PUSH(x);
1638 break;
1639
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 default:
1641 fprintf(stderr,
1642 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001643 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001644 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 why = WHY_EXCEPTION;
1646 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001647
1648#ifdef CASE_TOO_BIG
1649 }
1650#endif
1651
Guido van Rossum374a9221991-04-04 10:40:29 +00001652 } /* switch */
1653
1654 on_error:
1655
1656 /* Quickly continue if no error occurred */
1657
1658 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659 if (err == 0 && x != NULL) {
1660#ifdef CHECKEXC
1661 if (err_occurred())
1662 fprintf(stderr,
1663 "XXX undetected error\n");
1664 else
1665#endif
1666 continue; /* Normal, fast path */
1667 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 why = WHY_EXCEPTION;
1669 x = None;
1670 err = 0;
1671 }
1672
Guido van Rossum801dcae1992-04-08 11:32:32 +00001673#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 /* Double-check exception status */
1675
1676 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1677 if (!err_occurred()) {
1678 fprintf(stderr, "XXX ghost error\n");
1679 err_setstr(SystemError, "ghost error");
1680 why = WHY_EXCEPTION;
1681 }
1682 }
1683 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001684 if (err_occurred()) {
1685 fprintf(stderr,
1686 "XXX undetected error (why=%d)\n",
1687 why);
1688 why = WHY_EXCEPTION;
1689 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 }
1691#endif
1692
1693 /* Log traceback info if this is a real exception */
1694
1695 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001698 f->f_lasti -= 2;
1699 tb_here(f);
1700
Guido van Rossume59214e1994-08-30 08:01:59 +00001701 if (f->f_trace)
1702 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001703 if (sys_profile)
1704 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 }
1706
1707 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1708
1709 if (why == WHY_RERAISE)
1710 why = WHY_EXCEPTION;
1711
1712 /* Unwind stacks if a (pseudo) exception occurred */
1713
1714 while (why != WHY_NOT && f->f_iblock > 0) {
1715 block *b = pop_block(f);
1716 while (STACK_LEVEL() > b->b_level) {
1717 v = POP();
1718 XDECREF(v);
1719 }
1720 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1721 why = WHY_NOT;
1722 JUMPTO(b->b_handler);
1723 break;
1724 }
1725 if (b->b_type == SETUP_FINALLY ||
1726 b->b_type == SETUP_EXCEPT &&
1727 why == WHY_EXCEPTION) {
1728 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001729 object *exc, *val, *tb;
1730 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 if (val == NULL) {
1732 val = None;
1733 INCREF(val);
1734 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 /* Make the raw exception data
1736 available to the handler,
1737 so a program can emulate the
1738 Python main loop. Don't do
1739 this for 'finally'. */
1740 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001741 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 sysset("exc_value", val);
1743 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001745 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 PUSH(val);
1747 PUSH(exc);
1748 }
1749 else {
1750 if (why == WHY_RETURN)
1751 PUSH(retval);
1752 v = newintobject((long)why);
1753 PUSH(v);
1754 }
1755 why = WHY_NOT;
1756 JUMPTO(b->b_handler);
1757 break;
1758 }
1759 } /* unwind stack */
1760
1761 /* End the loop if we still have an error (or return) */
1762
1763 if (why != WHY_NOT)
1764 break;
1765
1766 } /* main loop */
1767
1768 /* Pop remaining stack entries */
1769
1770 while (!EMPTY()) {
1771 v = POP();
1772 XDECREF(v);
1773 }
1774
Guido van Rossum96a42c81992-01-12 02:29:51 +00001775 if (why != WHY_RETURN)
1776 retval = NULL;
1777
Guido van Rossume59214e1994-08-30 08:01:59 +00001778 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001779 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001780 if (call_trace(&f->f_trace, &f->f_trace, f,
1781 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001782 XDECREF(retval);
1783 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001784 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001785 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001786 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001787 }
1788
1789 if (sys_profile && why == WHY_RETURN) {
1790 if (call_trace(&sys_profile, (object**)0,
1791 f, "return", retval)) {
1792 XDECREF(retval);
1793 retval = NULL;
1794 why = WHY_EXCEPTION;
1795 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001796 }
1797
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001799
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 current_frame = f->f_back;
1801 DECREF(f);
1802
Guido van Rossum96a42c81992-01-12 02:29:51 +00001803 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001804}
1805
Guido van Rossum96a42c81992-01-12 02:29:51 +00001806#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001807static int
1808prtrace(v, str)
1809 object *v;
1810 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001811{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001812 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001813 if (printobject(v, stdout, 0) != 0)
1814 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001815 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001817#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001819static void
1820call_exc_trace(p_trace, p_newtrace, f)
1821 object **p_trace, **p_newtrace;
1822 frameobject *f;
1823{
1824 object *type, *value, *traceback, *arg;
1825 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001826 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001827 if (value == NULL) {
1828 value = None;
1829 INCREF(value);
1830 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001831 arg = mkvalue("(OOO)", type, value, traceback);
1832 if (arg == NULL) {
1833 err_restore(type, value, traceback);
1834 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001835 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001836 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1837 DECREF(arg);
1838 if (err == 0)
1839 err_restore(type, value, traceback);
1840 else {
1841 XDECREF(type);
1842 XDECREF(value);
1843 XDECREF(traceback);
1844 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001845}
1846
1847static int
1848call_trace(p_trace, p_newtrace, f, msg, arg)
1849 object **p_trace; /* in/out; may not be NULL;
1850 may not point to NULL variable initially */
1851 object **p_newtrace; /* in/out; may be NULL;
1852 may point to NULL variable;
1853 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001854 frameobject *f;
1855 char *msg;
1856 object *arg;
1857{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001858 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001859 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001860 static int tracing = 0;
1861
1862 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001863 /* Don't do recursive traces */
1864 if (p_newtrace) {
1865 XDECREF(*p_newtrace);
1866 *p_newtrace = NULL;
1867 }
1868 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001869 }
1870
Guido van Rossumf10570b1995-07-07 22:53:21 +00001871 args = newtupleobject(3);
1872 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001873 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001874 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001875 if (what == NULL)
1876 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001877 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001878 SETTUPLEITEM(args, 0, (object *)f);
1879 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001880 if (arg == NULL)
1881 arg = None;
1882 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001883 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001884 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001885 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001886 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001887 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001888 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001889 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001890 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001891 if (res == NULL) {
1892 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001893 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001894 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001895 *p_trace = NULL;
1896 if (p_newtrace) {
1897 XDECREF(*p_newtrace);
1898 *p_newtrace = NULL;
1899 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001900 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001901 }
1902 else {
1903 if (p_newtrace) {
1904 XDECREF(*p_newtrace);
1905 if (res == None)
1906 *p_newtrace = NULL;
1907 else {
1908 INCREF(res);
1909 *p_newtrace = res;
1910 }
1911 }
1912 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001913 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001914 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001915}
1916
Guido van Rossum3f5da241990-12-20 15:06:42 +00001917object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001918getbuiltins()
1919{
1920 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001921 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001922 else
1923 return current_frame->f_builtins;
1924}
1925
1926object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001927getlocals()
1928{
1929 if (current_frame == NULL)
1930 return NULL;
1931 fast_2_locals(current_frame);
1932 return current_frame->f_locals;
1933}
1934
1935object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001936getglobals()
1937{
1938 if (current_frame == NULL)
1939 return NULL;
1940 else
1941 return current_frame->f_globals;
1942}
1943
Guido van Rossum81daa321993-05-20 14:24:46 +00001944object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001945getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001946{
1947 if (current_frame == NULL)
1948 return NULL;
1949 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001950 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001951}
1952
Guido van Rossume59214e1994-08-30 08:01:59 +00001953object *
1954getframe()
1955{
1956 return (object *)current_frame;
1957}
1958
Guido van Rossum6135a871995-01-09 17:53:26 +00001959int
1960getrestricted()
1961{
1962 return current_frame == NULL ? 0 : current_frame->f_restricted;
1963}
1964
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966flushline()
1967{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001968 object *f = sysget("stdout");
1969 if (softspace(f, 0))
1970 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971}
1972
Guido van Rossum3f5da241990-12-20 15:06:42 +00001973
Guido van Rossum06186511995-01-07 12:40:10 +00001974#define BINOP(opname, ropname, thisfunc) \
1975 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1976 ; \
1977 else \
1978 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001979
1980
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001982or(v, w)
1983 object *v, *w;
1984{
Guido van Rossum06186511995-01-07 12:40:10 +00001985 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001986 if (v->ob_type->tp_as_number != NULL) {
1987 object *x;
1988 object * (*f) FPROTO((object *, object *));
1989 if (coerce(&v, &w) != 0)
1990 return NULL;
1991 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1992 x = (*f)(v, w);
1993 DECREF(v);
1994 DECREF(w);
1995 if (f != NULL)
1996 return x;
1997 }
1998 err_setstr(TypeError, "bad operand type(s) for |");
1999 return NULL;
2000}
2001
2002static object *
2003xor(v, w)
2004 object *v, *w;
2005{
Guido van Rossum06186511995-01-07 12:40:10 +00002006 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002007 if (v->ob_type->tp_as_number != NULL) {
2008 object *x;
2009 object * (*f) FPROTO((object *, object *));
2010 if (coerce(&v, &w) != 0)
2011 return NULL;
2012 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2013 x = (*f)(v, w);
2014 DECREF(v);
2015 DECREF(w);
2016 if (f != NULL)
2017 return x;
2018 }
2019 err_setstr(TypeError, "bad operand type(s) for ^");
2020 return NULL;
2021}
2022
2023static object *
2024and(v, w)
2025 object *v, *w;
2026{
Guido van Rossum06186511995-01-07 12:40:10 +00002027 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002028 if (v->ob_type->tp_as_number != NULL) {
2029 object *x;
2030 object * (*f) FPROTO((object *, object *));
2031 if (coerce(&v, &w) != 0)
2032 return NULL;
2033 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2034 x = (*f)(v, w);
2035 DECREF(v);
2036 DECREF(w);
2037 if (f != NULL)
2038 return x;
2039 }
2040 err_setstr(TypeError, "bad operand type(s) for &");
2041 return NULL;
2042}
2043
2044static object *
2045lshift(v, w)
2046 object *v, *w;
2047{
Guido van Rossum06186511995-01-07 12:40:10 +00002048 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002049 if (v->ob_type->tp_as_number != NULL) {
2050 object *x;
2051 object * (*f) FPROTO((object *, object *));
2052 if (coerce(&v, &w) != 0)
2053 return NULL;
2054 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2055 x = (*f)(v, w);
2056 DECREF(v);
2057 DECREF(w);
2058 if (f != NULL)
2059 return x;
2060 }
2061 err_setstr(TypeError, "bad operand type(s) for <<");
2062 return NULL;
2063}
2064
2065static object *
2066rshift(v, w)
2067 object *v, *w;
2068{
Guido van Rossum06186511995-01-07 12:40:10 +00002069 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002070 if (v->ob_type->tp_as_number != NULL) {
2071 object *x;
2072 object * (*f) FPROTO((object *, object *));
2073 if (coerce(&v, &w) != 0)
2074 return NULL;
2075 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2076 x = (*f)(v, w);
2077 DECREF(v);
2078 DECREF(w);
2079 if (f != NULL)
2080 return x;
2081 }
2082 err_setstr(TypeError, "bad operand type(s) for >>");
2083 return NULL;
2084}
2085
2086static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002087add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 object *v, *w;
2089{
Guido van Rossum06186511995-01-07 12:40:10 +00002090 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002091 if (v->ob_type->tp_as_sequence != NULL)
2092 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2093 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002094 object *x;
2095 if (coerce(&v, &w) != 0)
2096 return NULL;
2097 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2098 DECREF(v);
2099 DECREF(w);
2100 return x;
2101 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002102 err_setstr(TypeError, "bad operand type(s) for +");
2103 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104}
2105
2106static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002108 object *v, *w;
2109{
Guido van Rossum06186511995-01-07 12:40:10 +00002110 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002111 if (v->ob_type->tp_as_number != NULL) {
2112 object *x;
2113 if (coerce(&v, &w) != 0)
2114 return NULL;
2115 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2116 DECREF(v);
2117 DECREF(w);
2118 return x;
2119 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002120 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 return NULL;
2122}
2123
2124static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002125mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 object *v, *w;
2127{
2128 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002129 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002130 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002131 if (tp->tp_as_number != NULL &&
2132 w->ob_type->tp_as_sequence != NULL &&
2133 !is_instanceobject(v)) {
2134 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 object *tmp = v;
2136 v = w;
2137 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002138 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002140 if (tp->tp_as_number != NULL) {
2141 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002142 if (is_instanceobject(v)) {
2143 /* Instances of user-defined classes get their
2144 other argument uncoerced, so they may
2145 implement sequence*number as well as
2146 number*number. */
2147 INCREF(v);
2148 INCREF(w);
2149 }
2150 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002151 return NULL;
2152 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2153 DECREF(v);
2154 DECREF(w);
2155 return x;
2156 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157 if (tp->tp_as_sequence != NULL) {
2158 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002159 err_setstr(TypeError,
2160 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 return NULL;
2162 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002163 return (*tp->tp_as_sequence->sq_repeat)
2164 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002166 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 return NULL;
2168}
2169
2170static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002171divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 object *v, *w;
2173{
Guido van Rossum06186511995-01-07 12:40:10 +00002174 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002175 if (v->ob_type->tp_as_number != NULL) {
2176 object *x;
2177 if (coerce(&v, &w) != 0)
2178 return NULL;
2179 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2180 DECREF(v);
2181 DECREF(w);
2182 return x;
2183 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002184 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 return NULL;
2186}
2187
2188static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002189mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 object *v, *w;
2191{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002192 if (is_stringobject(v)) {
2193 return formatstring(v, w);
2194 }
Guido van Rossum06186511995-01-07 12:40:10 +00002195 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002196 if (v->ob_type->tp_as_number != NULL) {
2197 object *x;
2198 if (coerce(&v, &w) != 0)
2199 return NULL;
2200 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2201 DECREF(v);
2202 DECREF(w);
2203 return x;
2204 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002205 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 return NULL;
2207}
2208
2209static object *
Guido van Rossum50564e81996-01-12 01:13:16 +00002210pow(v, w)
2211 object *v, *w;
2212{
2213 object *res;
2214 BINOP("__pow__", "__rpow__", pow);
2215 if (v->ob_type->tp_as_number == NULL ||
2216 w->ob_type->tp_as_number == NULL) {
2217 err_setstr(TypeError, "pow() requires numeric arguments");
2218 return NULL;
2219 }
2220 if (
2221#ifndef WITHOUT_COMPLEX
2222 !is_complexobject(v) &&
2223#endif
2224 is_floatobject(w) && getfloatvalue(v) < 0.0) {
2225 if (!err_occurred())
2226 err_setstr(ValueError, "negative number to float power");
2227 return NULL;
2228 }
2229 if (coerce(&v, &w) != 0)
2230 return NULL;
2231 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2232 DECREF(v);
2233 DECREF(w);
2234 return res;
2235}
2236
2237static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002238neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 object *v;
2240{
2241 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 return (*v->ob_type->tp_as_number->nb_negative)(v);
2243 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 return NULL;
2245}
2246
2247static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002248pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 object *v;
2250{
2251 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252 return (*v->ob_type->tp_as_number->nb_positive)(v);
2253 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 return NULL;
2255}
2256
2257static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002258invert(v)
2259 object *v;
2260{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002261 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002262 if (v->ob_type->tp_as_number != NULL &&
2263 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2264 return (*f)(v);
2265 err_setstr(TypeError, "bad operand type(s) for unary ~");
2266 return NULL;
2267}
2268
2269static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002270not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 object *v;
2272{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002273 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002274 object *w;
2275 if (outcome < 0)
2276 return NULL;
2277 if (outcome == 0)
2278 w = True;
2279 else
2280 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002281 INCREF(w);
2282 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283}
Guido van Rossum234f9421993-06-17 12:35:49 +00002284
2285
Guido van Rossum681d79a1995-07-18 14:51:37 +00002286/* External interface to call any callable object.
2287 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002288
2289object *
2290call_object(func, arg)
2291 object *func;
2292 object *arg;
2293{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002294 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2295}
Guido van Rossume59214e1994-08-30 08:01:59 +00002296
Guido van Rossum681d79a1995-07-18 14:51:37 +00002297object *
2298PyEval_CallObjectWithKeywords(func, arg, kw)
2299 object *func;
2300 object *arg;
2301 object *kw;
2302{
2303 ternaryfunc call;
2304 object *result;
2305
2306 if (arg == NULL)
2307 arg = newtupleobject(0);
2308 else if (!is_tupleobject(arg)) {
2309 err_setstr(TypeError, "argument list must be a tuple");
2310 return NULL;
2311 }
2312 else
2313 INCREF(arg);
2314
Guido van Rossume3e61c11995-08-04 04:14:47 +00002315 if (kw != NULL && !is_dictobject(kw)) {
2316 err_setstr(TypeError, "keyword list must be a dictionary");
2317 return NULL;
2318 }
2319
Guido van Rossum681d79a1995-07-18 14:51:37 +00002320 if (call = func->ob_type->tp_call)
2321 result = (*call)(func, arg, kw);
2322 else if (is_instancemethodobject(func) || is_funcobject(func))
2323 result = call_function(func, arg, kw);
2324 else
2325 result = call_builtin(func, arg, kw);
2326
2327 DECREF(arg);
2328
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002329 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002330 err_setstr(SystemError,
2331 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002332
2333 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002334}
2335
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002337call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002339 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002340 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 if (is_methodobject(func)) {
2343 method meth = getmethod(func);
2344 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002345 int flags = getflags(func);
2346 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002347 int size = gettuplesize(arg);
2348 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002349 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002350 else if (size == 0)
2351 arg = NULL;
2352 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002353 if (flags & METH_KEYWORDS)
2354 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002355 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002356 err_setstr(TypeError,
2357 "this function takes no keyword arguments");
2358 return NULL;
2359 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002360 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 }
2362 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002363 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002365 if (is_instanceobject(func)) {
2366 object *res, *call = getattr(func,"__call__");
2367 if (call == NULL) {
2368 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002369 err_setstr(AttributeError,
2370 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002371 return NULL;
2372 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002373 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002374 DECREF(call);
2375 return res;
2376 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 return NULL;
2379}
2380
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002382call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002384 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002385 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002387 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002388 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002389 object **d, **k;
2390 int nk, nd;
2391 object *result;
2392
2393 if (kw != NULL && !is_dictobject(kw)) {
2394 err_badcall();
2395 return NULL;
2396 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397
Guido van Rossume8122f11991-05-05 20:03:07 +00002398 if (is_instancemethodobject(func)) {
2399 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002400 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002401 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002402 if (self == NULL) {
2403 /* Unbound methods must be called with an instance of
2404 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002406 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002407 if (self != NULL &&
2408 is_instanceobject(self) &&
2409 issubclass((object *)
2410 (((instanceobject *)self)->in_class),
2411 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002412 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002413 else
2414 self = NULL;
2415 }
2416 if (self == NULL) {
2417 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002419 return NULL;
2420 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002421 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002422 }
2423 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 int argcount = gettuplesize(arg);
2425 object *newarg = newtupleobject(argcount + 1);
2426 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002427 if (newarg == NULL)
2428 return NULL;
2429 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002430 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002431 for (i = 0; i < argcount; i++) {
2432 object *v = GETTUPLEITEM(arg, i);
2433 XINCREF(v);
2434 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002435 }
2436 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 }
2438 }
2439 else {
2440 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002441 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442 return NULL;
2443 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446
2447 argdefs = PyFunction_GetDefaults(func);
2448 if (argdefs != NULL && is_tupleobject(argdefs)) {
2449 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2450 nd = gettuplesize(argdefs);
2451 }
2452 else {
2453 d = NULL;
2454 nd = 0;
2455 }
2456
2457 if (kw != NULL) {
2458 int pos, i;
2459 nk = getmappingsize(kw);
2460 k = NEW(object *, 2*nk);
2461 if (k == NULL) {
2462 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002463 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002465 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002466 pos = i = 0;
2467 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2468 i += 2;
2469 nk = i/2;
2470 /* XXX This is broken if the caller deletes dict items! */
2471 }
2472 else {
2473 k = NULL;
2474 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002475 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476
Guido van Rossum681d79a1995-07-18 14:51:37 +00002477 result = eval_code2(
2478 (codeobject *)getfunccode(func),
2479 getfuncglobals(func), (object *)NULL,
2480 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2481 k, nk,
2482 d, nd,
2483 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484
Guido van Rossum681d79a1995-07-18 14:51:37 +00002485 DECREF(arg);
2486 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487
Guido van Rossum681d79a1995-07-18 14:51:37 +00002488 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489}
2490
2491static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002492apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 object *v, *w;
2494{
2495 typeobject *tp = v->ob_type;
2496 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 return NULL;
2499 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002500 if (tp->tp_as_mapping != NULL) {
2501 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2502 }
2503 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 int i;
2505 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 return NULL;
2508 }
2509 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002510 if (i < 0) {
2511 int len = (*tp->tp_as_sequence->sq_length)(v);
2512 if (len < 0)
2513 return NULL;
2514 i += len;
2515 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518}
2519
2520static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522 object *v, *w;
2523{
2524 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002525 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 return NULL;
2529 }
2530 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002531 v = (*sq->sq_item)(v, i);
2532 if (v)
2533 return v;
2534 if (err_occurred() == IndexError)
2535 err_clear();
2536 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537}
2538
2539static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002540slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 object *v;
2542 int isize;
2543 int *pi;
2544{
2545 if (v != NULL) {
2546 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547 err_setstr(TypeError, "slice index must be int");
2548 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 }
2550 *pi = getintvalue(v);
2551 if (*pi < 0)
2552 *pi += isize;
2553 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002554 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555}
2556
2557static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559 object *u, *v, *w;
2560{
2561 typeobject *tp = u->ob_type;
2562 int ilow, ihigh, isize;
2563 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002564 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565 return NULL;
2566 }
2567 ilow = 0;
2568 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002569 if (isize < 0)
2570 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002571 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002573 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002577
2578static int
2579assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 object *w;
2581 object *key;
2582 object *v;
2583{
2584 typeobject *tp = w->ob_type;
2585 sequence_methods *sq;
2586 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002587 int (*func1)();
2588 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002589 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002590 (func1 = mp->mp_ass_subscript) != NULL) {
2591 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002592 }
2593 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002594 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002597 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002598 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002600 else {
2601 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002602 if (i < 0) {
2603 int len = (*sq->sq_length)(w);
2604 if (len < 0)
2605 return -1;
2606 i += len;
2607 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002608 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002609 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002612 err_setstr(TypeError,
2613 "can't assign to this subscripted object");
2614 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616}
2617
Guido van Rossum3f5da241990-12-20 15:06:42 +00002618static int
2619assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 object *u, *v, *w, *x;
2621{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002622 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002624 if (sq == NULL) {
2625 err_setstr(TypeError, "assign to slice of non-sequence");
2626 return -1;
2627 }
2628 if (sq == NULL || sq->sq_ass_slice == NULL) {
2629 err_setstr(TypeError, "unassignable slice");
2630 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 }
2632 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002634 if (isize < 0)
2635 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 if (slice_index(v, isize, &ilow) != 0)
2637 return -1;
2638 if (slice_index(w, isize, &ihigh) != 0)
2639 return -1;
2640 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641}
2642
2643static int
2644cmp_exception(err, v)
2645 object *err, *v;
2646{
2647 if (is_tupleobject(v)) {
2648 int i, n;
2649 n = gettuplesize(v);
2650 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002651 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002652 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 return 1;
2654 }
2655 return 0;
2656 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002657 if (is_classobject(v) && is_classobject(err))
2658 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 return err == v;
2660}
2661
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662static int
2663cmp_member(v, w)
2664 object *v, *w;
2665{
Guido van Rossume59214e1994-08-30 08:01:59 +00002666 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 object *x;
2668 sequence_methods *sq;
2669 /* Special case for char in string */
2670 if (is_stringobject(w)) {
2671 register char *s, *end;
2672 register char c;
2673 if (!is_stringobject(v) || getstringsize(v) != 1) {
2674 err_setstr(TypeError,
2675 "string member test needs char left operand");
2676 return -1;
2677 }
2678 c = getstringvalue(v)[0];
2679 s = getstringvalue(w);
2680 end = s + getstringsize(w);
2681 while (s < end) {
2682 if (c == *s++)
2683 return 1;
2684 }
2685 return 0;
2686 }
2687 sq = w->ob_type->tp_as_sequence;
2688 if (sq == NULL) {
2689 err_setstr(TypeError,
2690 "'in' or 'not in' needs sequence right argument");
2691 return -1;
2692 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002693 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002694 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002695 if (x == NULL) {
2696 if (err_occurred() == IndexError) {
2697 err_clear();
2698 break;
2699 }
2700 return -1;
2701 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002702 cmp = cmpobject(v, x);
2703 XDECREF(x);
2704 if (cmp == 0)
2705 return 1;
2706 }
2707 return 0;
2708}
2709
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002711cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002712 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 register object *v;
2714 register object *w;
2715{
2716 register int cmp;
2717 register int res = 0;
2718 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002719 case IS:
2720 case IS_NOT:
2721 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002722 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002723 res = !res;
2724 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 case IN:
2726 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002727 res = cmp_member(v, w);
2728 if (res < 0)
2729 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002730 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002731 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 break;
2733 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002734 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 break;
2736 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002737 cmp = cmpobject(v, w);
2738 switch (op) {
2739 case LT: res = cmp < 0; break;
2740 case LE: res = cmp <= 0; break;
2741 case EQ: res = cmp == 0; break;
2742 case NE: res = cmp != 0; break;
2743 case GT: res = cmp > 0; break;
2744 case GE: res = cmp >= 0; break;
2745 /* XXX no default? (res is initialized to 0 though) */
2746 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 }
2748 v = res ? True : False;
2749 INCREF(v);
2750 return v;
2751}
2752
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753static int
2754import_from(locals, v, name)
2755 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002756 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002757 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002758{
2759 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002760 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002761 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002762 return -1;
2763 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002764 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002765 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002766 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002767 object *name, *value;
2768 pos = 0;
2769 while (mappinggetnext(w, &pos, &name, &value)) {
2770 if (!is_stringobject(name) ||
2771 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002772 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002773 if (is_accessobject(value)) {
2774 value = getaccessvalue(value, (object *)NULL);
2775 if (value == NULL) {
2776 err_clear();
2777 continue;
2778 }
2779 }
2780 else
2781 INCREF(value);
2782 err = dict2insert(locals, name, value);
2783 DECREF(value);
2784 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002785 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002786 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002787 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002788 }
2789 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002790 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002791 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002792 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002793 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002794 getstringvalue(name));
2795 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002796 return -1;
2797 }
2798 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002799 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002800 }
2801}
2802
2803static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002804build_class(methods, bases, name)
2805 object *methods; /* dictionary */
2806 object *bases; /* tuple containing classes */
2807 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002808{
Guido van Rossum25831651993-05-19 14:50:45 +00002809 int i;
2810 if (!is_tupleobject(bases)) {
2811 err_setstr(SystemError, "build_class with non-tuple bases");
2812 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002813 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002814 if (gettuplesize(bases) > 0) {
2815 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002816 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002817 /* Call the base's *type*, if it is callable.
2818 This code is a hook for Donald Beaudry's type extensions.
2819 In unexended Python it will never be triggered since its
2820 types are not callable. */
2821 if (base->ob_type->ob_type->tp_call) {
2822 object *args;
2823 object *class;
2824 args = mkvalue("(OOO)", name, bases, methods);
2825 class = call_object((object *)base->ob_type, args);
2826 DECREF(args);
2827 return class;
2828 }
2829 }
Guido van Rossum25831651993-05-19 14:50:45 +00002830 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002831 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002832 return NULL;
2833 }
Guido van Rossum25831651993-05-19 14:50:45 +00002834 if (!is_stringobject(name)) {
2835 err_setstr(SystemError, "build_class witn non-string name");
2836 return NULL;
2837 }
2838 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002839 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002840 if (!is_classobject(base)) {
2841 err_setstr(TypeError,
2842 "base is not a class object");
2843 return NULL;
2844 }
2845 }
2846 return newclassobject(bases, methods, name);
2847}
2848
2849static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002850access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002851 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002852 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002853 frameobject *f;
2854{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002855 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002856 object *value, *ac;
2857 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002858 int ret;
2859 fast_2_locals(f);
2860 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002861 if (value && is_accessobject(value)) {
2862 err_setstr(AccessError, "can't override access");
2863 return -1;
2864 }
2865 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002866 if (value != NULL && value != None)
2867 type = value->ob_type;
2868 else
2869 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002870 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002871 if (ac == NULL)
2872 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002873 ret = mappinginsert(f->f_locals, name, ac);
2874 DECREF(ac);
2875 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002876 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002877}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002878
2879static int
2880exec_statement(prog, globals, locals)
2881 object *prog;
2882 object *globals;
2883 object *locals;
2884{
2885 char *s;
2886 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002887 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002889
2890 if (is_tupleobject(prog) && globals == None && locals == None &&
2891 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2892 /* Backward compatibility hack */
2893 globals = gettupleitem(prog, 1);
2894 if (n == 3)
2895 locals = gettupleitem(prog, 2);
2896 prog = gettupleitem(prog, 0);
2897 }
2898 if (globals == None) {
2899 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002900 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002901 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002902 plain = 1;
2903 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002904 }
2905 else if (locals == None)
2906 locals = globals;
2907 if (!is_stringobject(prog) &&
2908 !is_codeobject(prog) &&
2909 !is_fileobject(prog)) {
2910 err_setstr(TypeError,
2911 "exec 1st arg must be string, code or file object");
2912 return -1;
2913 }
2914 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2915 err_setstr(TypeError,
2916 "exec 2nd/3rd args must be dict or None");
2917 return -1;
2918 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002919 if (dictlookup(globals, "__builtins__") == NULL)
2920 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002921 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002922 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002923 return -1;
2924 return 0;
2925 }
2926 if (is_fileobject(prog)) {
2927 FILE *fp = getfilefile(prog);
2928 char *name = getstringvalue(getfilename(prog));
2929 if (run_file(fp, name, file_input, globals, locals) == NULL)
2930 return -1;
2931 return 0;
2932 }
2933 s = getstringvalue(prog);
2934 if (strlen(s) != getstringsize(prog)) {
2935 err_setstr(ValueError, "embedded '\\0' in exec string");
2936 return -1;
2937 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002938 v = run_string(s, file_input, globals, locals);
2939 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002940 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002941 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002942 if (plain)
2943 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002944 return 0;
2945}
Guido van Rossum24c13741995-02-14 09:42:43 +00002946
Guido van Rossum681d79a1995-07-18 14:51:37 +00002947/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002948static object *
2949find_from_args(f, nexti)
2950 frameobject *f;
2951 int nexti;
2952{
2953 int opcode;
2954 int oparg;
2955 object *list, *name;
2956 unsigned char *next_instr;
2957
2958 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2959 opcode = (*next_instr++);
2960 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002961 INCREF(None);
2962 return None;
2963 }
2964
2965 list = newlistobject(0);
2966 if (list == NULL)
2967 return NULL;
2968
2969 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002970 oparg = (next_instr[1]<<8) + next_instr[0];
2971 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002972 name = Getnamev(f, oparg);
2973 if (addlistitem(list, name) < 0) {
2974 DECREF(list);
2975 break;
2976 }
2977 opcode = (*next_instr++);
2978 } while (opcode == IMPORT_FROM);
2979
2980 return list;
2981}