blob: 816973f86a7404c8b466e74a1aaf8a2aa61e0eea [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
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum8c1e1501996-05-24 20:49:24 +000036 XXX totally get rid of access stuff
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000038 XXX document it!
39 */
40
Guido van Rossum3f5da241990-12-20 15:06:42 +000041#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum10dc2e81990-11-18 17:27:39 +000043#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000044#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000045#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000046#include "opcode.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000047#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000048
Guido van Rossumc6004111993-11-05 10:22:19 +000049#include <ctype.h>
50
Guido van Rossum04691fc1992-08-12 15:35:34 +000051/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000053
Guido van Rossum408027e1996-12-30 16:17:54 +000054#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000055/* For debugging the interpreter: */
56#define LLTRACE 1 /* Low-level trace feature */
57#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000058#endif
59
Guido van Rossum5b722181993-03-30 17:46:03 +000060
Guido van Rossum374a9221991-04-04 10:40:29 +000061/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000062
Guido van Rossum681d79a1995-07-18 14:51:37 +000063static object *eval_code2 PROTO((codeobject *,
64 object *, object *,
65 object **, int,
66 object **, int,
67 object **, int,
68 object *));
Guido van Rossum0aa9ee61996-12-10 18:07:35 +000069static int do_raise PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000070#ifdef LLTRACE
71static int prtrace PROTO((object *, char *));
72#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000073static void call_exc_trace PROTO((object **, object**, frameobject *));
74static int call_trace
75 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000076static object *add PROTO((object *, object *));
77static object *sub PROTO((object *, object *));
Guido van Rossum3b4da591996-06-19 21:49:17 +000078static object *powerop PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000079static object *mul PROTO((object *, object *));
80static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000081static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000082static object *neg PROTO((object *));
83static object *pos PROTO((object *));
84static object *not PROTO((object *));
85static object *invert PROTO((object *));
86static object *lshift PROTO((object *, object *));
87static object *rshift PROTO((object *, object *));
88static object *and PROTO((object *, object *));
89static object *xor PROTO((object *, object *));
90static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000091static object *call_builtin PROTO((object *, object *, object *));
92static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000093static object *apply_subscript PROTO((object *, object *));
94static object *loop_subscript PROTO((object *, object *));
95static int slice_index PROTO((object *, int, int *));
96static object *apply_slice PROTO((object *, object *, object *));
Guido van Rossum8861b741996-07-30 16:49:37 +000097static object *build_slice PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000098static int assign_subscript PROTO((object *, object *, object *));
99static int assign_slice PROTO((object *, object *, object *, object *));
100static int cmp_exception PROTO((object *, object *));
101static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +0000102static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000103static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000104static object *build_class PROTO((object *, object *, object *));
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000105#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000106static int access_statement PROTO((object *, object *, frameobject *));
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000107#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000108static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000109static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000110
111
Guido van Rossum0a066c01992-03-27 17:29:15 +0000112/* Pointer to current frame, used to link new frames to */
113
Guido van Rossum374a9221991-04-04 10:40:29 +0000114static frameobject *current_frame;
115
Guido van Rossume59214e1994-08-30 08:01:59 +0000116#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000117
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118#include <errno.h>
119#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000120
Guido van Rossuma9672091994-09-14 13:31:22 +0000121static type_lock interpreter_lock = 0;
122static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123
124void
125init_save_thread()
126{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000128 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129 interpreter_lock = allocate_lock();
130 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000131 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000133
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000134#endif
135
Guido van Rossumff4949e1992-08-05 19:58:53 +0000136/* Functions save_thread and restore_thread are always defined so
137 dynamically loaded modules needn't be compiled separately for use
138 with and without threads: */
139
Guido van Rossum04691fc1992-08-12 15:35:34 +0000140object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000141save_thread()
142{
Guido van Rossume59214e1994-08-30 08:01:59 +0000143#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000144 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000145 object *res;
146 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000147 current_frame = NULL;
148 release_lock(interpreter_lock);
149 return res;
150 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000151#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000152 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153}
154
155void
156restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000157 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158{
Guido van Rossume59214e1994-08-30 08:01:59 +0000159#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000160 if (interpreter_lock) {
161 int err;
162 err = errno;
163 acquire_lock(interpreter_lock, 1);
164 errno = err;
165 current_frame = (frameobject *)x;
166 }
167#endif
168}
169
170
Guido van Rossuma9672091994-09-14 13:31:22 +0000171/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
172 signal handlers or Mac I/O completion routines) can schedule calls
173 to a function to be called synchronously.
174 The synchronous function is called with one void* argument.
175 It should return 0 for success or -1 for failure -- failure should
176 be accompanied by an exception.
177
178 If registry succeeds, the registry function returns 0; if it fails
179 (e.g. due to too many pending calls) it returns -1 (without setting
180 an exception condition).
181
182 Note that because registry may occur from within signal handlers,
183 or other asynchronous events, calling malloc() is unsafe!
184
185#ifdef WITH_THREAD
186 Any thread can schedule pending calls, but only the main thread
187 will execute them.
188#endif
189
190 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
191 There are two possible race conditions:
192 (1) nested asynchronous registry calls;
193 (2) registry calls made while pending calls are being processed.
194 While (1) is very unlikely, (2) is a real possibility.
195 The current code is safe against (2), but not against (1).
196 The safety against (2) is derived from the fact that only one
197 thread (the main thread) ever takes things out of the queue.
198*/
199
Guido van Rossum8861b741996-07-30 16:49:37 +0000200static int ticker = 0; /* main loop counter to do periodic things */
201
Guido van Rossuma9672091994-09-14 13:31:22 +0000202#define NPENDINGCALLS 32
203static struct {
204 int (*func) PROTO((ANY *));
205 ANY *arg;
206} pendingcalls[NPENDINGCALLS];
207static volatile int pendingfirst = 0;
208static volatile int pendinglast = 0;
209
210int
211Py_AddPendingCall(func, arg)
212 int (*func) PROTO((ANY *));
213 ANY *arg;
214{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000215 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000216 int i, j;
217 /* XXX Begin critical section */
218 /* XXX If you want this to be safe against nested
219 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000220 if (busy)
221 return -1;
222 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000223 i = pendinglast;
224 j = (i + 1) % NPENDINGCALLS;
225 if (j == pendingfirst)
226 return -1; /* Queue full */
227 pendingcalls[i].func = func;
228 pendingcalls[i].arg = arg;
229 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000230 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000231 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000232 /* XXX End critical section */
233 return 0;
234}
235
Guido van Rossum180d7b41994-09-29 09:45:57 +0000236int
237Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000238{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000239 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240#ifdef WITH_THREAD
Guido van Rossum8861b741996-07-30 16:49:37 +0000241 if (get_thread_ident() != main_thread) {
242 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000243 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000244 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000245#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000246 if (busy) {
247 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000249 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000250 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251 for (;;) {
252 int i;
253 int (*func) PROTO((ANY *));
254 ANY *arg;
255 i = pendingfirst;
256 if (i == pendinglast)
257 break; /* Queue empty */
258 func = pendingcalls[i].func;
259 arg = pendingcalls[i].arg;
260 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000261 if (func(arg) < 0) {
262 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000263 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000265 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000266 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000268 return 0;
269}
270
271
Guido van Rossum374a9221991-04-04 10:40:29 +0000272/* Status code for main loop (reason for stack unwind) */
273
274enum why_code {
275 WHY_NOT, /* No error */
276 WHY_EXCEPTION, /* Exception occurred */
277 WHY_RERAISE, /* Exception re-raised by 'finally' */
278 WHY_RETURN, /* 'return' statement */
279 WHY_BREAK /* 'break' statement */
280};
281
282
Guido van Rossum681d79a1995-07-18 14:51:37 +0000283/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000284
285object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000286eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000287 codeobject *co;
288 object *globals;
289 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000290{
291 return eval_code2(co,
292 globals, locals,
293 (object **)NULL, 0,
294 (object **)NULL, 0,
295 (object **)NULL, 0,
296 (object *)NULL);
297}
298
299
300/* Interpreter main loop */
301
Guido van Rossum8861b741996-07-30 16:49:37 +0000302#ifndef MAX_RECURSION_DEPTH
303#define MAX_RECURSION_DEPTH 10000
304#endif
305
306static int recursion_depth = 0;
307
Guido van Rossum681d79a1995-07-18 14:51:37 +0000308static object *
309eval_code2(co, globals, locals,
310 args, argcount, kws, kwcount, defs, defcount, owner)
311 codeobject *co;
312 object *globals;
313 object *locals;
314 object **args;
315 int argcount;
316 object **kws; /* length: 2*kwcount */
317 int kwcount;
318 object **defs;
319 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000320 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000321{
322 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000323 register int opcode = 0; /* Current opcode */
324 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000325 register object **stack_pointer;
326 register enum why_code why; /* Reason for block stack unwind */
327 register int err; /* Error status -- nonzero if error */
328 register object *x; /* Result object -- NULL if error */
329 register object *v; /* Temporary objects popped off stack */
330 register object *w;
331 register object *u;
332 register object *t;
333 register frameobject *f; /* Current frame */
Guido van Rossum150b2df1996-12-05 23:17:11 +0000334 register object **fastlocals = NULL;
335 object *retval = NULL; /* Return value */
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000336#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumb3f72581993-05-21 19:56:10 +0000337 int defmode = 0; /* Default access mode for new variables */
Guido van Rossum0dfcf751996-08-12 22:00:53 +0000338#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +0000339#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000340 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000341#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000342#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000343 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000344 char *filename = getstringvalue(co->co_filename);
345#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000346
347/* Code access macros */
348
349#define GETCONST(i) Getconst(f, i)
350#define GETNAME(i) Getname(f, i)
351#define GETNAMEV(i) Getnamev(f, i)
352#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
353#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
354#define NEXTOP() (*next_instr++)
355#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
356#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
357#define JUMPBY(x) (next_instr += (x))
358
359/* Stack manipulation macros */
360
361#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
362#define EMPTY() (STACK_LEVEL() == 0)
363#define TOP() (stack_pointer[-1])
364#define BASIC_PUSH(v) (*stack_pointer++ = (v))
365#define BASIC_POP() (*--stack_pointer)
366
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000367#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
368 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
369
Guido van Rossum96a42c81992-01-12 02:29:51 +0000370#ifdef LLTRACE
371#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
372#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000373#else
374#define PUSH(v) BASIC_PUSH(v)
375#define POP() BASIC_POP()
376#endif
377
Guido van Rossum681d79a1995-07-18 14:51:37 +0000378/* Local variable macros */
379
380#define GETLOCAL(i) (fastlocals[i])
381#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
382 GETLOCAL(i) = value; } while (0)
383
Guido van Rossum8861b741996-07-30 16:49:37 +0000384#ifdef USE_STACKCHECK
385 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
386 err_setstr(MemoryError, "Stack overflow");
387 return NULL;
388 }
389#endif
390
Guido van Rossum681d79a1995-07-18 14:51:37 +0000391 if (globals == NULL) {
392 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000393 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000394 }
395
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000396#ifdef LLTRACE
397 lltrace = dictlookup(globals, "__lltrace__") != NULL;
398#endif
399
Guido van Rossum374a9221991-04-04 10:40:29 +0000400 f = newframeobject(
401 current_frame, /*back*/
402 co, /*code*/
403 globals, /*globals*/
404 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000405 owner, /*owner*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000406 50, /*nvalues*/
407 20); /*nblocks*/
408 if (f == NULL)
409 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000410
Guido van Rossum374a9221991-04-04 10:40:29 +0000411 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000412
Guido van Rossum681d79a1995-07-18 14:51:37 +0000413 if (co->co_nlocals > 0)
414 fastlocals = ((listobject *)f->f_fastlocals)->ob_item;
415
416 if (co->co_argcount > 0 ||
417 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
418 int i;
419 int n = argcount;
420 object *kwdict = NULL;
421 if (co->co_flags & CO_VARKEYWORDS) {
422 kwdict = newmappingobject();
423 if (kwdict == NULL)
424 goto fail;
425 }
426 if (argcount > co->co_argcount) {
427 if (!(co->co_flags & CO_VARARGS)) {
428 err_setstr(TypeError, "too many arguments");
429 goto fail;
430 }
431 n = co->co_argcount;
432 }
433 for (i = 0; i < n; i++) {
434 x = args[i];
435 INCREF(x);
436 SETLOCAL(i, x);
437 }
438 if (co->co_flags & CO_VARARGS) {
439 u = newtupleobject(argcount - n);
440 for (i = n; i < argcount; i++) {
441 x = args[i];
442 INCREF(x);
443 SETTUPLEITEM(u, i-n, x);
444 }
445 SETLOCAL(co->co_argcount, u);
446 }
447 for (i = 0; i < kwcount; i++) {
448 object *keyword = kws[2*i];
449 object *value = kws[2*i + 1];
450 int j;
451 /* XXX slow -- speed up using dictionary? */
452 for (j = 0; j < co->co_argcount; j++) {
453 object *nm = GETTUPLEITEM(co->co_varnames, j);
454 if (cmpobject(keyword, nm) == 0)
455 break;
456 }
457 if (j >= co->co_argcount) {
458 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000459 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 goto fail;
461 }
462 mappinginsert(kwdict, keyword, value);
463 }
464 else {
465 if (GETLOCAL(j) != NULL) {
466 err_setstr(TypeError,
467 "keyword parameter redefined");
468 goto fail;
469 }
470 INCREF(value);
471 SETLOCAL(j, value);
472 }
473 }
474 if (argcount < co->co_argcount) {
475 int m = co->co_argcount - defcount;
476 for (i = argcount; i < m; i++) {
477 if (GETLOCAL(i) == NULL) {
478 err_setstr(TypeError,
479 "not enough arguments");
480 goto fail;
481 }
482 }
483 if (n > m)
484 i = n - m;
485 else
486 i = 0;
487 for (; i < defcount; i++) {
488 if (GETLOCAL(m+i) == NULL) {
489 object *def = defs[i];
490 INCREF(def);
491 SETLOCAL(m+i, def);
492 }
493 }
494 }
495 if (kwdict != NULL) {
496 i = co->co_argcount;
497 if (co->co_flags & CO_VARARGS)
498 i++;
499 SETLOCAL(i, kwdict);
500 }
501 if (0) {
502 fail:
503 XDECREF(kwdict);
504 goto fail2;
505 }
506 }
507 else {
508 if (argcount > 0 || kwcount > 0) {
509 err_setstr(TypeError, "no arguments expected");
510 fail2:
511 current_frame = f->f_back;
512 DECREF(f);
513 return NULL;
514 }
515 }
516
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000517 if (sys_trace != NULL) {
518 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000519 be called on *every* entry to a code block.
520 Its return value, if not None, is a function that
521 will be called at the start of each executed line
522 of code. (Actually, the function must return
523 itself in order to continue tracing.)
524 The trace functions are called with three arguments:
525 a pointer to the current frame, a string indicating
526 why the function is called, and an argument which
527 depends on the situation. The global trace function
528 (sys.trace) is also called whenever an exception
529 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 if (call_trace(&sys_trace, &f->f_trace, f, "call",
531 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000532 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000533 current_frame = f->f_back;
534 DECREF(f);
535 return NULL;
536 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000537 }
538
539 if (sys_profile != NULL) {
540 /* Similar for sys_profile, except it needn't return
541 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000542 if (call_trace(&sys_profile, (object**)0, f, "call",
543 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000544 current_frame = f->f_back;
545 DECREF(f);
546 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000547 }
548 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000549
Guido van Rossum8861b741996-07-30 16:49:37 +0000550 if (++recursion_depth > MAX_RECURSION_DEPTH) {
551 --recursion_depth;
552 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
553 current_frame = f->f_back;
554 DECREF(f);
555 return NULL;
556 }
557
Guido van Rossum374a9221991-04-04 10:40:29 +0000558 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000559 stack_pointer = f->f_valuestack;
560
Guido van Rossum374a9221991-04-04 10:40:29 +0000561 why = WHY_NOT;
562 err = 0;
563 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000564
565 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000566 /* Do periodic things.
567 Doing this every time through the loop would add
568 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000569 So we do it only every Nth instruction.
570
571 The ticker is reset to zero if there are pending
572 calls (see Py_AddPendingCalls() and
573 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000574
Guido van Rossum374a9221991-04-04 10:40:29 +0000575 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000576 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000577 if (pendingfirst != pendinglast) {
578 if (Py_MakePendingCalls() < 0) {
579 why = WHY_EXCEPTION;
580 goto on_error;
581 }
582 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000583 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 goto on_error;
586 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587
Guido van Rossume59214e1994-08-30 08:01:59 +0000588#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589 if (interpreter_lock) {
590 /* Give another thread a chance */
591
592 current_frame = NULL;
593 release_lock(interpreter_lock);
594
595 /* Other threads may run now */
596
597 acquire_lock(interpreter_lock, 1);
598 current_frame = f;
599 }
600#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000601 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000604
Guido van Rossum408027e1996-12-30 16:17:54 +0000605#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000606 f->f_lasti = INSTR_OFFSET();
607#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000608
609 opcode = NEXTOP();
610 if (HAS_ARG(opcode))
611 oparg = NEXTARG();
612
Guido van Rossum96a42c81992-01-12 02:29:51 +0000613#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 /* Instruction tracing */
615
Guido van Rossum96a42c81992-01-12 02:29:51 +0000616 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000617 if (HAS_ARG(opcode)) {
618 printf("%d: %d, %d\n",
619 (int) (INSTR_OFFSET() - 3),
620 opcode, oparg);
621 }
622 else {
623 printf("%d: %d\n",
624 (int) (INSTR_OFFSET() - 1), opcode);
625 }
626 }
627#endif
628
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000629 if (!CHECK_STACK(3)) {
630 x = NULL;
631 break;
632 }
633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 /* Main switch on opcode */
635
636 switch (opcode) {
637
638 /* BEWARE!
639 It is essential that any operation that fails sets either
640 x to NULL, err to nonzero, or why to anything but WHY_NOT,
641 and that no operation that succeeds does this! */
642
643 /* case STOP_CODE: this is an error! */
644
645 case POP_TOP:
646 v = POP();
647 DECREF(v);
648 break;
649
650 case ROT_TWO:
651 v = POP();
652 w = POP();
653 PUSH(v);
654 PUSH(w);
655 break;
656
657 case ROT_THREE:
658 v = POP();
659 w = POP();
660 x = POP();
661 PUSH(v);
662 PUSH(x);
663 PUSH(w);
664 break;
665
666 case DUP_TOP:
667 v = TOP();
668 INCREF(v);
669 PUSH(v);
670 break;
671
672 case UNARY_POSITIVE:
673 v = POP();
674 x = pos(v);
675 DECREF(v);
676 PUSH(x);
677 break;
678
679 case UNARY_NEGATIVE:
680 v = POP();
681 x = neg(v);
682 DECREF(v);
683 PUSH(x);
684 break;
685
686 case UNARY_NOT:
687 v = POP();
688 x = not(v);
689 DECREF(v);
690 PUSH(x);
691 break;
692
693 case UNARY_CONVERT:
694 v = POP();
695 x = reprobject(v);
696 DECREF(v);
697 PUSH(x);
698 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000699
700 case UNARY_INVERT:
701 v = POP();
702 x = invert(v);
703 DECREF(v);
704 PUSH(x);
705 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000706
Guido van Rossum50564e81996-01-12 01:13:16 +0000707 case BINARY_POWER:
708 w = POP();
709 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000710 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000711 DECREF(v);
712 DECREF(w);
713 PUSH(x);
714 break;
715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 case BINARY_MULTIPLY:
717 w = POP();
718 v = POP();
719 x = mul(v, w);
720 DECREF(v);
721 DECREF(w);
722 PUSH(x);
723 break;
724
725 case BINARY_DIVIDE:
726 w = POP();
727 v = POP();
728 x = divide(v, w);
729 DECREF(v);
730 DECREF(w);
731 PUSH(x);
732 break;
733
734 case BINARY_MODULO:
735 w = POP();
736 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000737 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 DECREF(v);
739 DECREF(w);
740 PUSH(x);
741 break;
742
743 case BINARY_ADD:
744 w = POP();
745 v = POP();
746 x = add(v, w);
747 DECREF(v);
748 DECREF(w);
749 PUSH(x);
750 break;
751
752 case BINARY_SUBTRACT:
753 w = POP();
754 v = POP();
755 x = sub(v, w);
756 DECREF(v);
757 DECREF(w);
758 PUSH(x);
759 break;
760
761 case BINARY_SUBSCR:
762 w = POP();
763 v = POP();
764 x = apply_subscript(v, w);
765 DECREF(v);
766 DECREF(w);
767 PUSH(x);
768 break;
769
Guido van Rossum7928cd71991-10-24 14:59:31 +0000770 case BINARY_LSHIFT:
771 w = POP();
772 v = POP();
773 x = lshift(v, w);
774 DECREF(v);
775 DECREF(w);
776 PUSH(x);
777 break;
778
779 case BINARY_RSHIFT:
780 w = POP();
781 v = POP();
782 x = rshift(v, w);
783 DECREF(v);
784 DECREF(w);
785 PUSH(x);
786 break;
787
788 case BINARY_AND:
789 w = POP();
790 v = POP();
791 x = and(v, w);
792 DECREF(v);
793 DECREF(w);
794 PUSH(x);
795 break;
796
797 case BINARY_XOR:
798 w = POP();
799 v = POP();
800 x = xor(v, w);
801 DECREF(v);
802 DECREF(w);
803 PUSH(x);
804 break;
805
806 case BINARY_OR:
807 w = POP();
808 v = POP();
809 x = or(v, w);
810 DECREF(v);
811 DECREF(w);
812 PUSH(x);
813 break;
814
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 case SLICE+0:
816 case SLICE+1:
817 case SLICE+2:
818 case SLICE+3:
819 if ((opcode-SLICE) & 2)
820 w = POP();
821 else
822 w = NULL;
823 if ((opcode-SLICE) & 1)
824 v = POP();
825 else
826 v = NULL;
827 u = POP();
828 x = apply_slice(u, v, w);
829 DECREF(u);
830 XDECREF(v);
831 XDECREF(w);
832 PUSH(x);
833 break;
834
835 case STORE_SLICE+0:
836 case STORE_SLICE+1:
837 case STORE_SLICE+2:
838 case STORE_SLICE+3:
839 if ((opcode-STORE_SLICE) & 2)
840 w = POP();
841 else
842 w = NULL;
843 if ((opcode-STORE_SLICE) & 1)
844 v = POP();
845 else
846 v = NULL;
847 u = POP();
848 t = POP();
849 err = assign_slice(u, v, w, t); /* u[v:w] = t */
850 DECREF(t);
851 DECREF(u);
852 XDECREF(v);
853 XDECREF(w);
854 break;
855
856 case DELETE_SLICE+0:
857 case DELETE_SLICE+1:
858 case DELETE_SLICE+2:
859 case DELETE_SLICE+3:
860 if ((opcode-DELETE_SLICE) & 2)
861 w = POP();
862 else
863 w = NULL;
864 if ((opcode-DELETE_SLICE) & 1)
865 v = POP();
866 else
867 v = NULL;
868 u = POP();
869 err = assign_slice(u, v, w, (object *)NULL);
870 /* del u[v:w] */
871 DECREF(u);
872 XDECREF(v);
873 XDECREF(w);
874 break;
875
876 case STORE_SUBSCR:
877 w = POP();
878 v = POP();
879 u = POP();
880 /* v[w] = u */
881 err = assign_subscript(v, w, u);
882 DECREF(u);
883 DECREF(v);
884 DECREF(w);
885 break;
886
887 case DELETE_SUBSCR:
888 w = POP();
889 v = POP();
890 /* del v[w] */
891 err = assign_subscript(v, w, (object *)NULL);
892 DECREF(v);
893 DECREF(w);
894 break;
895
896 case PRINT_EXPR:
897 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000899 /* Before printing, also assign to '_' */
900 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000901 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000902 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000904 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000905 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000906 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 flushline();
908 }
909 DECREF(v);
910 break;
911
912 case PRINT_ITEM:
913 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000914 w = sysget("stdout");
915 if (softspace(w, 1))
916 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000917 err = writeobject(v, w, PRINT_RAW);
918 if (err == 0 && is_stringobject(v)) {
919 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 char *s = getstringvalue(v);
921 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000922 if (len > 0 &&
923 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000924 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000925 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 DECREF(v);
928 break;
929
930 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000931 x = sysget("stdout");
932 if (x == NULL)
933 err_setstr(RuntimeError, "lost sys.stdout");
934 else {
935 writestring("\n", x);
936 softspace(x, 0);
937 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 break;
939
940 case BREAK_LOOP:
941 why = WHY_BREAK;
942 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000943
Guido van Rossumf10570b1995-07-07 22:53:21 +0000944 case RAISE_VARARGS:
945 u = v = w = NULL;
946 switch (oparg) {
947 case 3:
948 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000949 /* Fallthrough */
950 case 2:
951 v = POP(); /* value */
952 /* Fallthrough */
953 case 1:
954 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000955 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000956 break;
957 default:
958 err_setstr(SystemError,
959 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000960 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000961 break;
962 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
964
965 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000966 if ((x = f->f_locals) == NULL) {
967 err_setstr(SystemError, "no locals");
968 break;
969 }
970 INCREF(x);
971 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 break;
973
974 case RETURN_VALUE:
975 retval = POP();
976 why = WHY_RETURN;
977 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000978
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000979 case EXEC_STMT:
980 w = POP();
981 v = POP();
982 u = POP();
983 err = exec_statement(u, v, w);
984 DECREF(u);
985 DECREF(v);
986 DECREF(w);
987 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000988
Guido van Rossum374a9221991-04-04 10:40:29 +0000989 case POP_BLOCK:
990 {
991 block *b = pop_block(f);
992 while (STACK_LEVEL() > b->b_level) {
993 v = POP();
994 DECREF(v);
995 }
996 }
997 break;
998
999 case END_FINALLY:
1000 v = POP();
1001 if (is_intobject(v)) {
1002 why = (enum why_code) getintvalue(v);
1003 if (why == WHY_RETURN)
1004 retval = POP();
1005 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001006 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001008 u = POP();
1009 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001010 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001011 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 }
1013 else if (v != None) {
1014 err_setstr(SystemError,
1015 "'finally' pops bad exception");
1016 why = WHY_EXCEPTION;
1017 }
1018 DECREF(v);
1019 break;
1020
1021 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001022 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001023 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001024 w = POP();
1025 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001027 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 DECREF(v);
1029 DECREF(w);
1030 break;
1031
1032 case STORE_NAME:
1033 w = GETNAMEV(oparg);
1034 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001035 if ((x = f->f_locals) == NULL) {
1036 err_setstr(SystemError, "no locals");
1037 break;
1038 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001039#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001040 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001041 if (u == NULL) {
1042 if (defmode != 0) {
1043 if (v != None)
1044 u = (object *)v->ob_type;
1045 else
1046 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001047 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001048 (typeobject *)u,
1049 defmode);
1050 DECREF(v);
1051 if (x == NULL)
1052 break;
1053 v = x;
1054 }
1055 }
1056 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001057 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001058 DECREF(v);
1059 break;
1060 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001061#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001062 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 DECREF(v);
1064 break;
1065
1066 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001067 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001068 if ((x = f->f_locals) == NULL) {
1069 err_setstr(SystemError, "no locals");
1070 break;
1071 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001072#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001073 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001074 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001075 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001076 (object *)NULL);
1077 break;
1078 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001079#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001080 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001081 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001082 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001083
1084#ifdef CASE_TOO_BIG
1085 default: switch (opcode) {
1086#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001087
1088 case UNPACK_TUPLE:
1089 v = POP();
1090 if (!is_tupleobject(v)) {
1091 err_setstr(TypeError, "unpack non-tuple");
1092 why = WHY_EXCEPTION;
1093 }
1094 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001095 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 "unpack tuple of wrong size");
1097 why = WHY_EXCEPTION;
1098 }
1099 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001100 if (!CHECK_STACK(oparg)) {
1101 x = NULL;
1102 break;
1103 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001104 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001105 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 INCREF(w);
1107 PUSH(w);
1108 }
1109 }
1110 DECREF(v);
1111 break;
1112
1113 case UNPACK_LIST:
1114 v = POP();
1115 if (!is_listobject(v)) {
1116 err_setstr(TypeError, "unpack non-list");
1117 why = WHY_EXCEPTION;
1118 }
1119 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001120 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 "unpack list of wrong size");
1122 why = WHY_EXCEPTION;
1123 }
1124 else {
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001125 if (!CHECK_STACK(oparg)) {
1126 x = NULL;
1127 break;
1128 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 for (; --oparg >= 0; ) {
1130 w = getlistitem(v, oparg);
1131 INCREF(w);
1132 PUSH(w);
1133 }
1134 }
1135 DECREF(v);
1136 break;
1137
1138 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001139 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 v = POP();
1141 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001142 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 DECREF(v);
1144 DECREF(u);
1145 break;
1146
1147 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001148 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001150 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 DECREF(v);
1152 break;
1153
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001154 case STORE_GLOBAL:
1155 w = GETNAMEV(oparg);
1156 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001157#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001158 if (f->f_locals != NULL) {
1159 u = dict2lookup(f->f_locals, w);
1160 if (u != NULL && is_accessobject(u)) {
1161 err = setaccessvalue(u, f->f_globals,
1162 v);
1163 DECREF(v);
1164 break;
1165 }
Guido van Rossum25831651993-05-19 14:50:45 +00001166 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001167#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001168 err = dict2insert(f->f_globals, w, v);
1169 DECREF(v);
1170 break;
1171
1172 case DELETE_GLOBAL:
1173 w = GETNAMEV(oparg);
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001174#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001175 if (f->f_locals != NULL) {
1176 u = dict2lookup(f->f_locals, w);
1177 if (u != NULL && is_accessobject(u)) {
1178 err = setaccessvalue(u, f->f_globals,
1179 (object *)NULL);
1180 break;
1181 }
Guido van Rossum25831651993-05-19 14:50:45 +00001182 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001183#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001184 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001185 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001186 break;
1187
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 case LOAD_CONST:
1189 x = GETCONST(oparg);
1190 INCREF(x);
1191 PUSH(x);
1192 break;
1193
1194 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001195 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001196 if ((x = f->f_locals) == NULL) {
1197 err_setstr(SystemError, "no locals");
1198 break;
1199 }
1200 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001202 err_clear();
1203 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001205 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001206 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001208 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 break;
1210 }
1211 }
1212 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001213#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001214 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001215 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001216 if (x == NULL)
1217 break;
1218 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001219 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001220#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001221 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 PUSH(x);
1223 break;
1224
1225 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001226 w = GETNAMEV(oparg);
1227 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001229 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001230 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001232 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 break;
1234 }
1235 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001236#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001237 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001238 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001239 if (x == NULL)
1240 break;
1241 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001242 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001243#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001244 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 PUSH(x);
1246 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001247
1248#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001250 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001251 if ((x = f->f_locals) == NULL) {
1252 err_setstr(SystemError, "no locals");
1253 break;
1254 }
1255 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001257 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 break;
1259 }
Guido van Rossum25831651993-05-19 14:50:45 +00001260 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001261 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001262 if (x == NULL)
1263 break;
1264 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001265 else
1266 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 PUSH(x);
1268 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001269#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001270
1271 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001272 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001273 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001274 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001275 gettupleitem(co->co_varnames,
1276 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001277 break;
1278 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001279#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001280 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001281 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001282 if (x == NULL)
1283 break;
1284 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001285 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001286#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001287 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001288 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001289 break;
1290
1291 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001292 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001293#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001294 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001295 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001296 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001297 DECREF(v);
1298 break;
1299 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001300#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001301 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001302 break;
1303
1304 case DELETE_FAST:
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001305#ifdef SUPPORT_OBSOLETE_ACCESS
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 Rossum681d79a1995-07-18 14:51:37 +00001313 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001314 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001315 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001316 break;
1317 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001318#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001320 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001321
1322 case BUILD_TUPLE:
1323 x = newtupleobject(oparg);
1324 if (x != NULL) {
1325 for (; --oparg >= 0;) {
1326 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001327 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 }
1329 PUSH(x);
1330 }
1331 break;
1332
1333 case BUILD_LIST:
1334 x = newlistobject(oparg);
1335 if (x != NULL) {
1336 for (; --oparg >= 0;) {
1337 w = POP();
1338 err = setlistitem(x, oparg, w);
1339 if (err != 0)
1340 break;
1341 }
1342 PUSH(x);
1343 }
1344 break;
1345
1346 case BUILD_MAP:
1347 x = newdictobject();
1348 PUSH(x);
1349 break;
1350
1351 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001352 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001354 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 DECREF(v);
1356 PUSH(x);
1357 break;
1358
1359 case COMPARE_OP:
1360 w = POP();
1361 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001362 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 DECREF(v);
1364 DECREF(w);
1365 PUSH(x);
1366 break;
1367
1368 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001370 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371 if (x == NULL) {
1372 err_setstr(ImportError,
1373 "__import__ not found");
1374 break;
1375 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001376 if (is_methodobject(x)) {
1377 u = None;
1378 INCREF(u);
1379 }
1380 else {
1381 u = find_from_args(f, INSTR_OFFSET());
1382 if (u == NULL) {
1383 x = u;
1384 break;
1385 }
1386 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001387 w = mkvalue("(OOOO)",
1388 w,
1389 f->f_globals,
1390 f->f_locals == NULL ? None : f->f_locals,
1391 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001392 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001393 if (w == NULL) {
1394 x = NULL;
1395 break;
1396 }
1397 x = call_object(x, w);
1398 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001399 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 break;
1401
1402 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001403 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001404 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001405 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001406 if ((x = f->f_locals) == NULL) {
1407 err_setstr(SystemError, "no locals");
1408 break;
1409 }
1410 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001411 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001413
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001414#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001415 case ACCESS_MODE:
1416 v = POP();
1417 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001418 if (getstringvalue(w)[0] == '*')
1419 defmode = getintvalue(v);
1420 else
1421 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001422 DECREF(v);
1423 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001424#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001425
1426 case JUMP_FORWARD:
1427 JUMPBY(oparg);
1428 break;
1429
1430 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001431 err = testbool(TOP());
1432 if (err > 0)
1433 err = 0;
1434 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 JUMPBY(oparg);
1436 break;
1437
1438 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001439 err = testbool(TOP());
1440 if (err > 0) {
1441 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001443 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 break;
1445
1446 case JUMP_ABSOLUTE:
1447 JUMPTO(oparg);
1448 break;
1449
1450 case FOR_LOOP:
1451 /* for v in s: ...
1452 On entry: stack contains s, i.
1453 On exit: stack contains s, i+1, s[i];
1454 but if loop exhausted:
1455 s, i are popped, and we jump */
1456 w = POP(); /* Loop index */
1457 v = POP(); /* Sequence object */
1458 u = loop_subscript(v, w);
1459 if (u != NULL) {
1460 PUSH(v);
1461 x = newintobject(getintvalue(w)+1);
1462 PUSH(x);
1463 DECREF(w);
1464 PUSH(u);
1465 }
1466 else {
1467 DECREF(v);
1468 DECREF(w);
1469 /* A NULL can mean "s exhausted"
1470 but also an error: */
1471 if (err_occurred())
1472 why = WHY_EXCEPTION;
1473 else
1474 JUMPBY(oparg);
1475 }
1476 break;
1477
1478 case SETUP_LOOP:
1479 case SETUP_EXCEPT:
1480 case SETUP_FINALLY:
1481 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1482 STACK_LEVEL());
1483 break;
1484
1485 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001486#ifdef LLTRACE
1487 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001488 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001490 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001491 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001492 /* Trace each line of code reached */
1493 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001494 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001495 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001496 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001498
1499 case CALL_FUNCTION:
1500 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001501 int na = oparg & 0xff;
1502 int nk = (oparg>>8) & 0xff;
1503 int n = na + 2*nk;
1504 object **pfunc = stack_pointer - n - 1;
1505 object *func = *pfunc;
1506 object *self = NULL;
1507 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001508 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 if (is_instancemethodobject(func)) {
1510 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001511 class = instancemethodgetclass(func);
1512 func = instancemethodgetfunc(func);
1513 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001514 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001515 INCREF(self);
1516 DECREF(*pfunc);
1517 *pfunc = self;
1518 na++;
1519 n++;
1520 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001521 else {
1522 /* Unbound methods must be
1523 called with an instance of
1524 the class (or a derived
1525 class) as first argument */
1526 if (na > 0 &&
1527 (self = stack_pointer[-n])
1528 != NULL &&
1529 is_instanceobject(self) &&
1530 issubclass(
1531 (object *)
1532 (((instanceobject *)self)
1533 ->in_class),
1534 class))
1535 /* Handy-dandy */ ;
1536 else {
1537 err_setstr(TypeError,
1538 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001539 x = NULL;
1540 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 }
1542 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001543 }
1544 else
1545 INCREF(func);
1546 if (is_funcobject(func)) {
1547 object *co = getfunccode(func);
1548 object *globals = getfuncglobals(func);
1549 object *argdefs = PyFunction_GetDefaults(func);
1550 object **d;
1551 int nd;
1552 if (argdefs != NULL) {
1553 d = &GETTUPLEITEM(argdefs, 0);
1554 nd = ((tupleobject *)argdefs)->ob_size;
1555 }
1556 else {
1557 d = NULL;
1558 nd = 0;
1559 }
1560 x = eval_code2(
1561 (codeobject *)co,
1562 globals, (object *)NULL,
1563 stack_pointer-n, na,
1564 stack_pointer-2*nk, nk,
1565 d, nd,
1566 class);
1567 }
1568 else {
1569 object *args = newtupleobject(na);
1570 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001571 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001573 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001574 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001575 if (nk > 0) {
1576 kwdict = newdictobject();
1577 if (kwdict == NULL) {
1578 x = NULL;
1579 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001581 err = 0;
1582 while (--nk >= 0) {
1583 object *value = POP();
1584 object *key = POP();
1585 err = mappinginsert(
1586 kwdict, key, value);
1587 if (err) {
1588 DECREF(key);
1589 DECREF(value);
1590 break;
1591 }
1592 }
1593 if (err) {
1594 DECREF(args);
1595 DECREF(kwdict);
1596 break;
1597 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001598 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001599 while (--na >= 0) {
1600 w = POP();
1601 SETTUPLEITEM(args, na, w);
1602 }
1603 x = PyEval_CallObjectWithKeywords(
1604 func, args, kwdict);
1605 DECREF(args);
1606 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001607 }
1608 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609 while (stack_pointer > pfunc) {
1610 w = POP();
1611 DECREF(w);
1612 }
1613 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001614 break;
1615 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001616
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617 case MAKE_FUNCTION:
1618 v = POP(); /* code object */
1619 x = newfuncobject(v, f->f_globals);
1620 DECREF(v);
1621 /* XXX Maybe this should be a separate opcode? */
1622 if (x != NULL && oparg > 0) {
1623 v = newtupleobject(oparg);
1624 if (v == NULL) {
1625 DECREF(x);
1626 x = NULL;
1627 break;
1628 }
1629 while (--oparg >= 0) {
1630 w = POP();
1631 SETTUPLEITEM(v, oparg, w);
1632 }
1633 err = PyFunction_SetDefaults(x, v);
1634 DECREF(v);
1635 }
1636 PUSH(x);
1637 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001638
1639 case BUILD_SLICE:
1640 if (oparg == 3)
1641 w = POP();
1642 else
1643 w = NULL;
1644 v = POP();
1645 u = POP();
1646 x = build_slice(u,v,w);
1647 DECREF(u);
1648 DECREF(v);
1649 XDECREF(w);
1650 PUSH(x);
1651 break;
1652
1653
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 default:
1655 fprintf(stderr,
1656 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001657 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 why = WHY_EXCEPTION;
1660 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001661
1662#ifdef CASE_TOO_BIG
1663 }
1664#endif
1665
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 } /* switch */
1667
1668 on_error:
1669
1670 /* Quickly continue if no error occurred */
1671
1672 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 if (err == 0 && x != NULL) {
1674#ifdef CHECKEXC
1675 if (err_occurred())
1676 fprintf(stderr,
1677 "XXX undetected error\n");
1678 else
1679#endif
1680 continue; /* Normal, fast path */
1681 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 why = WHY_EXCEPTION;
1683 x = None;
1684 err = 0;
1685 }
1686
Guido van Rossum801dcae1992-04-08 11:32:32 +00001687#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 /* Double-check exception status */
1689
1690 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1691 if (!err_occurred()) {
1692 fprintf(stderr, "XXX ghost error\n");
1693 err_setstr(SystemError, "ghost error");
1694 why = WHY_EXCEPTION;
1695 }
1696 }
1697 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001698 if (err_occurred()) {
1699 fprintf(stderr,
1700 "XXX undetected error (why=%d)\n",
1701 why);
1702 why = WHY_EXCEPTION;
1703 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 }
1705#endif
1706
1707 /* Log traceback info if this is a real exception */
1708
1709 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001710 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001712 f->f_lasti -= 2;
1713 tb_here(f);
1714
Guido van Rossume59214e1994-08-30 08:01:59 +00001715 if (f->f_trace)
1716 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001717 if (sys_profile)
1718 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 }
1720
1721 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1722
1723 if (why == WHY_RERAISE)
1724 why = WHY_EXCEPTION;
1725
1726 /* Unwind stacks if a (pseudo) exception occurred */
1727
1728 while (why != WHY_NOT && f->f_iblock > 0) {
1729 block *b = pop_block(f);
1730 while (STACK_LEVEL() > b->b_level) {
1731 v = POP();
1732 XDECREF(v);
1733 }
1734 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1735 why = WHY_NOT;
1736 JUMPTO(b->b_handler);
1737 break;
1738 }
1739 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001740 (b->b_type == SETUP_EXCEPT &&
1741 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001743 object *exc, *val, *tb;
1744 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 if (val == NULL) {
1746 val = None;
1747 INCREF(val);
1748 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 /* Make the raw exception data
1750 available to the handler,
1751 so a program can emulate the
1752 Python main loop. Don't do
1753 this for 'finally'. */
1754 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001755 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 sysset("exc_value", val);
1757 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001759 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001760 PUSH(val);
1761 PUSH(exc);
1762 }
1763 else {
1764 if (why == WHY_RETURN)
1765 PUSH(retval);
1766 v = newintobject((long)why);
1767 PUSH(v);
1768 }
1769 why = WHY_NOT;
1770 JUMPTO(b->b_handler);
1771 break;
1772 }
1773 } /* unwind stack */
1774
1775 /* End the loop if we still have an error (or return) */
1776
1777 if (why != WHY_NOT)
1778 break;
1779
1780 } /* main loop */
1781
1782 /* Pop remaining stack entries */
1783
1784 while (!EMPTY()) {
1785 v = POP();
1786 XDECREF(v);
1787 }
1788
Guido van Rossum96a42c81992-01-12 02:29:51 +00001789 if (why != WHY_RETURN)
1790 retval = NULL;
1791
Guido van Rossume59214e1994-08-30 08:01:59 +00001792 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001793 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001794 if (call_trace(&f->f_trace, &f->f_trace, f,
1795 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001796 XDECREF(retval);
1797 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001798 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001799 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001800 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001801 }
1802
1803 if (sys_profile && why == WHY_RETURN) {
1804 if (call_trace(&sys_profile, (object**)0,
1805 f, "return", retval)) {
1806 XDECREF(retval);
1807 retval = NULL;
1808 why = WHY_EXCEPTION;
1809 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001810 }
1811
Guido van Rossum374a9221991-04-04 10:40:29 +00001812 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001813
Guido van Rossum374a9221991-04-04 10:40:29 +00001814 current_frame = f->f_back;
1815 DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +00001816 --recursion_depth;
Guido van Rossum374a9221991-04-04 10:40:29 +00001817
Guido van Rossum96a42c81992-01-12 02:29:51 +00001818 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001819}
1820
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001821/* Logic for the raise statement (too complicated for inlining).
1822 This *consumes* a reference count to each of its arguments. */
1823static int
1824do_raise(type, value, tb)
1825 object *type, *value, *tb;
1826{
1827 /* We support the following forms of raise:
1828 raise <class>, <classinstance>
1829 raise <class>, <argument tuple>
1830 raise <class>, None
1831 raise <class>, <argument>
1832 raise <classinstance>, None
1833 raise <string>, <object>
1834 raise <string>, None
1835
1836 An omitted second argument is the same as None.
1837
1838 In addition, raise <tuple>, <anything> is the same as
1839 raising the tuple's first item (and it better have one!);
1840 this rule is applied recursively.
1841
1842 Finally, an optional third argument can be supplied, which
1843 gives the traceback to be substituted (useful when
1844 re-raising an exception after examining it). */
1845
1846 /* First, check the traceback argument, replacing None with
1847 NULL. */
1848 if (tb == None) {
1849 DECREF(tb);
1850 tb = NULL;
1851 }
1852 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1853 err_setstr(TypeError,
1854 "raise 3rd arg must be traceback or None");
1855 goto raise_error;
1856 }
1857
1858 /* Next, replace a missing value with None */
1859 if (value == NULL) {
1860 value = None;
1861 INCREF(value);
1862 }
1863
1864 /* Next, repeatedly, replace a tuple exception with its first item */
1865 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1866 object *tmp = type;
1867 type = GETTUPLEITEM(type, 0);
1868 INCREF(type);
1869 DECREF(tmp);
1870 }
1871
1872 /* Now switch on the exception's type */
1873 if (is_stringobject(type)) {
1874 ;
1875 }
1876 else if (is_classobject(type)) {
1877 /* Raising a class. If the value is an instance, it
1878 better be an instance of the class. If it is not,
1879 it will be used to create an instance. */
1880 if (is_instanceobject(value)) {
1881 object *inclass = (object*)
1882 (((instanceobject*)value)->in_class);
1883 if (!issubclass(inclass, type)) {
1884 err_setstr(TypeError,
1885 "raise <class>, <instance> requires that <instance> is a member of <class>");
1886 goto raise_error;
1887 }
1888 }
1889 else {
1890 /* Go instantiate the class */
1891 object *args, *res;
1892 if (value == None)
1893 args = mkvalue("()");
1894 else if (is_tupleobject(value)) {
1895 INCREF(value);
1896 args = value;
1897 }
1898 else
1899 args = mkvalue("(O)", value);
1900 if (args == NULL)
1901 goto raise_error;
1902 res = call_object(type, args);
1903 DECREF(args);
1904 if (res == NULL)
1905 goto raise_error;
1906 DECREF(value);
1907 value = res;
1908 }
1909 }
1910 else if (is_instanceobject(type)) {
1911 /* Raising an instance. The value should be a dummy. */
1912 if (value != None) {
1913 err_setstr(TypeError,
1914 "instance exception may not have a separate value");
1915 goto raise_error;
1916 }
1917 else {
1918 /* Normalize to raise <class>, <instance> */
1919 DECREF(value);
1920 value = type;
1921 type = (object*) ((instanceobject*)type)->in_class;
1922 INCREF(type);
1923 }
1924 }
1925 else {
1926 /* Not something you can raise. You get an exception
1927 anyway, just not what you specified :-) */
1928 err_setstr(TypeError,
1929 "exceptions must be strings, classes, or instances");
1930 goto raise_error;
1931 }
1932 err_restore(type, value, tb);
1933 if (tb == NULL)
1934 return WHY_EXCEPTION;
1935 else
1936 return WHY_RERAISE;
1937 raise_error:
1938 XDECREF(value);
1939 XDECREF(type);
1940 XDECREF(tb);
1941 return WHY_EXCEPTION;
1942}
1943
Guido van Rossum96a42c81992-01-12 02:29:51 +00001944#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001945static int
1946prtrace(v, str)
1947 object *v;
1948 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001949{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001951 if (printobject(v, stdout, 0) != 0)
1952 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001957static void
1958call_exc_trace(p_trace, p_newtrace, f)
1959 object **p_trace, **p_newtrace;
1960 frameobject *f;
1961{
1962 object *type, *value, *traceback, *arg;
1963 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001964 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001965 if (value == NULL) {
1966 value = None;
1967 INCREF(value);
1968 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969 arg = mkvalue("(OOO)", type, value, traceback);
1970 if (arg == NULL) {
1971 err_restore(type, value, traceback);
1972 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001973 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1975 DECREF(arg);
1976 if (err == 0)
1977 err_restore(type, value, traceback);
1978 else {
1979 XDECREF(type);
1980 XDECREF(value);
1981 XDECREF(traceback);
1982 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001983}
1984
1985static int
1986call_trace(p_trace, p_newtrace, f, msg, arg)
1987 object **p_trace; /* in/out; may not be NULL;
1988 may not point to NULL variable initially */
1989 object **p_newtrace; /* in/out; may be NULL;
1990 may point to NULL variable;
1991 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001992 frameobject *f;
1993 char *msg;
1994 object *arg;
1995{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001996 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001997 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001998 static int tracing = 0;
1999
2000 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002001 /* Don't do recursive traces */
2002 if (p_newtrace) {
2003 XDECREF(*p_newtrace);
2004 *p_newtrace = NULL;
2005 }
2006 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002007 }
2008
Guido van Rossumf10570b1995-07-07 22:53:21 +00002009 args = newtupleobject(3);
2010 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002011 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002012 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002013 if (what == NULL)
2014 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002015 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002016 SETTUPLEITEM(args, 0, (object *)f);
2017 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002018 if (arg == NULL)
2019 arg = None;
2020 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002021 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002022 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00002023 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002024 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00002025 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002026 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002027 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002028 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002029 if (res == NULL) {
2030 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002031 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00002032 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002033 *p_trace = NULL;
2034 if (p_newtrace) {
2035 XDECREF(*p_newtrace);
2036 *p_newtrace = NULL;
2037 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002038 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002039 }
2040 else {
2041 if (p_newtrace) {
2042 XDECREF(*p_newtrace);
2043 if (res == None)
2044 *p_newtrace = NULL;
2045 else {
2046 INCREF(res);
2047 *p_newtrace = res;
2048 }
2049 }
2050 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002051 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002052 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002053}
2054
Guido van Rossum3f5da241990-12-20 15:06:42 +00002055object *
Guido van Rossum6135a871995-01-09 17:53:26 +00002056getbuiltins()
2057{
2058 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00002059 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00002060 else
2061 return current_frame->f_builtins;
2062}
2063
2064object *
Guido van Rossum5b722181993-03-30 17:46:03 +00002065getlocals()
2066{
2067 if (current_frame == NULL)
2068 return NULL;
2069 fast_2_locals(current_frame);
2070 return current_frame->f_locals;
2071}
2072
2073object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002074getglobals()
2075{
2076 if (current_frame == NULL)
2077 return NULL;
2078 else
2079 return current_frame->f_globals;
2080}
2081
Guido van Rossum81daa321993-05-20 14:24:46 +00002082object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002083getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00002084{
2085 if (current_frame == NULL)
2086 return NULL;
2087 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002088 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00002089}
2090
Guido van Rossume59214e1994-08-30 08:01:59 +00002091object *
2092getframe()
2093{
2094 return (object *)current_frame;
2095}
2096
Guido van Rossum6135a871995-01-09 17:53:26 +00002097int
2098getrestricted()
2099{
2100 return current_frame == NULL ? 0 : current_frame->f_restricted;
2101}
2102
Guido van Rossum3f5da241990-12-20 15:06:42 +00002103void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104flushline()
2105{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002106 object *f = sysget("stdout");
2107 if (softspace(f, 0))
2108 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109}
2110
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111
Guido van Rossum06186511995-01-07 12:40:10 +00002112#define BINOP(opname, ropname, thisfunc) \
2113 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2114 ; \
2115 else \
2116 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002117
2118
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002120or(v, w)
2121 object *v, *w;
2122{
Guido van Rossum06186511995-01-07 12:40:10 +00002123 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002124 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002125 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002126 object * (*f) FPROTO((object *, object *));
2127 if (coerce(&v, &w) != 0)
2128 return NULL;
2129 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2130 x = (*f)(v, w);
2131 DECREF(v);
2132 DECREF(w);
2133 if (f != NULL)
2134 return x;
2135 }
2136 err_setstr(TypeError, "bad operand type(s) for |");
2137 return NULL;
2138}
2139
2140static object *
2141xor(v, w)
2142 object *v, *w;
2143{
Guido van Rossum06186511995-01-07 12:40:10 +00002144 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002145 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002146 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002147 object * (*f) FPROTO((object *, object *));
2148 if (coerce(&v, &w) != 0)
2149 return NULL;
2150 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2151 x = (*f)(v, w);
2152 DECREF(v);
2153 DECREF(w);
2154 if (f != NULL)
2155 return x;
2156 }
2157 err_setstr(TypeError, "bad operand type(s) for ^");
2158 return NULL;
2159}
2160
2161static object *
2162and(v, w)
2163 object *v, *w;
2164{
Guido van Rossum06186511995-01-07 12:40:10 +00002165 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002166 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002167 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002168 object * (*f) FPROTO((object *, object *));
2169 if (coerce(&v, &w) != 0)
2170 return NULL;
2171 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2172 x = (*f)(v, w);
2173 DECREF(v);
2174 DECREF(w);
2175 if (f != NULL)
2176 return x;
2177 }
2178 err_setstr(TypeError, "bad operand type(s) for &");
2179 return NULL;
2180}
2181
2182static object *
2183lshift(v, w)
2184 object *v, *w;
2185{
Guido van Rossum06186511995-01-07 12:40:10 +00002186 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002187 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002188 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002189 object * (*f) FPROTO((object *, object *));
2190 if (coerce(&v, &w) != 0)
2191 return NULL;
2192 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2193 x = (*f)(v, w);
2194 DECREF(v);
2195 DECREF(w);
2196 if (f != NULL)
2197 return x;
2198 }
2199 err_setstr(TypeError, "bad operand type(s) for <<");
2200 return NULL;
2201}
2202
2203static object *
2204rshift(v, w)
2205 object *v, *w;
2206{
Guido van Rossum06186511995-01-07 12:40:10 +00002207 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002208 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002209 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002210 object * (*f) FPROTO((object *, object *));
2211 if (coerce(&v, &w) != 0)
2212 return NULL;
2213 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2214 x = (*f)(v, w);
2215 DECREF(v);
2216 DECREF(w);
2217 if (f != NULL)
2218 return x;
2219 }
2220 err_setstr(TypeError, "bad operand type(s) for >>");
2221 return NULL;
2222}
2223
2224static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002225add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 object *v, *w;
2227{
Guido van Rossum06186511995-01-07 12:40:10 +00002228 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002229 if (v->ob_type->tp_as_sequence != NULL)
2230 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2231 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002232 object *x;
2233 if (coerce(&v, &w) != 0)
2234 return NULL;
2235 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2236 DECREF(v);
2237 DECREF(w);
2238 return x;
2239 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002240 err_setstr(TypeError, "bad operand type(s) for +");
2241 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002242}
2243
2244static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002245sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002246 object *v, *w;
2247{
Guido van Rossum06186511995-01-07 12:40:10 +00002248 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002249 if (v->ob_type->tp_as_number != NULL) {
2250 object *x;
2251 if (coerce(&v, &w) != 0)
2252 return NULL;
2253 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2254 DECREF(v);
2255 DECREF(w);
2256 return x;
2257 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002258 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 return NULL;
2260}
2261
2262static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002263mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 object *v, *w;
2265{
2266 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002267 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002268 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002269 if (tp->tp_as_number != NULL &&
2270 w->ob_type->tp_as_sequence != NULL &&
2271 !is_instanceobject(v)) {
2272 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273 object *tmp = v;
2274 v = w;
2275 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002276 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002278 if (tp->tp_as_number != NULL) {
2279 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002280 if (is_instanceobject(v)) {
2281 /* Instances of user-defined classes get their
2282 other argument uncoerced, so they may
2283 implement sequence*number as well as
2284 number*number. */
2285 INCREF(v);
2286 INCREF(w);
2287 }
2288 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002289 return NULL;
2290 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2291 DECREF(v);
2292 DECREF(w);
2293 return x;
2294 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 if (tp->tp_as_sequence != NULL) {
2296 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002297 err_setstr(TypeError,
2298 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 return NULL;
2300 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002301 return (*tp->tp_as_sequence->sq_repeat)
2302 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 return NULL;
2306}
2307
2308static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002309divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 object *v, *w;
2311{
Guido van Rossum06186511995-01-07 12:40:10 +00002312 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002313 if (v->ob_type->tp_as_number != NULL) {
2314 object *x;
2315 if (coerce(&v, &w) != 0)
2316 return NULL;
2317 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2318 DECREF(v);
2319 DECREF(w);
2320 return x;
2321 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002322 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 return NULL;
2324}
2325
2326static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002327mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 object *v, *w;
2329{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002330 if (is_stringobject(v)) {
2331 return formatstring(v, w);
2332 }
Guido van Rossum06186511995-01-07 12:40:10 +00002333 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002334 if (v->ob_type->tp_as_number != NULL) {
2335 object *x;
2336 if (coerce(&v, &w) != 0)
2337 return NULL;
2338 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2339 DECREF(v);
2340 DECREF(w);
2341 return x;
2342 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 return NULL;
2345}
2346
2347static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002348powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002349 object *v, *w;
2350{
2351 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002352 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002353 if (v->ob_type->tp_as_number == NULL ||
2354 w->ob_type->tp_as_number == NULL) {
2355 err_setstr(TypeError, "pow() requires numeric arguments");
2356 return NULL;
2357 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002358 if (coerce(&v, &w) != 0)
2359 return NULL;
2360 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2361 DECREF(v);
2362 DECREF(w);
2363 return res;
2364}
2365
2366static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002367neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 object *v;
2369{
2370 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 return (*v->ob_type->tp_as_number->nb_negative)(v);
2372 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 return NULL;
2374}
2375
2376static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 object *v;
2379{
2380 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 return (*v->ob_type->tp_as_number->nb_positive)(v);
2382 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 return NULL;
2384}
2385
2386static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002387invert(v)
2388 object *v;
2389{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002390 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002391 if (v->ob_type->tp_as_number != NULL &&
2392 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2393 return (*f)(v);
2394 err_setstr(TypeError, "bad operand type(s) for unary ~");
2395 return NULL;
2396}
2397
2398static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002399not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 object *v;
2401{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002402 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002403 object *w;
2404 if (outcome < 0)
2405 return NULL;
2406 if (outcome == 0)
2407 w = True;
2408 else
2409 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002410 INCREF(w);
2411 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412}
Guido van Rossum234f9421993-06-17 12:35:49 +00002413
2414
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415/* External interface to call any callable object.
2416 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002417
2418object *
2419call_object(func, arg)
2420 object *func;
2421 object *arg;
2422{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2424}
Guido van Rossume59214e1994-08-30 08:01:59 +00002425
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426object *
2427PyEval_CallObjectWithKeywords(func, arg, kw)
2428 object *func;
2429 object *arg;
2430 object *kw;
2431{
2432 ternaryfunc call;
2433 object *result;
2434
2435 if (arg == NULL)
2436 arg = newtupleobject(0);
2437 else if (!is_tupleobject(arg)) {
2438 err_setstr(TypeError, "argument list must be a tuple");
2439 return NULL;
2440 }
2441 else
2442 INCREF(arg);
2443
Guido van Rossume3e61c11995-08-04 04:14:47 +00002444 if (kw != NULL && !is_dictobject(kw)) {
2445 err_setstr(TypeError, "keyword list must be a dictionary");
2446 return NULL;
2447 }
2448
Guido van Rossum150b2df1996-12-05 23:17:11 +00002449 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 result = (*call)(func, arg, kw);
2451 else if (is_instancemethodobject(func) || is_funcobject(func))
2452 result = call_function(func, arg, kw);
2453 else
2454 result = call_builtin(func, arg, kw);
2455
2456 DECREF(arg);
2457
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002458 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002459 err_setstr(SystemError,
2460 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002461
2462 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002463}
2464
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002466call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002468 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002469 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 if (is_methodobject(func)) {
2472 method meth = getmethod(func);
2473 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002474 int flags = getflags(func);
2475 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002476 int size = gettuplesize(arg);
2477 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002478 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002479 else if (size == 0)
2480 arg = NULL;
2481 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002482 if (flags & METH_KEYWORDS)
2483 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002484 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002485 err_setstr(TypeError,
2486 "this function takes no keyword arguments");
2487 return NULL;
2488 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002489 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
2491 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002492 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002494 if (is_instanceobject(func)) {
2495 object *res, *call = getattr(func,"__call__");
2496 if (call == NULL) {
2497 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002498 err_setstr(AttributeError,
2499 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002500 return NULL;
2501 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002502 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002503 DECREF(call);
2504 return res;
2505 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 return NULL;
2508}
2509
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002511call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002513 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002514 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002516 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002517 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002518 object **d, **k;
2519 int nk, nd;
2520 object *result;
2521
2522 if (kw != NULL && !is_dictobject(kw)) {
2523 err_badcall();
2524 return NULL;
2525 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526
Guido van Rossume8122f11991-05-05 20:03:07 +00002527 if (is_instancemethodobject(func)) {
2528 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002529 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002530 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002531 if (self == NULL) {
2532 /* Unbound methods must be called with an instance of
2533 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002534 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002535 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002536 if (self != NULL &&
2537 is_instanceobject(self) &&
2538 issubclass((object *)
2539 (((instanceobject *)self)->in_class),
2540 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002541 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002542 else
2543 self = NULL;
2544 }
2545 if (self == NULL) {
2546 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002547 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002548 return NULL;
2549 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002550 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002551 }
2552 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002553 int argcount = gettuplesize(arg);
2554 object *newarg = newtupleobject(argcount + 1);
2555 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002556 if (newarg == NULL)
2557 return NULL;
2558 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002559 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002560 for (i = 0; i < argcount; i++) {
2561 object *v = GETTUPLEITEM(arg, i);
2562 XINCREF(v);
2563 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002564 }
2565 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 }
2567 }
2568 else {
2569 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 return NULL;
2572 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002573 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002575
2576 argdefs = PyFunction_GetDefaults(func);
2577 if (argdefs != NULL && is_tupleobject(argdefs)) {
2578 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2579 nd = gettuplesize(argdefs);
2580 }
2581 else {
2582 d = NULL;
2583 nd = 0;
2584 }
2585
2586 if (kw != NULL) {
2587 int pos, i;
2588 nk = getmappingsize(kw);
2589 k = NEW(object *, 2*nk);
2590 if (k == NULL) {
2591 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002592 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002593 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002594 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002595 pos = i = 0;
2596 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2597 i += 2;
2598 nk = i/2;
2599 /* XXX This is broken if the caller deletes dict items! */
2600 }
2601 else {
2602 k = NULL;
2603 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002604 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605
Guido van Rossum681d79a1995-07-18 14:51:37 +00002606 result = eval_code2(
2607 (codeobject *)getfunccode(func),
2608 getfuncglobals(func), (object *)NULL,
2609 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2610 k, nk,
2611 d, nd,
2612 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613
Guido van Rossum681d79a1995-07-18 14:51:37 +00002614 DECREF(arg);
2615 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616
Guido van Rossum681d79a1995-07-18 14:51:37 +00002617 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618}
2619
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002620#define SLICE_ERROR_MSG \
2621 "standard sequence type does not support step size other than one"
2622
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002624apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 object *v, *w;
2626{
2627 typeobject *tp = v->ob_type;
2628 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002629 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 return NULL;
2631 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002632 if (tp->tp_as_mapping != NULL) {
2633 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2634 }
2635 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002637 if (!is_intobject(w)) {
2638 if (PySlice_Check(w)) {
2639 err_setstr(ValueError, SLICE_ERROR_MSG);
2640 } else {
2641 err_setstr(TypeError,
2642 "sequence subscript not int");
2643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 return NULL;
2645 }
2646 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002647 if (i < 0) {
2648 int len = (*tp->tp_as_sequence->sq_length)(v);
2649 if (len < 0)
2650 return NULL;
2651 i += len;
2652 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002653 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655}
2656
2657static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002658loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 object *v, *w;
2660{
2661 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002662 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 return NULL;
2666 }
2667 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002668 v = (*sq->sq_item)(v, i);
2669 if (v)
2670 return v;
2671 if (err_occurred() == IndexError)
2672 err_clear();
2673 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674}
2675
2676static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002677slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 object *v;
2679 int isize;
2680 int *pi;
2681{
2682 if (v != NULL) {
2683 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002684 err_setstr(TypeError, "slice index must be int");
2685 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 }
2687 *pi = getintvalue(v);
2688 if (*pi < 0)
2689 *pi += isize;
2690 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002691 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692}
2693
2694static object *
Guido van Rossum8861b741996-07-30 16:49:37 +00002695build_slice(u, v, w) /* u:v:w */
2696 object *u, *v, *w;
2697{
2698 return PySlice_New(u,v,w);
2699}
2700
2701static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002702apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 object *u, *v, *w;
2704{
2705 typeobject *tp = u->ob_type;
2706 int ilow, ihigh, isize;
2707 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002708 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 return NULL;
2710 }
2711 ilow = 0;
2712 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002713 if (isize < 0)
2714 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002715 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002717 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002719 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002720}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002721
2722static int
2723assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 object *w;
2725 object *key;
2726 object *v;
2727{
2728 typeobject *tp = w->ob_type;
2729 sequence_methods *sq;
2730 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002731 int (*func1)();
2732 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002733 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002734 (func1 = mp->mp_ass_subscript) != NULL) {
2735 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002736 }
2737 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002738 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002740 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002741 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002742 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002744 else {
2745 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002746 if (i < 0) {
2747 int len = (*sq->sq_length)(w);
2748 if (len < 0)
2749 return -1;
2750 i += len;
2751 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002752 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002753 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002756 err_setstr(TypeError,
2757 "can't assign to this subscripted object");
2758 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760}
2761
Guido van Rossum3f5da241990-12-20 15:06:42 +00002762static int
2763assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764 object *u, *v, *w, *x;
2765{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002766 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002768 if (sq == NULL) {
2769 err_setstr(TypeError, "assign to slice of non-sequence");
2770 return -1;
2771 }
2772 if (sq == NULL || sq->sq_ass_slice == NULL) {
2773 err_setstr(TypeError, "unassignable slice");
2774 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 }
2776 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002777 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002778 if (isize < 0)
2779 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002780 if (slice_index(v, isize, &ilow) != 0)
2781 return -1;
2782 if (slice_index(w, isize, &ihigh) != 0)
2783 return -1;
2784 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785}
2786
2787static int
2788cmp_exception(err, v)
2789 object *err, *v;
2790{
2791 if (is_tupleobject(v)) {
2792 int i, n;
2793 n = gettuplesize(v);
2794 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002795 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002796 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 return 1;
2798 }
2799 return 0;
2800 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002801 if (is_classobject(v) && is_classobject(err))
2802 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002803 return err == v;
2804}
2805
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806static int
2807cmp_member(v, w)
2808 object *v, *w;
2809{
Guido van Rossume59214e1994-08-30 08:01:59 +00002810 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811 object *x;
2812 sequence_methods *sq;
2813 /* Special case for char in string */
2814 if (is_stringobject(w)) {
2815 register char *s, *end;
2816 register char c;
2817 if (!is_stringobject(v) || getstringsize(v) != 1) {
2818 err_setstr(TypeError,
2819 "string member test needs char left operand");
2820 return -1;
2821 }
2822 c = getstringvalue(v)[0];
2823 s = getstringvalue(w);
2824 end = s + getstringsize(w);
2825 while (s < end) {
2826 if (c == *s++)
2827 return 1;
2828 }
2829 return 0;
2830 }
2831 sq = w->ob_type->tp_as_sequence;
2832 if (sq == NULL) {
2833 err_setstr(TypeError,
2834 "'in' or 'not in' needs sequence right argument");
2835 return -1;
2836 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002837 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002838 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002839 if (x == NULL) {
2840 if (err_occurred() == IndexError) {
2841 err_clear();
2842 break;
2843 }
2844 return -1;
2845 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002846 cmp = cmpobject(v, x);
2847 XDECREF(x);
2848 if (cmp == 0)
2849 return 1;
2850 }
2851 return 0;
2852}
2853
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002855cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002856 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 register object *v;
2858 register object *w;
2859{
2860 register int cmp;
2861 register int res = 0;
2862 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002863 case IS:
2864 case IS_NOT:
2865 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002866 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002867 res = !res;
2868 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869 case IN:
2870 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002871 res = cmp_member(v, w);
2872 if (res < 0)
2873 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002874 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002875 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 break;
2877 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002878 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 break;
2880 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002881 cmp = cmpobject(v, w);
2882 switch (op) {
2883 case LT: res = cmp < 0; break;
2884 case LE: res = cmp <= 0; break;
2885 case EQ: res = cmp == 0; break;
2886 case NE: res = cmp != 0; break;
2887 case GT: res = cmp > 0; break;
2888 case GE: res = cmp >= 0; break;
2889 /* XXX no default? (res is initialized to 0 though) */
2890 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 }
2892 v = res ? True : False;
2893 INCREF(v);
2894 return v;
2895}
2896
Guido van Rossum3f5da241990-12-20 15:06:42 +00002897static int
2898import_from(locals, v, name)
2899 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002900 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002901 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002902{
2903 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002904 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002905 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002906 return -1;
2907 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002908 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002909 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002910 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002911 object *name, *value;
2912 pos = 0;
2913 while (mappinggetnext(w, &pos, &name, &value)) {
2914 if (!is_stringobject(name) ||
2915 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002916 continue;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002917#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002918 if (is_accessobject(value)) {
2919 value = getaccessvalue(value, (object *)NULL);
2920 if (value == NULL) {
2921 err_clear();
2922 continue;
2923 }
2924 }
2925 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002926#endif
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002927 INCREF(value);
2928 err = dict2insert(locals, name, value);
2929 DECREF(value);
2930 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002932 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002933 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002934 }
2935 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002936 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002937 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002938 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002939 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002940 getstringvalue(name));
2941 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002942 return -1;
2943 }
2944 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002945 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002946 }
2947}
2948
2949static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002950build_class(methods, bases, name)
2951 object *methods; /* dictionary */
2952 object *bases; /* tuple containing classes */
2953 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002954{
Guido van Rossum25831651993-05-19 14:50:45 +00002955 int i;
2956 if (!is_tupleobject(bases)) {
2957 err_setstr(SystemError, "build_class with non-tuple bases");
2958 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002959 }
Guido van Rossum25831651993-05-19 14:50:45 +00002960 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002961 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002962 return NULL;
2963 }
Guido van Rossum25831651993-05-19 14:50:45 +00002964 if (!is_stringobject(name)) {
2965 err_setstr(SystemError, "build_class witn non-string name");
2966 return NULL;
2967 }
2968 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002969 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002970 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002971 /* Call the base's *type*, if it is callable.
2972 This code is a hook for Donald Beaudry's
2973 and Jim Fulton's type extensions. In
2974 unexended Python it will never be triggered
2975 since its types are not callable. */
2976 if (base->ob_type->ob_type->tp_call) {
2977 object *args;
2978 object *class;
2979 args = mkvalue("(OOO)", name, bases, methods);
2980 class = call_object((object *)base->ob_type,
2981 args);
2982 DECREF(args);
2983 return class;
2984 }
Guido van Rossum25831651993-05-19 14:50:45 +00002985 err_setstr(TypeError,
2986 "base is not a class object");
2987 return NULL;
2988 }
2989 }
2990 return newclassobject(bases, methods, name);
2991}
2992
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002993#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00002994static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00002995access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00002996 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002997 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00002998 frameobject *f;
2999{
Guido van Rossumb3f72581993-05-21 19:56:10 +00003000 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00003001 object *value, *ac;
3002 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003003 int ret;
3004 fast_2_locals(f);
3005 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003006 if (value && is_accessobject(value)) {
3007 err_setstr(AccessError, "can't override access");
3008 return -1;
3009 }
3010 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00003011 if (value != NULL && value != None)
3012 type = value->ob_type;
3013 else
3014 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003015 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00003016 if (ac == NULL)
3017 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003018 ret = mappinginsert(f->f_locals, name, ac);
3019 DECREF(ac);
3020 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00003021 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003022}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00003023#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003024
3025static int
3026exec_statement(prog, globals, locals)
3027 object *prog;
3028 object *globals;
3029 object *locals;
3030{
3031 char *s;
3032 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003033 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003034 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003035
3036 if (is_tupleobject(prog) && globals == None && locals == None &&
3037 ((n = gettuplesize(prog)) == 2 || n == 3)) {
3038 /* Backward compatibility hack */
3039 globals = gettupleitem(prog, 1);
3040 if (n == 3)
3041 locals = gettupleitem(prog, 2);
3042 prog = gettupleitem(prog, 0);
3043 }
3044 if (globals == None) {
3045 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003047 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003048 plain = 1;
3049 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003050 }
3051 else if (locals == None)
3052 locals = globals;
3053 if (!is_stringobject(prog) &&
3054 !is_codeobject(prog) &&
3055 !is_fileobject(prog)) {
3056 err_setstr(TypeError,
3057 "exec 1st arg must be string, code or file object");
3058 return -1;
3059 }
3060 if (!is_dictobject(globals) || !is_dictobject(locals)) {
3061 err_setstr(TypeError,
3062 "exec 2nd/3rd args must be dict or None");
3063 return -1;
3064 }
Guido van Rossum6135a871995-01-09 17:53:26 +00003065 if (dictlookup(globals, "__builtins__") == NULL)
3066 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003067 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003069 return -1;
3070 return 0;
3071 }
3072 if (is_fileobject(prog)) {
3073 FILE *fp = getfilefile(prog);
3074 char *name = getstringvalue(getfilename(prog));
3075 if (run_file(fp, name, file_input, globals, locals) == NULL)
3076 return -1;
3077 return 0;
3078 }
3079 s = getstringvalue(prog);
3080 if (strlen(s) != getstringsize(prog)) {
3081 err_setstr(ValueError, "embedded '\\0' in exec string");
3082 return -1;
3083 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003084 v = run_string(s, file_input, globals, locals);
3085 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003086 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003087 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003088 if (plain)
3089 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003090 return 0;
3091}
Guido van Rossum24c13741995-02-14 09:42:43 +00003092
Guido van Rossum681d79a1995-07-18 14:51:37 +00003093/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00003094static object *
3095find_from_args(f, nexti)
3096 frameobject *f;
3097 int nexti;
3098{
3099 int opcode;
3100 int oparg;
3101 object *list, *name;
3102 unsigned char *next_instr;
3103
3104 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
3105 opcode = (*next_instr++);
3106 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00003107 INCREF(None);
3108 return None;
3109 }
3110
3111 list = newlistobject(0);
3112 if (list == NULL)
3113 return NULL;
3114
3115 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003116 oparg = (next_instr[1]<<8) + next_instr[0];
3117 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00003118 name = Getnamev(f, oparg);
3119 if (addlistitem(list, name) < 0) {
3120 DECREF(list);
3121 break;
3122 }
3123 opcode = (*next_instr++);
3124 } while (opcode == IMPORT_FROM);
3125
3126 return list;
3127}