blob: 36e9b8c8eb65c9a8870b0e12f00f0216f898fe40 [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 *));
Guido van Rossum8861b741996-07-30 16:49:37 +000090static object *build_slice PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000091static int assign_subscript PROTO((object *, object *, object *));
92static int assign_slice PROTO((object *, object *, object *, object *));
93static int cmp_exception PROTO((object *, object *));
94static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000095static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000096static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +000097static object *build_class PROTO((object *, object *, object *));
Guido van Rossumb3f72581993-05-21 19:56:10 +000098static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +000099static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000100static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000101
102
Guido van Rossum0a066c01992-03-27 17:29:15 +0000103/* Pointer to current frame, used to link new frames to */
104
Guido van Rossum374a9221991-04-04 10:40:29 +0000105static frameobject *current_frame;
106
Guido van Rossume59214e1994-08-30 08:01:59 +0000107#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000108
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109#include <errno.h>
110#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111
Guido van Rossuma9672091994-09-14 13:31:22 +0000112static type_lock interpreter_lock = 0;
113static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114
115void
116init_save_thread()
117{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000119 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120 interpreter_lock = allocate_lock();
121 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000122 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000124
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125#endif
126
Guido van Rossumff4949e1992-08-05 19:58:53 +0000127/* Functions save_thread and restore_thread are always defined so
128 dynamically loaded modules needn't be compiled separately for use
129 with and without threads: */
130
Guido van Rossum04691fc1992-08-12 15:35:34 +0000131object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132save_thread()
133{
Guido van Rossume59214e1994-08-30 08:01:59 +0000134#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000136 object *res;
137 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138 current_frame = NULL;
139 release_lock(interpreter_lock);
140 return res;
141 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000143 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144}
145
146void
147restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000148 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149{
Guido van Rossume59214e1994-08-30 08:01:59 +0000150#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000151 if (interpreter_lock) {
152 int err;
153 err = errno;
154 acquire_lock(interpreter_lock, 1);
155 errno = err;
156 current_frame = (frameobject *)x;
157 }
158#endif
159}
160
161
Guido van Rossuma9672091994-09-14 13:31:22 +0000162/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
163 signal handlers or Mac I/O completion routines) can schedule calls
164 to a function to be called synchronously.
165 The synchronous function is called with one void* argument.
166 It should return 0 for success or -1 for failure -- failure should
167 be accompanied by an exception.
168
169 If registry succeeds, the registry function returns 0; if it fails
170 (e.g. due to too many pending calls) it returns -1 (without setting
171 an exception condition).
172
173 Note that because registry may occur from within signal handlers,
174 or other asynchronous events, calling malloc() is unsafe!
175
176#ifdef WITH_THREAD
177 Any thread can schedule pending calls, but only the main thread
178 will execute them.
179#endif
180
181 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
182 There are two possible race conditions:
183 (1) nested asynchronous registry calls;
184 (2) registry calls made while pending calls are being processed.
185 While (1) is very unlikely, (2) is a real possibility.
186 The current code is safe against (2), but not against (1).
187 The safety against (2) is derived from the fact that only one
188 thread (the main thread) ever takes things out of the queue.
189*/
190
Guido van Rossum8861b741996-07-30 16:49:37 +0000191static int ticker = 0; /* main loop counter to do periodic things */
192
Guido van Rossuma9672091994-09-14 13:31:22 +0000193#define NPENDINGCALLS 32
194static struct {
195 int (*func) PROTO((ANY *));
196 ANY *arg;
197} pendingcalls[NPENDINGCALLS];
198static volatile int pendingfirst = 0;
199static volatile int pendinglast = 0;
200
201int
202Py_AddPendingCall(func, arg)
203 int (*func) PROTO((ANY *));
204 ANY *arg;
205{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000206 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000207 int i, j;
208 /* XXX Begin critical section */
209 /* XXX If you want this to be safe against nested
210 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000211 if (busy)
212 return -1;
213 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000214 i = pendinglast;
215 j = (i + 1) % NPENDINGCALLS;
216 if (j == pendingfirst)
217 return -1; /* Queue full */
218 pendingcalls[i].func = func;
219 pendingcalls[i].arg = arg;
220 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000221 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000222 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000223 /* XXX End critical section */
224 return 0;
225}
226
Guido van Rossum180d7b41994-09-29 09:45:57 +0000227int
228Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000229{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000230 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000231#ifdef WITH_THREAD
Guido van Rossum8861b741996-07-30 16:49:37 +0000232 if (get_thread_ident() != main_thread) {
233 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000234 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000235 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000236#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000237 if (busy) {
238 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000239 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000240 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000241 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000242 for (;;) {
243 int i;
244 int (*func) PROTO((ANY *));
245 ANY *arg;
246 i = pendingfirst;
247 if (i == pendinglast)
248 break; /* Queue empty */
249 func = pendingcalls[i].func;
250 arg = pendingcalls[i].arg;
251 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000252 if (func(arg) < 0) {
253 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000254 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000255 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000257 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000258 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 return 0;
260}
261
262
Guido van Rossum374a9221991-04-04 10:40:29 +0000263/* Status code for main loop (reason for stack unwind) */
264
265enum why_code {
266 WHY_NOT, /* No error */
267 WHY_EXCEPTION, /* Exception occurred */
268 WHY_RERAISE, /* Exception re-raised by 'finally' */
269 WHY_RETURN, /* 'return' statement */
270 WHY_BREAK /* 'break' statement */
271};
272
273
Guido van Rossum681d79a1995-07-18 14:51:37 +0000274/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000275
276object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000277eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000278 codeobject *co;
279 object *globals;
280 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000281{
282 return eval_code2(co,
283 globals, locals,
284 (object **)NULL, 0,
285 (object **)NULL, 0,
286 (object **)NULL, 0,
287 (object *)NULL);
288}
289
290
291/* Interpreter main loop */
292
Guido van Rossum8861b741996-07-30 16:49:37 +0000293#ifndef MAX_RECURSION_DEPTH
294#define MAX_RECURSION_DEPTH 10000
295#endif
296
297static int recursion_depth = 0;
298
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299static object *
300eval_code2(co, globals, locals,
301 args, argcount, kws, kwcount, defs, defcount, owner)
302 codeobject *co;
303 object *globals;
304 object *locals;
305 object **args;
306 int argcount;
307 object **kws; /* length: 2*kwcount */
308 int kwcount;
309 object **defs;
310 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000311 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000312{
313 register unsigned char *next_instr;
314 register int opcode; /* Current opcode */
315 register int oparg; /* Current opcode argument, if any */
316 register object **stack_pointer;
317 register enum why_code why; /* Reason for block stack unwind */
318 register int err; /* Error status -- nonzero if error */
319 register object *x; /* Result object -- NULL if error */
320 register object *v; /* Temporary objects popped off stack */
321 register object *w;
322 register object *u;
323 register object *t;
324 register frameobject *f; /* Current frame */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000325 register object **fastlocals;
326 object *retval; /* Return value */
Guido van Rossumb3f72581993-05-21 19:56:10 +0000327 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000328#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000329 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000330#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +0000331#if defined(DEBUG) || defined(LLTRACE)
332 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000333 char *filename = getstringvalue(co->co_filename);
334#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000335
336/* Code access macros */
337
338#define GETCONST(i) Getconst(f, i)
339#define GETNAME(i) Getname(f, i)
340#define GETNAMEV(i) Getnamev(f, i)
341#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
342#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
343#define NEXTOP() (*next_instr++)
344#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
345#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
346#define JUMPBY(x) (next_instr += (x))
347
348/* Stack manipulation macros */
349
350#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
351#define EMPTY() (STACK_LEVEL() == 0)
352#define TOP() (stack_pointer[-1])
353#define BASIC_PUSH(v) (*stack_pointer++ = (v))
354#define BASIC_POP() (*--stack_pointer)
355
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000356#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
357 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
358
Guido van Rossum96a42c81992-01-12 02:29:51 +0000359#ifdef LLTRACE
360#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
361#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000362#else
363#define PUSH(v) BASIC_PUSH(v)
364#define POP() BASIC_POP()
365#endif
366
Guido van Rossum681d79a1995-07-18 14:51:37 +0000367/* Local variable macros */
368
369#define GETLOCAL(i) (fastlocals[i])
370#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
371 GETLOCAL(i) = value; } while (0)
372
Guido van Rossum8861b741996-07-30 16:49:37 +0000373#ifdef USE_STACKCHECK
374 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
375 err_setstr(MemoryError, "Stack overflow");
376 return NULL;
377 }
378#endif
379
Guido van Rossum681d79a1995-07-18 14:51:37 +0000380 if (globals == NULL) {
381 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000382 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000383 }
384
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000385#ifdef LLTRACE
386 lltrace = dictlookup(globals, "__lltrace__") != NULL;
387#endif
388
Guido van Rossum374a9221991-04-04 10:40:29 +0000389 f = newframeobject(
390 current_frame, /*back*/
391 co, /*code*/
392 globals, /*globals*/
393 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000394 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000395 50, /*nvalues*/
396 20); /*nblocks*/
397 if (f == NULL)
398 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000399
Guido van Rossum374a9221991-04-04 10:40:29 +0000400 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000401
Guido van Rossum681d79a1995-07-18 14:51:37 +0000402 if (co->co_nlocals > 0)
403 fastlocals = ((listobject *)f->f_fastlocals)->ob_item;
404
405 if (co->co_argcount > 0 ||
406 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
407 int i;
408 int n = argcount;
409 object *kwdict = NULL;
410 if (co->co_flags & CO_VARKEYWORDS) {
411 kwdict = newmappingobject();
412 if (kwdict == NULL)
413 goto fail;
414 }
415 if (argcount > co->co_argcount) {
416 if (!(co->co_flags & CO_VARARGS)) {
417 err_setstr(TypeError, "too many arguments");
418 goto fail;
419 }
420 n = co->co_argcount;
421 }
422 for (i = 0; i < n; i++) {
423 x = args[i];
424 INCREF(x);
425 SETLOCAL(i, x);
426 }
427 if (co->co_flags & CO_VARARGS) {
428 u = newtupleobject(argcount - n);
429 for (i = n; i < argcount; i++) {
430 x = args[i];
431 INCREF(x);
432 SETTUPLEITEM(u, i-n, x);
433 }
434 SETLOCAL(co->co_argcount, u);
435 }
436 for (i = 0; i < kwcount; i++) {
437 object *keyword = kws[2*i];
438 object *value = kws[2*i + 1];
439 int j;
440 /* XXX slow -- speed up using dictionary? */
441 for (j = 0; j < co->co_argcount; j++) {
442 object *nm = GETTUPLEITEM(co->co_varnames, j);
443 if (cmpobject(keyword, nm) == 0)
444 break;
445 }
446 if (j >= co->co_argcount) {
447 if (kwdict == NULL) {
448 err_setval(KeyError/*XXX*/, keyword);
449 goto fail;
450 }
451 mappinginsert(kwdict, keyword, value);
452 }
453 else {
454 if (GETLOCAL(j) != NULL) {
455 err_setstr(TypeError,
456 "keyword parameter redefined");
457 goto fail;
458 }
459 INCREF(value);
460 SETLOCAL(j, value);
461 }
462 }
463 if (argcount < co->co_argcount) {
464 int m = co->co_argcount - defcount;
465 for (i = argcount; i < m; i++) {
466 if (GETLOCAL(i) == NULL) {
467 err_setstr(TypeError,
468 "not enough arguments");
469 goto fail;
470 }
471 }
472 if (n > m)
473 i = n - m;
474 else
475 i = 0;
476 for (; i < defcount; i++) {
477 if (GETLOCAL(m+i) == NULL) {
478 object *def = defs[i];
479 INCREF(def);
480 SETLOCAL(m+i, def);
481 }
482 }
483 }
484 if (kwdict != NULL) {
485 i = co->co_argcount;
486 if (co->co_flags & CO_VARARGS)
487 i++;
488 SETLOCAL(i, kwdict);
489 }
490 if (0) {
491 fail:
492 XDECREF(kwdict);
493 goto fail2;
494 }
495 }
496 else {
497 if (argcount > 0 || kwcount > 0) {
498 err_setstr(TypeError, "no arguments expected");
499 fail2:
500 current_frame = f->f_back;
501 DECREF(f);
502 return NULL;
503 }
504 }
505
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000506 if (sys_trace != NULL) {
507 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000508 be called on *every* entry to a code block.
509 Its return value, if not None, is a function that
510 will be called at the start of each executed line
511 of code. (Actually, the function must return
512 itself in order to continue tracing.)
513 The trace functions are called with three arguments:
514 a pointer to the current frame, a string indicating
515 why the function is called, and an argument which
516 depends on the situation. The global trace function
517 (sys.trace) is also called whenever an exception
518 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 if (call_trace(&sys_trace, &f->f_trace, f, "call",
520 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000521 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000522 current_frame = f->f_back;
523 DECREF(f);
524 return NULL;
525 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000526 }
527
528 if (sys_profile != NULL) {
529 /* Similar for sys_profile, except it needn't return
530 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 if (call_trace(&sys_profile, (object**)0, f, "call",
532 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000533 current_frame = f->f_back;
534 DECREF(f);
535 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536 }
537 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000538
Guido van Rossum8861b741996-07-30 16:49:37 +0000539 if (++recursion_depth > MAX_RECURSION_DEPTH) {
540 --recursion_depth;
541 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
542 current_frame = f->f_back;
543 DECREF(f);
544 return NULL;
545 }
546
Guido van Rossum374a9221991-04-04 10:40:29 +0000547 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 stack_pointer = f->f_valuestack;
549
Guido van Rossum374a9221991-04-04 10:40:29 +0000550 why = WHY_NOT;
551 err = 0;
552 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000553
554 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000555 /* Do periodic things.
556 Doing this every time through the loop would add
557 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000558 So we do it only every Nth instruction.
559
560 The ticker is reset to zero if there are pending
561 calls (see Py_AddPendingCalls() and
562 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000563
Guido van Rossum374a9221991-04-04 10:40:29 +0000564 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000565 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000566 if (pendingfirst != pendinglast) {
567 if (Py_MakePendingCalls() < 0) {
568 why = WHY_EXCEPTION;
569 goto on_error;
570 }
571 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000572 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000573 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000574 goto on_error;
575 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000576
Guido van Rossume59214e1994-08-30 08:01:59 +0000577#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000578 if (interpreter_lock) {
579 /* Give another thread a chance */
580
581 current_frame = NULL;
582 release_lock(interpreter_lock);
583
584 /* Other threads may run now */
585
586 acquire_lock(interpreter_lock, 1);
587 current_frame = f;
588 }
589#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000590 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591
Guido van Rossum374a9221991-04-04 10:40:29 +0000592 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000593
Guido van Rossum8c1e1501996-05-24 20:49:24 +0000594#if defined(DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000595 f->f_lasti = INSTR_OFFSET();
596#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000597
598 opcode = NEXTOP();
599 if (HAS_ARG(opcode))
600 oparg = NEXTARG();
601
Guido van Rossum96a42c81992-01-12 02:29:51 +0000602#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 /* Instruction tracing */
604
Guido van Rossum96a42c81992-01-12 02:29:51 +0000605 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 if (HAS_ARG(opcode)) {
607 printf("%d: %d, %d\n",
608 (int) (INSTR_OFFSET() - 3),
609 opcode, oparg);
610 }
611 else {
612 printf("%d: %d\n",
613 (int) (INSTR_OFFSET() - 1), opcode);
614 }
615 }
616#endif
617
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000618 if (!CHECK_STACK(3)) {
619 x = NULL;
620 break;
621 }
622
Guido van Rossum374a9221991-04-04 10:40:29 +0000623 /* Main switch on opcode */
624
625 switch (opcode) {
626
627 /* BEWARE!
628 It is essential that any operation that fails sets either
629 x to NULL, err to nonzero, or why to anything but WHY_NOT,
630 and that no operation that succeeds does this! */
631
632 /* case STOP_CODE: this is an error! */
633
634 case POP_TOP:
635 v = POP();
636 DECREF(v);
637 break;
638
639 case ROT_TWO:
640 v = POP();
641 w = POP();
642 PUSH(v);
643 PUSH(w);
644 break;
645
646 case ROT_THREE:
647 v = POP();
648 w = POP();
649 x = POP();
650 PUSH(v);
651 PUSH(x);
652 PUSH(w);
653 break;
654
655 case DUP_TOP:
656 v = TOP();
657 INCREF(v);
658 PUSH(v);
659 break;
660
661 case UNARY_POSITIVE:
662 v = POP();
663 x = pos(v);
664 DECREF(v);
665 PUSH(x);
666 break;
667
668 case UNARY_NEGATIVE:
669 v = POP();
670 x = neg(v);
671 DECREF(v);
672 PUSH(x);
673 break;
674
675 case UNARY_NOT:
676 v = POP();
677 x = not(v);
678 DECREF(v);
679 PUSH(x);
680 break;
681
682 case UNARY_CONVERT:
683 v = POP();
684 x = reprobject(v);
685 DECREF(v);
686 PUSH(x);
687 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000688
689 case UNARY_INVERT:
690 v = POP();
691 x = invert(v);
692 DECREF(v);
693 PUSH(x);
694 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000695
Guido van Rossum50564e81996-01-12 01:13:16 +0000696 case BINARY_POWER:
697 w = POP();
698 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000699 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000700 DECREF(v);
701 DECREF(w);
702 PUSH(x);
703 break;
704
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 case BINARY_MULTIPLY:
706 w = POP();
707 v = POP();
708 x = mul(v, w);
709 DECREF(v);
710 DECREF(w);
711 PUSH(x);
712 break;
713
714 case BINARY_DIVIDE:
715 w = POP();
716 v = POP();
717 x = divide(v, w);
718 DECREF(v);
719 DECREF(w);
720 PUSH(x);
721 break;
722
723 case BINARY_MODULO:
724 w = POP();
725 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000726 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 DECREF(v);
728 DECREF(w);
729 PUSH(x);
730 break;
731
732 case BINARY_ADD:
733 w = POP();
734 v = POP();
735 x = add(v, w);
736 DECREF(v);
737 DECREF(w);
738 PUSH(x);
739 break;
740
741 case BINARY_SUBTRACT:
742 w = POP();
743 v = POP();
744 x = sub(v, w);
745 DECREF(v);
746 DECREF(w);
747 PUSH(x);
748 break;
749
750 case BINARY_SUBSCR:
751 w = POP();
752 v = POP();
753 x = apply_subscript(v, w);
754 DECREF(v);
755 DECREF(w);
756 PUSH(x);
757 break;
758
Guido van Rossum7928cd71991-10-24 14:59:31 +0000759 case BINARY_LSHIFT:
760 w = POP();
761 v = POP();
762 x = lshift(v, w);
763 DECREF(v);
764 DECREF(w);
765 PUSH(x);
766 break;
767
768 case BINARY_RSHIFT:
769 w = POP();
770 v = POP();
771 x = rshift(v, w);
772 DECREF(v);
773 DECREF(w);
774 PUSH(x);
775 break;
776
777 case BINARY_AND:
778 w = POP();
779 v = POP();
780 x = and(v, w);
781 DECREF(v);
782 DECREF(w);
783 PUSH(x);
784 break;
785
786 case BINARY_XOR:
787 w = POP();
788 v = POP();
789 x = xor(v, w);
790 DECREF(v);
791 DECREF(w);
792 PUSH(x);
793 break;
794
795 case BINARY_OR:
796 w = POP();
797 v = POP();
798 x = or(v, w);
799 DECREF(v);
800 DECREF(w);
801 PUSH(x);
802 break;
803
Guido van Rossum374a9221991-04-04 10:40:29 +0000804 case SLICE+0:
805 case SLICE+1:
806 case SLICE+2:
807 case SLICE+3:
808 if ((opcode-SLICE) & 2)
809 w = POP();
810 else
811 w = NULL;
812 if ((opcode-SLICE) & 1)
813 v = POP();
814 else
815 v = NULL;
816 u = POP();
817 x = apply_slice(u, v, w);
818 DECREF(u);
819 XDECREF(v);
820 XDECREF(w);
821 PUSH(x);
822 break;
823
824 case STORE_SLICE+0:
825 case STORE_SLICE+1:
826 case STORE_SLICE+2:
827 case STORE_SLICE+3:
828 if ((opcode-STORE_SLICE) & 2)
829 w = POP();
830 else
831 w = NULL;
832 if ((opcode-STORE_SLICE) & 1)
833 v = POP();
834 else
835 v = NULL;
836 u = POP();
837 t = POP();
838 err = assign_slice(u, v, w, t); /* u[v:w] = t */
839 DECREF(t);
840 DECREF(u);
841 XDECREF(v);
842 XDECREF(w);
843 break;
844
845 case DELETE_SLICE+0:
846 case DELETE_SLICE+1:
847 case DELETE_SLICE+2:
848 case DELETE_SLICE+3:
849 if ((opcode-DELETE_SLICE) & 2)
850 w = POP();
851 else
852 w = NULL;
853 if ((opcode-DELETE_SLICE) & 1)
854 v = POP();
855 else
856 v = NULL;
857 u = POP();
858 err = assign_slice(u, v, w, (object *)NULL);
859 /* del u[v:w] */
860 DECREF(u);
861 XDECREF(v);
862 XDECREF(w);
863 break;
864
865 case STORE_SUBSCR:
866 w = POP();
867 v = POP();
868 u = POP();
869 /* v[w] = u */
870 err = assign_subscript(v, w, u);
871 DECREF(u);
872 DECREF(v);
873 DECREF(w);
874 break;
875
876 case DELETE_SUBSCR:
877 w = POP();
878 v = POP();
879 /* del v[w] */
880 err = assign_subscript(v, w, (object *)NULL);
881 DECREF(v);
882 DECREF(w);
883 break;
884
885 case PRINT_EXPR:
886 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000888 /* Before printing, also assign to '_' */
889 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000890 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000891 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000893 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000894 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000895 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 flushline();
897 }
898 DECREF(v);
899 break;
900
901 case PRINT_ITEM:
902 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000903 w = sysget("stdout");
904 if (softspace(w, 1))
905 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000906 err = writeobject(v, w, PRINT_RAW);
907 if (err == 0 && is_stringobject(v)) {
908 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 char *s = getstringvalue(v);
910 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000911 if (len > 0 &&
912 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000913 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000914 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 DECREF(v);
917 break;
918
919 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000920 x = sysget("stdout");
921 if (x == NULL)
922 err_setstr(RuntimeError, "lost sys.stdout");
923 else {
924 writestring("\n", x);
925 softspace(x, 0);
926 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 break;
928
929 case BREAK_LOOP:
930 why = WHY_BREAK;
931 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000932
Guido van Rossumf10570b1995-07-07 22:53:21 +0000933 case RAISE_VARARGS:
934 u = v = w = NULL;
935 switch (oparg) {
936 case 3:
937 u = POP(); /* traceback */
938 if (u == None) {
939 DECREF(u);
940 u = NULL;
941 }
Guido van Rossum9d78d8d1995-09-18 21:29:36 +0000942 else if (!PyTraceBack_Check(u)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000943 err_setstr(TypeError,
944 "raise 3rd arg must be traceback or None");
945 goto raise_error;
946 }
947 /* Fallthrough */
948 case 2:
949 v = POP(); /* value */
950 /* Fallthrough */
951 case 1:
952 w = POP(); /* exc */
953 break;
954 default:
955 err_setstr(SystemError,
956 "bad RAISE_VARARGS oparg");
957 goto raise_error;
958 }
959 if (v == NULL) {
960 v = None;
961 INCREF(v);
962 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000963 /* A tuple is equivalent to its first element here */
Guido van Rossume59214e1994-08-30 08:01:59 +0000964 while (is_tupleobject(w) && gettuplesize(w) > 0) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000965 t = w;
966 w = GETTUPLEITEM(w, 0);
Guido van Rossum1919ca71995-01-20 16:55:14 +0000967 INCREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000968 DECREF(t);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +0000969 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000970 if (is_stringobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000971 ;
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000972 } else if (is_classobject(w)) {
973 if (!is_instanceobject(v)
974 || !issubclass((object*)((instanceobject*)v)->in_class,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000975 w)) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000976 err_setstr(TypeError,
977 "a class exception must have a value that is an instance of the class");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000978 goto raise_error;
979 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000980 } else if (is_instanceobject(w)) {
Guido van Rossumf10570b1995-07-07 22:53:21 +0000981 if (v != None) {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000982 err_setstr(TypeError,
983 "an instance exception may not have a separate value");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000984 goto raise_error;
985 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000986 else {
987 DECREF(v);
988 v = w;
989 w = (object*) ((instanceobject*)w)->in_class;
990 INCREF(w);
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000991 }
Guido van Rossumf10570b1995-07-07 22:53:21 +0000992 }
993 else {
Guido van Rossum8bf7c481995-01-26 00:41:04 +0000994 err_setstr(TypeError,
995 "exceptions must be strings, classes, or instances");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000996 goto raise_error;
997 }
998 err_restore(w, v, u);
999 if (u == NULL)
1000 why = WHY_EXCEPTION;
1001 else
1002 why = WHY_RERAISE;
1003 break;
1004 raise_error:
1005 XDECREF(v);
1006 XDECREF(w);
1007 XDECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 why = WHY_EXCEPTION;
1009 break;
1010
1011 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001012 if ((x = f->f_locals) == NULL) {
1013 err_setstr(SystemError, "no locals");
1014 break;
1015 }
1016 INCREF(x);
1017 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 break;
1019
1020 case RETURN_VALUE:
1021 retval = POP();
1022 why = WHY_RETURN;
1023 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001024
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001025 case EXEC_STMT:
1026 w = POP();
1027 v = POP();
1028 u = POP();
1029 err = exec_statement(u, v, w);
1030 DECREF(u);
1031 DECREF(v);
1032 DECREF(w);
1033 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001034
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 case POP_BLOCK:
1036 {
1037 block *b = pop_block(f);
1038 while (STACK_LEVEL() > b->b_level) {
1039 v = POP();
1040 DECREF(v);
1041 }
1042 }
1043 break;
1044
1045 case END_FINALLY:
1046 v = POP();
1047 if (is_intobject(v)) {
1048 why = (enum why_code) getintvalue(v);
1049 if (why == WHY_RETURN)
1050 retval = POP();
1051 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001052 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001054 u = POP();
1055 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001057 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001058 }
1059 else if (v != None) {
1060 err_setstr(SystemError,
1061 "'finally' pops bad exception");
1062 why = WHY_EXCEPTION;
1063 }
1064 DECREF(v);
1065 break;
1066
1067 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001068 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001069 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001070 w = POP();
1071 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001073 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001074 DECREF(v);
1075 DECREF(w);
1076 break;
1077
1078 case STORE_NAME:
1079 w = GETNAMEV(oparg);
1080 v = POP();
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 Rossumb3f72581993-05-21 19:56:10 +00001086 if (u == NULL) {
1087 if (defmode != 0) {
1088 if (v != None)
1089 u = (object *)v->ob_type;
1090 else
1091 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001092 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001093 (typeobject *)u,
1094 defmode);
1095 DECREF(v);
1096 if (x == NULL)
1097 break;
1098 v = x;
1099 }
1100 }
1101 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001102 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001103 DECREF(v);
1104 break;
1105 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001106 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 DECREF(v);
1108 break;
1109
1110 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001111 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001112 if ((x = f->f_locals) == NULL) {
1113 err_setstr(SystemError, "no locals");
1114 break;
1115 }
1116 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001117 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001118 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001119 (object *)NULL);
1120 break;
1121 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001122 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001123 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001125
1126#ifdef CASE_TOO_BIG
1127 default: switch (opcode) {
1128#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001129
1130 case UNPACK_TUPLE:
1131 v = POP();
1132 if (!is_tupleobject(v)) {
1133 err_setstr(TypeError, "unpack non-tuple");
1134 why = WHY_EXCEPTION;
1135 }
1136 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001137 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 "unpack tuple of wrong size");
1139 why = WHY_EXCEPTION;
1140 }
1141 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001142 if (!CHECK_STACK(oparg)) {
1143 x = NULL;
1144 break;
1145 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001147 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 INCREF(w);
1149 PUSH(w);
1150 }
1151 }
1152 DECREF(v);
1153 break;
1154
1155 case UNPACK_LIST:
1156 v = POP();
1157 if (!is_listobject(v)) {
1158 err_setstr(TypeError, "unpack non-list");
1159 why = WHY_EXCEPTION;
1160 }
1161 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001162 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 "unpack list of wrong size");
1164 why = WHY_EXCEPTION;
1165 }
1166 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001167 if (!CHECK_STACK(oparg)) {
1168 x = NULL;
1169 break;
1170 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 for (; --oparg >= 0; ) {
1172 w = getlistitem(v, oparg);
1173 INCREF(w);
1174 PUSH(w);
1175 }
1176 }
1177 DECREF(v);
1178 break;
1179
1180 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001181 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 v = POP();
1183 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001184 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 DECREF(v);
1186 DECREF(u);
1187 break;
1188
1189 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001190 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001192 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 DECREF(v);
1194 break;
1195
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001196 case STORE_GLOBAL:
1197 w = GETNAMEV(oparg);
1198 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001199 if (f->f_locals != NULL) {
1200 u = dict2lookup(f->f_locals, w);
1201 if (u != NULL && is_accessobject(u)) {
1202 err = setaccessvalue(u, f->f_globals,
1203 v);
1204 DECREF(v);
1205 break;
1206 }
Guido van Rossum25831651993-05-19 14:50:45 +00001207 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001208 err = dict2insert(f->f_globals, w, v);
1209 DECREF(v);
1210 break;
1211
1212 case DELETE_GLOBAL:
1213 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001214 if (f->f_locals != NULL) {
1215 u = dict2lookup(f->f_locals, w);
1216 if (u != NULL && is_accessobject(u)) {
1217 err = setaccessvalue(u, f->f_globals,
1218 (object *)NULL);
1219 break;
1220 }
Guido van Rossum25831651993-05-19 14:50:45 +00001221 }
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001222 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001223 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001224 break;
1225
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 case LOAD_CONST:
1227 x = GETCONST(oparg);
1228 INCREF(x);
1229 PUSH(x);
1230 break;
1231
1232 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001233 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001234 if ((x = f->f_locals) == NULL) {
1235 err_setstr(SystemError, "no locals");
1236 break;
1237 }
1238 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001240 err_clear();
1241 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001243 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001244 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001246 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 break;
1248 }
1249 }
1250 }
Guido van Rossum25831651993-05-19 14:50:45 +00001251 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001252 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001253 if (x == NULL)
1254 break;
1255 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001256 else
1257 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 PUSH(x);
1259 break;
1260
1261 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001262 w = GETNAMEV(oparg);
1263 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001265 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001266 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001268 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 break;
1270 }
1271 }
Guido van Rossum25831651993-05-19 14:50:45 +00001272 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001273 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001274 if (x == NULL)
1275 break;
1276 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001277 else
1278 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 PUSH(x);
1280 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001281
1282#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001284 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001285 if ((x = f->f_locals) == NULL) {
1286 err_setstr(SystemError, "no locals");
1287 break;
1288 }
1289 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001291 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 break;
1293 }
Guido van Rossum25831651993-05-19 14:50:45 +00001294 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001295 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001296 if (x == NULL)
1297 break;
1298 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001299 else
1300 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 PUSH(x);
1302 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001304
1305 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001307 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001308 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001309 gettupleitem(co->co_varnames,
1310 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001311 break;
1312 }
Guido van Rossum25831651993-05-19 14:50:45 +00001313 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001314 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001315 if (x == NULL)
1316 break;
1317 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001318 else
1319 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001320 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001321 break;
1322
1323 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001324 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001325 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001326 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001327 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001328 DECREF(v);
1329 break;
1330 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001331 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001332 break;
1333
1334 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001335 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001336 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001337 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001338 gettupleitem(co->co_varnames,
1339 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001340 break;
1341 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001342 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001343 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001344 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001345 break;
1346 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001347 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001348 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349
1350 case BUILD_TUPLE:
1351 x = newtupleobject(oparg);
1352 if (x != NULL) {
1353 for (; --oparg >= 0;) {
1354 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001355 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 }
1357 PUSH(x);
1358 }
1359 break;
1360
1361 case BUILD_LIST:
1362 x = newlistobject(oparg);
1363 if (x != NULL) {
1364 for (; --oparg >= 0;) {
1365 w = POP();
1366 err = setlistitem(x, oparg, w);
1367 if (err != 0)
1368 break;
1369 }
1370 PUSH(x);
1371 }
1372 break;
1373
1374 case BUILD_MAP:
1375 x = newdictobject();
1376 PUSH(x);
1377 break;
1378
1379 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001380 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001382 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 DECREF(v);
1384 PUSH(x);
1385 break;
1386
1387 case COMPARE_OP:
1388 w = POP();
1389 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001390 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 DECREF(v);
1392 DECREF(w);
1393 PUSH(x);
1394 break;
1395
1396 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001397 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001398 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001399 if (x == NULL) {
1400 err_setstr(ImportError,
1401 "__import__ not found");
1402 break;
1403 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001404 if (is_methodobject(x)) {
1405 u = None;
1406 INCREF(u);
1407 }
1408 else {
1409 u = find_from_args(f, INSTR_OFFSET());
1410 if (u == NULL) {
1411 x = u;
1412 break;
1413 }
1414 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001415 w = mkvalue("(OOOO)",
1416 w,
1417 f->f_globals,
1418 f->f_locals == NULL ? None : f->f_locals,
1419 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001420 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421 if (w == NULL) {
1422 x = NULL;
1423 break;
1424 }
1425 x = call_object(x, w);
1426 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001428 break;
1429
1430 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001431 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001432 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001433 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 if ((x = f->f_locals) == NULL) {
1435 err_setstr(SystemError, "no locals");
1436 break;
1437 }
1438 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001439 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001441
1442 case ACCESS_MODE:
1443 v = POP();
1444 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001445 if (getstringvalue(w)[0] == '*')
1446 defmode = getintvalue(v);
1447 else
1448 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001449 DECREF(v);
1450 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001451
1452 case JUMP_FORWARD:
1453 JUMPBY(oparg);
1454 break;
1455
1456 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001457 err = testbool(TOP());
1458 if (err > 0)
1459 err = 0;
1460 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 JUMPBY(oparg);
1462 break;
1463
1464 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001465 err = testbool(TOP());
1466 if (err > 0) {
1467 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001469 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001470 break;
1471
1472 case JUMP_ABSOLUTE:
1473 JUMPTO(oparg);
1474 break;
1475
1476 case FOR_LOOP:
1477 /* for v in s: ...
1478 On entry: stack contains s, i.
1479 On exit: stack contains s, i+1, s[i];
1480 but if loop exhausted:
1481 s, i are popped, and we jump */
1482 w = POP(); /* Loop index */
1483 v = POP(); /* Sequence object */
1484 u = loop_subscript(v, w);
1485 if (u != NULL) {
1486 PUSH(v);
1487 x = newintobject(getintvalue(w)+1);
1488 PUSH(x);
1489 DECREF(w);
1490 PUSH(u);
1491 }
1492 else {
1493 DECREF(v);
1494 DECREF(w);
1495 /* A NULL can mean "s exhausted"
1496 but also an error: */
1497 if (err_occurred())
1498 why = WHY_EXCEPTION;
1499 else
1500 JUMPBY(oparg);
1501 }
1502 break;
1503
1504 case SETUP_LOOP:
1505 case SETUP_EXCEPT:
1506 case SETUP_FINALLY:
1507 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1508 STACK_LEVEL());
1509 break;
1510
1511 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001512#ifdef LLTRACE
1513 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001514 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001515#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001516 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001517 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001518 /* Trace each line of code reached */
1519 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001520 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001521 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001522 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001524
1525 case CALL_FUNCTION:
1526 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001527 int na = oparg & 0xff;
1528 int nk = (oparg>>8) & 0xff;
1529 int n = na + 2*nk;
1530 object **pfunc = stack_pointer - n - 1;
1531 object *func = *pfunc;
1532 object *self = NULL;
1533 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001534 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001535 if (is_instancemethodobject(func)) {
1536 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001537 class = instancemethodgetclass(func);
1538 func = instancemethodgetfunc(func);
1539 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001540 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 INCREF(self);
1542 DECREF(*pfunc);
1543 *pfunc = self;
1544 na++;
1545 n++;
1546 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001547 else {
1548 /* Unbound methods must be
1549 called with an instance of
1550 the class (or a derived
1551 class) as first argument */
1552 if (na > 0 &&
1553 (self = stack_pointer[-n])
1554 != NULL &&
1555 is_instanceobject(self) &&
1556 issubclass(
1557 (object *)
1558 (((instanceobject *)self)
1559 ->in_class),
1560 class))
1561 /* Handy-dandy */ ;
1562 else {
1563 err_setstr(TypeError,
1564 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001565 x = NULL;
1566 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001567 }
1568 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001569 }
1570 else
1571 INCREF(func);
1572 if (is_funcobject(func)) {
1573 object *co = getfunccode(func);
1574 object *globals = getfuncglobals(func);
1575 object *argdefs = PyFunction_GetDefaults(func);
1576 object **d;
1577 int nd;
1578 if (argdefs != NULL) {
1579 d = &GETTUPLEITEM(argdefs, 0);
1580 nd = ((tupleobject *)argdefs)->ob_size;
1581 }
1582 else {
1583 d = NULL;
1584 nd = 0;
1585 }
1586 x = eval_code2(
1587 (codeobject *)co,
1588 globals, (object *)NULL,
1589 stack_pointer-n, na,
1590 stack_pointer-2*nk, nk,
1591 d, nd,
1592 class);
1593 }
1594 else {
1595 object *args = newtupleobject(na);
1596 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001597 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001598 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001599 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001601 if (nk > 0) {
1602 kwdict = newdictobject();
1603 if (kwdict == NULL) {
1604 x = NULL;
1605 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001607 err = 0;
1608 while (--nk >= 0) {
1609 object *value = POP();
1610 object *key = POP();
1611 err = mappinginsert(
1612 kwdict, key, value);
1613 if (err) {
1614 DECREF(key);
1615 DECREF(value);
1616 break;
1617 }
1618 }
1619 if (err) {
1620 DECREF(args);
1621 DECREF(kwdict);
1622 break;
1623 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001624 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001625 while (--na >= 0) {
1626 w = POP();
1627 SETTUPLEITEM(args, na, w);
1628 }
1629 x = PyEval_CallObjectWithKeywords(
1630 func, args, kwdict);
1631 DECREF(args);
1632 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001633 }
1634 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001635 while (stack_pointer > pfunc) {
1636 w = POP();
1637 DECREF(w);
1638 }
1639 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001640 break;
1641 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001642
Guido van Rossum681d79a1995-07-18 14:51:37 +00001643 case MAKE_FUNCTION:
1644 v = POP(); /* code object */
1645 x = newfuncobject(v, f->f_globals);
1646 DECREF(v);
1647 /* XXX Maybe this should be a separate opcode? */
1648 if (x != NULL && oparg > 0) {
1649 v = newtupleobject(oparg);
1650 if (v == NULL) {
1651 DECREF(x);
1652 x = NULL;
1653 break;
1654 }
1655 while (--oparg >= 0) {
1656 w = POP();
1657 SETTUPLEITEM(v, oparg, w);
1658 }
1659 err = PyFunction_SetDefaults(x, v);
1660 DECREF(v);
1661 }
1662 PUSH(x);
1663 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001664
1665 case BUILD_SLICE:
1666 if (oparg == 3)
1667 w = POP();
1668 else
1669 w = NULL;
1670 v = POP();
1671 u = POP();
1672 x = build_slice(u,v,w);
1673 DECREF(u);
1674 DECREF(v);
1675 XDECREF(w);
1676 PUSH(x);
1677 break;
1678
1679
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 default:
1681 fprintf(stderr,
1682 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001683 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001684 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 why = WHY_EXCEPTION;
1686 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001687
1688#ifdef CASE_TOO_BIG
1689 }
1690#endif
1691
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 } /* switch */
1693
1694 on_error:
1695
1696 /* Quickly continue if no error occurred */
1697
1698 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001699 if (err == 0 && x != NULL) {
1700#ifdef CHECKEXC
1701 if (err_occurred())
1702 fprintf(stderr,
1703 "XXX undetected error\n");
1704 else
1705#endif
1706 continue; /* Normal, fast path */
1707 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 why = WHY_EXCEPTION;
1709 x = None;
1710 err = 0;
1711 }
1712
Guido van Rossum801dcae1992-04-08 11:32:32 +00001713#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 /* Double-check exception status */
1715
1716 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1717 if (!err_occurred()) {
1718 fprintf(stderr, "XXX ghost error\n");
1719 err_setstr(SystemError, "ghost error");
1720 why = WHY_EXCEPTION;
1721 }
1722 }
1723 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001724 if (err_occurred()) {
1725 fprintf(stderr,
1726 "XXX undetected error (why=%d)\n",
1727 why);
1728 why = WHY_EXCEPTION;
1729 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 }
1731#endif
1732
1733 /* Log traceback info if this is a real exception */
1734
1735 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001736 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001738 f->f_lasti -= 2;
1739 tb_here(f);
1740
Guido van Rossume59214e1994-08-30 08:01:59 +00001741 if (f->f_trace)
1742 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001743 if (sys_profile)
1744 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 }
1746
1747 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1748
1749 if (why == WHY_RERAISE)
1750 why = WHY_EXCEPTION;
1751
1752 /* Unwind stacks if a (pseudo) exception occurred */
1753
1754 while (why != WHY_NOT && f->f_iblock > 0) {
1755 block *b = pop_block(f);
1756 while (STACK_LEVEL() > b->b_level) {
1757 v = POP();
1758 XDECREF(v);
1759 }
1760 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1761 why = WHY_NOT;
1762 JUMPTO(b->b_handler);
1763 break;
1764 }
1765 if (b->b_type == SETUP_FINALLY ||
1766 b->b_type == SETUP_EXCEPT &&
1767 why == WHY_EXCEPTION) {
1768 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001769 object *exc, *val, *tb;
1770 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 if (val == NULL) {
1772 val = None;
1773 INCREF(val);
1774 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001775 /* Make the raw exception data
1776 available to the handler,
1777 so a program can emulate the
1778 Python main loop. Don't do
1779 this for 'finally'. */
1780 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001781 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 sysset("exc_value", val);
1783 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001785 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 PUSH(val);
1787 PUSH(exc);
1788 }
1789 else {
1790 if (why == WHY_RETURN)
1791 PUSH(retval);
1792 v = newintobject((long)why);
1793 PUSH(v);
1794 }
1795 why = WHY_NOT;
1796 JUMPTO(b->b_handler);
1797 break;
1798 }
1799 } /* unwind stack */
1800
1801 /* End the loop if we still have an error (or return) */
1802
1803 if (why != WHY_NOT)
1804 break;
1805
1806 } /* main loop */
1807
1808 /* Pop remaining stack entries */
1809
1810 while (!EMPTY()) {
1811 v = POP();
1812 XDECREF(v);
1813 }
1814
Guido van Rossum96a42c81992-01-12 02:29:51 +00001815 if (why != WHY_RETURN)
1816 retval = NULL;
1817
Guido van Rossume59214e1994-08-30 08:01:59 +00001818 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001819 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001820 if (call_trace(&f->f_trace, &f->f_trace, f,
1821 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001822 XDECREF(retval);
1823 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001824 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001825 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001826 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001827 }
1828
1829 if (sys_profile && why == WHY_RETURN) {
1830 if (call_trace(&sys_profile, (object**)0,
1831 f, "return", retval)) {
1832 XDECREF(retval);
1833 retval = NULL;
1834 why = WHY_EXCEPTION;
1835 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001836 }
1837
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001839
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 current_frame = f->f_back;
1841 DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +00001842 --recursion_depth;
Guido van Rossum374a9221991-04-04 10:40:29 +00001843
Guido van Rossum96a42c81992-01-12 02:29:51 +00001844 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001845}
1846
Guido van Rossum96a42c81992-01-12 02:29:51 +00001847#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001848static int
1849prtrace(v, str)
1850 object *v;
1851 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001853 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001854 if (printobject(v, stdout, 0) != 0)
1855 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001857}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001858#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001860static void
1861call_exc_trace(p_trace, p_newtrace, f)
1862 object **p_trace, **p_newtrace;
1863 frameobject *f;
1864{
1865 object *type, *value, *traceback, *arg;
1866 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001867 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001868 if (value == NULL) {
1869 value = None;
1870 INCREF(value);
1871 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872 arg = mkvalue("(OOO)", type, value, traceback);
1873 if (arg == NULL) {
1874 err_restore(type, value, traceback);
1875 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001876 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1878 DECREF(arg);
1879 if (err == 0)
1880 err_restore(type, value, traceback);
1881 else {
1882 XDECREF(type);
1883 XDECREF(value);
1884 XDECREF(traceback);
1885 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001886}
1887
1888static int
1889call_trace(p_trace, p_newtrace, f, msg, arg)
1890 object **p_trace; /* in/out; may not be NULL;
1891 may not point to NULL variable initially */
1892 object **p_newtrace; /* in/out; may be NULL;
1893 may point to NULL variable;
1894 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001895 frameobject *f;
1896 char *msg;
1897 object *arg;
1898{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001899 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001900 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001901 static int tracing = 0;
1902
1903 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001904 /* Don't do recursive traces */
1905 if (p_newtrace) {
1906 XDECREF(*p_newtrace);
1907 *p_newtrace = NULL;
1908 }
1909 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910 }
1911
Guido van Rossumf10570b1995-07-07 22:53:21 +00001912 args = newtupleobject(3);
1913 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001914 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001915 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001916 if (what == NULL)
1917 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001918 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001919 SETTUPLEITEM(args, 0, (object *)f);
1920 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001921 if (arg == NULL)
1922 arg = None;
1923 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001924 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001925 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001926 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001927 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001928 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001929 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001930 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001931 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001932 if (res == NULL) {
1933 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001934 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001935 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001936 *p_trace = NULL;
1937 if (p_newtrace) {
1938 XDECREF(*p_newtrace);
1939 *p_newtrace = NULL;
1940 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001941 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001942 }
1943 else {
1944 if (p_newtrace) {
1945 XDECREF(*p_newtrace);
1946 if (res == None)
1947 *p_newtrace = NULL;
1948 else {
1949 INCREF(res);
1950 *p_newtrace = res;
1951 }
1952 }
1953 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001954 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001955 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001956}
1957
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001959getbuiltins()
1960{
1961 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001962 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001963 else
1964 return current_frame->f_builtins;
1965}
1966
1967object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001968getlocals()
1969{
1970 if (current_frame == NULL)
1971 return NULL;
1972 fast_2_locals(current_frame);
1973 return current_frame->f_locals;
1974}
1975
1976object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977getglobals()
1978{
1979 if (current_frame == NULL)
1980 return NULL;
1981 else
1982 return current_frame->f_globals;
1983}
1984
Guido van Rossum81daa321993-05-20 14:24:46 +00001985object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001986getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00001987{
1988 if (current_frame == NULL)
1989 return NULL;
1990 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001991 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00001992}
1993
Guido van Rossume59214e1994-08-30 08:01:59 +00001994object *
1995getframe()
1996{
1997 return (object *)current_frame;
1998}
1999
Guido van Rossum6135a871995-01-09 17:53:26 +00002000int
2001getrestricted()
2002{
2003 return current_frame == NULL ? 0 : current_frame->f_restricted;
2004}
2005
Guido van Rossum3f5da241990-12-20 15:06:42 +00002006void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007flushline()
2008{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002009 object *f = sysget("stdout");
2010 if (softspace(f, 0))
2011 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012}
2013
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014
Guido van Rossum06186511995-01-07 12:40:10 +00002015#define BINOP(opname, ropname, thisfunc) \
2016 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2017 ; \
2018 else \
2019 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002020
2021
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002023or(v, w)
2024 object *v, *w;
2025{
Guido van Rossum06186511995-01-07 12:40:10 +00002026 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002027 if (v->ob_type->tp_as_number != NULL) {
2028 object *x;
2029 object * (*f) FPROTO((object *, object *));
2030 if (coerce(&v, &w) != 0)
2031 return NULL;
2032 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2033 x = (*f)(v, w);
2034 DECREF(v);
2035 DECREF(w);
2036 if (f != NULL)
2037 return x;
2038 }
2039 err_setstr(TypeError, "bad operand type(s) for |");
2040 return NULL;
2041}
2042
2043static object *
2044xor(v, w)
2045 object *v, *w;
2046{
Guido van Rossum06186511995-01-07 12:40:10 +00002047 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002048 if (v->ob_type->tp_as_number != NULL) {
2049 object *x;
2050 object * (*f) FPROTO((object *, object *));
2051 if (coerce(&v, &w) != 0)
2052 return NULL;
2053 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2054 x = (*f)(v, w);
2055 DECREF(v);
2056 DECREF(w);
2057 if (f != NULL)
2058 return x;
2059 }
2060 err_setstr(TypeError, "bad operand type(s) for ^");
2061 return NULL;
2062}
2063
2064static object *
2065and(v, w)
2066 object *v, *w;
2067{
Guido van Rossum06186511995-01-07 12:40:10 +00002068 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002069 if (v->ob_type->tp_as_number != NULL) {
2070 object *x;
2071 object * (*f) FPROTO((object *, object *));
2072 if (coerce(&v, &w) != 0)
2073 return NULL;
2074 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2075 x = (*f)(v, w);
2076 DECREF(v);
2077 DECREF(w);
2078 if (f != NULL)
2079 return x;
2080 }
2081 err_setstr(TypeError, "bad operand type(s) for &");
2082 return NULL;
2083}
2084
2085static object *
2086lshift(v, w)
2087 object *v, *w;
2088{
Guido van Rossum06186511995-01-07 12:40:10 +00002089 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002090 if (v->ob_type->tp_as_number != NULL) {
2091 object *x;
2092 object * (*f) FPROTO((object *, object *));
2093 if (coerce(&v, &w) != 0)
2094 return NULL;
2095 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2096 x = (*f)(v, w);
2097 DECREF(v);
2098 DECREF(w);
2099 if (f != NULL)
2100 return x;
2101 }
2102 err_setstr(TypeError, "bad operand type(s) for <<");
2103 return NULL;
2104}
2105
2106static object *
2107rshift(v, w)
2108 object *v, *w;
2109{
Guido van Rossum06186511995-01-07 12:40:10 +00002110 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002111 if (v->ob_type->tp_as_number != NULL) {
2112 object *x;
2113 object * (*f) FPROTO((object *, object *));
2114 if (coerce(&v, &w) != 0)
2115 return NULL;
2116 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2117 x = (*f)(v, w);
2118 DECREF(v);
2119 DECREF(w);
2120 if (f != NULL)
2121 return x;
2122 }
2123 err_setstr(TypeError, "bad operand type(s) for >>");
2124 return NULL;
2125}
2126
2127static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 object *v, *w;
2130{
Guido van Rossum06186511995-01-07 12:40:10 +00002131 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002132 if (v->ob_type->tp_as_sequence != NULL)
2133 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2134 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002135 object *x;
2136 if (coerce(&v, &w) != 0)
2137 return NULL;
2138 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2139 DECREF(v);
2140 DECREF(w);
2141 return x;
2142 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002143 err_setstr(TypeError, "bad operand type(s) for +");
2144 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145}
2146
2147static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 object *v, *w;
2150{
Guido van Rossum06186511995-01-07 12:40:10 +00002151 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002152 if (v->ob_type->tp_as_number != NULL) {
2153 object *x;
2154 if (coerce(&v, &w) != 0)
2155 return NULL;
2156 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2157 DECREF(v);
2158 DECREF(w);
2159 return x;
2160 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 return NULL;
2163}
2164
2165static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002166mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 object *v, *w;
2168{
2169 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002170 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002171 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002172 if (tp->tp_as_number != NULL &&
2173 w->ob_type->tp_as_sequence != NULL &&
2174 !is_instanceobject(v)) {
2175 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 object *tmp = v;
2177 v = w;
2178 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002179 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002181 if (tp->tp_as_number != NULL) {
2182 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002183 if (is_instanceobject(v)) {
2184 /* Instances of user-defined classes get their
2185 other argument uncoerced, so they may
2186 implement sequence*number as well as
2187 number*number. */
2188 INCREF(v);
2189 INCREF(w);
2190 }
2191 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002192 return NULL;
2193 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2194 DECREF(v);
2195 DECREF(w);
2196 return x;
2197 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 if (tp->tp_as_sequence != NULL) {
2199 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 err_setstr(TypeError,
2201 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 return NULL;
2203 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002204 return (*tp->tp_as_sequence->sq_repeat)
2205 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002207 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208 return NULL;
2209}
2210
2211static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002212divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 object *v, *w;
2214{
Guido van Rossum06186511995-01-07 12:40:10 +00002215 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002216 if (v->ob_type->tp_as_number != NULL) {
2217 object *x;
2218 if (coerce(&v, &w) != 0)
2219 return NULL;
2220 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2221 DECREF(v);
2222 DECREF(w);
2223 return x;
2224 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002225 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 return NULL;
2227}
2228
2229static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002230mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 object *v, *w;
2232{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002233 if (is_stringobject(v)) {
2234 return formatstring(v, w);
2235 }
Guido van Rossum06186511995-01-07 12:40:10 +00002236 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002237 if (v->ob_type->tp_as_number != NULL) {
2238 object *x;
2239 if (coerce(&v, &w) != 0)
2240 return NULL;
2241 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2242 DECREF(v);
2243 DECREF(w);
2244 return x;
2245 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 return NULL;
2248}
2249
2250static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002251powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002252 object *v, *w;
2253{
2254 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002255 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002256 if (v->ob_type->tp_as_number == NULL ||
2257 w->ob_type->tp_as_number == NULL) {
2258 err_setstr(TypeError, "pow() requires numeric arguments");
2259 return NULL;
2260 }
2261 if (
2262#ifndef WITHOUT_COMPLEX
2263 !is_complexobject(v) &&
2264#endif
2265 is_floatobject(w) && getfloatvalue(v) < 0.0) {
2266 if (!err_occurred())
2267 err_setstr(ValueError, "negative number to float power");
2268 return NULL;
2269 }
2270 if (coerce(&v, &w) != 0)
2271 return NULL;
2272 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2273 DECREF(v);
2274 DECREF(w);
2275 return res;
2276}
2277
2278static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002279neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 object *v;
2281{
2282 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002283 return (*v->ob_type->tp_as_number->nb_negative)(v);
2284 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 return NULL;
2286}
2287
2288static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002289pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290 object *v;
2291{
2292 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293 return (*v->ob_type->tp_as_number->nb_positive)(v);
2294 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 return NULL;
2296}
2297
2298static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002299invert(v)
2300 object *v;
2301{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002302 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002303 if (v->ob_type->tp_as_number != NULL &&
2304 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2305 return (*f)(v);
2306 err_setstr(TypeError, "bad operand type(s) for unary ~");
2307 return NULL;
2308}
2309
2310static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002311not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 object *v;
2313{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002314 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002315 object *w;
2316 if (outcome < 0)
2317 return NULL;
2318 if (outcome == 0)
2319 w = True;
2320 else
2321 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002322 INCREF(w);
2323 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324}
Guido van Rossum234f9421993-06-17 12:35:49 +00002325
2326
Guido van Rossum681d79a1995-07-18 14:51:37 +00002327/* External interface to call any callable object.
2328 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002329
2330object *
2331call_object(func, arg)
2332 object *func;
2333 object *arg;
2334{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002335 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2336}
Guido van Rossume59214e1994-08-30 08:01:59 +00002337
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338object *
2339PyEval_CallObjectWithKeywords(func, arg, kw)
2340 object *func;
2341 object *arg;
2342 object *kw;
2343{
2344 ternaryfunc call;
2345 object *result;
2346
2347 if (arg == NULL)
2348 arg = newtupleobject(0);
2349 else if (!is_tupleobject(arg)) {
2350 err_setstr(TypeError, "argument list must be a tuple");
2351 return NULL;
2352 }
2353 else
2354 INCREF(arg);
2355
Guido van Rossume3e61c11995-08-04 04:14:47 +00002356 if (kw != NULL && !is_dictobject(kw)) {
2357 err_setstr(TypeError, "keyword list must be a dictionary");
2358 return NULL;
2359 }
2360
Guido van Rossum681d79a1995-07-18 14:51:37 +00002361 if (call = func->ob_type->tp_call)
2362 result = (*call)(func, arg, kw);
2363 else if (is_instancemethodobject(func) || is_funcobject(func))
2364 result = call_function(func, arg, kw);
2365 else
2366 result = call_builtin(func, arg, kw);
2367
2368 DECREF(arg);
2369
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002370 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002371 err_setstr(SystemError,
2372 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002373
2374 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002375}
2376
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002377static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002378call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002381 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 if (is_methodobject(func)) {
2384 method meth = getmethod(func);
2385 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002386 int flags = getflags(func);
2387 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002388 int size = gettuplesize(arg);
2389 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002390 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002391 else if (size == 0)
2392 arg = NULL;
2393 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002394 if (flags & METH_KEYWORDS)
2395 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002396 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002397 err_setstr(TypeError,
2398 "this function takes no keyword arguments");
2399 return NULL;
2400 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002401 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 }
2403 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002404 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002406 if (is_instanceobject(func)) {
2407 object *res, *call = getattr(func,"__call__");
2408 if (call == NULL) {
2409 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 err_setstr(AttributeError,
2411 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002412 return NULL;
2413 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002414 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002415 DECREF(call);
2416 return res;
2417 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002418 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 return NULL;
2420}
2421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002429 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430 object **d, **k;
2431 int nk, nd;
2432 object *result;
2433
2434 if (kw != NULL && !is_dictobject(kw)) {
2435 err_badcall();
2436 return NULL;
2437 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438
Guido van Rossume8122f11991-05-05 20:03:07 +00002439 if (is_instancemethodobject(func)) {
2440 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002441 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002442 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002443 if (self == NULL) {
2444 /* Unbound methods must be called with an instance of
2445 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002447 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002448 if (self != NULL &&
2449 is_instanceobject(self) &&
2450 issubclass((object *)
2451 (((instanceobject *)self)->in_class),
2452 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002453 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002454 else
2455 self = NULL;
2456 }
2457 if (self == NULL) {
2458 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002459 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002460 return NULL;
2461 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002462 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002463 }
2464 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002465 int argcount = gettuplesize(arg);
2466 object *newarg = newtupleobject(argcount + 1);
2467 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002468 if (newarg == NULL)
2469 return NULL;
2470 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002471 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002472 for (i = 0; i < argcount; i++) {
2473 object *v = GETTUPLEITEM(arg, i);
2474 XINCREF(v);
2475 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002476 }
2477 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 }
2479 }
2480 else {
2481 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002482 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 return NULL;
2484 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002485 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002487
2488 argdefs = PyFunction_GetDefaults(func);
2489 if (argdefs != NULL && is_tupleobject(argdefs)) {
2490 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2491 nd = gettuplesize(argdefs);
2492 }
2493 else {
2494 d = NULL;
2495 nd = 0;
2496 }
2497
2498 if (kw != NULL) {
2499 int pos, i;
2500 nk = getmappingsize(kw);
2501 k = NEW(object *, 2*nk);
2502 if (k == NULL) {
2503 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002504 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002505 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002506 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002507 pos = i = 0;
2508 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2509 i += 2;
2510 nk = i/2;
2511 /* XXX This is broken if the caller deletes dict items! */
2512 }
2513 else {
2514 k = NULL;
2515 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002516 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517
Guido van Rossum681d79a1995-07-18 14:51:37 +00002518 result = eval_code2(
2519 (codeobject *)getfunccode(func),
2520 getfuncglobals(func), (object *)NULL,
2521 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2522 k, nk,
2523 d, nd,
2524 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525
Guido van Rossum681d79a1995-07-18 14:51:37 +00002526 DECREF(arg);
2527 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528
Guido van Rossum681d79a1995-07-18 14:51:37 +00002529 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530}
2531
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002532#define SLICE_ERROR_MSG \
2533 "standard sequence type does not support step size other than one"
2534
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002536apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 object *v, *w;
2538{
2539 typeobject *tp = v->ob_type;
2540 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002541 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 return NULL;
2543 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002544 if (tp->tp_as_mapping != NULL) {
2545 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2546 }
2547 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002549 if (!is_intobject(w)) {
2550 if (PySlice_Check(w)) {
2551 err_setstr(ValueError, SLICE_ERROR_MSG);
2552 } else {
2553 err_setstr(TypeError,
2554 "sequence subscript not int");
2555 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556 return NULL;
2557 }
2558 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002559 if (i < 0) {
2560 int len = (*tp->tp_as_sequence->sq_length)(v);
2561 if (len < 0)
2562 return NULL;
2563 i += len;
2564 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002565 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567}
2568
2569static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 object *v, *w;
2572{
2573 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002574 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 return NULL;
2578 }
2579 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002580 v = (*sq->sq_item)(v, i);
2581 if (v)
2582 return v;
2583 if (err_occurred() == IndexError)
2584 err_clear();
2585 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586}
2587
2588static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 object *v;
2591 int isize;
2592 int *pi;
2593{
2594 if (v != NULL) {
2595 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 err_setstr(TypeError, "slice index must be int");
2597 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 }
2599 *pi = getintvalue(v);
2600 if (*pi < 0)
2601 *pi += isize;
2602 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604}
2605
2606static object *
Guido van Rossum8861b741996-07-30 16:49:37 +00002607build_slice(u, v, w) /* u:v:w */
2608 object *u, *v, *w;
2609{
2610 return PySlice_New(u,v,w);
2611}
2612
2613static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002614apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615 object *u, *v, *w;
2616{
2617 typeobject *tp = u->ob_type;
2618 int ilow, ihigh, isize;
2619 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002620 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 return NULL;
2622 }
2623 ilow = 0;
2624 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002625 if (isize < 0)
2626 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002629 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002631 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633
2634static int
2635assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 object *w;
2637 object *key;
2638 object *v;
2639{
2640 typeobject *tp = w->ob_type;
2641 sequence_methods *sq;
2642 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002643 int (*func1)();
2644 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002645 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002646 (func1 = mp->mp_ass_subscript) != NULL) {
2647 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002648 }
2649 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002650 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002653 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002654 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002656 else {
2657 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002658 if (i < 0) {
2659 int len = (*sq->sq_length)(w);
2660 if (len < 0)
2661 return -1;
2662 i += len;
2663 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002664 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002665 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002668 err_setstr(TypeError,
2669 "can't assign to this subscripted object");
2670 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672}
2673
Guido van Rossum3f5da241990-12-20 15:06:42 +00002674static int
2675assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002676 object *u, *v, *w, *x;
2677{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002678 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002680 if (sq == NULL) {
2681 err_setstr(TypeError, "assign to slice of non-sequence");
2682 return -1;
2683 }
2684 if (sq == NULL || sq->sq_ass_slice == NULL) {
2685 err_setstr(TypeError, "unassignable slice");
2686 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 }
2688 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002689 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002690 if (isize < 0)
2691 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002692 if (slice_index(v, isize, &ilow) != 0)
2693 return -1;
2694 if (slice_index(w, isize, &ihigh) != 0)
2695 return -1;
2696 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697}
2698
2699static int
2700cmp_exception(err, v)
2701 object *err, *v;
2702{
2703 if (is_tupleobject(v)) {
2704 int i, n;
2705 n = gettuplesize(v);
2706 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002707 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002708 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 return 1;
2710 }
2711 return 0;
2712 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002713 if (is_classobject(v) && is_classobject(err))
2714 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 return err == v;
2716}
2717
Guido van Rossum3f5da241990-12-20 15:06:42 +00002718static int
2719cmp_member(v, w)
2720 object *v, *w;
2721{
Guido van Rossume59214e1994-08-30 08:01:59 +00002722 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002723 object *x;
2724 sequence_methods *sq;
2725 /* Special case for char in string */
2726 if (is_stringobject(w)) {
2727 register char *s, *end;
2728 register char c;
2729 if (!is_stringobject(v) || getstringsize(v) != 1) {
2730 err_setstr(TypeError,
2731 "string member test needs char left operand");
2732 return -1;
2733 }
2734 c = getstringvalue(v)[0];
2735 s = getstringvalue(w);
2736 end = s + getstringsize(w);
2737 while (s < end) {
2738 if (c == *s++)
2739 return 1;
2740 }
2741 return 0;
2742 }
2743 sq = w->ob_type->tp_as_sequence;
2744 if (sq == NULL) {
2745 err_setstr(TypeError,
2746 "'in' or 'not in' needs sequence right argument");
2747 return -1;
2748 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002749 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002750 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002751 if (x == NULL) {
2752 if (err_occurred() == IndexError) {
2753 err_clear();
2754 break;
2755 }
2756 return -1;
2757 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002758 cmp = cmpobject(v, x);
2759 XDECREF(x);
2760 if (cmp == 0)
2761 return 1;
2762 }
2763 return 0;
2764}
2765
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002767cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002768 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 register object *v;
2770 register object *w;
2771{
2772 register int cmp;
2773 register int res = 0;
2774 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002775 case IS:
2776 case IS_NOT:
2777 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002778 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002779 res = !res;
2780 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 case IN:
2782 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002783 res = cmp_member(v, w);
2784 if (res < 0)
2785 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002786 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002787 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788 break;
2789 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002790 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 break;
2792 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793 cmp = cmpobject(v, w);
2794 switch (op) {
2795 case LT: res = cmp < 0; break;
2796 case LE: res = cmp <= 0; break;
2797 case EQ: res = cmp == 0; break;
2798 case NE: res = cmp != 0; break;
2799 case GT: res = cmp > 0; break;
2800 case GE: res = cmp >= 0; break;
2801 /* XXX no default? (res is initialized to 0 though) */
2802 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803 }
2804 v = res ? True : False;
2805 INCREF(v);
2806 return v;
2807}
2808
Guido van Rossum3f5da241990-12-20 15:06:42 +00002809static int
2810import_from(locals, v, name)
2811 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002812 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002813 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002814{
2815 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002816 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002817 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002818 return -1;
2819 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002820 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002821 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002822 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002823 object *name, *value;
2824 pos = 0;
2825 while (mappinggetnext(w, &pos, &name, &value)) {
2826 if (!is_stringobject(name) ||
2827 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002828 continue;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002829 if (is_accessobject(value)) {
2830 value = getaccessvalue(value, (object *)NULL);
2831 if (value == NULL) {
2832 err_clear();
2833 continue;
2834 }
2835 }
2836 else
2837 INCREF(value);
2838 err = dict2insert(locals, name, value);
2839 DECREF(value);
2840 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002841 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002842 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002843 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002844 }
2845 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002846 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002848 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002849 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002850 getstringvalue(name));
2851 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002852 return -1;
2853 }
2854 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002855 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002856 }
2857}
2858
2859static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002860build_class(methods, bases, name)
2861 object *methods; /* dictionary */
2862 object *bases; /* tuple containing classes */
2863 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002864{
Guido van Rossum25831651993-05-19 14:50:45 +00002865 int i;
2866 if (!is_tupleobject(bases)) {
2867 err_setstr(SystemError, "build_class with non-tuple bases");
2868 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002869 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002870 if (gettuplesize(bases) > 0) {
2871 object *base;
Guido van Rossum8d617a61995-03-09 12:12:11 +00002872 base = GETTUPLEITEM(bases, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002873 /* Call the base's *type*, if it is callable.
2874 This code is a hook for Donald Beaudry's type extensions.
2875 In unexended Python it will never be triggered since its
2876 types are not callable. */
2877 if (base->ob_type->ob_type->tp_call) {
2878 object *args;
2879 object *class;
2880 args = mkvalue("(OOO)", name, bases, methods);
2881 class = call_object((object *)base->ob_type, args);
2882 DECREF(args);
2883 return class;
2884 }
2885 }
Guido van Rossum25831651993-05-19 14:50:45 +00002886 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002888 return NULL;
2889 }
Guido van Rossum25831651993-05-19 14:50:45 +00002890 if (!is_stringobject(name)) {
2891 err_setstr(SystemError, "build_class witn non-string name");
2892 return NULL;
2893 }
2894 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002895 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002896 if (!is_classobject(base)) {
2897 err_setstr(TypeError,
2898 "base is not a class object");
2899 return NULL;
2900 }
2901 }
2902 return newclassobject(bases, methods, name);
2903}
2904
2905static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002906access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002907 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002908 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002909 frameobject *f;
2910{
Guido van Rossumb3f72581993-05-21 19:56:10 +00002911 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00002912 object *value, *ac;
2913 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002914 int ret;
2915 fast_2_locals(f);
2916 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002917 if (value && is_accessobject(value)) {
2918 err_setstr(AccessError, "can't override access");
2919 return -1;
2920 }
2921 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00002922 if (value != NULL && value != None)
2923 type = value->ob_type;
2924 else
2925 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002926 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00002927 if (ac == NULL)
2928 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002929 ret = mappinginsert(f->f_locals, name, ac);
2930 DECREF(ac);
2931 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00002932 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002933}
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002934
2935static int
2936exec_statement(prog, globals, locals)
2937 object *prog;
2938 object *globals;
2939 object *locals;
2940{
2941 char *s;
2942 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002943 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002944 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002945
2946 if (is_tupleobject(prog) && globals == None && locals == None &&
2947 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2948 /* Backward compatibility hack */
2949 globals = gettupleitem(prog, 1);
2950 if (n == 3)
2951 locals = gettupleitem(prog, 2);
2952 prog = gettupleitem(prog, 0);
2953 }
2954 if (globals == None) {
2955 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002956 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002957 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002958 plain = 1;
2959 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002960 }
2961 else if (locals == None)
2962 locals = globals;
2963 if (!is_stringobject(prog) &&
2964 !is_codeobject(prog) &&
2965 !is_fileobject(prog)) {
2966 err_setstr(TypeError,
2967 "exec 1st arg must be string, code or file object");
2968 return -1;
2969 }
2970 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2971 err_setstr(TypeError,
2972 "exec 2nd/3rd args must be dict or None");
2973 return -1;
2974 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002975 if (dictlookup(globals, "__builtins__") == NULL)
2976 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002977 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002978 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002979 return -1;
2980 return 0;
2981 }
2982 if (is_fileobject(prog)) {
2983 FILE *fp = getfilefile(prog);
2984 char *name = getstringvalue(getfilename(prog));
2985 if (run_file(fp, name, file_input, globals, locals) == NULL)
2986 return -1;
2987 return 0;
2988 }
2989 s = getstringvalue(prog);
2990 if (strlen(s) != getstringsize(prog)) {
2991 err_setstr(ValueError, "embedded '\\0' in exec string");
2992 return -1;
2993 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002994 v = run_string(s, file_input, globals, locals);
2995 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002996 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002997 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002998 if (plain)
2999 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003000 return 0;
3001}
Guido van Rossum24c13741995-02-14 09:42:43 +00003002
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00003004static object *
3005find_from_args(f, nexti)
3006 frameobject *f;
3007 int nexti;
3008{
3009 int opcode;
3010 int oparg;
3011 object *list, *name;
3012 unsigned char *next_instr;
3013
3014 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
3015 opcode = (*next_instr++);
3016 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00003017 INCREF(None);
3018 return None;
3019 }
3020
3021 list = newlistobject(0);
3022 if (list == NULL)
3023 return NULL;
3024
3025 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 oparg = (next_instr[1]<<8) + next_instr[0];
3027 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00003028 name = Getnamev(f, oparg);
3029 if (addlistitem(list, name) < 0) {
3030 DECREF(list);
3031 break;
3032 }
3033 opcode = (*next_instr++);
3034 } while (opcode == IMPORT_FROM);
3035
3036 return list;
3037}