blob: ea71c97d035ba23ce2c5675499ba851c1396da9a [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 Rossum62f7d151997-01-17 21:05:28 +0000367#if 0
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000368#define CHECK_STACK(n) (STACK_LEVEL() + (n) < f->f_nvalues || \
369 (stack_pointer = extend_stack(f, STACK_LEVEL(), n)))
Guido van Rossum62f7d151997-01-17 21:05:28 +0000370#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000371
Guido van Rossum96a42c81992-01-12 02:29:51 +0000372#ifdef LLTRACE
373#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
374#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000375#else
376#define PUSH(v) BASIC_PUSH(v)
377#define POP() BASIC_POP()
378#endif
379
Guido van Rossum681d79a1995-07-18 14:51:37 +0000380/* Local variable macros */
381
382#define GETLOCAL(i) (fastlocals[i])
383#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
384 GETLOCAL(i) = value; } while (0)
385
Guido van Rossum8861b741996-07-30 16:49:37 +0000386#ifdef USE_STACKCHECK
387 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
388 err_setstr(MemoryError, "Stack overflow");
389 return NULL;
390 }
391#endif
392
Guido van Rossum681d79a1995-07-18 14:51:37 +0000393 if (globals == NULL) {
394 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000395 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000396 }
397
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000398#ifdef LLTRACE
399 lltrace = dictlookup(globals, "__lltrace__") != NULL;
400#endif
401
Guido van Rossum374a9221991-04-04 10:40:29 +0000402 f = newframeobject(
403 current_frame, /*back*/
404 co, /*code*/
405 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000406 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000407 if (f == NULL)
408 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000411
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412 if (co->co_nlocals > 0)
Guido van Rossum76836021997-01-20 04:26:20 +0000413 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414
415 if (co->co_argcount > 0 ||
416 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
417 int i;
418 int n = argcount;
419 object *kwdict = NULL;
420 if (co->co_flags & CO_VARKEYWORDS) {
421 kwdict = newmappingobject();
422 if (kwdict == NULL)
423 goto fail;
424 }
425 if (argcount > co->co_argcount) {
426 if (!(co->co_flags & CO_VARARGS)) {
427 err_setstr(TypeError, "too many arguments");
428 goto fail;
429 }
430 n = co->co_argcount;
431 }
432 for (i = 0; i < n; i++) {
433 x = args[i];
434 INCREF(x);
435 SETLOCAL(i, x);
436 }
437 if (co->co_flags & CO_VARARGS) {
438 u = newtupleobject(argcount - n);
439 for (i = n; i < argcount; i++) {
440 x = args[i];
441 INCREF(x);
442 SETTUPLEITEM(u, i-n, x);
443 }
444 SETLOCAL(co->co_argcount, u);
445 }
446 for (i = 0; i < kwcount; i++) {
447 object *keyword = kws[2*i];
448 object *value = kws[2*i + 1];
449 int j;
450 /* XXX slow -- speed up using dictionary? */
451 for (j = 0; j < co->co_argcount; j++) {
452 object *nm = GETTUPLEITEM(co->co_varnames, j);
453 if (cmpobject(keyword, nm) == 0)
454 break;
455 }
456 if (j >= co->co_argcount) {
457 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000458 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 goto fail;
460 }
461 mappinginsert(kwdict, keyword, value);
462 }
463 else {
464 if (GETLOCAL(j) != NULL) {
465 err_setstr(TypeError,
466 "keyword parameter redefined");
467 goto fail;
468 }
469 INCREF(value);
470 SETLOCAL(j, value);
471 }
472 }
473 if (argcount < co->co_argcount) {
474 int m = co->co_argcount - defcount;
475 for (i = argcount; i < m; i++) {
476 if (GETLOCAL(i) == NULL) {
477 err_setstr(TypeError,
478 "not enough arguments");
479 goto fail;
480 }
481 }
482 if (n > m)
483 i = n - m;
484 else
485 i = 0;
486 for (; i < defcount; i++) {
487 if (GETLOCAL(m+i) == NULL) {
488 object *def = defs[i];
489 INCREF(def);
490 SETLOCAL(m+i, def);
491 }
492 }
493 }
494 if (kwdict != NULL) {
495 i = co->co_argcount;
496 if (co->co_flags & CO_VARARGS)
497 i++;
498 SETLOCAL(i, kwdict);
499 }
500 if (0) {
501 fail:
502 XDECREF(kwdict);
503 goto fail2;
504 }
505 }
506 else {
507 if (argcount > 0 || kwcount > 0) {
508 err_setstr(TypeError, "no arguments expected");
509 fail2:
510 current_frame = f->f_back;
511 DECREF(f);
512 return NULL;
513 }
514 }
515
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000516 if (sys_trace != NULL) {
517 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000518 be called on *every* entry to a code block.
519 Its return value, if not None, is a function that
520 will be called at the start of each executed line
521 of code. (Actually, the function must return
522 itself in order to continue tracing.)
523 The trace functions are called with three arguments:
524 a pointer to the current frame, a string indicating
525 why the function is called, and an argument which
526 depends on the situation. The global trace function
527 (sys.trace) is also called whenever an exception
528 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 if (call_trace(&sys_trace, &f->f_trace, f, "call",
530 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000531 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000532 current_frame = f->f_back;
533 DECREF(f);
534 return NULL;
535 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000536 }
537
538 if (sys_profile != NULL) {
539 /* Similar for sys_profile, except it needn't return
540 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000541 if (call_trace(&sys_profile, (object**)0, f, "call",
542 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000543 current_frame = f->f_back;
544 DECREF(f);
545 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000546 }
547 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000548
Guido van Rossum8861b741996-07-30 16:49:37 +0000549 if (++recursion_depth > MAX_RECURSION_DEPTH) {
550 --recursion_depth;
551 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
552 current_frame = f->f_back;
553 DECREF(f);
554 return NULL;
555 }
556
Guido van Rossum374a9221991-04-04 10:40:29 +0000557 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000558 stack_pointer = f->f_valuestack;
559
Guido van Rossum374a9221991-04-04 10:40:29 +0000560 why = WHY_NOT;
561 err = 0;
562 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000563
564 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000565 /* Do periodic things.
566 Doing this every time through the loop would add
567 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 So we do it only every Nth instruction.
569
570 The ticker is reset to zero if there are pending
571 calls (see Py_AddPendingCalls() and
572 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000573
Guido van Rossum374a9221991-04-04 10:40:29 +0000574 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000575 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000576 if (pendingfirst != pendinglast) {
577 if (Py_MakePendingCalls() < 0) {
578 why = WHY_EXCEPTION;
579 goto on_error;
580 }
581 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000582 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000583 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 goto on_error;
585 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586
Guido van Rossume59214e1994-08-30 08:01:59 +0000587#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000588 if (interpreter_lock) {
589 /* Give another thread a chance */
590
591 current_frame = NULL;
592 release_lock(interpreter_lock);
593
594 /* Other threads may run now */
595
596 acquire_lock(interpreter_lock, 1);
597 current_frame = f;
598 }
599#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000601
Guido van Rossum374a9221991-04-04 10:40:29 +0000602 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000603
Guido van Rossum408027e1996-12-30 16:17:54 +0000604#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000605 f->f_lasti = INSTR_OFFSET();
606#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000607
608 opcode = NEXTOP();
609 if (HAS_ARG(opcode))
610 oparg = NEXTARG();
611
Guido van Rossum96a42c81992-01-12 02:29:51 +0000612#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000613 /* Instruction tracing */
614
Guido van Rossum96a42c81992-01-12 02:29:51 +0000615 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 if (HAS_ARG(opcode)) {
617 printf("%d: %d, %d\n",
618 (int) (INSTR_OFFSET() - 3),
619 opcode, oparg);
620 }
621 else {
622 printf("%d: %d\n",
623 (int) (INSTR_OFFSET() - 1), opcode);
624 }
625 }
626#endif
627
Guido van Rossum62f7d151997-01-17 21:05:28 +0000628#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000629 if (!CHECK_STACK(3)) {
630 x = NULL;
631 break;
632 }
Guido van Rossum62f7d151997-01-17 21:05:28 +0000633#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000634
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 /* Main switch on opcode */
636
637 switch (opcode) {
638
639 /* BEWARE!
640 It is essential that any operation that fails sets either
641 x to NULL, err to nonzero, or why to anything but WHY_NOT,
642 and that no operation that succeeds does this! */
643
644 /* case STOP_CODE: this is an error! */
645
646 case POP_TOP:
647 v = POP();
648 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000649 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000650
651 case ROT_TWO:
652 v = POP();
653 w = POP();
654 PUSH(v);
655 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000656 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000657
658 case ROT_THREE:
659 v = POP();
660 w = POP();
661 x = POP();
662 PUSH(v);
663 PUSH(x);
664 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000665 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000666
667 case DUP_TOP:
668 v = TOP();
669 INCREF(v);
670 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000671 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000672
673 case UNARY_POSITIVE:
674 v = POP();
675 x = pos(v);
676 DECREF(v);
677 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000678 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 break;
680
681 case UNARY_NEGATIVE:
682 v = POP();
683 x = neg(v);
684 DECREF(v);
685 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000686 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 break;
688
689 case UNARY_NOT:
690 v = POP();
691 x = not(v);
692 DECREF(v);
693 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000694 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 break;
696
697 case UNARY_CONVERT:
698 v = POP();
699 x = reprobject(v);
700 DECREF(v);
701 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000702 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000704
705 case UNARY_INVERT:
706 v = POP();
707 x = invert(v);
708 DECREF(v);
709 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000711 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000712
Guido van Rossum50564e81996-01-12 01:13:16 +0000713 case BINARY_POWER:
714 w = POP();
715 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000716 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000717 DECREF(v);
718 DECREF(w);
719 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000720 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000721 break;
722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 case BINARY_MULTIPLY:
724 w = POP();
725 v = POP();
726 x = mul(v, w);
727 DECREF(v);
728 DECREF(w);
729 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000730 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000731 break;
732
733 case BINARY_DIVIDE:
734 w = POP();
735 v = POP();
736 x = divide(v, w);
737 DECREF(v);
738 DECREF(w);
739 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000740 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000741 break;
742
743 case BINARY_MODULO:
744 w = POP();
745 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000746 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 DECREF(v);
748 DECREF(w);
749 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000750 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000751 break;
752
753 case BINARY_ADD:
754 w = POP();
755 v = POP();
756 x = add(v, w);
757 DECREF(v);
758 DECREF(w);
759 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000760 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 break;
762
763 case BINARY_SUBTRACT:
764 w = POP();
765 v = POP();
766 x = sub(v, w);
767 DECREF(v);
768 DECREF(w);
769 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000770 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 break;
772
773 case BINARY_SUBSCR:
774 w = POP();
775 v = POP();
776 x = apply_subscript(v, w);
777 DECREF(v);
778 DECREF(w);
779 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000780 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 break;
782
Guido van Rossum7928cd71991-10-24 14:59:31 +0000783 case BINARY_LSHIFT:
784 w = POP();
785 v = POP();
786 x = lshift(v, w);
787 DECREF(v);
788 DECREF(w);
789 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000790 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000791 break;
792
793 case BINARY_RSHIFT:
794 w = POP();
795 v = POP();
796 x = rshift(v, w);
797 DECREF(v);
798 DECREF(w);
799 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000800 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000801 break;
802
803 case BINARY_AND:
804 w = POP();
805 v = POP();
806 x = and(v, w);
807 DECREF(v);
808 DECREF(w);
809 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000810 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000811 break;
812
813 case BINARY_XOR:
814 w = POP();
815 v = POP();
816 x = xor(v, w);
817 DECREF(v);
818 DECREF(w);
819 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000820 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000821 break;
822
823 case BINARY_OR:
824 w = POP();
825 v = POP();
826 x = or(v, w);
827 DECREF(v);
828 DECREF(w);
829 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000830 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000831 break;
832
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 case SLICE+0:
834 case SLICE+1:
835 case SLICE+2:
836 case SLICE+3:
837 if ((opcode-SLICE) & 2)
838 w = POP();
839 else
840 w = NULL;
841 if ((opcode-SLICE) & 1)
842 v = POP();
843 else
844 v = NULL;
845 u = POP();
846 x = apply_slice(u, v, w);
847 DECREF(u);
848 XDECREF(v);
849 XDECREF(w);
850 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000851 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000852 break;
853
854 case STORE_SLICE+0:
855 case STORE_SLICE+1:
856 case STORE_SLICE+2:
857 case STORE_SLICE+3:
858 if ((opcode-STORE_SLICE) & 2)
859 w = POP();
860 else
861 w = NULL;
862 if ((opcode-STORE_SLICE) & 1)
863 v = POP();
864 else
865 v = NULL;
866 u = POP();
867 t = POP();
868 err = assign_slice(u, v, w, t); /* u[v:w] = t */
869 DECREF(t);
870 DECREF(u);
871 XDECREF(v);
872 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000873 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 break;
875
876 case DELETE_SLICE+0:
877 case DELETE_SLICE+1:
878 case DELETE_SLICE+2:
879 case DELETE_SLICE+3:
880 if ((opcode-DELETE_SLICE) & 2)
881 w = POP();
882 else
883 w = NULL;
884 if ((opcode-DELETE_SLICE) & 1)
885 v = POP();
886 else
887 v = NULL;
888 u = POP();
889 err = assign_slice(u, v, w, (object *)NULL);
890 /* del u[v:w] */
891 DECREF(u);
892 XDECREF(v);
893 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000894 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000895 break;
896
897 case STORE_SUBSCR:
898 w = POP();
899 v = POP();
900 u = POP();
901 /* v[w] = u */
902 err = assign_subscript(v, w, u);
903 DECREF(u);
904 DECREF(v);
905 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000906 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 break;
908
909 case DELETE_SUBSCR:
910 w = POP();
911 v = POP();
912 /* del v[w] */
913 err = assign_subscript(v, w, (object *)NULL);
914 DECREF(v);
915 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000916 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 break;
918
919 case PRINT_EXPR:
920 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000922 /* Before printing, also assign to '_' */
923 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000924 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000925 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000927 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000928 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000929 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 flushline();
931 }
932 DECREF(v);
933 break;
934
935 case PRINT_ITEM:
936 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000937 w = sysget("stdout");
938 if (softspace(w, 1))
939 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000940 err = writeobject(v, w, PRINT_RAW);
941 if (err == 0 && is_stringobject(v)) {
942 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 char *s = getstringvalue(v);
944 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000945 if (len > 0 &&
946 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000947 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000948 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000951 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 break;
953
954 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000955 x = sysget("stdout");
956 if (x == NULL)
957 err_setstr(RuntimeError, "lost sys.stdout");
958 else {
959 writestring("\n", x);
960 softspace(x, 0);
961 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000962 break;
963
964 case BREAK_LOOP:
965 why = WHY_BREAK;
966 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000967
Guido van Rossumf10570b1995-07-07 22:53:21 +0000968 case RAISE_VARARGS:
969 u = v = w = NULL;
970 switch (oparg) {
971 case 3:
972 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000973 /* Fallthrough */
974 case 2:
975 v = POP(); /* value */
976 /* Fallthrough */
977 case 1:
978 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000979 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000980 break;
981 default:
982 err_setstr(SystemError,
983 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000984 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000985 break;
986 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000987 break;
988
989 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000990 if ((x = f->f_locals) == NULL) {
991 err_setstr(SystemError, "no locals");
992 break;
993 }
994 INCREF(x);
995 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 break;
997
998 case RETURN_VALUE:
999 retval = POP();
1000 why = WHY_RETURN;
1001 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001002
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001003 case EXEC_STMT:
1004 w = POP();
1005 v = POP();
1006 u = POP();
1007 err = exec_statement(u, v, w);
1008 DECREF(u);
1009 DECREF(v);
1010 DECREF(w);
1011 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001012
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 case POP_BLOCK:
1014 {
1015 block *b = pop_block(f);
1016 while (STACK_LEVEL() > b->b_level) {
1017 v = POP();
1018 DECREF(v);
1019 }
1020 }
1021 break;
1022
1023 case END_FINALLY:
1024 v = POP();
1025 if (is_intobject(v)) {
1026 why = (enum why_code) getintvalue(v);
1027 if (why == WHY_RETURN)
1028 retval = POP();
1029 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001030 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001032 u = POP();
1033 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001035 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 }
1037 else if (v != None) {
1038 err_setstr(SystemError,
1039 "'finally' pops bad exception");
1040 why = WHY_EXCEPTION;
1041 }
1042 DECREF(v);
1043 break;
1044
1045 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001046 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001048 w = POP();
1049 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001051 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 DECREF(v);
1053 DECREF(w);
1054 break;
1055
1056 case STORE_NAME:
1057 w = GETNAMEV(oparg);
1058 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001059 if ((x = f->f_locals) == NULL) {
1060 err_setstr(SystemError, "no locals");
1061 break;
1062 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001063#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001064 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001065 if (u == NULL) {
1066 if (defmode != 0) {
1067 if (v != None)
1068 u = (object *)v->ob_type;
1069 else
1070 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001071 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001072 (typeobject *)u,
1073 defmode);
1074 DECREF(v);
1075 if (x == NULL)
1076 break;
1077 v = x;
1078 }
1079 }
1080 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001081 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001082 DECREF(v);
1083 break;
1084 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001085#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001086 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 DECREF(v);
1088 break;
1089
1090 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001091 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001092 if ((x = f->f_locals) == NULL) {
1093 err_setstr(SystemError, "no locals");
1094 break;
1095 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001096#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001097 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001098 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001099 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001100 (object *)NULL);
1101 break;
1102 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001103#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001104 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001105 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001107
1108#ifdef CASE_TOO_BIG
1109 default: switch (opcode) {
1110#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001111
1112 case UNPACK_TUPLE:
1113 v = POP();
1114 if (!is_tupleobject(v)) {
1115 err_setstr(TypeError, "unpack non-tuple");
1116 why = WHY_EXCEPTION;
1117 }
1118 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001119 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 "unpack tuple of wrong size");
1121 why = WHY_EXCEPTION;
1122 }
1123 else {
Guido van Rossum62f7d151997-01-17 21:05:28 +00001124#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001125 if (!CHECK_STACK(oparg)) {
1126 x = NULL;
1127 break;
1128 }
Guido van Rossum62f7d151997-01-17 21:05:28 +00001129#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001131 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 INCREF(w);
1133 PUSH(w);
1134 }
1135 }
1136 DECREF(v);
1137 break;
1138
1139 case UNPACK_LIST:
1140 v = POP();
1141 if (!is_listobject(v)) {
1142 err_setstr(TypeError, "unpack non-list");
1143 why = WHY_EXCEPTION;
1144 }
1145 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001146 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 "unpack list of wrong size");
1148 why = WHY_EXCEPTION;
1149 }
1150 else {
Guido van Rossum62f7d151997-01-17 21:05:28 +00001151#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001152 if (!CHECK_STACK(oparg)) {
1153 x = NULL;
1154 break;
1155 }
Guido van Rossum62f7d151997-01-17 21:05:28 +00001156#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 for (; --oparg >= 0; ) {
1158 w = getlistitem(v, oparg);
1159 INCREF(w);
1160 PUSH(w);
1161 }
1162 }
1163 DECREF(v);
1164 break;
1165
1166 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001167 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 v = POP();
1169 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001170 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 DECREF(v);
1172 DECREF(u);
1173 break;
1174
1175 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001176 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001178 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 DECREF(v);
1180 break;
1181
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001182 case STORE_GLOBAL:
1183 w = GETNAMEV(oparg);
1184 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001185#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001186 if (f->f_locals != NULL) {
1187 u = dict2lookup(f->f_locals, w);
1188 if (u != NULL && is_accessobject(u)) {
1189 err = setaccessvalue(u, f->f_globals,
1190 v);
1191 DECREF(v);
1192 break;
1193 }
Guido van Rossum25831651993-05-19 14:50:45 +00001194 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001195#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001196 err = dict2insert(f->f_globals, w, v);
1197 DECREF(v);
1198 break;
1199
1200 case DELETE_GLOBAL:
1201 w = GETNAMEV(oparg);
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001202#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001203 if (f->f_locals != NULL) {
1204 u = dict2lookup(f->f_locals, w);
1205 if (u != NULL && is_accessobject(u)) {
1206 err = setaccessvalue(u, f->f_globals,
1207 (object *)NULL);
1208 break;
1209 }
Guido van Rossum25831651993-05-19 14:50:45 +00001210 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001211#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001212 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001213 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001214 break;
1215
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 case LOAD_CONST:
1217 x = GETCONST(oparg);
1218 INCREF(x);
1219 PUSH(x);
1220 break;
1221
1222 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001223 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001224 if ((x = f->f_locals) == NULL) {
1225 err_setstr(SystemError, "no locals");
1226 break;
1227 }
1228 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001230 err_clear();
1231 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001233 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001234 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001236 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 break;
1238 }
1239 }
1240 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001241#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001242 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001243 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001244 if (x == NULL)
1245 break;
1246 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001247 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001248#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001249 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 PUSH(x);
1251 break;
1252
1253 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001254 w = GETNAMEV(oparg);
1255 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001257 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001258 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001260 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 break;
1262 }
1263 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001264#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001265 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001266 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001267 if (x == NULL)
1268 break;
1269 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001270 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001271#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001272 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 PUSH(x);
1274 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001275
1276#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001278 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001279 if ((x = f->f_locals) == NULL) {
1280 err_setstr(SystemError, "no locals");
1281 break;
1282 }
1283 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001285 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 break;
1287 }
Guido van Rossum25831651993-05-19 14:50:45 +00001288 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001289 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001290 if (x == NULL)
1291 break;
1292 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001293 else
1294 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 PUSH(x);
1296 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001297#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001298
1299 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001300 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001301 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001302 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303 gettupleitem(co->co_varnames,
1304 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001305 break;
1306 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001307#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001308 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001309 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001310 if (x == NULL)
1311 break;
1312 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001313 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001314#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001315 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001316 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001317 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001318 break;
1319
1320 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001321 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001322#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001323 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001324 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001325 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001326 DECREF(v);
1327 break;
1328 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001329#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001330 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001331 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001332
1333 case DELETE_FAST:
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001334#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001335 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001336 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001337 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001338 gettupleitem(co->co_varnames,
1339 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001340 break;
1341 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001342 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001343 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001344 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001345 break;
1346 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001347#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001348 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001349 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350
1351 case BUILD_TUPLE:
1352 x = newtupleobject(oparg);
1353 if (x != NULL) {
1354 for (; --oparg >= 0;) {
1355 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001356 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 }
1358 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001359 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 }
1361 break;
1362
1363 case BUILD_LIST:
1364 x = newlistobject(oparg);
1365 if (x != NULL) {
1366 for (; --oparg >= 0;) {
1367 w = POP();
1368 err = setlistitem(x, oparg, w);
1369 if (err != 0)
1370 break;
1371 }
1372 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 }
1375 break;
1376
1377 case BUILD_MAP:
1378 x = newdictobject();
1379 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001380 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 break;
1382
1383 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001384 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001386 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 DECREF(v);
1388 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001389 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 break;
1391
1392 case COMPARE_OP:
1393 w = POP();
1394 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001395 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 DECREF(v);
1397 DECREF(w);
1398 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001399 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 break;
1401
1402 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001403 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001404 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001405 if (x == NULL) {
1406 err_setstr(ImportError,
1407 "__import__ not found");
1408 break;
1409 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001410 if (is_methodobject(x)) {
1411 u = None;
1412 INCREF(u);
1413 }
1414 else {
1415 u = find_from_args(f, INSTR_OFFSET());
1416 if (u == NULL) {
1417 x = u;
1418 break;
1419 }
1420 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 w = mkvalue("(OOOO)",
1422 w,
1423 f->f_globals,
1424 f->f_locals == NULL ? None : f->f_locals,
1425 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001426 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001427 if (w == NULL) {
1428 x = NULL;
1429 break;
1430 }
1431 x = call_object(x, w);
1432 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001433 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001434 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 break;
1436
1437 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001438 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001440 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 if ((x = f->f_locals) == NULL) {
1442 err_setstr(SystemError, "no locals");
1443 break;
1444 }
1445 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001446 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001447 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001449
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001450#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001451 case ACCESS_MODE:
1452 v = POP();
1453 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001454 if (getstringvalue(w)[0] == '*')
1455 defmode = getintvalue(v);
1456 else
1457 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001458 DECREF(v);
1459 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001460#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001461
1462 case JUMP_FORWARD:
1463 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001464 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001465
1466 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001467 err = testbool(TOP());
1468 if (err > 0)
1469 err = 0;
1470 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001472 else
1473 break;
1474 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001475
1476 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001477 err = testbool(TOP());
1478 if (err > 0) {
1479 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001481 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001482 else if (err == 0)
1483 ;
1484 else
1485 break;
1486 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001487
1488 case JUMP_ABSOLUTE:
1489 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001490 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001491
1492 case FOR_LOOP:
1493 /* for v in s: ...
1494 On entry: stack contains s, i.
1495 On exit: stack contains s, i+1, s[i];
1496 but if loop exhausted:
1497 s, i are popped, and we jump */
1498 w = POP(); /* Loop index */
1499 v = POP(); /* Sequence object */
1500 u = loop_subscript(v, w);
1501 if (u != NULL) {
1502 PUSH(v);
1503 x = newintobject(getintvalue(w)+1);
1504 PUSH(x);
1505 DECREF(w);
1506 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001507 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 }
1509 else {
1510 DECREF(v);
1511 DECREF(w);
1512 /* A NULL can mean "s exhausted"
1513 but also an error: */
1514 if (err_occurred())
1515 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001516 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001518 continue;
1519 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 }
1521 break;
1522
1523 case SETUP_LOOP:
1524 case SETUP_EXCEPT:
1525 case SETUP_FINALLY:
1526 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1527 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001528 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001529
1530 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001531#ifdef LLTRACE
1532 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001533 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001535 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001536 if (f->f_trace == NULL)
1537 continue;
1538 /* Trace each line of code reached */
1539 f->f_lasti = INSTR_OFFSET();
1540 err = call_trace(&f->f_trace, &f->f_trace,
1541 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001543
1544 case CALL_FUNCTION:
1545 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001546 int na = oparg & 0xff;
1547 int nk = (oparg>>8) & 0xff;
1548 int n = na + 2*nk;
1549 object **pfunc = stack_pointer - n - 1;
1550 object *func = *pfunc;
1551 object *self = NULL;
1552 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001554 if (is_instancemethodobject(func)) {
1555 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001556 class = instancemethodgetclass(func);
1557 func = instancemethodgetfunc(func);
1558 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001560 INCREF(self);
1561 DECREF(*pfunc);
1562 *pfunc = self;
1563 na++;
1564 n++;
1565 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 else {
1567 /* Unbound methods must be
1568 called with an instance of
1569 the class (or a derived
1570 class) as first argument */
1571 if (na > 0 &&
1572 (self = stack_pointer[-n])
1573 != NULL &&
1574 is_instanceobject(self) &&
1575 issubclass(
1576 (object *)
1577 (((instanceobject *)self)
1578 ->in_class),
1579 class))
1580 /* Handy-dandy */ ;
1581 else {
1582 err_setstr(TypeError,
1583 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001584 x = NULL;
1585 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001586 }
1587 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 }
1589 else
1590 INCREF(func);
1591 if (is_funcobject(func)) {
1592 object *co = getfunccode(func);
1593 object *globals = getfuncglobals(func);
1594 object *argdefs = PyFunction_GetDefaults(func);
1595 object **d;
1596 int nd;
1597 if (argdefs != NULL) {
1598 d = &GETTUPLEITEM(argdefs, 0);
1599 nd = ((tupleobject *)argdefs)->ob_size;
1600 }
1601 else {
1602 d = NULL;
1603 nd = 0;
1604 }
1605 x = eval_code2(
1606 (codeobject *)co,
1607 globals, (object *)NULL,
1608 stack_pointer-n, na,
1609 stack_pointer-2*nk, nk,
1610 d, nd,
1611 class);
1612 }
1613 else {
1614 object *args = newtupleobject(na);
1615 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001616 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001618 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001619 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001620 if (nk > 0) {
1621 kwdict = newdictobject();
1622 if (kwdict == NULL) {
1623 x = NULL;
1624 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001625 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001626 err = 0;
1627 while (--nk >= 0) {
1628 object *value = POP();
1629 object *key = POP();
1630 err = mappinginsert(
1631 kwdict, key, value);
1632 if (err) {
1633 DECREF(key);
1634 DECREF(value);
1635 break;
1636 }
1637 }
1638 if (err) {
1639 DECREF(args);
1640 DECREF(kwdict);
1641 break;
1642 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001643 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001644 while (--na >= 0) {
1645 w = POP();
1646 SETTUPLEITEM(args, na, w);
1647 }
1648 x = PyEval_CallObjectWithKeywords(
1649 func, args, kwdict);
1650 DECREF(args);
1651 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001652 }
1653 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001654 while (stack_pointer > pfunc) {
1655 w = POP();
1656 DECREF(w);
1657 }
1658 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001659 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001660 break;
1661 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001662
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 case MAKE_FUNCTION:
1664 v = POP(); /* code object */
1665 x = newfuncobject(v, f->f_globals);
1666 DECREF(v);
1667 /* XXX Maybe this should be a separate opcode? */
1668 if (x != NULL && oparg > 0) {
1669 v = newtupleobject(oparg);
1670 if (v == NULL) {
1671 DECREF(x);
1672 x = NULL;
1673 break;
1674 }
1675 while (--oparg >= 0) {
1676 w = POP();
1677 SETTUPLEITEM(v, oparg, w);
1678 }
1679 err = PyFunction_SetDefaults(x, v);
1680 DECREF(v);
1681 }
1682 PUSH(x);
1683 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001684
1685 case BUILD_SLICE:
1686 if (oparg == 3)
1687 w = POP();
1688 else
1689 w = NULL;
1690 v = POP();
1691 u = POP();
1692 x = build_slice(u,v,w);
1693 DECREF(u);
1694 DECREF(v);
1695 XDECREF(w);
1696 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001697 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001698 break;
1699
1700
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 default:
1702 fprintf(stderr,
1703 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001704 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001705 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 why = WHY_EXCEPTION;
1707 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001708
1709#ifdef CASE_TOO_BIG
1710 }
1711#endif
1712
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 } /* switch */
1714
1715 on_error:
1716
1717 /* Quickly continue if no error occurred */
1718
1719 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001720 if (err == 0 && x != NULL) {
1721#ifdef CHECKEXC
1722 if (err_occurred())
1723 fprintf(stderr,
1724 "XXX undetected error\n");
1725 else
1726#endif
1727 continue; /* Normal, fast path */
1728 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 why = WHY_EXCEPTION;
1730 x = None;
1731 err = 0;
1732 }
1733
Guido van Rossum801dcae1992-04-08 11:32:32 +00001734#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001735 /* Double-check exception status */
1736
1737 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1738 if (!err_occurred()) {
1739 fprintf(stderr, "XXX ghost error\n");
1740 err_setstr(SystemError, "ghost error");
1741 why = WHY_EXCEPTION;
1742 }
1743 }
1744 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001745 if (err_occurred()) {
1746 fprintf(stderr,
1747 "XXX undetected error (why=%d)\n",
1748 why);
1749 why = WHY_EXCEPTION;
1750 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 }
1752#endif
1753
1754 /* Log traceback info if this is a real exception */
1755
1756 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001757 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001759 f->f_lasti -= 2;
1760 tb_here(f);
1761
Guido van Rossume59214e1994-08-30 08:01:59 +00001762 if (f->f_trace)
1763 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001764 if (sys_profile)
1765 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 }
1767
1768 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1769
1770 if (why == WHY_RERAISE)
1771 why = WHY_EXCEPTION;
1772
1773 /* Unwind stacks if a (pseudo) exception occurred */
1774
1775 while (why != WHY_NOT && f->f_iblock > 0) {
1776 block *b = pop_block(f);
1777 while (STACK_LEVEL() > b->b_level) {
1778 v = POP();
1779 XDECREF(v);
1780 }
1781 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1782 why = WHY_NOT;
1783 JUMPTO(b->b_handler);
1784 break;
1785 }
1786 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001787 (b->b_type == SETUP_EXCEPT &&
1788 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001790 object *exc, *val, *tb;
1791 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 if (val == NULL) {
1793 val = None;
1794 INCREF(val);
1795 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 /* Make the raw exception data
1797 available to the handler,
1798 so a program can emulate the
1799 Python main loop. Don't do
1800 this for 'finally'. */
1801 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001802 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 sysset("exc_value", val);
1804 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001806 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 PUSH(val);
1808 PUSH(exc);
1809 }
1810 else {
1811 if (why == WHY_RETURN)
1812 PUSH(retval);
1813 v = newintobject((long)why);
1814 PUSH(v);
1815 }
1816 why = WHY_NOT;
1817 JUMPTO(b->b_handler);
1818 break;
1819 }
1820 } /* unwind stack */
1821
1822 /* End the loop if we still have an error (or return) */
1823
1824 if (why != WHY_NOT)
1825 break;
1826
1827 } /* main loop */
1828
1829 /* Pop remaining stack entries */
1830
1831 while (!EMPTY()) {
1832 v = POP();
1833 XDECREF(v);
1834 }
1835
Guido van Rossum96a42c81992-01-12 02:29:51 +00001836 if (why != WHY_RETURN)
1837 retval = NULL;
1838
Guido van Rossume59214e1994-08-30 08:01:59 +00001839 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001840 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001841 if (call_trace(&f->f_trace, &f->f_trace, f,
1842 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001843 XDECREF(retval);
1844 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001845 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001846 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001847 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001848 }
1849
1850 if (sys_profile && why == WHY_RETURN) {
1851 if (call_trace(&sys_profile, (object**)0,
1852 f, "return", retval)) {
1853 XDECREF(retval);
1854 retval = NULL;
1855 why = WHY_EXCEPTION;
1856 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001857 }
1858
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001860
Guido van Rossum374a9221991-04-04 10:40:29 +00001861 current_frame = f->f_back;
1862 DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +00001863 --recursion_depth;
Guido van Rossum374a9221991-04-04 10:40:29 +00001864
Guido van Rossum96a42c81992-01-12 02:29:51 +00001865 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001866}
1867
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001868/* Logic for the raise statement (too complicated for inlining).
1869 This *consumes* a reference count to each of its arguments. */
1870static int
1871do_raise(type, value, tb)
1872 object *type, *value, *tb;
1873{
1874 /* We support the following forms of raise:
1875 raise <class>, <classinstance>
1876 raise <class>, <argument tuple>
1877 raise <class>, None
1878 raise <class>, <argument>
1879 raise <classinstance>, None
1880 raise <string>, <object>
1881 raise <string>, None
1882
1883 An omitted second argument is the same as None.
1884
1885 In addition, raise <tuple>, <anything> is the same as
1886 raising the tuple's first item (and it better have one!);
1887 this rule is applied recursively.
1888
1889 Finally, an optional third argument can be supplied, which
1890 gives the traceback to be substituted (useful when
1891 re-raising an exception after examining it). */
1892
1893 /* First, check the traceback argument, replacing None with
1894 NULL. */
1895 if (tb == None) {
1896 DECREF(tb);
1897 tb = NULL;
1898 }
1899 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1900 err_setstr(TypeError,
1901 "raise 3rd arg must be traceback or None");
1902 goto raise_error;
1903 }
1904
1905 /* Next, replace a missing value with None */
1906 if (value == NULL) {
1907 value = None;
1908 INCREF(value);
1909 }
1910
1911 /* Next, repeatedly, replace a tuple exception with its first item */
1912 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1913 object *tmp = type;
1914 type = GETTUPLEITEM(type, 0);
1915 INCREF(type);
1916 DECREF(tmp);
1917 }
1918
1919 /* Now switch on the exception's type */
1920 if (is_stringobject(type)) {
1921 ;
1922 }
1923 else if (is_classobject(type)) {
1924 /* Raising a class. If the value is an instance, it
1925 better be an instance of the class. If it is not,
1926 it will be used to create an instance. */
1927 if (is_instanceobject(value)) {
1928 object *inclass = (object*)
1929 (((instanceobject*)value)->in_class);
1930 if (!issubclass(inclass, type)) {
1931 err_setstr(TypeError,
1932 "raise <class>, <instance> requires that <instance> is a member of <class>");
1933 goto raise_error;
1934 }
1935 }
1936 else {
1937 /* Go instantiate the class */
1938 object *args, *res;
1939 if (value == None)
1940 args = mkvalue("()");
1941 else if (is_tupleobject(value)) {
1942 INCREF(value);
1943 args = value;
1944 }
1945 else
1946 args = mkvalue("(O)", value);
1947 if (args == NULL)
1948 goto raise_error;
1949 res = call_object(type, args);
1950 DECREF(args);
1951 if (res == NULL)
1952 goto raise_error;
1953 DECREF(value);
1954 value = res;
1955 }
1956 }
1957 else if (is_instanceobject(type)) {
1958 /* Raising an instance. The value should be a dummy. */
1959 if (value != None) {
1960 err_setstr(TypeError,
1961 "instance exception may not have a separate value");
1962 goto raise_error;
1963 }
1964 else {
1965 /* Normalize to raise <class>, <instance> */
1966 DECREF(value);
1967 value = type;
1968 type = (object*) ((instanceobject*)type)->in_class;
1969 INCREF(type);
1970 }
1971 }
1972 else {
1973 /* Not something you can raise. You get an exception
1974 anyway, just not what you specified :-) */
1975 err_setstr(TypeError,
1976 "exceptions must be strings, classes, or instances");
1977 goto raise_error;
1978 }
1979 err_restore(type, value, tb);
1980 if (tb == NULL)
1981 return WHY_EXCEPTION;
1982 else
1983 return WHY_RERAISE;
1984 raise_error:
1985 XDECREF(value);
1986 XDECREF(type);
1987 XDECREF(tb);
1988 return WHY_EXCEPTION;
1989}
1990
Guido van Rossum96a42c81992-01-12 02:29:51 +00001991#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001992static int
1993prtrace(v, str)
1994 object *v;
1995 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001997 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001998 if (printobject(v, stdout, 0) != 0)
1999 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002002#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002004static void
2005call_exc_trace(p_trace, p_newtrace, f)
2006 object **p_trace, **p_newtrace;
2007 frameobject *f;
2008{
2009 object *type, *value, *traceback, *arg;
2010 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002011 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002012 if (value == NULL) {
2013 value = None;
2014 INCREF(value);
2015 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002016 arg = mkvalue("(OOO)", type, value, traceback);
2017 if (arg == NULL) {
2018 err_restore(type, value, traceback);
2019 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002020 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002021 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
2022 DECREF(arg);
2023 if (err == 0)
2024 err_restore(type, value, traceback);
2025 else {
2026 XDECREF(type);
2027 XDECREF(value);
2028 XDECREF(traceback);
2029 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002030}
2031
2032static int
2033call_trace(p_trace, p_newtrace, f, msg, arg)
2034 object **p_trace; /* in/out; may not be NULL;
2035 may not point to NULL variable initially */
2036 object **p_newtrace; /* in/out; may be NULL;
2037 may point to NULL variable;
2038 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002039 frameobject *f;
2040 char *msg;
2041 object *arg;
2042{
Guido van Rossumf10570b1995-07-07 22:53:21 +00002043 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002044 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002045 static int tracing = 0;
2046
2047 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002048 /* Don't do recursive traces */
2049 if (p_newtrace) {
2050 XDECREF(*p_newtrace);
2051 *p_newtrace = NULL;
2052 }
2053 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002054 }
2055
Guido van Rossumf10570b1995-07-07 22:53:21 +00002056 args = newtupleobject(3);
2057 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002058 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002059 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002060 if (what == NULL)
2061 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002062 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002063 SETTUPLEITEM(args, 0, (object *)f);
2064 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002065 if (arg == NULL)
2066 arg = None;
2067 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002068 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002069 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00002070 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002071 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00002072 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002073 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002074 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002075 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002076 if (res == NULL) {
2077 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002078 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00002079 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002080 *p_trace = NULL;
2081 if (p_newtrace) {
2082 XDECREF(*p_newtrace);
2083 *p_newtrace = NULL;
2084 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002085 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002086 }
2087 else {
2088 if (p_newtrace) {
2089 XDECREF(*p_newtrace);
2090 if (res == None)
2091 *p_newtrace = NULL;
2092 else {
2093 INCREF(res);
2094 *p_newtrace = res;
2095 }
2096 }
2097 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002098 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002099 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002100}
2101
Guido van Rossum3f5da241990-12-20 15:06:42 +00002102object *
Guido van Rossum6135a871995-01-09 17:53:26 +00002103getbuiltins()
2104{
2105 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00002106 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00002107 else
2108 return current_frame->f_builtins;
2109}
2110
2111object *
Guido van Rossum5b722181993-03-30 17:46:03 +00002112getlocals()
2113{
2114 if (current_frame == NULL)
2115 return NULL;
2116 fast_2_locals(current_frame);
2117 return current_frame->f_locals;
2118}
2119
2120object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002121getglobals()
2122{
2123 if (current_frame == NULL)
2124 return NULL;
2125 else
2126 return current_frame->f_globals;
2127}
2128
Guido van Rossum81daa321993-05-20 14:24:46 +00002129object *
Guido van Rossume59214e1994-08-30 08:01:59 +00002130getframe()
2131{
2132 return (object *)current_frame;
2133}
2134
Guido van Rossum6135a871995-01-09 17:53:26 +00002135int
2136getrestricted()
2137{
2138 return current_frame == NULL ? 0 : current_frame->f_restricted;
2139}
2140
Guido van Rossum3f5da241990-12-20 15:06:42 +00002141void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142flushline()
2143{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002144 object *f = sysget("stdout");
2145 if (softspace(f, 0))
2146 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147}
2148
Guido van Rossum3f5da241990-12-20 15:06:42 +00002149
Guido van Rossum06186511995-01-07 12:40:10 +00002150#define BINOP(opname, ropname, thisfunc) \
2151 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2152 ; \
2153 else \
2154 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002155
2156
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002158or(v, w)
2159 object *v, *w;
2160{
Guido van Rossum06186511995-01-07 12:40:10 +00002161 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002162 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002163 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002164 object * (*f) FPROTO((object *, object *));
2165 if (coerce(&v, &w) != 0)
2166 return NULL;
2167 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2168 x = (*f)(v, w);
2169 DECREF(v);
2170 DECREF(w);
2171 if (f != NULL)
2172 return x;
2173 }
2174 err_setstr(TypeError, "bad operand type(s) for |");
2175 return NULL;
2176}
2177
2178static object *
2179xor(v, w)
2180 object *v, *w;
2181{
Guido van Rossum06186511995-01-07 12:40:10 +00002182 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002183 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002184 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002185 object * (*f) FPROTO((object *, object *));
2186 if (coerce(&v, &w) != 0)
2187 return NULL;
2188 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2189 x = (*f)(v, w);
2190 DECREF(v);
2191 DECREF(w);
2192 if (f != NULL)
2193 return x;
2194 }
2195 err_setstr(TypeError, "bad operand type(s) for ^");
2196 return NULL;
2197}
2198
2199static object *
2200and(v, w)
2201 object *v, *w;
2202{
Guido van Rossum06186511995-01-07 12:40:10 +00002203 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002204 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002205 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002206 object * (*f) FPROTO((object *, object *));
2207 if (coerce(&v, &w) != 0)
2208 return NULL;
2209 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2210 x = (*f)(v, w);
2211 DECREF(v);
2212 DECREF(w);
2213 if (f != NULL)
2214 return x;
2215 }
2216 err_setstr(TypeError, "bad operand type(s) for &");
2217 return NULL;
2218}
2219
2220static object *
2221lshift(v, w)
2222 object *v, *w;
2223{
Guido van Rossum06186511995-01-07 12:40:10 +00002224 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002225 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002226 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002227 object * (*f) FPROTO((object *, object *));
2228 if (coerce(&v, &w) != 0)
2229 return NULL;
2230 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2231 x = (*f)(v, w);
2232 DECREF(v);
2233 DECREF(w);
2234 if (f != NULL)
2235 return x;
2236 }
2237 err_setstr(TypeError, "bad operand type(s) for <<");
2238 return NULL;
2239}
2240
2241static object *
2242rshift(v, w)
2243 object *v, *w;
2244{
Guido van Rossum06186511995-01-07 12:40:10 +00002245 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002246 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002247 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002248 object * (*f) FPROTO((object *, object *));
2249 if (coerce(&v, &w) != 0)
2250 return NULL;
2251 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2252 x = (*f)(v, w);
2253 DECREF(v);
2254 DECREF(w);
2255 if (f != NULL)
2256 return x;
2257 }
2258 err_setstr(TypeError, "bad operand type(s) for >>");
2259 return NULL;
2260}
2261
2262static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002263add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 object *v, *w;
2265{
Guido van Rossum06186511995-01-07 12:40:10 +00002266 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002267 if (v->ob_type->tp_as_sequence != NULL)
2268 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2269 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002270 object *x;
2271 if (coerce(&v, &w) != 0)
2272 return NULL;
2273 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2274 DECREF(v);
2275 DECREF(w);
2276 return x;
2277 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002278 err_setstr(TypeError, "bad operand type(s) for +");
2279 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280}
2281
2282static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002283sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 object *v, *w;
2285{
Guido van Rossum06186511995-01-07 12:40:10 +00002286 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002287 if (v->ob_type->tp_as_number != NULL) {
2288 object *x;
2289 if (coerce(&v, &w) != 0)
2290 return NULL;
2291 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2292 DECREF(v);
2293 DECREF(w);
2294 return x;
2295 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002296 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 return NULL;
2298}
2299
2300static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002301mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002302 object *v, *w;
2303{
2304 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002305 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002306 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002307 if (tp->tp_as_number != NULL &&
2308 w->ob_type->tp_as_sequence != NULL &&
2309 !is_instanceobject(v)) {
2310 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 object *tmp = v;
2312 v = w;
2313 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002314 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002316 if (tp->tp_as_number != NULL) {
2317 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002318 if (is_instanceobject(v)) {
2319 /* Instances of user-defined classes get their
2320 other argument uncoerced, so they may
2321 implement sequence*number as well as
2322 number*number. */
2323 INCREF(v);
2324 INCREF(w);
2325 }
2326 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002327 return NULL;
2328 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2329 DECREF(v);
2330 DECREF(w);
2331 return x;
2332 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 if (tp->tp_as_sequence != NULL) {
2334 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335 err_setstr(TypeError,
2336 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 return NULL;
2338 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002339 return (*tp->tp_as_sequence->sq_repeat)
2340 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002342 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 return NULL;
2344}
2345
2346static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002347divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 object *v, *w;
2349{
Guido van Rossum06186511995-01-07 12:40:10 +00002350 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002351 if (v->ob_type->tp_as_number != NULL) {
2352 object *x;
2353 if (coerce(&v, &w) != 0)
2354 return NULL;
2355 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2356 DECREF(v);
2357 DECREF(w);
2358 return x;
2359 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002360 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 return NULL;
2362}
2363
2364static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002365mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 object *v, *w;
2367{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002368 if (is_stringobject(v)) {
2369 return formatstring(v, w);
2370 }
Guido van Rossum06186511995-01-07 12:40:10 +00002371 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002372 if (v->ob_type->tp_as_number != NULL) {
2373 object *x;
2374 if (coerce(&v, &w) != 0)
2375 return NULL;
2376 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2377 DECREF(v);
2378 DECREF(w);
2379 return x;
2380 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 return NULL;
2383}
2384
2385static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002386powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002387 object *v, *w;
2388{
2389 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002390 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002391 if (v->ob_type->tp_as_number == NULL ||
2392 w->ob_type->tp_as_number == NULL) {
2393 err_setstr(TypeError, "pow() requires numeric arguments");
2394 return NULL;
2395 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002396 if (coerce(&v, &w) != 0)
2397 return NULL;
2398 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2399 DECREF(v);
2400 DECREF(w);
2401 return res;
2402}
2403
2404static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 object *v;
2407{
2408 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002409 return (*v->ob_type->tp_as_number->nb_negative)(v);
2410 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 return NULL;
2412}
2413
2414static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 object *v;
2417{
2418 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002419 return (*v->ob_type->tp_as_number->nb_positive)(v);
2420 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 return NULL;
2422}
2423
2424static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002425invert(v)
2426 object *v;
2427{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002428 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002429 if (v->ob_type->tp_as_number != NULL &&
2430 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2431 return (*f)(v);
2432 err_setstr(TypeError, "bad operand type(s) for unary ~");
2433 return NULL;
2434}
2435
2436static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438 object *v;
2439{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002440 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002441 object *w;
2442 if (outcome < 0)
2443 return NULL;
2444 if (outcome == 0)
2445 w = True;
2446 else
2447 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448 INCREF(w);
2449 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450}
Guido van Rossum234f9421993-06-17 12:35:49 +00002451
2452
Guido van Rossum681d79a1995-07-18 14:51:37 +00002453/* External interface to call any callable object.
2454 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002455
2456object *
2457call_object(func, arg)
2458 object *func;
2459 object *arg;
2460{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002461 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2462}
Guido van Rossume59214e1994-08-30 08:01:59 +00002463
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464object *
2465PyEval_CallObjectWithKeywords(func, arg, kw)
2466 object *func;
2467 object *arg;
2468 object *kw;
2469{
2470 ternaryfunc call;
2471 object *result;
2472
2473 if (arg == NULL)
2474 arg = newtupleobject(0);
2475 else if (!is_tupleobject(arg)) {
2476 err_setstr(TypeError, "argument list must be a tuple");
2477 return NULL;
2478 }
2479 else
2480 INCREF(arg);
2481
Guido van Rossume3e61c11995-08-04 04:14:47 +00002482 if (kw != NULL && !is_dictobject(kw)) {
2483 err_setstr(TypeError, "keyword list must be a dictionary");
2484 return NULL;
2485 }
2486
Guido van Rossum150b2df1996-12-05 23:17:11 +00002487 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002488 result = (*call)(func, arg, kw);
2489 else if (is_instancemethodobject(func) || is_funcobject(func))
2490 result = call_function(func, arg, kw);
2491 else
2492 result = call_builtin(func, arg, kw);
2493
2494 DECREF(arg);
2495
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002496 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002497 err_setstr(SystemError,
2498 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002499
2500 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002501}
2502
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002504call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002505 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002507 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509 if (is_methodobject(func)) {
2510 method meth = getmethod(func);
2511 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002512 int flags = getflags(func);
2513 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002514 int size = gettuplesize(arg);
2515 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002516 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002517 else if (size == 0)
2518 arg = NULL;
2519 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002520 if (flags & METH_KEYWORDS)
2521 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002522 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002523 err_setstr(TypeError,
2524 "this function takes no keyword arguments");
2525 return NULL;
2526 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 }
2529 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002530 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002532 if (is_instanceobject(func)) {
2533 object *res, *call = getattr(func,"__call__");
2534 if (call == NULL) {
2535 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002536 err_setstr(AttributeError,
2537 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002538 return NULL;
2539 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002540 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002541 DECREF(call);
2542 return res;
2543 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 return NULL;
2546}
2547
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002549call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002551 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002552 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002554 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002555 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002556 object **d, **k;
2557 int nk, nd;
2558 object *result;
2559
2560 if (kw != NULL && !is_dictobject(kw)) {
2561 err_badcall();
2562 return NULL;
2563 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564
Guido van Rossume8122f11991-05-05 20:03:07 +00002565 if (is_instancemethodobject(func)) {
2566 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002567 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002568 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002569 if (self == NULL) {
2570 /* Unbound methods must be called with an instance of
2571 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002572 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002573 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002574 if (self != NULL &&
2575 is_instanceobject(self) &&
2576 issubclass((object *)
2577 (((instanceobject *)self)->in_class),
2578 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002579 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002580 else
2581 self = NULL;
2582 }
2583 if (self == NULL) {
2584 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002585 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002586 return NULL;
2587 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002588 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002589 }
2590 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002591 int argcount = gettuplesize(arg);
2592 object *newarg = newtupleobject(argcount + 1);
2593 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002594 if (newarg == NULL)
2595 return NULL;
2596 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002597 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002598 for (i = 0; i < argcount; i++) {
2599 object *v = GETTUPLEITEM(arg, i);
2600 XINCREF(v);
2601 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002602 }
2603 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 }
2605 }
2606 else {
2607 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002608 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002609 return NULL;
2610 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002611 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002613
2614 argdefs = PyFunction_GetDefaults(func);
2615 if (argdefs != NULL && is_tupleobject(argdefs)) {
2616 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2617 nd = gettuplesize(argdefs);
2618 }
2619 else {
2620 d = NULL;
2621 nd = 0;
2622 }
2623
2624 if (kw != NULL) {
2625 int pos, i;
2626 nk = getmappingsize(kw);
2627 k = NEW(object *, 2*nk);
2628 if (k == NULL) {
2629 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002630 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002631 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002632 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002633 pos = i = 0;
2634 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2635 i += 2;
2636 nk = i/2;
2637 /* XXX This is broken if the caller deletes dict items! */
2638 }
2639 else {
2640 k = NULL;
2641 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002642 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643
Guido van Rossum681d79a1995-07-18 14:51:37 +00002644 result = eval_code2(
2645 (codeobject *)getfunccode(func),
2646 getfuncglobals(func), (object *)NULL,
2647 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2648 k, nk,
2649 d, nd,
2650 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651
Guido van Rossum681d79a1995-07-18 14:51:37 +00002652 DECREF(arg);
2653 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654
Guido van Rossum681d79a1995-07-18 14:51:37 +00002655 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656}
2657
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002658#define SLICE_ERROR_MSG \
2659 "standard sequence type does not support step size other than one"
2660
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 object *v, *w;
2664{
2665 typeobject *tp = v->ob_type;
2666 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668 return NULL;
2669 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002670 if (tp->tp_as_mapping != NULL) {
2671 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2672 }
2673 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002674 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002675 if (!is_intobject(w)) {
2676 if (PySlice_Check(w)) {
2677 err_setstr(ValueError, SLICE_ERROR_MSG);
2678 } else {
2679 err_setstr(TypeError,
2680 "sequence subscript not int");
2681 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 return NULL;
2683 }
2684 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002685 if (i < 0) {
2686 int len = (*tp->tp_as_sequence->sq_length)(v);
2687 if (len < 0)
2688 return NULL;
2689 i += len;
2690 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002691 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693}
2694
2695static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002696loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697 object *v, *w;
2698{
2699 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002700 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002702 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 return NULL;
2704 }
2705 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002706 v = (*sq->sq_item)(v, i);
2707 if (v)
2708 return v;
2709 if (err_occurred() == IndexError)
2710 err_clear();
2711 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712}
2713
2714static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002715slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 object *v;
2717 int isize;
2718 int *pi;
2719{
2720 if (v != NULL) {
2721 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002722 err_setstr(TypeError, "slice index must be int");
2723 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 }
2725 *pi = getintvalue(v);
2726 if (*pi < 0)
2727 *pi += isize;
2728 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002729 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730}
2731
2732static object *
Guido van Rossum8861b741996-07-30 16:49:37 +00002733build_slice(u, v, w) /* u:v:w */
2734 object *u, *v, *w;
2735{
2736 return PySlice_New(u,v,w);
2737}
2738
2739static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002740apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 object *u, *v, *w;
2742{
2743 typeobject *tp = u->ob_type;
2744 int ilow, ihigh, isize;
2745 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002746 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 return NULL;
2748 }
2749 ilow = 0;
2750 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002751 if (isize < 0)
2752 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002755 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002757 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759
2760static int
2761assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 object *w;
2763 object *key;
2764 object *v;
2765{
2766 typeobject *tp = w->ob_type;
2767 sequence_methods *sq;
2768 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002769 int (*func1)();
2770 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002771 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002772 (func1 = mp->mp_ass_subscript) != NULL) {
2773 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002774 }
2775 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002776 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002778 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002779 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002780 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002782 else {
2783 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002784 if (i < 0) {
2785 int len = (*sq->sq_length)(w);
2786 if (len < 0)
2787 return -1;
2788 i += len;
2789 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002790 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002791 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002792 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002794 err_setstr(TypeError,
2795 "can't assign to this subscripted object");
2796 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798}
2799
Guido van Rossum3f5da241990-12-20 15:06:42 +00002800static int
2801assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 object *u, *v, *w, *x;
2803{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002804 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806 if (sq == NULL) {
2807 err_setstr(TypeError, "assign to slice of non-sequence");
2808 return -1;
2809 }
2810 if (sq == NULL || sq->sq_ass_slice == NULL) {
2811 err_setstr(TypeError, "unassignable slice");
2812 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 }
2814 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002815 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002816 if (isize < 0)
2817 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818 if (slice_index(v, isize, &ilow) != 0)
2819 return -1;
2820 if (slice_index(w, isize, &ihigh) != 0)
2821 return -1;
2822 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823}
2824
2825static int
2826cmp_exception(err, v)
2827 object *err, *v;
2828{
2829 if (is_tupleobject(v)) {
2830 int i, n;
2831 n = gettuplesize(v);
2832 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002833 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002834 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 return 1;
2836 }
2837 return 0;
2838 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002839 if (is_classobject(v) && is_classobject(err))
2840 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 return err == v;
2842}
2843
Guido van Rossum3f5da241990-12-20 15:06:42 +00002844static int
2845cmp_member(v, w)
2846 object *v, *w;
2847{
Guido van Rossume59214e1994-08-30 08:01:59 +00002848 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002849 object *x;
2850 sequence_methods *sq;
2851 /* Special case for char in string */
2852 if (is_stringobject(w)) {
2853 register char *s, *end;
2854 register char c;
2855 if (!is_stringobject(v) || getstringsize(v) != 1) {
2856 err_setstr(TypeError,
2857 "string member test needs char left operand");
2858 return -1;
2859 }
2860 c = getstringvalue(v)[0];
2861 s = getstringvalue(w);
2862 end = s + getstringsize(w);
2863 while (s < end) {
2864 if (c == *s++)
2865 return 1;
2866 }
2867 return 0;
2868 }
2869 sq = w->ob_type->tp_as_sequence;
2870 if (sq == NULL) {
2871 err_setstr(TypeError,
2872 "'in' or 'not in' needs sequence right argument");
2873 return -1;
2874 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002875 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002876 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002877 if (x == NULL) {
2878 if (err_occurred() == IndexError) {
2879 err_clear();
2880 break;
2881 }
2882 return -1;
2883 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 cmp = cmpobject(v, x);
2885 XDECREF(x);
2886 if (cmp == 0)
2887 return 1;
2888 }
2889 return 0;
2890}
2891
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002893cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002894 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 register object *v;
2896 register object *w;
2897{
2898 register int cmp;
2899 register int res = 0;
2900 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002901 case IS:
2902 case IS_NOT:
2903 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002904 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002905 res = !res;
2906 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 case IN:
2908 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002909 res = cmp_member(v, w);
2910 if (res < 0)
2911 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002912 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002913 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 break;
2915 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002916 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917 break;
2918 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002919 cmp = cmpobject(v, w);
2920 switch (op) {
2921 case LT: res = cmp < 0; break;
2922 case LE: res = cmp <= 0; break;
2923 case EQ: res = cmp == 0; break;
2924 case NE: res = cmp != 0; break;
2925 case GT: res = cmp > 0; break;
2926 case GE: res = cmp >= 0; break;
2927 /* XXX no default? (res is initialized to 0 though) */
2928 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 }
2930 v = res ? True : False;
2931 INCREF(v);
2932 return v;
2933}
2934
Guido van Rossum3f5da241990-12-20 15:06:42 +00002935static int
2936import_from(locals, v, name)
2937 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002938 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002939 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002940{
2941 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002942 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002943 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002944 return -1;
2945 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002946 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002947 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002948 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002949 object *name, *value;
2950 pos = 0;
2951 while (mappinggetnext(w, &pos, &name, &value)) {
2952 if (!is_stringobject(name) ||
2953 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002954 continue;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002955#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002956 if (is_accessobject(value)) {
2957 value = getaccessvalue(value, (object *)NULL);
2958 if (value == NULL) {
2959 err_clear();
2960 continue;
2961 }
2962 }
2963 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002964#endif
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002965 INCREF(value);
2966 err = dict2insert(locals, name, value);
2967 DECREF(value);
2968 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002969 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002970 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002971 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002972 }
2973 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002974 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002975 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002976 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002977 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002978 getstringvalue(name));
2979 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002980 return -1;
2981 }
2982 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002983 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002984 }
2985}
2986
2987static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002988build_class(methods, bases, name)
2989 object *methods; /* dictionary */
2990 object *bases; /* tuple containing classes */
2991 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002992{
Guido van Rossum25831651993-05-19 14:50:45 +00002993 int i;
2994 if (!is_tupleobject(bases)) {
2995 err_setstr(SystemError, "build_class with non-tuple bases");
2996 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002997 }
Guido van Rossum25831651993-05-19 14:50:45 +00002998 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002999 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003000 return NULL;
3001 }
Guido van Rossum25831651993-05-19 14:50:45 +00003002 if (!is_stringobject(name)) {
3003 err_setstr(SystemError, "build_class witn non-string name");
3004 return NULL;
3005 }
3006 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00003007 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00003008 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003009 /* Call the base's *type*, if it is callable.
3010 This code is a hook for Donald Beaudry's
3011 and Jim Fulton's type extensions. In
3012 unexended Python it will never be triggered
3013 since its types are not callable. */
3014 if (base->ob_type->ob_type->tp_call) {
3015 object *args;
3016 object *class;
3017 args = mkvalue("(OOO)", name, bases, methods);
3018 class = call_object((object *)base->ob_type,
3019 args);
3020 DECREF(args);
3021 return class;
3022 }
Guido van Rossum25831651993-05-19 14:50:45 +00003023 err_setstr(TypeError,
3024 "base is not a class object");
3025 return NULL;
3026 }
3027 }
3028 return newclassobject(bases, methods, name);
3029}
3030
Guido van Rossum0dfcf751996-08-12 22:00:53 +00003031#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00003032static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00003033access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00003034 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00003035 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00003036 frameobject *f;
3037{
Guido van Rossumb3f72581993-05-21 19:56:10 +00003038 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00003039 object *value, *ac;
3040 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003041 int ret;
3042 fast_2_locals(f);
3043 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003044 if (value && is_accessobject(value)) {
3045 err_setstr(AccessError, "can't override access");
3046 return -1;
3047 }
3048 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00003049 if (value != NULL && value != None)
3050 type = value->ob_type;
3051 else
3052 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003053 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00003054 if (ac == NULL)
3055 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003056 ret = mappinginsert(f->f_locals, name, ac);
3057 DECREF(ac);
3058 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00003059 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003060}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00003061#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003062
3063static int
3064exec_statement(prog, globals, locals)
3065 object *prog;
3066 object *globals;
3067 object *locals;
3068{
3069 char *s;
3070 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003071 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003072 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003073
3074 if (is_tupleobject(prog) && globals == None && locals == None &&
3075 ((n = gettuplesize(prog)) == 2 || n == 3)) {
3076 /* Backward compatibility hack */
3077 globals = gettupleitem(prog, 1);
3078 if (n == 3)
3079 locals = gettupleitem(prog, 2);
3080 prog = gettupleitem(prog, 0);
3081 }
3082 if (globals == None) {
3083 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003084 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003085 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003086 plain = 1;
3087 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003088 }
3089 else if (locals == None)
3090 locals = globals;
3091 if (!is_stringobject(prog) &&
3092 !is_codeobject(prog) &&
3093 !is_fileobject(prog)) {
3094 err_setstr(TypeError,
3095 "exec 1st arg must be string, code or file object");
3096 return -1;
3097 }
3098 if (!is_dictobject(globals) || !is_dictobject(locals)) {
3099 err_setstr(TypeError,
3100 "exec 2nd/3rd args must be dict or None");
3101 return -1;
3102 }
Guido van Rossum6135a871995-01-09 17:53:26 +00003103 if (dictlookup(globals, "__builtins__") == NULL)
3104 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003105 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003106 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003107 return -1;
3108 return 0;
3109 }
3110 if (is_fileobject(prog)) {
3111 FILE *fp = getfilefile(prog);
3112 char *name = getstringvalue(getfilename(prog));
3113 if (run_file(fp, name, file_input, globals, locals) == NULL)
3114 return -1;
3115 return 0;
3116 }
3117 s = getstringvalue(prog);
3118 if (strlen(s) != getstringsize(prog)) {
3119 err_setstr(ValueError, "embedded '\\0' in exec string");
3120 return -1;
3121 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003122 v = run_string(s, file_input, globals, locals);
3123 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003124 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003125 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003126 if (plain)
3127 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003128 return 0;
3129}
Guido van Rossum24c13741995-02-14 09:42:43 +00003130
Guido van Rossum681d79a1995-07-18 14:51:37 +00003131/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00003132static object *
3133find_from_args(f, nexti)
3134 frameobject *f;
3135 int nexti;
3136{
3137 int opcode;
3138 int oparg;
3139 object *list, *name;
3140 unsigned char *next_instr;
3141
3142 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
3143 opcode = (*next_instr++);
3144 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00003145 INCREF(None);
3146 return None;
3147 }
3148
3149 list = newlistobject(0);
3150 if (list == NULL)
3151 return NULL;
3152
3153 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003154 oparg = (next_instr[1]<<8) + next_instr[0];
3155 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00003156 name = Getnamev(f, oparg);
3157 if (addlistitem(list, name) < 0) {
3158 DECREF(list);
3159 break;
3160 }
3161 opcode = (*next_instr++);
3162 } while (opcode == IMPORT_FROM);
3163
3164 return list;
3165}