blob: ec26792e46de0c3540e42dae26a81050a3e84d52 [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?
Guido van Rossum8c1e1501996-05-24 20:49:24 +000029 XXX totally get rid of access stuff
Guido van Rossum681d79a1995-07-18 14:51:37 +000030 XXX speed up searching for keywords by using a dictionary
31 XXX unknown keyword shouldn't raise KeyError?
32 XXX document it!
33 */
34
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000036
Guido van Rossum10dc2e81990-11-18 17:27:39 +000037#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000039#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000040#include "opcode.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000041#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossumc6004111993-11-05 10:22:19 +000043#include <ctype.h>
44
Guido van Rossum04691fc1992-08-12 15:35:34 +000045/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000046/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000047
Guido van Rossum8c1e1501996-05-24 20:49:24 +000048#ifdef DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000049/* For debugging the interpreter: */
50#define LLTRACE 1 /* Low-level trace feature */
51#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000052#endif
53
Guido van Rossum5b722181993-03-30 17:46:03 +000054
Guido van Rossum374a9221991-04-04 10:40:29 +000055/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000056
Guido van Rossum681d79a1995-07-18 14:51:37 +000057static object *eval_code2 PROTO((codeobject *,
58 object *, object *,
59 object **, int,
60 object **, int,
61 object **, int,
62 object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000063#ifdef LLTRACE
64static int prtrace PROTO((object *, char *));
65#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000066static void call_exc_trace PROTO((object **, object**, frameobject *));
67static int call_trace
68 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000069static object *add PROTO((object *, object *));
70static object *sub PROTO((object *, object *));
Guido van Rossum3b4da591996-06-19 21:49:17 +000071static object *powerop PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000072static object *mul PROTO((object *, object *));
73static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000074static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075static object *neg PROTO((object *));
76static object *pos PROTO((object *));
77static object *not PROTO((object *));
78static object *invert PROTO((object *));
79static object *lshift PROTO((object *, object *));
80static object *rshift PROTO((object *, object *));
81static object *and PROTO((object *, object *));
82static object *xor PROTO((object *, object *));
83static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000084static object *call_builtin PROTO((object *, object *, object *));
85static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000086static object *apply_subscript PROTO((object *, object *));
87static object *loop_subscript PROTO((object *, object *));
88static int slice_index PROTO((object *, int, int *));
89static object *apply_slice PROTO((object *, object *, object *));
90static int assign_subscript PROTO((object *, object *, object *));
91static int assign_slice PROTO((object *, object *, object *, object *));
92static int cmp_exception PROTO((object *, object *));
93static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000094static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000095static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000096static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000097static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000098static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +000099static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000100
101
Guido van Rossum0a066c01992-03-27 17:29:15 +0000102/* Pointer to current frame, used to link new frames to */
103
Guido van Rossum374a9221991-04-04 10:40:29 +0000104static frameobject *current_frame;
105
Guido van Rossume59214e1994-08-30 08:01:59 +0000106#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000107
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000108#include <errno.h>
109#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000110
Guido van Rossuma9672091994-09-14 13:31:22 +0000111static type_lock interpreter_lock = 0;
112static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113
114void
115init_save_thread()
116{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000117 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000118 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119 interpreter_lock = allocate_lock();
120 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000121 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000123
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124#endif
125
Guido van Rossumff4949e1992-08-05 19:58:53 +0000126/* Functions save_thread and restore_thread are always defined so
127 dynamically loaded modules needn't be compiled separately for use
128 with and without threads: */
129
Guido van Rossum04691fc1992-08-12 15:35:34 +0000130object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131save_thread()
132{
Guido van Rossume59214e1994-08-30 08:01:59 +0000133#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000134 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000135 object *res;
136 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137 current_frame = NULL;
138 release_lock(interpreter_lock);
139 return res;
140 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000141#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000142 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000143}
144
145void
146restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000147 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148{
Guido van Rossume59214e1994-08-30 08:01:59 +0000149#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000150 if (interpreter_lock) {
151 int err;
152 err = errno;
153 acquire_lock(interpreter_lock, 1);
154 errno = err;
155 current_frame = (frameobject *)x;
156 }
157#endif
158}
159
160
Guido van Rossuma9672091994-09-14 13:31:22 +0000161/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
162 signal handlers or Mac I/O completion routines) can schedule calls
163 to a function to be called synchronously.
164 The synchronous function is called with one void* argument.
165 It should return 0 for success or -1 for failure -- failure should
166 be accompanied by an exception.
167
168 If registry succeeds, the registry function returns 0; if it fails
169 (e.g. due to too many pending calls) it returns -1 (without setting
170 an exception condition).
171
172 Note that because registry may occur from within signal handlers,
173 or other asynchronous events, calling malloc() is unsafe!
174
175#ifdef WITH_THREAD
176 Any thread can schedule pending calls, but only the main thread
177 will execute them.
178#endif
179
180 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
181 There are two possible race conditions:
182 (1) nested asynchronous registry calls;
183 (2) registry calls made while pending calls are being processed.
184 While (1) is very unlikely, (2) is a real possibility.
185 The current code is safe against (2), but not against (1).
186 The safety against (2) is derived from the fact that only one
187 thread (the main thread) ever takes things out of the queue.
188*/
189
190#define NPENDINGCALLS 32
191static struct {
192 int (*func) PROTO((ANY *));
193 ANY *arg;
194} pendingcalls[NPENDINGCALLS];
195static volatile int pendingfirst = 0;
196static volatile int pendinglast = 0;
197
198int
199Py_AddPendingCall(func, arg)
200 int (*func) PROTO((ANY *));
201 ANY *arg;
202{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000203 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000204 int i, j;
205 /* XXX Begin critical section */
206 /* XXX If you want this to be safe against nested
207 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000208 if (busy)
209 return -1;
210 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000211 i = pendinglast;
212 j = (i + 1) % NPENDINGCALLS;
213 if (j == pendingfirst)
214 return -1; /* Queue full */
215 pendingcalls[i].func = func;
216 pendingcalls[i].arg = arg;
217 pendinglast = j;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000218 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000219 /* XXX End critical section */
220 return 0;
221}
222
Guido van Rossum180d7b41994-09-29 09:45:57 +0000223int
224Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000225{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000226 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000227#ifdef WITH_THREAD
228 if (get_thread_ident() != main_thread)
229 return 0;
230#endif
Guido van Rossum180d7b41994-09-29 09:45:57 +0000231 if (busy)
232 return 0;
233 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000234 for (;;) {
235 int i;
236 int (*func) PROTO((ANY *));
237 ANY *arg;
238 i = pendingfirst;
239 if (i == pendinglast)
240 break; /* Queue empty */
241 func = pendingcalls[i].func;
242 arg = pendingcalls[i].arg;
243 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 if (func(arg) < 0) {
245 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000247 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000249 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000250 return 0;
251}
252
253
Guido van Rossum374a9221991-04-04 10:40:29 +0000254/* Status code for main loop (reason for stack unwind) */
255
256enum why_code {
257 WHY_NOT, /* No error */
258 WHY_EXCEPTION, /* Exception occurred */
259 WHY_RERAISE, /* Exception re-raised by 'finally' */
260 WHY_RETURN, /* 'return' statement */
261 WHY_BREAK /* 'break' statement */
262};
263
264
Guido van Rossum681d79a1995-07-18 14:51:37 +0000265/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000266
267object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000268eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000269 codeobject *co;
270 object *globals;
271 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000272{
273 return eval_code2(co,
274 globals, locals,
275 (object **)NULL, 0,
276 (object **)NULL, 0,
277 (object **)NULL, 0,
278 (object *)NULL);
279}
280
281
282/* Interpreter main loop */
283
284static object *
285eval_code2(co, globals, locals,
286 args, argcount, kws, kwcount, defs, defcount, owner)
287 codeobject *co;
288 object *globals;
289 object *locals;
290 object **args;
291 int argcount;
292 object **kws; /* length: 2*kwcount */
293 int kwcount;
294 object **defs;
295 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000296 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000297{
298 register unsigned char *next_instr;
299 register int opcode; /* Current opcode */
300 register int oparg; /* Current opcode argument, if any */
301 register object **stack_pointer;
302 register enum why_code why; /* Reason for block stack unwind */
303 register int err; /* Error status -- nonzero if error */
304 register object *x; /* Result object -- NULL if error */
305 register object *v; /* Temporary objects popped off stack */
306 register object *w;
307 register object *u;
308 register object *t;
309 register frameobject *f; /* Current frame */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000310 register object **fastlocals;
311 object *retval; /* Return value */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000312 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000313#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000314 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000315#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316#if defined(DEBUG) || defined(LLTRACE)
317 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000318 char *filename = getstringvalue(co->co_filename);
319#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000320
321/* Code access macros */
322
323#define GETCONST(i) Getconst(f, i)
324#define GETNAME(i) Getname(f, i)
325#define GETNAMEV(i) Getnamev(f, i)
326#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
327#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
328#define NEXTOP() (*next_instr++)
329#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
330#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
331#define JUMPBY(x) (next_instr += (x))
332
333/* Stack manipulation macros */
334
335#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
336#define EMPTY() (STACK_LEVEL() == 0)
337#define TOP() (stack_pointer[-1])
338#define BASIC_PUSH(v) (*stack_pointer++ = (v))
339#define BASIC_POP() (*--stack_pointer)
340
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000341#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
342 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
343
Guido van Rossum96a42c81992-01-12 02:29:51 +0000344#ifdef LLTRACE
345#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
346#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000347#else
348#define PUSH(v) BASIC_PUSH(v)
349#define POP() BASIC_POP()
350#endif
351
Guido van Rossum681d79a1995-07-18 14:51:37 +0000352/* Local variable macros */
353
354#define GETLOCAL(i) (fastlocals[i])
355#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
356 GETLOCAL(i) = value; } while (0)
357
358 if (globals == NULL) {
359 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000360 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000361 }
362
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000363#ifdef LLTRACE
364 lltrace = dictlookup(globals, "__lltrace__") != NULL;
365#endif
366
Guido van Rossum374a9221991-04-04 10:40:29 +0000367 f = newframeobject(
368 current_frame, /*back*/
369 co, /*code*/
370 globals, /*globals*/
371 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000372 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000373 50, /*nvalues*/
374 20); /*nblocks*/
375 if (f == NULL)
376 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000377
Guido van Rossum374a9221991-04-04 10:40:29 +0000378 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000379
Guido van Rossum681d79a1995-07-18 14:51:37 +0000380 if (co->co_nlocals > 0)
381 fastlocals = ((listobject *)f->f_fastlocals)->ob_item;
382
383 if (co->co_argcount > 0 ||
384 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
385 int i;
386 int n = argcount;
387 object *kwdict = NULL;
388 if (co->co_flags & CO_VARKEYWORDS) {
389 kwdict = newmappingobject();
390 if (kwdict == NULL)
391 goto fail;
392 }
393 if (argcount > co->co_argcount) {
394 if (!(co->co_flags & CO_VARARGS)) {
395 err_setstr(TypeError, "too many arguments");
396 goto fail;
397 }
398 n = co->co_argcount;
399 }
400 for (i = 0; i < n; i++) {
401 x = args[i];
402 INCREF(x);
403 SETLOCAL(i, x);
404 }
405 if (co->co_flags & CO_VARARGS) {
406 u = newtupleobject(argcount - n);
407 for (i = n; i < argcount; i++) {
408 x = args[i];
409 INCREF(x);
410 SETTUPLEITEM(u, i-n, x);
411 }
412 SETLOCAL(co->co_argcount, u);
413 }
414 for (i = 0; i < kwcount; i++) {
415 object *keyword = kws[2*i];
416 object *value = kws[2*i + 1];
417 int j;
418 /* XXX slow -- speed up using dictionary? */
419 for (j = 0; j < co->co_argcount; j++) {
420 object *nm = GETTUPLEITEM(co->co_varnames, j);
421 if (cmpobject(keyword, nm) == 0)
422 break;
423 }
424 if (j >= co->co_argcount) {
425 if (kwdict == NULL) {
426 err_setval(KeyError/*XXX*/, keyword);
427 goto fail;
428 }
429 mappinginsert(kwdict, keyword, value);
430 }
431 else {
432 if (GETLOCAL(j) != NULL) {
433 err_setstr(TypeError,
434 "keyword parameter redefined");
435 goto fail;
436 }
437 INCREF(value);
438 SETLOCAL(j, value);
439 }
440 }
441 if (argcount < co->co_argcount) {
442 int m = co->co_argcount - defcount;
443 for (i = argcount; i < m; i++) {
444 if (GETLOCAL(i) == NULL) {
445 err_setstr(TypeError,
446 "not enough arguments");
447 goto fail;
448 }
449 }
450 if (n > m)
451 i = n - m;
452 else
453 i = 0;
454 for (; i < defcount; i++) {
455 if (GETLOCAL(m+i) == NULL) {
456 object *def = defs[i];
457 INCREF(def);
458 SETLOCAL(m+i, def);
459 }
460 }
461 }
462 if (kwdict != NULL) {
463 i = co->co_argcount;
464 if (co->co_flags & CO_VARARGS)
465 i++;
466 SETLOCAL(i, kwdict);
467 }
468 if (0) {
469 fail:
470 XDECREF(kwdict);
471 goto fail2;
472 }
473 }
474 else {
475 if (argcount > 0 || kwcount > 0) {
476 err_setstr(TypeError, "no arguments expected");
477 fail2:
478 current_frame = f->f_back;
479 DECREF(f);
480 return NULL;
481 }
482 }
483
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000484 if (sys_trace != NULL) {
485 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000486 be called on *every* entry to a code block.
487 Its return value, if not None, is a function that
488 will be called at the start of each executed line
489 of code. (Actually, the function must return
490 itself in order to continue tracing.)
491 The trace functions are called with three arguments:
492 a pointer to the current frame, a string indicating
493 why the function is called, and an argument which
494 depends on the situation. The global trace function
495 (sys.trace) is also called whenever an exception
496 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497 if (call_trace(&sys_trace, &f->f_trace, f, "call",
498 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000499 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000500 current_frame = f->f_back;
501 DECREF(f);
502 return NULL;
503 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000504 }
505
506 if (sys_profile != NULL) {
507 /* Similar for sys_profile, except it needn't return
508 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 if (call_trace(&sys_profile, (object**)0, f, "call",
510 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000511 current_frame = f->f_back;
512 DECREF(f);
513 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000514 }
515 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000516
Guido van Rossum374a9221991-04-04 10:40:29 +0000517 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000518 stack_pointer = f->f_valuestack;
519
Guido van Rossum374a9221991-04-04 10:40:29 +0000520 why = WHY_NOT;
521 err = 0;
522 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000523
524 for (;;) {
Guido van Rossum4965bc81991-05-14 11:51:49 +0000525 static int ticker;
Guido van Rossum374a9221991-04-04 10:40:29 +0000526
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527 /* Do periodic things.
528 Doing this every time through the loop would add
529 too much overhead (a function call per instruction).
Guido van Rossume59214e1994-08-30 08:01:59 +0000530 So we do it only every Nth instruction. */
Guido van Rossum374a9221991-04-04 10:40:29 +0000531
Guido van Rossuma9672091994-09-14 13:31:22 +0000532 if (pendingfirst != pendinglast) {
Guido van Rossum180d7b41994-09-29 09:45:57 +0000533 if (Py_MakePendingCalls() < 0) {
Guido van Rossuma9672091994-09-14 13:31:22 +0000534 why = WHY_EXCEPTION;
535 goto on_error;
536 }
537 }
538
Guido van Rossum374a9221991-04-04 10:40:29 +0000539 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000540 ticker = sys_checkinterval;
Guido van Rossume59214e1994-08-30 08:01:59 +0000541 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000542 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000543 goto on_error;
544 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545
Guido van Rossume59214e1994-08-30 08:01:59 +0000546#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000547 if (interpreter_lock) {
548 /* Give another thread a chance */
549
550 current_frame = NULL;
551 release_lock(interpreter_lock);
552
553 /* Other threads may run now */
554
555 acquire_lock(interpreter_lock, 1);
556 current_frame = f;
557 }
558#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000559 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000560
Guido van Rossum374a9221991-04-04 10:40:29 +0000561 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000562
Guido van Rossum8c1e1501996-05-24 20:49:24 +0000563#if defined(DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000564 f->f_lasti = INSTR_OFFSET();
565#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000566
567 opcode = NEXTOP();
568 if (HAS_ARG(opcode))
569 oparg = NEXTARG();
570
Guido van Rossum96a42c81992-01-12 02:29:51 +0000571#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000572 /* Instruction tracing */
573
Guido van Rossum96a42c81992-01-12 02:29:51 +0000574 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000575 if (HAS_ARG(opcode)) {
576 printf("%d: %d, %d\n",
577 (int) (INSTR_OFFSET() - 3),
578 opcode, oparg);
579 }
580 else {
581 printf("%d: %d\n",
582 (int) (INSTR_OFFSET() - 1), opcode);
583 }
584 }
585#endif
586
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000587 if (!CHECK_STACK(3)) {
588 x = NULL;
589 break;
590 }
591
Guido van Rossum374a9221991-04-04 10:40:29 +0000592 /* Main switch on opcode */
593
594 switch (opcode) {
595
596 /* BEWARE!
597 It is essential that any operation that fails sets either
598 x to NULL, err to nonzero, or why to anything but WHY_NOT,
599 and that no operation that succeeds does this! */
600
601 /* case STOP_CODE: this is an error! */
602
603 case POP_TOP:
604 v = POP();
605 DECREF(v);
606 break;
607
608 case ROT_TWO:
609 v = POP();
610 w = POP();
611 PUSH(v);
612 PUSH(w);
613 break;
614
615 case ROT_THREE:
616 v = POP();
617 w = POP();
618 x = POP();
619 PUSH(v);
620 PUSH(x);
621 PUSH(w);
622 break;
623
624 case DUP_TOP:
625 v = TOP();
626 INCREF(v);
627 PUSH(v);
628 break;
629
630 case UNARY_POSITIVE:
631 v = POP();
632 x = pos(v);
633 DECREF(v);
634 PUSH(x);
635 break;
636
637 case UNARY_NEGATIVE:
638 v = POP();
639 x = neg(v);
640 DECREF(v);
641 PUSH(x);
642 break;
643
644 case UNARY_NOT:
645 v = POP();
646 x = not(v);
647 DECREF(v);
648 PUSH(x);
649 break;
650
651 case UNARY_CONVERT:
652 v = POP();
653 x = reprobject(v);
654 DECREF(v);
655 PUSH(x);
656 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000657
658 case UNARY_INVERT:
659 v = POP();
660 x = invert(v);
661 DECREF(v);
662 PUSH(x);
663 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000664
Guido van Rossum50564e81996-01-12 01:13:16 +0000665 case BINARY_POWER:
666 w = POP();
667 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000668 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000669 DECREF(v);
670 DECREF(w);
671 PUSH(x);
672 break;
673
Guido van Rossum374a9221991-04-04 10:40:29 +0000674 case BINARY_MULTIPLY:
675 w = POP();
676 v = POP();
677 x = mul(v, w);
678 DECREF(v);
679 DECREF(w);
680 PUSH(x);
681 break;
682
683 case BINARY_DIVIDE:
684 w = POP();
685 v = POP();
686 x = divide(v, w);
687 DECREF(v);
688 DECREF(w);
689 PUSH(x);
690 break;
691
692 case BINARY_MODULO:
693 w = POP();
694 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000695 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000696 DECREF(v);
697 DECREF(w);
698 PUSH(x);
699 break;
700
701 case BINARY_ADD:
702 w = POP();
703 v = POP();
704 x = add(v, w);
705 DECREF(v);
706 DECREF(w);
707 PUSH(x);
708 break;
709
710 case BINARY_SUBTRACT:
711 w = POP();
712 v = POP();
713 x = sub(v, w);
714 DECREF(v);
715 DECREF(w);
716 PUSH(x);
717 break;
718
719 case BINARY_SUBSCR:
720 w = POP();
721 v = POP();
722 x = apply_subscript(v, w);
723 DECREF(v);
724 DECREF(w);
725 PUSH(x);
726 break;
727
Guido van Rossum7928cd71991-10-24 14:59:31 +0000728 case BINARY_LSHIFT:
729 w = POP();
730 v = POP();
731 x = lshift(v, w);
732 DECREF(v);
733 DECREF(w);
734 PUSH(x);
735 break;
736
737 case BINARY_RSHIFT:
738 w = POP();
739 v = POP();
740 x = rshift(v, w);
741 DECREF(v);
742 DECREF(w);
743 PUSH(x);
744 break;
745
746 case BINARY_AND:
747 w = POP();
748 v = POP();
749 x = and(v, w);
750 DECREF(v);
751 DECREF(w);
752 PUSH(x);
753 break;
754
755 case BINARY_XOR:
756 w = POP();
757 v = POP();
758 x = xor(v, w);
759 DECREF(v);
760 DECREF(w);
761 PUSH(x);
762 break;
763
764 case BINARY_OR:
765 w = POP();
766 v = POP();
767 x = or(v, w);
768 DECREF(v);
769 DECREF(w);
770 PUSH(x);
771 break;
772
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 case SLICE+0:
774 case SLICE+1:
775 case SLICE+2:
776 case SLICE+3:
777 if ((opcode-SLICE) & 2)
778 w = POP();
779 else
780 w = NULL;
781 if ((opcode-SLICE) & 1)
782 v = POP();
783 else
784 v = NULL;
785 u = POP();
786 x = apply_slice(u, v, w);
787 DECREF(u);
788 XDECREF(v);
789 XDECREF(w);
790 PUSH(x);
791 break;
792
793 case STORE_SLICE+0:
794 case STORE_SLICE+1:
795 case STORE_SLICE+2:
796 case STORE_SLICE+3:
797 if ((opcode-STORE_SLICE) & 2)
798 w = POP();
799 else
800 w = NULL;
801 if ((opcode-STORE_SLICE) & 1)
802 v = POP();
803 else
804 v = NULL;
805 u = POP();
806 t = POP();
807 err = assign_slice(u, v, w, t); /* u[v:w] = t */
808 DECREF(t);
809 DECREF(u);
810 XDECREF(v);
811 XDECREF(w);
812 break;
813
814 case DELETE_SLICE+0:
815 case DELETE_SLICE+1:
816 case DELETE_SLICE+2:
817 case DELETE_SLICE+3:
818 if ((opcode-DELETE_SLICE) & 2)
819 w = POP();
820 else
821 w = NULL;
822 if ((opcode-DELETE_SLICE) & 1)
823 v = POP();
824 else
825 v = NULL;
826 u = POP();
827 err = assign_slice(u, v, w, (object *)NULL);
828 /* del u[v:w] */
829 DECREF(u);
830 XDECREF(v);
831 XDECREF(w);
832 break;
833
834 case STORE_SUBSCR:
835 w = POP();
836 v = POP();
837 u = POP();
838 /* v[w] = u */
839 err = assign_subscript(v, w, u);
840 DECREF(u);
841 DECREF(v);
842 DECREF(w);
843 break;
844
845 case DELETE_SUBSCR:
846 w = POP();
847 v = POP();
848 /* del v[w] */
849 err = assign_subscript(v, w, (object *)NULL);
850 DECREF(v);
851 DECREF(w);
852 break;
853
854 case PRINT_EXPR:
855 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000856 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000857 /* Before printing, also assign to '_' */
858 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000859 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000860 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000862 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000863 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000864 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 flushline();
866 }
867 DECREF(v);
868 break;
869
870 case PRINT_ITEM:
871 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000872 w = sysget("stdout");
873 if (softspace(w, 1))
874 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000875 err = writeobject(v, w, PRINT_RAW);
876 if (err == 0 && is_stringobject(v)) {
877 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 char *s = getstringvalue(v);
879 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000880 if (len > 0 &&
881 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000882 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000883 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000885 DECREF(v);
886 break;
887
888 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000889 x = sysget("stdout");
890 if (x == NULL)
891 err_setstr(RuntimeError, "lost sys.stdout");
892 else {
893 writestring("\n", x);
894 softspace(x, 0);
895 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 break;
897
898 case BREAK_LOOP:
899 why = WHY_BREAK;
900 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000901
Guido van Rossumf10570b1995-07-07 22:53:21 +0000902 case RAISE_VARARGS:
903 u = v = w = NULL;
904 switch (oparg) {
905 case 3:
906 u = POP(); /* traceback */
907 if (u == None) {
908 DECREF(u);
909 u = NULL;
910 }
Guido van Rossum9d78d8d1995-09-18 21:29:36 +0000911 else if (!PyTraceBack_Check(u)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000912 err_setstr(TypeError,
913 "raise 3rd arg must be traceback or None");
914 goto raise_error;
915 }
916 /* Fallthrough */
917 case 2:
918 v = POP(); /* value */
919 /* Fallthrough */
920 case 1:
921 w = POP(); /* exc */
922 break;
923 default:
924 err_setstr(SystemError,
925 "bad RAISE_VARARGS oparg");
926 goto raise_error;
927 }
928 if (v == NULL) {
929 v = None;
930 INCREF(v);
931 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000932 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000933 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000934 t = w;
935 w = GETTUPLEITEM(w, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000936 INCREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000937 DECREF(t);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000938 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000939 if (is_stringobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000940 ;
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000941 } else if (is_classobject(w)) {
942 if (!is_instanceobject(v)
943 || !issubclass((object*)((instanceobject*)v)->in_class,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000944 w)) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000945 err_setstr(TypeError,
946 "a class exception must have a value that is an instance of the class");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000947 goto raise_error;
948 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000949 } else if (is_instanceobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000950 if (v != None) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000951 err_setstr(TypeError,
952 "an instance exception may not have a separate value");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000953 goto raise_error;
954 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000955 else {
956 DECREF(v);
957 v = w;
958 w = (object*) ((instanceobject*)w)->in_class;
959 INCREF(w);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000960 }
Guido van Rossumf10570b1995-07-07 22:53:21 +0000961 }
962 else {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000963 err_setstr(TypeError,
964 "exceptions must be strings, classes, or instances");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000965 goto raise_error;
966 }
967 err_restore(w, v, u);
968 if (u == NULL)
969 why = WHY_EXCEPTION;
970 else
971 why = WHY_RERAISE;
972 break;
973 raise_error:
974 XDECREF(v);
975 XDECREF(w);
976 XDECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 why = WHY_EXCEPTION;
978 break;
979
980 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000981 if ((x = f->f_locals) == NULL) {
982 err_setstr(SystemError, "no locals");
983 break;
984 }
985 INCREF(x);
986 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 break;
988
989 case RETURN_VALUE:
990 retval = POP();
991 why = WHY_RETURN;
992 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000993
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000994 case EXEC_STMT:
995 w = POP();
996 v = POP();
997 u = POP();
998 err = exec_statement(u, v, w);
999 DECREF(u);
1000 DECREF(v);
1001 DECREF(w);
1002 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001003
Guido van Rossum374a9221991-04-04 10:40:29 +00001004 case POP_BLOCK:
1005 {
1006 block *b = pop_block(f);
1007 while (STACK_LEVEL() > b->b_level) {
1008 v = POP();
1009 DECREF(v);
1010 }
1011 }
1012 break;
1013
1014 case END_FINALLY:
1015 v = POP();
1016 if (is_intobject(v)) {
1017 why = (enum why_code) getintvalue(v);
1018 if (why == WHY_RETURN)
1019 retval = POP();
1020 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001021 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001023 u = POP();
1024 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001026 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 }
1028 else if (v != None) {
1029 err_setstr(SystemError,
1030 "'finally' pops bad exception");
1031 why = WHY_EXCEPTION;
1032 }
1033 DECREF(v);
1034 break;
1035
1036 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001037 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001039 w = POP();
1040 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001042 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 DECREF(v);
1044 DECREF(w);
1045 break;
1046
1047 case STORE_NAME:
1048 w = GETNAMEV(oparg);
1049 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001050 if ((x = f->f_locals) == NULL) {
1051 err_setstr(SystemError, "no locals");
1052 break;
1053 }
1054 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001055 if (u == NULL) {
1056 if (defmode != 0) {
1057 if (v != None)
1058 u = (object *)v->ob_type;
1059 else
1060 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001061 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001062 (typeobject *)u,
1063 defmode);
1064 DECREF(v);
1065 if (x == NULL)
1066 break;
1067 v = x;
1068 }
1069 }
1070 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001071 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001072 DECREF(v);
1073 break;
1074 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001075 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 DECREF(v);
1077 break;
1078
1079 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001080 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001081 if ((x = f->f_locals) == NULL) {
1082 err_setstr(SystemError, "no locals");
1083 break;
1084 }
1085 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001086 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001087 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001088 (object *)NULL);
1089 break;
1090 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001091 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001092 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001093 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001094
1095#ifdef CASE_TOO_BIG
1096 default: switch (opcode) {
1097#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001098
1099 case UNPACK_TUPLE:
1100 v = POP();
1101 if (!is_tupleobject(v)) {
1102 err_setstr(TypeError, "unpack non-tuple");
1103 why = WHY_EXCEPTION;
1104 }
1105 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001106 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 "unpack tuple of wrong size");
1108 why = WHY_EXCEPTION;
1109 }
1110 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001111 if (!CHECK_STACK(oparg)) {
1112 x = NULL;
1113 break;
1114 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001115 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001116 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 INCREF(w);
1118 PUSH(w);
1119 }
1120 }
1121 DECREF(v);
1122 break;
1123
1124 case UNPACK_LIST:
1125 v = POP();
1126 if (!is_listobject(v)) {
1127 err_setstr(TypeError, "unpack non-list");
1128 why = WHY_EXCEPTION;
1129 }
1130 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001131 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 "unpack list of wrong size");
1133 why = WHY_EXCEPTION;
1134 }
1135 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001136 if (!CHECK_STACK(oparg)) {
1137 x = NULL;
1138 break;
1139 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 for (; --oparg >= 0; ) {
1141 w = getlistitem(v, oparg);
1142 INCREF(w);
1143 PUSH(w);
1144 }
1145 }
1146 DECREF(v);
1147 break;
1148
1149 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001150 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 v = POP();
1152 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001153 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 DECREF(v);
1155 DECREF(u);
1156 break;
1157
1158 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001159 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001161 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 DECREF(v);
1163 break;
1164
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001165 case STORE_GLOBAL:
1166 w = GETNAMEV(oparg);
1167 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001168 if (f->f_locals != NULL) {
1169 u = dict2lookup(f->f_locals, w);
1170 if (u != NULL && is_accessobject(u)) {
1171 err = setaccessvalue(u, f->f_globals,
1172 v);
1173 DECREF(v);
1174 break;
1175 }
Guido van Rossum25831651993-05-19 14:50:45 +00001176 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001177 err = dict2insert(f->f_globals, w, v);
1178 DECREF(v);
1179 break;
1180
1181 case DELETE_GLOBAL:
1182 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001183 if (f->f_locals != NULL) {
1184 u = dict2lookup(f->f_locals, w);
1185 if (u != NULL && is_accessobject(u)) {
1186 err = setaccessvalue(u, f->f_globals,
1187 (object *)NULL);
1188 break;
1189 }
Guido van Rossum25831651993-05-19 14:50:45 +00001190 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001191 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001192 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001193 break;
1194
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 case LOAD_CONST:
1196 x = GETCONST(oparg);
1197 INCREF(x);
1198 PUSH(x);
1199 break;
1200
1201 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001202 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001203 if ((x = f->f_locals) == NULL) {
1204 err_setstr(SystemError, "no locals");
1205 break;
1206 }
1207 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001208 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001209 err_clear();
1210 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001212 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001213 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001215 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 break;
1217 }
1218 }
1219 }
Guido van Rossum25831651993-05-19 14:50:45 +00001220 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001221 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001222 if (x == NULL)
1223 break;
1224 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001225 else
1226 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 PUSH(x);
1228 break;
1229
1230 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001231 w = GETNAMEV(oparg);
1232 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001234 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001235 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001237 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 break;
1239 }
1240 }
Guido van Rossum25831651993-05-19 14:50:45 +00001241 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001242 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001243 if (x == NULL)
1244 break;
1245 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001246 else
1247 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 PUSH(x);
1249 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001250
1251#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001253 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001254 if ((x = f->f_locals) == NULL) {
1255 err_setstr(SystemError, "no locals");
1256 break;
1257 }
1258 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001260 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 break;
1262 }
Guido van Rossum25831651993-05-19 14:50:45 +00001263 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001264 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001265 if (x == NULL)
1266 break;
1267 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001268 else
1269 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 PUSH(x);
1271 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001272#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001273
1274 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001275 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001276 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001277 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001278 gettupleitem(co->co_varnames,
1279 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001280 break;
1281 }
Guido van Rossum25831651993-05-19 14:50:45 +00001282 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001283 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001284 if (x == NULL)
1285 break;
1286 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001287 else
1288 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001289 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001290 break;
1291
1292 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001293 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001294 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001295 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001296 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001297 DECREF(v);
1298 break;
1299 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001300 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001301 break;
1302
1303 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001304 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001305 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001306 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001307 gettupleitem(co->co_varnames,
1308 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001309 break;
1310 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001311 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001312 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001313 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001314 break;
1315 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001316 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001317 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001318
1319 case BUILD_TUPLE:
1320 x = newtupleobject(oparg);
1321 if (x != NULL) {
1322 for (; --oparg >= 0;) {
1323 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001324 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 }
1326 PUSH(x);
1327 }
1328 break;
1329
1330 case BUILD_LIST:
1331 x = newlistobject(oparg);
1332 if (x != NULL) {
1333 for (; --oparg >= 0;) {
1334 w = POP();
1335 err = setlistitem(x, oparg, w);
1336 if (err != 0)
1337 break;
1338 }
1339 PUSH(x);
1340 }
1341 break;
1342
1343 case BUILD_MAP:
1344 x = newdictobject();
1345 PUSH(x);
1346 break;
1347
1348 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001349 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001351 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 DECREF(v);
1353 PUSH(x);
1354 break;
1355
1356 case COMPARE_OP:
1357 w = POP();
1358 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001359 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 DECREF(v);
1361 DECREF(w);
1362 PUSH(x);
1363 break;
1364
1365 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001366 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001367 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368 if (x == NULL) {
1369 err_setstr(ImportError,
1370 "__import__ not found");
1371 break;
1372 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001373 if (is_methodobject(x)) {
1374 u = None;
1375 INCREF(u);
1376 }
1377 else {
1378 u = find_from_args(f, INSTR_OFFSET());
1379 if (u == NULL) {
1380 x = u;
1381 break;
1382 }
1383 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001384 w = mkvalue("(OOOO)",
1385 w,
1386 f->f_globals,
1387 f->f_locals == NULL ? None : f->f_locals,
1388 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001389 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001390 if (w == NULL) {
1391 x = NULL;
1392 break;
1393 }
1394 x = call_object(x, w);
1395 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001396 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 break;
1398
1399 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001400 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001402 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001403 if ((x = f->f_locals) == NULL) {
1404 err_setstr(SystemError, "no locals");
1405 break;
1406 }
1407 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001408 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001409 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001410
1411 case ACCESS_MODE:
1412 v = POP();
1413 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001414 if (getstringvalue(w)[0] == '*')
1415 defmode = getintvalue(v);
1416 else
1417 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001418 DECREF(v);
1419 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001420
1421 case JUMP_FORWARD:
1422 JUMPBY(oparg);
1423 break;
1424
1425 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001426 err = testbool(TOP());
1427 if (err > 0)
1428 err = 0;
1429 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 JUMPBY(oparg);
1431 break;
1432
1433 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001434 err = testbool(TOP());
1435 if (err > 0) {
1436 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001438 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 break;
1440
1441 case JUMP_ABSOLUTE:
1442 JUMPTO(oparg);
1443 break;
1444
1445 case FOR_LOOP:
1446 /* for v in s: ...
1447 On entry: stack contains s, i.
1448 On exit: stack contains s, i+1, s[i];
1449 but if loop exhausted:
1450 s, i are popped, and we jump */
1451 w = POP(); /* Loop index */
1452 v = POP(); /* Sequence object */
1453 u = loop_subscript(v, w);
1454 if (u != NULL) {
1455 PUSH(v);
1456 x = newintobject(getintvalue(w)+1);
1457 PUSH(x);
1458 DECREF(w);
1459 PUSH(u);
1460 }
1461 else {
1462 DECREF(v);
1463 DECREF(w);
1464 /* A NULL can mean "s exhausted"
1465 but also an error: */
1466 if (err_occurred())
1467 why = WHY_EXCEPTION;
1468 else
1469 JUMPBY(oparg);
1470 }
1471 break;
1472
1473 case SETUP_LOOP:
1474 case SETUP_EXCEPT:
1475 case SETUP_FINALLY:
1476 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1477 STACK_LEVEL());
1478 break;
1479
1480 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001481#ifdef LLTRACE
1482 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001483 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001484#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001485 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001486 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001487 /* Trace each line of code reached */
1488 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001489 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001490 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001491 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001493
1494 case CALL_FUNCTION:
1495 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001496 int na = oparg & 0xff;
1497 int nk = (oparg>>8) & 0xff;
1498 int n = na + 2*nk;
1499 object **pfunc = stack_pointer - n - 1;
1500 object *func = *pfunc;
1501 object *self = NULL;
1502 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001503 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001504 if (is_instancemethodobject(func)) {
1505 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001506 class = instancemethodgetclass(func);
1507 func = instancemethodgetfunc(func);
1508 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001510 INCREF(self);
1511 DECREF(*pfunc);
1512 *pfunc = self;
1513 na++;
1514 n++;
1515 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001516 else {
1517 /* Unbound methods must be
1518 called with an instance of
1519 the class (or a derived
1520 class) as first argument */
1521 if (na > 0 &&
1522 (self = stack_pointer[-n])
1523 != NULL &&
1524 is_instanceobject(self) &&
1525 issubclass(
1526 (object *)
1527 (((instanceobject *)self)
1528 ->in_class),
1529 class))
1530 /* Handy-dandy */ ;
1531 else {
1532 err_setstr(TypeError,
1533 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001534 x = NULL;
1535 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001536 }
1537 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001538 }
1539 else
1540 INCREF(func);
1541 if (is_funcobject(func)) {
1542 object *co = getfunccode(func);
1543 object *globals = getfuncglobals(func);
1544 object *argdefs = PyFunction_GetDefaults(func);
1545 object **d;
1546 int nd;
1547 if (argdefs != NULL) {
1548 d = &GETTUPLEITEM(argdefs, 0);
1549 nd = ((tupleobject *)argdefs)->ob_size;
1550 }
1551 else {
1552 d = NULL;
1553 nd = 0;
1554 }
1555 x = eval_code2(
1556 (codeobject *)co,
1557 globals, (object *)NULL,
1558 stack_pointer-n, na,
1559 stack_pointer-2*nk, nk,
1560 d, nd,
1561 class);
1562 }
1563 else {
1564 object *args = newtupleobject(na);
1565 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001566 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001568 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001569 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001570 if (nk > 0) {
1571 kwdict = newdictobject();
1572 if (kwdict == NULL) {
1573 x = NULL;
1574 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001576 err = 0;
1577 while (--nk >= 0) {
1578 object *value = POP();
1579 object *key = POP();
1580 err = mappinginsert(
1581 kwdict, key, value);
1582 if (err) {
1583 DECREF(key);
1584 DECREF(value);
1585 break;
1586 }
1587 }
1588 if (err) {
1589 DECREF(args);
1590 DECREF(kwdict);
1591 break;
1592 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001594 while (--na >= 0) {
1595 w = POP();
1596 SETTUPLEITEM(args, na, w);
1597 }
1598 x = PyEval_CallObjectWithKeywords(
1599 func, args, kwdict);
1600 DECREF(args);
1601 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001602 }
1603 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001604 while (stack_pointer > pfunc) {
1605 w = POP();
1606 DECREF(w);
1607 }
1608 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001609 break;
1610 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001611
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 case MAKE_FUNCTION:
1613 v = POP(); /* code object */
1614 x = newfuncobject(v, f->f_globals);
1615 DECREF(v);
1616 /* XXX Maybe this should be a separate opcode? */
1617 if (x != NULL && oparg > 0) {
1618 v = newtupleobject(oparg);
1619 if (v == NULL) {
1620 DECREF(x);
1621 x = NULL;
1622 break;
1623 }
1624 while (--oparg >= 0) {
1625 w = POP();
1626 SETTUPLEITEM(v, oparg, w);
1627 }
1628 err = PyFunction_SetDefaults(x, v);
1629 DECREF(v);
1630 }
1631 PUSH(x);
1632 break;
1633
Guido van Rossum374a9221991-04-04 10:40:29 +00001634 default:
1635 fprintf(stderr,
1636 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001637 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001638 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 why = WHY_EXCEPTION;
1640 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001641
1642#ifdef CASE_TOO_BIG
1643 }
1644#endif
1645
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 } /* switch */
1647
1648 on_error:
1649
1650 /* Quickly continue if no error occurred */
1651
1652 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001653 if (err == 0 && x != NULL) {
1654#ifdef CHECKEXC
1655 if (err_occurred())
1656 fprintf(stderr,
1657 "XXX undetected error\n");
1658 else
1659#endif
1660 continue; /* Normal, fast path */
1661 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 why = WHY_EXCEPTION;
1663 x = None;
1664 err = 0;
1665 }
1666
Guido van Rossum801dcae1992-04-08 11:32:32 +00001667#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 /* Double-check exception status */
1669
1670 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1671 if (!err_occurred()) {
1672 fprintf(stderr, "XXX ghost error\n");
1673 err_setstr(SystemError, "ghost error");
1674 why = WHY_EXCEPTION;
1675 }
1676 }
1677 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001678 if (err_occurred()) {
1679 fprintf(stderr,
1680 "XXX undetected error (why=%d)\n",
1681 why);
1682 why = WHY_EXCEPTION;
1683 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 }
1685#endif
1686
1687 /* Log traceback info if this is a real exception */
1688
1689 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001690 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001692 f->f_lasti -= 2;
1693 tb_here(f);
1694
Guido van Rossume59214e1994-08-30 08:01:59 +00001695 if (f->f_trace)
1696 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001697 if (sys_profile)
1698 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 }
1700
1701 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1702
1703 if (why == WHY_RERAISE)
1704 why = WHY_EXCEPTION;
1705
1706 /* Unwind stacks if a (pseudo) exception occurred */
1707
1708 while (why != WHY_NOT && f->f_iblock > 0) {
1709 block *b = pop_block(f);
1710 while (STACK_LEVEL() > b->b_level) {
1711 v = POP();
1712 XDECREF(v);
1713 }
1714 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1715 why = WHY_NOT;
1716 JUMPTO(b->b_handler);
1717 break;
1718 }
1719 if (b->b_type == SETUP_FINALLY ||
1720 b->b_type == SETUP_EXCEPT &&
1721 why == WHY_EXCEPTION) {
1722 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001723 object *exc, *val, *tb;
1724 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 if (val == NULL) {
1726 val = None;
1727 INCREF(val);
1728 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 /* Make the raw exception data
1730 available to the handler,
1731 so a program can emulate the
1732 Python main loop. Don't do
1733 this for 'finally'. */
1734 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001735 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 sysset("exc_value", val);
1737 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001739 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 PUSH(val);
1741 PUSH(exc);
1742 }
1743 else {
1744 if (why == WHY_RETURN)
1745 PUSH(retval);
1746 v = newintobject((long)why);
1747 PUSH(v);
1748 }
1749 why = WHY_NOT;
1750 JUMPTO(b->b_handler);
1751 break;
1752 }
1753 } /* unwind stack */
1754
1755 /* End the loop if we still have an error (or return) */
1756
1757 if (why != WHY_NOT)
1758 break;
1759
1760 } /* main loop */
1761
1762 /* Pop remaining stack entries */
1763
1764 while (!EMPTY()) {
1765 v = POP();
1766 XDECREF(v);
1767 }
1768
Guido van Rossum96a42c81992-01-12 02:29:51 +00001769 if (why != WHY_RETURN)
1770 retval = NULL;
1771
Guido van Rossume59214e1994-08-30 08:01:59 +00001772 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001773 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001774 if (call_trace(&f->f_trace, &f->f_trace, f,
1775 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001776 XDECREF(retval);
1777 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001778 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001779 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001780 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001781 }
1782
1783 if (sys_profile && why == WHY_RETURN) {
1784 if (call_trace(&sys_profile, (object**)0,
1785 f, "return", retval)) {
1786 XDECREF(retval);
1787 retval = NULL;
1788 why = WHY_EXCEPTION;
1789 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001790 }
1791
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 current_frame = f->f_back;
1795 DECREF(f);
1796
Guido van Rossum96a42c81992-01-12 02:29:51 +00001797 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001798}
1799
Guido van Rossum96a42c81992-01-12 02:29:51 +00001800#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001801static int
1802prtrace(v, str)
1803 object *v;
1804 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001805{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001806 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001807 if (printobject(v, stdout, 0) != 0)
1808 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001809 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001810}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001811#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001812
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001813static void
1814call_exc_trace(p_trace, p_newtrace, f)
1815 object **p_trace, **p_newtrace;
1816 frameobject *f;
1817{
1818 object *type, *value, *traceback, *arg;
1819 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001820 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001821 if (value == NULL) {
1822 value = None;
1823 INCREF(value);
1824 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001825 arg = mkvalue("(OOO)", type, value, traceback);
1826 if (arg == NULL) {
1827 err_restore(type, value, traceback);
1828 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001829 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001830 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1831 DECREF(arg);
1832 if (err == 0)
1833 err_restore(type, value, traceback);
1834 else {
1835 XDECREF(type);
1836 XDECREF(value);
1837 XDECREF(traceback);
1838 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001839}
1840
1841static int
1842call_trace(p_trace, p_newtrace, f, msg, arg)
1843 object **p_trace; /* in/out; may not be NULL;
1844 may not point to NULL variable initially */
1845 object **p_newtrace; /* in/out; may be NULL;
1846 may point to NULL variable;
1847 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001848 frameobject *f;
1849 char *msg;
1850 object *arg;
1851{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001852 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001853 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001854 static int tracing = 0;
1855
1856 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001857 /* Don't do recursive traces */
1858 if (p_newtrace) {
1859 XDECREF(*p_newtrace);
1860 *p_newtrace = NULL;
1861 }
1862 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001863 }
1864
Guido van Rossumf10570b1995-07-07 22:53:21 +00001865 args = newtupleobject(3);
1866 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001867 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001868 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001869 if (what == NULL)
1870 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001871 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001872 SETTUPLEITEM(args, 0, (object *)f);
1873 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001874 if (arg == NULL)
1875 arg = None;
1876 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001877 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001878 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001879 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001880 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001881 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001882 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001883 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001884 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001885 if (res == NULL) {
1886 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001887 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001888 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001889 *p_trace = NULL;
1890 if (p_newtrace) {
1891 XDECREF(*p_newtrace);
1892 *p_newtrace = NULL;
1893 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001894 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001895 }
1896 else {
1897 if (p_newtrace) {
1898 XDECREF(*p_newtrace);
1899 if (res == None)
1900 *p_newtrace = NULL;
1901 else {
1902 INCREF(res);
1903 *p_newtrace = res;
1904 }
1905 }
1906 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001907 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001908 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001909}
1910
Guido van Rossum3f5da241990-12-20 15:06:42 +00001911object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001912getbuiltins()
1913{
1914 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001915 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001916 else
1917 return current_frame->f_builtins;
1918}
1919
1920object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001921getlocals()
1922{
1923 if (current_frame == NULL)
1924 return NULL;
1925 fast_2_locals(current_frame);
1926 return current_frame->f_locals;
1927}
1928
1929object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001930getglobals()
1931{
1932 if (current_frame == NULL)
1933 return NULL;
1934 else
1935 return current_frame->f_globals;
1936}
1937
Guido van Rossum81daa321993-05-20 14:24:46 +00001938object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001939getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001940{
1941 if (current_frame == NULL)
1942 return NULL;
1943 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001944 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001945}
1946
Guido van Rossume59214e1994-08-30 08:01:59 +00001947object *
1948getframe()
1949{
1950 return (object *)current_frame;
1951}
1952
Guido van Rossum6135a871995-01-09 17:53:26 +00001953int
1954getrestricted()
1955{
1956 return current_frame == NULL ? 0 : current_frame->f_restricted;
1957}
1958
Guido van Rossum3f5da241990-12-20 15:06:42 +00001959void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960flushline()
1961{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001962 object *f = sysget("stdout");
1963 if (softspace(f, 0))
1964 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965}
1966
Guido van Rossum3f5da241990-12-20 15:06:42 +00001967
Guido van Rossum06186511995-01-07 12:40:10 +00001968#define BINOP(opname, ropname, thisfunc) \
1969 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1970 ; \
1971 else \
1972 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001973
1974
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001976or(v, w)
1977 object *v, *w;
1978{
Guido van Rossum06186511995-01-07 12:40:10 +00001979 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001980 if (v->ob_type->tp_as_number != NULL) {
1981 object *x;
1982 object * (*f) FPROTO((object *, object *));
1983 if (coerce(&v, &w) != 0)
1984 return NULL;
1985 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
1986 x = (*f)(v, w);
1987 DECREF(v);
1988 DECREF(w);
1989 if (f != NULL)
1990 return x;
1991 }
1992 err_setstr(TypeError, "bad operand type(s) for |");
1993 return NULL;
1994}
1995
1996static object *
1997xor(v, w)
1998 object *v, *w;
1999{
Guido van Rossum06186511995-01-07 12:40:10 +00002000 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002001 if (v->ob_type->tp_as_number != NULL) {
2002 object *x;
2003 object * (*f) FPROTO((object *, object *));
2004 if (coerce(&v, &w) != 0)
2005 return NULL;
2006 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2007 x = (*f)(v, w);
2008 DECREF(v);
2009 DECREF(w);
2010 if (f != NULL)
2011 return x;
2012 }
2013 err_setstr(TypeError, "bad operand type(s) for ^");
2014 return NULL;
2015}
2016
2017static object *
2018and(v, w)
2019 object *v, *w;
2020{
Guido van Rossum06186511995-01-07 12:40:10 +00002021 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002022 if (v->ob_type->tp_as_number != NULL) {
2023 object *x;
2024 object * (*f) FPROTO((object *, object *));
2025 if (coerce(&v, &w) != 0)
2026 return NULL;
2027 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2028 x = (*f)(v, w);
2029 DECREF(v);
2030 DECREF(w);
2031 if (f != NULL)
2032 return x;
2033 }
2034 err_setstr(TypeError, "bad operand type(s) for &");
2035 return NULL;
2036}
2037
2038static object *
2039lshift(v, w)
2040 object *v, *w;
2041{
Guido van Rossum06186511995-01-07 12:40:10 +00002042 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002043 if (v->ob_type->tp_as_number != NULL) {
2044 object *x;
2045 object * (*f) FPROTO((object *, object *));
2046 if (coerce(&v, &w) != 0)
2047 return NULL;
2048 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2049 x = (*f)(v, w);
2050 DECREF(v);
2051 DECREF(w);
2052 if (f != NULL)
2053 return x;
2054 }
2055 err_setstr(TypeError, "bad operand type(s) for <<");
2056 return NULL;
2057}
2058
2059static object *
2060rshift(v, w)
2061 object *v, *w;
2062{
Guido van Rossum06186511995-01-07 12:40:10 +00002063 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002064 if (v->ob_type->tp_as_number != NULL) {
2065 object *x;
2066 object * (*f) FPROTO((object *, object *));
2067 if (coerce(&v, &w) != 0)
2068 return NULL;
2069 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2070 x = (*f)(v, w);
2071 DECREF(v);
2072 DECREF(w);
2073 if (f != NULL)
2074 return x;
2075 }
2076 err_setstr(TypeError, "bad operand type(s) for >>");
2077 return NULL;
2078}
2079
2080static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002081add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 object *v, *w;
2083{
Guido van Rossum06186511995-01-07 12:40:10 +00002084 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002085 if (v->ob_type->tp_as_sequence != NULL)
2086 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2087 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002088 object *x;
2089 if (coerce(&v, &w) != 0)
2090 return NULL;
2091 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2092 DECREF(v);
2093 DECREF(w);
2094 return x;
2095 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002096 err_setstr(TypeError, "bad operand type(s) for +");
2097 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098}
2099
2100static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002101sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 object *v, *w;
2103{
Guido van Rossum06186511995-01-07 12:40:10 +00002104 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002105 if (v->ob_type->tp_as_number != NULL) {
2106 object *x;
2107 if (coerce(&v, &w) != 0)
2108 return NULL;
2109 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2110 DECREF(v);
2111 DECREF(w);
2112 return x;
2113 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 return NULL;
2116}
2117
2118static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 object *v, *w;
2121{
2122 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002123 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002124 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002125 if (tp->tp_as_number != NULL &&
2126 w->ob_type->tp_as_sequence != NULL &&
2127 !is_instanceobject(v)) {
2128 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 object *tmp = v;
2130 v = w;
2131 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002132 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002134 if (tp->tp_as_number != NULL) {
2135 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002136 if (is_instanceobject(v)) {
2137 /* Instances of user-defined classes get their
2138 other argument uncoerced, so they may
2139 implement sequence*number as well as
2140 number*number. */
2141 INCREF(v);
2142 INCREF(w);
2143 }
2144 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002145 return NULL;
2146 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2147 DECREF(v);
2148 DECREF(w);
2149 return x;
2150 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 if (tp->tp_as_sequence != NULL) {
2152 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002153 err_setstr(TypeError,
2154 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 return NULL;
2156 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002157 return (*tp->tp_as_sequence->sq_repeat)
2158 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002160 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 return NULL;
2162}
2163
2164static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002165divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 object *v, *w;
2167{
Guido van Rossum06186511995-01-07 12:40:10 +00002168 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002169 if (v->ob_type->tp_as_number != NULL) {
2170 object *x;
2171 if (coerce(&v, &w) != 0)
2172 return NULL;
2173 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2174 DECREF(v);
2175 DECREF(w);
2176 return x;
2177 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002178 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 return NULL;
2180}
2181
2182static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002183mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 object *v, *w;
2185{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002186 if (is_stringobject(v)) {
2187 return formatstring(v, w);
2188 }
Guido van Rossum06186511995-01-07 12:40:10 +00002189 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002190 if (v->ob_type->tp_as_number != NULL) {
2191 object *x;
2192 if (coerce(&v, &w) != 0)
2193 return NULL;
2194 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2195 DECREF(v);
2196 DECREF(w);
2197 return x;
2198 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002199 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200 return NULL;
2201}
2202
2203static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002204powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002205 object *v, *w;
2206{
2207 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002208 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002209 if (v->ob_type->tp_as_number == NULL ||
2210 w->ob_type->tp_as_number == NULL) {
2211 err_setstr(TypeError, "pow() requires numeric arguments");
2212 return NULL;
2213 }
2214 if (
2215#ifndef WITHOUT_COMPLEX
2216 !is_complexobject(v) &&
2217#endif
2218 is_floatobject(w) && getfloatvalue(v) < 0.0) {
2219 if (!err_occurred())
2220 err_setstr(ValueError, "negative number to float power");
2221 return NULL;
2222 }
2223 if (coerce(&v, &w) != 0)
2224 return NULL;
2225 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2226 DECREF(v);
2227 DECREF(w);
2228 return res;
2229}
2230
2231static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002232neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 object *v;
2234{
2235 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002236 return (*v->ob_type->tp_as_number->nb_negative)(v);
2237 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 return NULL;
2239}
2240
2241static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 object *v;
2244{
2245 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 return (*v->ob_type->tp_as_number->nb_positive)(v);
2247 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 return NULL;
2249}
2250
2251static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002252invert(v)
2253 object *v;
2254{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002255 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002256 if (v->ob_type->tp_as_number != NULL &&
2257 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2258 return (*f)(v);
2259 err_setstr(TypeError, "bad operand type(s) for unary ~");
2260 return NULL;
2261}
2262
2263static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002264not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 object *v;
2266{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002267 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002268 object *w;
2269 if (outcome < 0)
2270 return NULL;
2271 if (outcome == 0)
2272 w = True;
2273 else
2274 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275 INCREF(w);
2276 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277}
Guido van Rossum234f9421993-06-17 12:35:49 +00002278
2279
Guido van Rossum681d79a1995-07-18 14:51:37 +00002280/* External interface to call any callable object.
2281 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002282
2283object *
2284call_object(func, arg)
2285 object *func;
2286 object *arg;
2287{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002288 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2289}
Guido van Rossume59214e1994-08-30 08:01:59 +00002290
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291object *
2292PyEval_CallObjectWithKeywords(func, arg, kw)
2293 object *func;
2294 object *arg;
2295 object *kw;
2296{
2297 ternaryfunc call;
2298 object *result;
2299
2300 if (arg == NULL)
2301 arg = newtupleobject(0);
2302 else if (!is_tupleobject(arg)) {
2303 err_setstr(TypeError, "argument list must be a tuple");
2304 return NULL;
2305 }
2306 else
2307 INCREF(arg);
2308
Guido van Rossume3e61c11995-08-04 04:14:47 +00002309 if (kw != NULL && !is_dictobject(kw)) {
2310 err_setstr(TypeError, "keyword list must be a dictionary");
2311 return NULL;
2312 }
2313
Guido van Rossum681d79a1995-07-18 14:51:37 +00002314 if (call = func->ob_type->tp_call)
2315 result = (*call)(func, arg, kw);
2316 else if (is_instancemethodobject(func) || is_funcobject(func))
2317 result = call_function(func, arg, kw);
2318 else
2319 result = call_builtin(func, arg, kw);
2320
2321 DECREF(arg);
2322
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002323 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002324 err_setstr(SystemError,
2325 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002326
2327 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002328}
2329
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002331call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002333 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 if (is_methodobject(func)) {
2337 method meth = getmethod(func);
2338 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002339 int flags = getflags(func);
2340 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002341 int size = gettuplesize(arg);
2342 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002343 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002344 else if (size == 0)
2345 arg = NULL;
2346 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002347 if (flags & METH_KEYWORDS)
2348 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002349 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002350 err_setstr(TypeError,
2351 "this function takes no keyword arguments");
2352 return NULL;
2353 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 }
2356 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002357 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002359 if (is_instanceobject(func)) {
2360 object *res, *call = getattr(func,"__call__");
2361 if (call == NULL) {
2362 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002363 err_setstr(AttributeError,
2364 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002365 return NULL;
2366 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002367 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002368 DECREF(call);
2369 return res;
2370 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 return NULL;
2373}
2374
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002376call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002378 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002379 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002381 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002382 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002383 object **d, **k;
2384 int nk, nd;
2385 object *result;
2386
2387 if (kw != NULL && !is_dictobject(kw)) {
2388 err_badcall();
2389 return NULL;
2390 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391
Guido van Rossume8122f11991-05-05 20:03:07 +00002392 if (is_instancemethodobject(func)) {
2393 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002394 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002395 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002396 if (self == NULL) {
2397 /* Unbound methods must be called with an instance of
2398 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002399 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002400 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002401 if (self != NULL &&
2402 is_instanceobject(self) &&
2403 issubclass((object *)
2404 (((instanceobject *)self)->in_class),
2405 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002406 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002407 else
2408 self = NULL;
2409 }
2410 if (self == NULL) {
2411 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002412 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002413 return NULL;
2414 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002416 }
2417 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 int argcount = gettuplesize(arg);
2419 object *newarg = newtupleobject(argcount + 1);
2420 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002421 if (newarg == NULL)
2422 return NULL;
2423 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002424 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 for (i = 0; i < argcount; i++) {
2426 object *v = GETTUPLEITEM(arg, i);
2427 XINCREF(v);
2428 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002429 }
2430 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 }
2432 }
2433 else {
2434 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002435 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 return NULL;
2437 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002438 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002440
2441 argdefs = PyFunction_GetDefaults(func);
2442 if (argdefs != NULL && is_tupleobject(argdefs)) {
2443 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2444 nd = gettuplesize(argdefs);
2445 }
2446 else {
2447 d = NULL;
2448 nd = 0;
2449 }
2450
2451 if (kw != NULL) {
2452 int pos, i;
2453 nk = getmappingsize(kw);
2454 k = NEW(object *, 2*nk);
2455 if (k == NULL) {
2456 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002457 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002458 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002459 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002460 pos = i = 0;
2461 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2462 i += 2;
2463 nk = i/2;
2464 /* XXX This is broken if the caller deletes dict items! */
2465 }
2466 else {
2467 k = NULL;
2468 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002469 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470
Guido van Rossum681d79a1995-07-18 14:51:37 +00002471 result = eval_code2(
2472 (codeobject *)getfunccode(func),
2473 getfuncglobals(func), (object *)NULL,
2474 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2475 k, nk,
2476 d, nd,
2477 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478
Guido van Rossum681d79a1995-07-18 14:51:37 +00002479 DECREF(arg);
2480 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481
Guido van Rossum681d79a1995-07-18 14:51:37 +00002482 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483}
2484
2485static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487 object *v, *w;
2488{
2489 typeobject *tp = v->ob_type;
2490 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492 return NULL;
2493 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002494 if (tp->tp_as_mapping != NULL) {
2495 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2496 }
2497 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 int i;
2499 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 err_setstr(TypeError, "sequence subscript not int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501 return NULL;
2502 }
2503 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002504 if (i < 0) {
2505 int len = (*tp->tp_as_sequence->sq_length)(v);
2506 if (len < 0)
2507 return NULL;
2508 i += len;
2509 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512}
2513
2514static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002515loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 object *v, *w;
2517{
2518 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002519 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522 return NULL;
2523 }
2524 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002525 v = (*sq->sq_item)(v, i);
2526 if (v)
2527 return v;
2528 if (err_occurred() == IndexError)
2529 err_clear();
2530 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531}
2532
2533static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002534slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 object *v;
2536 int isize;
2537 int *pi;
2538{
2539 if (v != NULL) {
2540 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002541 err_setstr(TypeError, "slice index must be int");
2542 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543 }
2544 *pi = getintvalue(v);
2545 if (*pi < 0)
2546 *pi += isize;
2547 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002548 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549}
2550
2551static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553 object *u, *v, *w;
2554{
2555 typeobject *tp = u->ob_type;
2556 int ilow, ihigh, isize;
2557 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559 return NULL;
2560 }
2561 ilow = 0;
2562 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002563 if (isize < 0)
2564 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002565 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002567 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002568 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002571
2572static int
2573assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 object *w;
2575 object *key;
2576 object *v;
2577{
2578 typeobject *tp = w->ob_type;
2579 sequence_methods *sq;
2580 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002581 int (*func1)();
2582 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002583 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002584 (func1 = mp->mp_ass_subscript) != NULL) {
2585 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002586 }
2587 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002588 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002590 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002591 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002594 else {
2595 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002596 if (i < 0) {
2597 int len = (*sq->sq_length)(w);
2598 if (len < 0)
2599 return -1;
2600 i += len;
2601 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002602 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002603 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606 err_setstr(TypeError,
2607 "can't assign to this subscripted object");
2608 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610}
2611
Guido van Rossum3f5da241990-12-20 15:06:42 +00002612static int
2613assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 object *u, *v, *w, *x;
2615{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002616 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002618 if (sq == NULL) {
2619 err_setstr(TypeError, "assign to slice of non-sequence");
2620 return -1;
2621 }
2622 if (sq == NULL || sq->sq_ass_slice == NULL) {
2623 err_setstr(TypeError, "unassignable slice");
2624 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 }
2626 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002628 if (isize < 0)
2629 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002630 if (slice_index(v, isize, &ilow) != 0)
2631 return -1;
2632 if (slice_index(w, isize, &ihigh) != 0)
2633 return -1;
2634 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635}
2636
2637static int
2638cmp_exception(err, v)
2639 object *err, *v;
2640{
2641 if (is_tupleobject(v)) {
2642 int i, n;
2643 n = gettuplesize(v);
2644 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002645 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002646 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 return 1;
2648 }
2649 return 0;
2650 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002651 if (is_classobject(v) && is_classobject(err))
2652 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 return err == v;
2654}
2655
Guido van Rossum3f5da241990-12-20 15:06:42 +00002656static int
2657cmp_member(v, w)
2658 object *v, *w;
2659{
Guido van Rossume59214e1994-08-30 08:01:59 +00002660 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002661 object *x;
2662 sequence_methods *sq;
2663 /* Special case for char in string */
2664 if (is_stringobject(w)) {
2665 register char *s, *end;
2666 register char c;
2667 if (!is_stringobject(v) || getstringsize(v) != 1) {
2668 err_setstr(TypeError,
2669 "string member test needs char left operand");
2670 return -1;
2671 }
2672 c = getstringvalue(v)[0];
2673 s = getstringvalue(w);
2674 end = s + getstringsize(w);
2675 while (s < end) {
2676 if (c == *s++)
2677 return 1;
2678 }
2679 return 0;
2680 }
2681 sq = w->ob_type->tp_as_sequence;
2682 if (sq == NULL) {
2683 err_setstr(TypeError,
2684 "'in' or 'not in' needs sequence right argument");
2685 return -1;
2686 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002687 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002688 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002689 if (x == NULL) {
2690 if (err_occurred() == IndexError) {
2691 err_clear();
2692 break;
2693 }
2694 return -1;
2695 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002696 cmp = cmpobject(v, x);
2697 XDECREF(x);
2698 if (cmp == 0)
2699 return 1;
2700 }
2701 return 0;
2702}
2703
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002704static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002705cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002706 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 register object *v;
2708 register object *w;
2709{
2710 register int cmp;
2711 register int res = 0;
2712 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002713 case IS:
2714 case IS_NOT:
2715 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002716 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002717 res = !res;
2718 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 case IN:
2720 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002721 res = cmp_member(v, w);
2722 if (res < 0)
2723 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002724 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002725 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726 break;
2727 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002728 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002729 break;
2730 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002731 cmp = cmpobject(v, w);
2732 switch (op) {
2733 case LT: res = cmp < 0; break;
2734 case LE: res = cmp <= 0; break;
2735 case EQ: res = cmp == 0; break;
2736 case NE: res = cmp != 0; break;
2737 case GT: res = cmp > 0; break;
2738 case GE: res = cmp >= 0; break;
2739 /* XXX no default? (res is initialized to 0 though) */
2740 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 }
2742 v = res ? True : False;
2743 INCREF(v);
2744 return v;
2745}
2746
Guido van Rossum3f5da241990-12-20 15:06:42 +00002747static int
2748import_from(locals, v, name)
2749 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002750 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002751 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002752{
2753 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002754 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002755 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002756 return -1;
2757 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002758 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002759 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002760 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002761 object *name, *value;
2762 pos = 0;
2763 while (mappinggetnext(w, &pos, &name, &value)) {
2764 if (!is_stringobject(name) ||
2765 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002766 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002767 if (is_accessobject(value)) {
2768 value = getaccessvalue(value, (object *)NULL);
2769 if (value == NULL) {
2770 err_clear();
2771 continue;
2772 }
2773 }
2774 else
2775 INCREF(value);
2776 err = dict2insert(locals, name, value);
2777 DECREF(value);
2778 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002779 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002780 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002781 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002782 }
2783 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002784 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002785 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002786 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002787 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002788 getstringvalue(name));
2789 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002790 return -1;
2791 }
2792 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002793 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002794 }
2795}
2796
2797static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002798build_class(methods, bases, name)
2799 object *methods; /* dictionary */
2800 object *bases; /* tuple containing classes */
2801 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002802{
Guido van Rossum25831651993-05-19 14:50:45 +00002803 int i;
2804 if (!is_tupleobject(bases)) {
2805 err_setstr(SystemError, "build_class with non-tuple bases");
2806 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002807 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002808 if (gettuplesize(bases) > 0) {
2809 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002810 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002811 /* Call the base's *type*, if it is callable.
2812 This code is a hook for Donald Beaudry's type extensions.
2813 In unexended Python it will never be triggered since its
2814 types are not callable. */
2815 if (base->ob_type->ob_type->tp_call) {
2816 object *args;
2817 object *class;
2818 args = mkvalue("(OOO)", name, bases, methods);
2819 class = call_object((object *)base->ob_type, args);
2820 DECREF(args);
2821 return class;
2822 }
2823 }
Guido van Rossum25831651993-05-19 14:50:45 +00002824 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002825 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002826 return NULL;
2827 }
Guido van Rossum25831651993-05-19 14:50:45 +00002828 if (!is_stringobject(name)) {
2829 err_setstr(SystemError, "build_class witn non-string name");
2830 return NULL;
2831 }
2832 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002833 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002834 if (!is_classobject(base)) {
2835 err_setstr(TypeError,
2836 "base is not a class object");
2837 return NULL;
2838 }
2839 }
2840 return newclassobject(bases, methods, name);
2841}
2842
2843static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002844access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002845 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002846 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002847 frameobject *f;
2848{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002849 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002850 object *value, *ac;
2851 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002852 int ret;
2853 fast_2_locals(f);
2854 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002855 if (value && is_accessobject(value)) {
2856 err_setstr(AccessError, "can't override access");
2857 return -1;
2858 }
2859 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002860 if (value != NULL && value != None)
2861 type = value->ob_type;
2862 else
2863 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002864 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002865 if (ac == NULL)
2866 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002867 ret = mappinginsert(f->f_locals, name, ac);
2868 DECREF(ac);
2869 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002870 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002871}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002872
2873static int
2874exec_statement(prog, globals, locals)
2875 object *prog;
2876 object *globals;
2877 object *locals;
2878{
2879 char *s;
2880 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002881 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002882 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002883
2884 if (is_tupleobject(prog) && globals == None && locals == None &&
2885 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2886 /* Backward compatibility hack */
2887 globals = gettupleitem(prog, 1);
2888 if (n == 3)
2889 locals = gettupleitem(prog, 2);
2890 prog = gettupleitem(prog, 0);
2891 }
2892 if (globals == None) {
2893 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002894 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002895 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002896 plain = 1;
2897 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002898 }
2899 else if (locals == None)
2900 locals = globals;
2901 if (!is_stringobject(prog) &&
2902 !is_codeobject(prog) &&
2903 !is_fileobject(prog)) {
2904 err_setstr(TypeError,
2905 "exec 1st arg must be string, code or file object");
2906 return -1;
2907 }
2908 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2909 err_setstr(TypeError,
2910 "exec 2nd/3rd args must be dict or None");
2911 return -1;
2912 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002913 if (dictlookup(globals, "__builtins__") == NULL)
2914 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002915 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002916 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002917 return -1;
2918 return 0;
2919 }
2920 if (is_fileobject(prog)) {
2921 FILE *fp = getfilefile(prog);
2922 char *name = getstringvalue(getfilename(prog));
2923 if (run_file(fp, name, file_input, globals, locals) == NULL)
2924 return -1;
2925 return 0;
2926 }
2927 s = getstringvalue(prog);
2928 if (strlen(s) != getstringsize(prog)) {
2929 err_setstr(ValueError, "embedded '\\0' in exec string");
2930 return -1;
2931 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002932 v = run_string(s, file_input, globals, locals);
2933 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002934 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002935 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002936 if (plain)
2937 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002938 return 0;
2939}
Guido van Rossum24c13741995-02-14 09:42:43 +00002940
Guido van Rossum681d79a1995-07-18 14:51:37 +00002941/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002942static object *
2943find_from_args(f, nexti)
2944 frameobject *f;
2945 int nexti;
2946{
2947 int opcode;
2948 int oparg;
2949 object *list, *name;
2950 unsigned char *next_instr;
2951
2952 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2953 opcode = (*next_instr++);
2954 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002955 INCREF(None);
2956 return None;
2957 }
2958
2959 list = newlistobject(0);
2960 if (list == NULL)
2961 return NULL;
2962
2963 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002964 oparg = (next_instr[1]<<8) + next_instr[0];
2965 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002966 name = Getnamev(f, oparg);
2967 if (addlistitem(list, name) < 0) {
2968 DECREF(list);
2969 break;
2970 }
2971 opcode = (*next_instr++);
2972 } while (opcode == IMPORT_FROM);
2973
2974 return list;
2975}