blob: a959e34814ec0a4576135caf5f8bccb600a8f5b1 [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*/
406 locals, /*locals*/
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000407 owner, /*owner*/
Guido van Rossum62f7d151997-01-17 21:05:28 +0000408 co->co_stacksize, /*nvalues*/
409 CO_MAXBLOCKS); /*nblocks*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 if (f == NULL)
411 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412
Guido van Rossum374a9221991-04-04 10:40:29 +0000413 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000414
Guido van Rossum681d79a1995-07-18 14:51:37 +0000415 if (co->co_nlocals > 0)
416 fastlocals = ((listobject *)f->f_fastlocals)->ob_item;
417
418 if (co->co_argcount > 0 ||
419 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
420 int i;
421 int n = argcount;
422 object *kwdict = NULL;
423 if (co->co_flags & CO_VARKEYWORDS) {
424 kwdict = newmappingobject();
425 if (kwdict == NULL)
426 goto fail;
427 }
428 if (argcount > co->co_argcount) {
429 if (!(co->co_flags & CO_VARARGS)) {
430 err_setstr(TypeError, "too many arguments");
431 goto fail;
432 }
433 n = co->co_argcount;
434 }
435 for (i = 0; i < n; i++) {
436 x = args[i];
437 INCREF(x);
438 SETLOCAL(i, x);
439 }
440 if (co->co_flags & CO_VARARGS) {
441 u = newtupleobject(argcount - n);
442 for (i = n; i < argcount; i++) {
443 x = args[i];
444 INCREF(x);
445 SETTUPLEITEM(u, i-n, x);
446 }
447 SETLOCAL(co->co_argcount, u);
448 }
449 for (i = 0; i < kwcount; i++) {
450 object *keyword = kws[2*i];
451 object *value = kws[2*i + 1];
452 int j;
453 /* XXX slow -- speed up using dictionary? */
454 for (j = 0; j < co->co_argcount; j++) {
455 object *nm = GETTUPLEITEM(co->co_varnames, j);
456 if (cmpobject(keyword, nm) == 0)
457 break;
458 }
459 if (j >= co->co_argcount) {
460 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000461 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 goto fail;
463 }
464 mappinginsert(kwdict, keyword, value);
465 }
466 else {
467 if (GETLOCAL(j) != NULL) {
468 err_setstr(TypeError,
469 "keyword parameter redefined");
470 goto fail;
471 }
472 INCREF(value);
473 SETLOCAL(j, value);
474 }
475 }
476 if (argcount < co->co_argcount) {
477 int m = co->co_argcount - defcount;
478 for (i = argcount; i < m; i++) {
479 if (GETLOCAL(i) == NULL) {
480 err_setstr(TypeError,
481 "not enough arguments");
482 goto fail;
483 }
484 }
485 if (n > m)
486 i = n - m;
487 else
488 i = 0;
489 for (; i < defcount; i++) {
490 if (GETLOCAL(m+i) == NULL) {
491 object *def = defs[i];
492 INCREF(def);
493 SETLOCAL(m+i, def);
494 }
495 }
496 }
497 if (kwdict != NULL) {
498 i = co->co_argcount;
499 if (co->co_flags & CO_VARARGS)
500 i++;
501 SETLOCAL(i, kwdict);
502 }
503 if (0) {
504 fail:
505 XDECREF(kwdict);
506 goto fail2;
507 }
508 }
509 else {
510 if (argcount > 0 || kwcount > 0) {
511 err_setstr(TypeError, "no arguments expected");
512 fail2:
513 current_frame = f->f_back;
514 DECREF(f);
515 return NULL;
516 }
517 }
518
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000519 if (sys_trace != NULL) {
520 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000521 be called on *every* entry to a code block.
522 Its return value, if not None, is a function that
523 will be called at the start of each executed line
524 of code. (Actually, the function must return
525 itself in order to continue tracing.)
526 The trace functions are called with three arguments:
527 a pointer to the current frame, a string indicating
528 why the function is called, and an argument which
529 depends on the situation. The global trace function
530 (sys.trace) is also called whenever an exception
531 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 if (call_trace(&sys_trace, &f->f_trace, f, "call",
533 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000534 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000535 current_frame = f->f_back;
536 DECREF(f);
537 return NULL;
538 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000539 }
540
541 if (sys_profile != NULL) {
542 /* Similar for sys_profile, except it needn't return
543 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544 if (call_trace(&sys_profile, (object**)0, f, "call",
545 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000546 current_frame = f->f_back;
547 DECREF(f);
548 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000549 }
550 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000551
Guido van Rossum8861b741996-07-30 16:49:37 +0000552 if (++recursion_depth > MAX_RECURSION_DEPTH) {
553 --recursion_depth;
554 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
555 current_frame = f->f_back;
556 DECREF(f);
557 return NULL;
558 }
559
Guido van Rossum374a9221991-04-04 10:40:29 +0000560 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000561 stack_pointer = f->f_valuestack;
562
Guido van Rossum374a9221991-04-04 10:40:29 +0000563 why = WHY_NOT;
564 err = 0;
565 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000566
567 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000568 /* Do periodic things.
569 Doing this every time through the loop would add
570 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000571 So we do it only every Nth instruction.
572
573 The ticker is reset to zero if there are pending
574 calls (see Py_AddPendingCalls() and
575 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000576
Guido van Rossum374a9221991-04-04 10:40:29 +0000577 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000578 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000579 if (pendingfirst != pendinglast) {
580 if (Py_MakePendingCalls() < 0) {
581 why = WHY_EXCEPTION;
582 goto on_error;
583 }
584 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000585 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000587 goto on_error;
588 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589
Guido van Rossume59214e1994-08-30 08:01:59 +0000590#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591 if (interpreter_lock) {
592 /* Give another thread a chance */
593
594 current_frame = NULL;
595 release_lock(interpreter_lock);
596
597 /* Other threads may run now */
598
599 acquire_lock(interpreter_lock, 1);
600 current_frame = f;
601 }
602#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000604
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000606
Guido van Rossum408027e1996-12-30 16:17:54 +0000607#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000608 f->f_lasti = INSTR_OFFSET();
609#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000610
611 opcode = NEXTOP();
612 if (HAS_ARG(opcode))
613 oparg = NEXTARG();
614
Guido van Rossum96a42c81992-01-12 02:29:51 +0000615#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 /* Instruction tracing */
617
Guido van Rossum96a42c81992-01-12 02:29:51 +0000618 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 if (HAS_ARG(opcode)) {
620 printf("%d: %d, %d\n",
621 (int) (INSTR_OFFSET() - 3),
622 opcode, oparg);
623 }
624 else {
625 printf("%d: %d\n",
626 (int) (INSTR_OFFSET() - 1), opcode);
627 }
628 }
629#endif
630
Guido van Rossum62f7d151997-01-17 21:05:28 +0000631#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000632 if (!CHECK_STACK(3)) {
633 x = NULL;
634 break;
635 }
Guido van Rossum62f7d151997-01-17 21:05:28 +0000636#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000637
Guido van Rossum374a9221991-04-04 10:40:29 +0000638 /* Main switch on opcode */
639
640 switch (opcode) {
641
642 /* BEWARE!
643 It is essential that any operation that fails sets either
644 x to NULL, err to nonzero, or why to anything but WHY_NOT,
645 and that no operation that succeeds does this! */
646
647 /* case STOP_CODE: this is an error! */
648
649 case POP_TOP:
650 v = POP();
651 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000652 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000653
654 case ROT_TWO:
655 v = POP();
656 w = POP();
657 PUSH(v);
658 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000659 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000660
661 case ROT_THREE:
662 v = POP();
663 w = POP();
664 x = POP();
665 PUSH(v);
666 PUSH(x);
667 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000668 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000669
670 case DUP_TOP:
671 v = TOP();
672 INCREF(v);
673 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000674 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000675
676 case UNARY_POSITIVE:
677 v = POP();
678 x = pos(v);
679 DECREF(v);
680 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000681 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 break;
683
684 case UNARY_NEGATIVE:
685 v = POP();
686 x = neg(v);
687 DECREF(v);
688 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000689 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000690 break;
691
692 case UNARY_NOT:
693 v = POP();
694 x = not(v);
695 DECREF(v);
696 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000697 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 break;
699
700 case UNARY_CONVERT:
701 v = POP();
702 x = reprobject(v);
703 DECREF(v);
704 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000705 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000706 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000707
708 case UNARY_INVERT:
709 v = POP();
710 x = invert(v);
711 DECREF(v);
712 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000713 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000714 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000715
Guido van Rossum50564e81996-01-12 01:13:16 +0000716 case BINARY_POWER:
717 w = POP();
718 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000719 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000720 DECREF(v);
721 DECREF(w);
722 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000723 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000724 break;
725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 case BINARY_MULTIPLY:
727 w = POP();
728 v = POP();
729 x = mul(v, w);
730 DECREF(v);
731 DECREF(w);
732 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 break;
735
736 case BINARY_DIVIDE:
737 w = POP();
738 v = POP();
739 x = divide(v, w);
740 DECREF(v);
741 DECREF(w);
742 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000743 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 break;
745
746 case BINARY_MODULO:
747 w = POP();
748 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000749 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 DECREF(v);
751 DECREF(w);
752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000753 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 break;
755
756 case BINARY_ADD:
757 w = POP();
758 v = POP();
759 x = add(v, w);
760 DECREF(v);
761 DECREF(w);
762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000764 break;
765
766 case BINARY_SUBTRACT:
767 w = POP();
768 v = POP();
769 x = sub(v, w);
770 DECREF(v);
771 DECREF(w);
772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 break;
775
776 case BINARY_SUBSCR:
777 w = POP();
778 v = POP();
779 x = apply_subscript(v, w);
780 DECREF(v);
781 DECREF(w);
782 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000783 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
Guido van Rossum7928cd71991-10-24 14:59:31 +0000786 case BINARY_LSHIFT:
787 w = POP();
788 v = POP();
789 x = lshift(v, w);
790 DECREF(v);
791 DECREF(w);
792 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000793 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000794 break;
795
796 case BINARY_RSHIFT:
797 w = POP();
798 v = POP();
799 x = rshift(v, w);
800 DECREF(v);
801 DECREF(w);
802 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000803 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000804 break;
805
806 case BINARY_AND:
807 w = POP();
808 v = POP();
809 x = and(v, w);
810 DECREF(v);
811 DECREF(w);
812 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000813 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000814 break;
815
816 case BINARY_XOR:
817 w = POP();
818 v = POP();
819 x = xor(v, w);
820 DECREF(v);
821 DECREF(w);
822 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000823 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000824 break;
825
826 case BINARY_OR:
827 w = POP();
828 v = POP();
829 x = or(v, w);
830 DECREF(v);
831 DECREF(w);
832 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000833 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000834 break;
835
Guido van Rossum374a9221991-04-04 10:40:29 +0000836 case SLICE+0:
837 case SLICE+1:
838 case SLICE+2:
839 case SLICE+3:
840 if ((opcode-SLICE) & 2)
841 w = POP();
842 else
843 w = NULL;
844 if ((opcode-SLICE) & 1)
845 v = POP();
846 else
847 v = NULL;
848 u = POP();
849 x = apply_slice(u, v, w);
850 DECREF(u);
851 XDECREF(v);
852 XDECREF(w);
853 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000854 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000855 break;
856
857 case STORE_SLICE+0:
858 case STORE_SLICE+1:
859 case STORE_SLICE+2:
860 case STORE_SLICE+3:
861 if ((opcode-STORE_SLICE) & 2)
862 w = POP();
863 else
864 w = NULL;
865 if ((opcode-STORE_SLICE) & 1)
866 v = POP();
867 else
868 v = NULL;
869 u = POP();
870 t = POP();
871 err = assign_slice(u, v, w, t); /* u[v:w] = t */
872 DECREF(t);
873 DECREF(u);
874 XDECREF(v);
875 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000876 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 break;
878
879 case DELETE_SLICE+0:
880 case DELETE_SLICE+1:
881 case DELETE_SLICE+2:
882 case DELETE_SLICE+3:
883 if ((opcode-DELETE_SLICE) & 2)
884 w = POP();
885 else
886 w = NULL;
887 if ((opcode-DELETE_SLICE) & 1)
888 v = POP();
889 else
890 v = NULL;
891 u = POP();
892 err = assign_slice(u, v, w, (object *)NULL);
893 /* del u[v:w] */
894 DECREF(u);
895 XDECREF(v);
896 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000897 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 break;
899
900 case STORE_SUBSCR:
901 w = POP();
902 v = POP();
903 u = POP();
904 /* v[w] = u */
905 err = assign_subscript(v, w, u);
906 DECREF(u);
907 DECREF(v);
908 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000909 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000910 break;
911
912 case DELETE_SUBSCR:
913 w = POP();
914 v = POP();
915 /* del v[w] */
916 err = assign_subscript(v, w, (object *)NULL);
917 DECREF(v);
918 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000919 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 break;
921
922 case PRINT_EXPR:
923 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000925 /* Before printing, also assign to '_' */
926 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000927 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000928 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000930 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000931 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000932 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 flushline();
934 }
935 DECREF(v);
936 break;
937
938 case PRINT_ITEM:
939 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000940 w = sysget("stdout");
941 if (softspace(w, 1))
942 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000943 err = writeobject(v, w, PRINT_RAW);
944 if (err == 0 && is_stringobject(v)) {
945 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 char *s = getstringvalue(v);
947 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000948 if (len > 0 &&
949 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000950 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000951 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000954 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 break;
956
957 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000958 x = sysget("stdout");
959 if (x == NULL)
960 err_setstr(RuntimeError, "lost sys.stdout");
961 else {
962 writestring("\n", x);
963 softspace(x, 0);
964 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 break;
966
967 case BREAK_LOOP:
968 why = WHY_BREAK;
969 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000970
Guido van Rossumf10570b1995-07-07 22:53:21 +0000971 case RAISE_VARARGS:
972 u = v = w = NULL;
973 switch (oparg) {
974 case 3:
975 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000976 /* Fallthrough */
977 case 2:
978 v = POP(); /* value */
979 /* Fallthrough */
980 case 1:
981 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000982 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000983 break;
984 default:
985 err_setstr(SystemError,
986 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000987 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000988 break;
989 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
991
992 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000993 if ((x = f->f_locals) == NULL) {
994 err_setstr(SystemError, "no locals");
995 break;
996 }
997 INCREF(x);
998 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 break;
1000
1001 case RETURN_VALUE:
1002 retval = POP();
1003 why = WHY_RETURN;
1004 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001005
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001006 case EXEC_STMT:
1007 w = POP();
1008 v = POP();
1009 u = POP();
1010 err = exec_statement(u, v, w);
1011 DECREF(u);
1012 DECREF(v);
1013 DECREF(w);
1014 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001015
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 case POP_BLOCK:
1017 {
1018 block *b = pop_block(f);
1019 while (STACK_LEVEL() > b->b_level) {
1020 v = POP();
1021 DECREF(v);
1022 }
1023 }
1024 break;
1025
1026 case END_FINALLY:
1027 v = POP();
1028 if (is_intobject(v)) {
1029 why = (enum why_code) getintvalue(v);
1030 if (why == WHY_RETURN)
1031 retval = POP();
1032 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001033 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001035 u = POP();
1036 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001038 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 }
1040 else if (v != None) {
1041 err_setstr(SystemError,
1042 "'finally' pops bad exception");
1043 why = WHY_EXCEPTION;
1044 }
1045 DECREF(v);
1046 break;
1047
1048 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001049 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001051 w = POP();
1052 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001054 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 DECREF(v);
1056 DECREF(w);
1057 break;
1058
1059 case STORE_NAME:
1060 w = GETNAMEV(oparg);
1061 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001062 if ((x = f->f_locals) == NULL) {
1063 err_setstr(SystemError, "no locals");
1064 break;
1065 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001066#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001067 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001068 if (u == NULL) {
1069 if (defmode != 0) {
1070 if (v != None)
1071 u = (object *)v->ob_type;
1072 else
1073 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001074 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001075 (typeobject *)u,
1076 defmode);
1077 DECREF(v);
1078 if (x == NULL)
1079 break;
1080 v = x;
1081 }
1082 }
1083 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001084 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001085 DECREF(v);
1086 break;
1087 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001088#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001089 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001090 DECREF(v);
1091 break;
1092
1093 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001094 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001095 if ((x = f->f_locals) == NULL) {
1096 err_setstr(SystemError, "no locals");
1097 break;
1098 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001099#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001100 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001101 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001102 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001103 (object *)NULL);
1104 break;
1105 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001106#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001107 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001108 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001110
1111#ifdef CASE_TOO_BIG
1112 default: switch (opcode) {
1113#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001114
1115 case UNPACK_TUPLE:
1116 v = POP();
1117 if (!is_tupleobject(v)) {
1118 err_setstr(TypeError, "unpack non-tuple");
1119 why = WHY_EXCEPTION;
1120 }
1121 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001122 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 "unpack tuple of wrong size");
1124 why = WHY_EXCEPTION;
1125 }
1126 else {
Guido van Rossum62f7d151997-01-17 21:05:28 +00001127#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001128 if (!CHECK_STACK(oparg)) {
1129 x = NULL;
1130 break;
1131 }
Guido van Rossum62f7d151997-01-17 21:05:28 +00001132#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001134 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 INCREF(w);
1136 PUSH(w);
1137 }
1138 }
1139 DECREF(v);
1140 break;
1141
1142 case UNPACK_LIST:
1143 v = POP();
1144 if (!is_listobject(v)) {
1145 err_setstr(TypeError, "unpack non-list");
1146 why = WHY_EXCEPTION;
1147 }
1148 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001149 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 "unpack list of wrong size");
1151 why = WHY_EXCEPTION;
1152 }
1153 else {
Guido van Rossum62f7d151997-01-17 21:05:28 +00001154#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001155 if (!CHECK_STACK(oparg)) {
1156 x = NULL;
1157 break;
1158 }
Guido van Rossum62f7d151997-01-17 21:05:28 +00001159#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 for (; --oparg >= 0; ) {
1161 w = getlistitem(v, oparg);
1162 INCREF(w);
1163 PUSH(w);
1164 }
1165 }
1166 DECREF(v);
1167 break;
1168
1169 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001170 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 v = POP();
1172 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001173 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 DECREF(v);
1175 DECREF(u);
1176 break;
1177
1178 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001179 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001181 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 DECREF(v);
1183 break;
1184
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001185 case STORE_GLOBAL:
1186 w = GETNAMEV(oparg);
1187 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001188#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001189 if (f->f_locals != NULL) {
1190 u = dict2lookup(f->f_locals, w);
1191 if (u != NULL && is_accessobject(u)) {
1192 err = setaccessvalue(u, f->f_globals,
1193 v);
1194 DECREF(v);
1195 break;
1196 }
Guido van Rossum25831651993-05-19 14:50:45 +00001197 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001198#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001199 err = dict2insert(f->f_globals, w, v);
1200 DECREF(v);
1201 break;
1202
1203 case DELETE_GLOBAL:
1204 w = GETNAMEV(oparg);
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001205#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001206 if (f->f_locals != NULL) {
1207 u = dict2lookup(f->f_locals, w);
1208 if (u != NULL && is_accessobject(u)) {
1209 err = setaccessvalue(u, f->f_globals,
1210 (object *)NULL);
1211 break;
1212 }
Guido van Rossum25831651993-05-19 14:50:45 +00001213 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001214#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001215 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001216 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001217 break;
1218
Guido van Rossum374a9221991-04-04 10:40:29 +00001219 case LOAD_CONST:
1220 x = GETCONST(oparg);
1221 INCREF(x);
1222 PUSH(x);
1223 break;
1224
1225 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001226 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001227 if ((x = f->f_locals) == NULL) {
1228 err_setstr(SystemError, "no locals");
1229 break;
1230 }
1231 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001233 err_clear();
1234 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001236 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001237 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001239 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 break;
1241 }
1242 }
1243 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001244#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001245 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001246 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001247 if (x == NULL)
1248 break;
1249 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001250 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001251#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001252 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 PUSH(x);
1254 break;
1255
1256 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001257 w = GETNAMEV(oparg);
1258 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001260 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001261 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001263 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
1265 }
1266 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001267#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001268 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001269 x = getaccessvalue(x, f->f_globals);
Guido van Rossum25831651993-05-19 14:50:45 +00001270 if (x == NULL)
1271 break;
1272 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001273 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001274#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001275 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 PUSH(x);
1277 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001278
1279#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001281 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001282 if ((x = f->f_locals) == NULL) {
1283 err_setstr(SystemError, "no locals");
1284 break;
1285 }
1286 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001288 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 break;
1290 }
Guido van Rossum25831651993-05-19 14:50:45 +00001291 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001292 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001293 if (x == NULL)
1294 break;
1295 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001296 else
1297 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 PUSH(x);
1299 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001300#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001301
1302 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001304 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001305 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 gettupleitem(co->co_varnames,
1307 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001308 break;
1309 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001310#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001311 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001312 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001313 if (x == NULL)
1314 break;
1315 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001316 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001317#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001318 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001319 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001320 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001321 break;
1322
1323 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001324 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001325#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001326 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001327 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001328 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001329 DECREF(v);
1330 break;
1331 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001332#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001333 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001334 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001335
1336 case DELETE_FAST:
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001337#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001338 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001339 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001340 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001341 gettupleitem(co->co_varnames,
1342 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001343 break;
1344 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001345 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001346 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001347 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001348 break;
1349 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001350#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001351 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001352 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353
1354 case BUILD_TUPLE:
1355 x = newtupleobject(oparg);
1356 if (x != NULL) {
1357 for (; --oparg >= 0;) {
1358 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001359 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 }
1361 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001362 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 }
1364 break;
1365
1366 case BUILD_LIST:
1367 x = newlistobject(oparg);
1368 if (x != NULL) {
1369 for (; --oparg >= 0;) {
1370 w = POP();
1371 err = setlistitem(x, oparg, w);
1372 if (err != 0)
1373 break;
1374 }
1375 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001376 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 }
1378 break;
1379
1380 case BUILD_MAP:
1381 x = newdictobject();
1382 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001383 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 break;
1385
1386 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001387 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001389 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 DECREF(v);
1391 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001392 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 break;
1394
1395 case COMPARE_OP:
1396 w = POP();
1397 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001398 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 DECREF(v);
1400 DECREF(w);
1401 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001402 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001403 break;
1404
1405 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001407 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001408 if (x == NULL) {
1409 err_setstr(ImportError,
1410 "__import__ not found");
1411 break;
1412 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001413 if (is_methodobject(x)) {
1414 u = None;
1415 INCREF(u);
1416 }
1417 else {
1418 u = find_from_args(f, INSTR_OFFSET());
1419 if (u == NULL) {
1420 x = u;
1421 break;
1422 }
1423 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001424 w = mkvalue("(OOOO)",
1425 w,
1426 f->f_globals,
1427 f->f_locals == NULL ? None : f->f_locals,
1428 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001429 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001430 if (w == NULL) {
1431 x = NULL;
1432 break;
1433 }
1434 x = call_object(x, w);
1435 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001436 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001437 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 break;
1439
1440 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001441 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001442 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001443 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001444 if ((x = f->f_locals) == NULL) {
1445 err_setstr(SystemError, "no locals");
1446 break;
1447 }
1448 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001449 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001450 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001452
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001453#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001454 case ACCESS_MODE:
1455 v = POP();
1456 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001457 if (getstringvalue(w)[0] == '*')
1458 defmode = getintvalue(v);
1459 else
1460 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001461 DECREF(v);
1462 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001463#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001464
1465 case JUMP_FORWARD:
1466 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001467 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468
1469 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001470 err = testbool(TOP());
1471 if (err > 0)
1472 err = 0;
1473 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001475 else
1476 break;
1477 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001478
1479 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001480 err = testbool(TOP());
1481 if (err > 0) {
1482 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001484 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001485 else if (err == 0)
1486 ;
1487 else
1488 break;
1489 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001490
1491 case JUMP_ABSOLUTE:
1492 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001493 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001494
1495 case FOR_LOOP:
1496 /* for v in s: ...
1497 On entry: stack contains s, i.
1498 On exit: stack contains s, i+1, s[i];
1499 but if loop exhausted:
1500 s, i are popped, and we jump */
1501 w = POP(); /* Loop index */
1502 v = POP(); /* Sequence object */
1503 u = loop_subscript(v, w);
1504 if (u != NULL) {
1505 PUSH(v);
1506 x = newintobject(getintvalue(w)+1);
1507 PUSH(x);
1508 DECREF(w);
1509 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001510 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001511 }
1512 else {
1513 DECREF(v);
1514 DECREF(w);
1515 /* A NULL can mean "s exhausted"
1516 but also an error: */
1517 if (err_occurred())
1518 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001519 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001521 continue;
1522 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 }
1524 break;
1525
1526 case SETUP_LOOP:
1527 case SETUP_EXCEPT:
1528 case SETUP_FINALLY:
1529 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1530 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001531 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001532
1533 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001534#ifdef LLTRACE
1535 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001536 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001537#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001538 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001539 if (f->f_trace == NULL)
1540 continue;
1541 /* Trace each line of code reached */
1542 f->f_lasti = INSTR_OFFSET();
1543 err = call_trace(&f->f_trace, &f->f_trace,
1544 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001546
1547 case CALL_FUNCTION:
1548 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001549 int na = oparg & 0xff;
1550 int nk = (oparg>>8) & 0xff;
1551 int n = na + 2*nk;
1552 object **pfunc = stack_pointer - n - 1;
1553 object *func = *pfunc;
1554 object *self = NULL;
1555 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001556 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001557 if (is_instancemethodobject(func)) {
1558 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001559 class = instancemethodgetclass(func);
1560 func = instancemethodgetfunc(func);
1561 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001563 INCREF(self);
1564 DECREF(*pfunc);
1565 *pfunc = self;
1566 na++;
1567 n++;
1568 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001569 else {
1570 /* Unbound methods must be
1571 called with an instance of
1572 the class (or a derived
1573 class) as first argument */
1574 if (na > 0 &&
1575 (self = stack_pointer[-n])
1576 != NULL &&
1577 is_instanceobject(self) &&
1578 issubclass(
1579 (object *)
1580 (((instanceobject *)self)
1581 ->in_class),
1582 class))
1583 /* Handy-dandy */ ;
1584 else {
1585 err_setstr(TypeError,
1586 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001587 x = NULL;
1588 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001589 }
1590 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001591 }
1592 else
1593 INCREF(func);
1594 if (is_funcobject(func)) {
1595 object *co = getfunccode(func);
1596 object *globals = getfuncglobals(func);
1597 object *argdefs = PyFunction_GetDefaults(func);
1598 object **d;
1599 int nd;
1600 if (argdefs != NULL) {
1601 d = &GETTUPLEITEM(argdefs, 0);
1602 nd = ((tupleobject *)argdefs)->ob_size;
1603 }
1604 else {
1605 d = NULL;
1606 nd = 0;
1607 }
1608 x = eval_code2(
1609 (codeobject *)co,
1610 globals, (object *)NULL,
1611 stack_pointer-n, na,
1612 stack_pointer-2*nk, nk,
1613 d, nd,
1614 class);
1615 }
1616 else {
1617 object *args = newtupleobject(na);
1618 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001619 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001620 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001621 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001622 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001623 if (nk > 0) {
1624 kwdict = newdictobject();
1625 if (kwdict == NULL) {
1626 x = NULL;
1627 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001628 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001629 err = 0;
1630 while (--nk >= 0) {
1631 object *value = POP();
1632 object *key = POP();
1633 err = mappinginsert(
1634 kwdict, key, value);
1635 if (err) {
1636 DECREF(key);
1637 DECREF(value);
1638 break;
1639 }
1640 }
1641 if (err) {
1642 DECREF(args);
1643 DECREF(kwdict);
1644 break;
1645 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001646 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001647 while (--na >= 0) {
1648 w = POP();
1649 SETTUPLEITEM(args, na, w);
1650 }
1651 x = PyEval_CallObjectWithKeywords(
1652 func, args, kwdict);
1653 DECREF(args);
1654 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001655 }
1656 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001657 while (stack_pointer > pfunc) {
1658 w = POP();
1659 DECREF(w);
1660 }
1661 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001662 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001663 break;
1664 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001665
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 case MAKE_FUNCTION:
1667 v = POP(); /* code object */
1668 x = newfuncobject(v, f->f_globals);
1669 DECREF(v);
1670 /* XXX Maybe this should be a separate opcode? */
1671 if (x != NULL && oparg > 0) {
1672 v = newtupleobject(oparg);
1673 if (v == NULL) {
1674 DECREF(x);
1675 x = NULL;
1676 break;
1677 }
1678 while (--oparg >= 0) {
1679 w = POP();
1680 SETTUPLEITEM(v, oparg, w);
1681 }
1682 err = PyFunction_SetDefaults(x, v);
1683 DECREF(v);
1684 }
1685 PUSH(x);
1686 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001687
1688 case BUILD_SLICE:
1689 if (oparg == 3)
1690 w = POP();
1691 else
1692 w = NULL;
1693 v = POP();
1694 u = POP();
1695 x = build_slice(u,v,w);
1696 DECREF(u);
1697 DECREF(v);
1698 XDECREF(w);
1699 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001700 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 break;
1702
1703
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 default:
1705 fprintf(stderr,
1706 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001707 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001708 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 why = WHY_EXCEPTION;
1710 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001711
1712#ifdef CASE_TOO_BIG
1713 }
1714#endif
1715
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 } /* switch */
1717
1718 on_error:
1719
1720 /* Quickly continue if no error occurred */
1721
1722 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001723 if (err == 0 && x != NULL) {
1724#ifdef CHECKEXC
1725 if (err_occurred())
1726 fprintf(stderr,
1727 "XXX undetected error\n");
1728 else
1729#endif
1730 continue; /* Normal, fast path */
1731 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 why = WHY_EXCEPTION;
1733 x = None;
1734 err = 0;
1735 }
1736
Guido van Rossum801dcae1992-04-08 11:32:32 +00001737#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 /* Double-check exception status */
1739
1740 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1741 if (!err_occurred()) {
1742 fprintf(stderr, "XXX ghost error\n");
1743 err_setstr(SystemError, "ghost error");
1744 why = WHY_EXCEPTION;
1745 }
1746 }
1747 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001748 if (err_occurred()) {
1749 fprintf(stderr,
1750 "XXX undetected error (why=%d)\n",
1751 why);
1752 why = WHY_EXCEPTION;
1753 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 }
1755#endif
1756
1757 /* Log traceback info if this is a real exception */
1758
1759 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001760 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001762 f->f_lasti -= 2;
1763 tb_here(f);
1764
Guido van Rossume59214e1994-08-30 08:01:59 +00001765 if (f->f_trace)
1766 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001767 if (sys_profile)
1768 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 }
1770
1771 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1772
1773 if (why == WHY_RERAISE)
1774 why = WHY_EXCEPTION;
1775
1776 /* Unwind stacks if a (pseudo) exception occurred */
1777
1778 while (why != WHY_NOT && f->f_iblock > 0) {
1779 block *b = pop_block(f);
1780 while (STACK_LEVEL() > b->b_level) {
1781 v = POP();
1782 XDECREF(v);
1783 }
1784 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1785 why = WHY_NOT;
1786 JUMPTO(b->b_handler);
1787 break;
1788 }
1789 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001790 (b->b_type == SETUP_EXCEPT &&
1791 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001792 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001793 object *exc, *val, *tb;
1794 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 if (val == NULL) {
1796 val = None;
1797 INCREF(val);
1798 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 /* Make the raw exception data
1800 available to the handler,
1801 so a program can emulate the
1802 Python main loop. Don't do
1803 this for 'finally'. */
1804 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001805 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 sysset("exc_value", val);
1807 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001808 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001809 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001810 PUSH(val);
1811 PUSH(exc);
1812 }
1813 else {
1814 if (why == WHY_RETURN)
1815 PUSH(retval);
1816 v = newintobject((long)why);
1817 PUSH(v);
1818 }
1819 why = WHY_NOT;
1820 JUMPTO(b->b_handler);
1821 break;
1822 }
1823 } /* unwind stack */
1824
1825 /* End the loop if we still have an error (or return) */
1826
1827 if (why != WHY_NOT)
1828 break;
1829
1830 } /* main loop */
1831
1832 /* Pop remaining stack entries */
1833
1834 while (!EMPTY()) {
1835 v = POP();
1836 XDECREF(v);
1837 }
1838
Guido van Rossum96a42c81992-01-12 02:29:51 +00001839 if (why != WHY_RETURN)
1840 retval = NULL;
1841
Guido van Rossume59214e1994-08-30 08:01:59 +00001842 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001843 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001844 if (call_trace(&f->f_trace, &f->f_trace, f,
1845 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001846 XDECREF(retval);
1847 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001848 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001849 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001850 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001851 }
1852
1853 if (sys_profile && why == WHY_RETURN) {
1854 if (call_trace(&sys_profile, (object**)0,
1855 f, "return", retval)) {
1856 XDECREF(retval);
1857 retval = NULL;
1858 why = WHY_EXCEPTION;
1859 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001860 }
1861
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001863
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 current_frame = f->f_back;
1865 DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +00001866 --recursion_depth;
Guido van Rossum374a9221991-04-04 10:40:29 +00001867
Guido van Rossum96a42c81992-01-12 02:29:51 +00001868 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001869}
1870
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001871/* Logic for the raise statement (too complicated for inlining).
1872 This *consumes* a reference count to each of its arguments. */
1873static int
1874do_raise(type, value, tb)
1875 object *type, *value, *tb;
1876{
1877 /* We support the following forms of raise:
1878 raise <class>, <classinstance>
1879 raise <class>, <argument tuple>
1880 raise <class>, None
1881 raise <class>, <argument>
1882 raise <classinstance>, None
1883 raise <string>, <object>
1884 raise <string>, None
1885
1886 An omitted second argument is the same as None.
1887
1888 In addition, raise <tuple>, <anything> is the same as
1889 raising the tuple's first item (and it better have one!);
1890 this rule is applied recursively.
1891
1892 Finally, an optional third argument can be supplied, which
1893 gives the traceback to be substituted (useful when
1894 re-raising an exception after examining it). */
1895
1896 /* First, check the traceback argument, replacing None with
1897 NULL. */
1898 if (tb == None) {
1899 DECREF(tb);
1900 tb = NULL;
1901 }
1902 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1903 err_setstr(TypeError,
1904 "raise 3rd arg must be traceback or None");
1905 goto raise_error;
1906 }
1907
1908 /* Next, replace a missing value with None */
1909 if (value == NULL) {
1910 value = None;
1911 INCREF(value);
1912 }
1913
1914 /* Next, repeatedly, replace a tuple exception with its first item */
1915 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1916 object *tmp = type;
1917 type = GETTUPLEITEM(type, 0);
1918 INCREF(type);
1919 DECREF(tmp);
1920 }
1921
1922 /* Now switch on the exception's type */
1923 if (is_stringobject(type)) {
1924 ;
1925 }
1926 else if (is_classobject(type)) {
1927 /* Raising a class. If the value is an instance, it
1928 better be an instance of the class. If it is not,
1929 it will be used to create an instance. */
1930 if (is_instanceobject(value)) {
1931 object *inclass = (object*)
1932 (((instanceobject*)value)->in_class);
1933 if (!issubclass(inclass, type)) {
1934 err_setstr(TypeError,
1935 "raise <class>, <instance> requires that <instance> is a member of <class>");
1936 goto raise_error;
1937 }
1938 }
1939 else {
1940 /* Go instantiate the class */
1941 object *args, *res;
1942 if (value == None)
1943 args = mkvalue("()");
1944 else if (is_tupleobject(value)) {
1945 INCREF(value);
1946 args = value;
1947 }
1948 else
1949 args = mkvalue("(O)", value);
1950 if (args == NULL)
1951 goto raise_error;
1952 res = call_object(type, args);
1953 DECREF(args);
1954 if (res == NULL)
1955 goto raise_error;
1956 DECREF(value);
1957 value = res;
1958 }
1959 }
1960 else if (is_instanceobject(type)) {
1961 /* Raising an instance. The value should be a dummy. */
1962 if (value != None) {
1963 err_setstr(TypeError,
1964 "instance exception may not have a separate value");
1965 goto raise_error;
1966 }
1967 else {
1968 /* Normalize to raise <class>, <instance> */
1969 DECREF(value);
1970 value = type;
1971 type = (object*) ((instanceobject*)type)->in_class;
1972 INCREF(type);
1973 }
1974 }
1975 else {
1976 /* Not something you can raise. You get an exception
1977 anyway, just not what you specified :-) */
1978 err_setstr(TypeError,
1979 "exceptions must be strings, classes, or instances");
1980 goto raise_error;
1981 }
1982 err_restore(type, value, tb);
1983 if (tb == NULL)
1984 return WHY_EXCEPTION;
1985 else
1986 return WHY_RERAISE;
1987 raise_error:
1988 XDECREF(value);
1989 XDECREF(type);
1990 XDECREF(tb);
1991 return WHY_EXCEPTION;
1992}
1993
Guido van Rossum96a42c81992-01-12 02:29:51 +00001994#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001995static int
1996prtrace(v, str)
1997 object *v;
1998 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001999{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002000 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00002001 if (printobject(v, stdout, 0) != 0)
2002 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002003 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002007static void
2008call_exc_trace(p_trace, p_newtrace, f)
2009 object **p_trace, **p_newtrace;
2010 frameobject *f;
2011{
2012 object *type, *value, *traceback, *arg;
2013 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002014 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002015 if (value == NULL) {
2016 value = None;
2017 INCREF(value);
2018 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002019 arg = mkvalue("(OOO)", type, value, traceback);
2020 if (arg == NULL) {
2021 err_restore(type, value, traceback);
2022 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002023 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002024 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
2025 DECREF(arg);
2026 if (err == 0)
2027 err_restore(type, value, traceback);
2028 else {
2029 XDECREF(type);
2030 XDECREF(value);
2031 XDECREF(traceback);
2032 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002033}
2034
2035static int
2036call_trace(p_trace, p_newtrace, f, msg, arg)
2037 object **p_trace; /* in/out; may not be NULL;
2038 may not point to NULL variable initially */
2039 object **p_newtrace; /* in/out; may be NULL;
2040 may point to NULL variable;
2041 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002042 frameobject *f;
2043 char *msg;
2044 object *arg;
2045{
Guido van Rossumf10570b1995-07-07 22:53:21 +00002046 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002047 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002048 static int tracing = 0;
2049
2050 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002051 /* Don't do recursive traces */
2052 if (p_newtrace) {
2053 XDECREF(*p_newtrace);
2054 *p_newtrace = NULL;
2055 }
2056 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002057 }
2058
Guido van Rossumf10570b1995-07-07 22:53:21 +00002059 args = newtupleobject(3);
2060 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002061 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002062 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002063 if (what == NULL)
2064 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002065 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002066 SETTUPLEITEM(args, 0, (object *)f);
2067 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002068 if (arg == NULL)
2069 arg = None;
2070 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002071 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002072 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00002073 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002074 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00002075 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002076 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002077 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002078 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002079 if (res == NULL) {
2080 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002081 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00002082 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002083 *p_trace = NULL;
2084 if (p_newtrace) {
2085 XDECREF(*p_newtrace);
2086 *p_newtrace = NULL;
2087 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002088 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002089 }
2090 else {
2091 if (p_newtrace) {
2092 XDECREF(*p_newtrace);
2093 if (res == None)
2094 *p_newtrace = NULL;
2095 else {
2096 INCREF(res);
2097 *p_newtrace = res;
2098 }
2099 }
2100 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002101 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002102 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002103}
2104
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105object *
Guido van Rossum6135a871995-01-09 17:53:26 +00002106getbuiltins()
2107{
2108 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00002109 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00002110 else
2111 return current_frame->f_builtins;
2112}
2113
2114object *
Guido van Rossum5b722181993-03-30 17:46:03 +00002115getlocals()
2116{
2117 if (current_frame == NULL)
2118 return NULL;
2119 fast_2_locals(current_frame);
2120 return current_frame->f_locals;
2121}
2122
2123object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002124getglobals()
2125{
2126 if (current_frame == NULL)
2127 return NULL;
2128 else
2129 return current_frame->f_globals;
2130}
2131
Guido van Rossum81daa321993-05-20 14:24:46 +00002132object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002133getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00002134{
2135 if (current_frame == NULL)
2136 return NULL;
2137 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002138 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00002139}
2140
Guido van Rossume59214e1994-08-30 08:01:59 +00002141object *
2142getframe()
2143{
2144 return (object *)current_frame;
2145}
2146
Guido van Rossum6135a871995-01-09 17:53:26 +00002147int
2148getrestricted()
2149{
2150 return current_frame == NULL ? 0 : current_frame->f_restricted;
2151}
2152
Guido van Rossum3f5da241990-12-20 15:06:42 +00002153void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154flushline()
2155{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002156 object *f = sysget("stdout");
2157 if (softspace(f, 0))
2158 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159}
2160
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161
Guido van Rossum06186511995-01-07 12:40:10 +00002162#define BINOP(opname, ropname, thisfunc) \
2163 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2164 ; \
2165 else \
2166 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002167
2168
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002170or(v, w)
2171 object *v, *w;
2172{
Guido van Rossum06186511995-01-07 12:40:10 +00002173 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002174 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002175 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002176 object * (*f) FPROTO((object *, object *));
2177 if (coerce(&v, &w) != 0)
2178 return NULL;
2179 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2180 x = (*f)(v, w);
2181 DECREF(v);
2182 DECREF(w);
2183 if (f != NULL)
2184 return x;
2185 }
2186 err_setstr(TypeError, "bad operand type(s) for |");
2187 return NULL;
2188}
2189
2190static object *
2191xor(v, w)
2192 object *v, *w;
2193{
Guido van Rossum06186511995-01-07 12:40:10 +00002194 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002195 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002196 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002197 object * (*f) FPROTO((object *, object *));
2198 if (coerce(&v, &w) != 0)
2199 return NULL;
2200 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2201 x = (*f)(v, w);
2202 DECREF(v);
2203 DECREF(w);
2204 if (f != NULL)
2205 return x;
2206 }
2207 err_setstr(TypeError, "bad operand type(s) for ^");
2208 return NULL;
2209}
2210
2211static object *
2212and(v, w)
2213 object *v, *w;
2214{
Guido van Rossum06186511995-01-07 12:40:10 +00002215 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002216 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002217 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002218 object * (*f) FPROTO((object *, object *));
2219 if (coerce(&v, &w) != 0)
2220 return NULL;
2221 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2222 x = (*f)(v, w);
2223 DECREF(v);
2224 DECREF(w);
2225 if (f != NULL)
2226 return x;
2227 }
2228 err_setstr(TypeError, "bad operand type(s) for &");
2229 return NULL;
2230}
2231
2232static object *
2233lshift(v, w)
2234 object *v, *w;
2235{
Guido van Rossum06186511995-01-07 12:40:10 +00002236 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002237 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002238 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002239 object * (*f) FPROTO((object *, object *));
2240 if (coerce(&v, &w) != 0)
2241 return NULL;
2242 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2243 x = (*f)(v, w);
2244 DECREF(v);
2245 DECREF(w);
2246 if (f != NULL)
2247 return x;
2248 }
2249 err_setstr(TypeError, "bad operand type(s) for <<");
2250 return NULL;
2251}
2252
2253static object *
2254rshift(v, w)
2255 object *v, *w;
2256{
Guido van Rossum06186511995-01-07 12:40:10 +00002257 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002258 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002259 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002260 object * (*f) FPROTO((object *, object *));
2261 if (coerce(&v, &w) != 0)
2262 return NULL;
2263 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2264 x = (*f)(v, w);
2265 DECREF(v);
2266 DECREF(w);
2267 if (f != NULL)
2268 return x;
2269 }
2270 err_setstr(TypeError, "bad operand type(s) for >>");
2271 return NULL;
2272}
2273
2274static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 object *v, *w;
2277{
Guido van Rossum06186511995-01-07 12:40:10 +00002278 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002279 if (v->ob_type->tp_as_sequence != NULL)
2280 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2281 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002282 object *x;
2283 if (coerce(&v, &w) != 0)
2284 return NULL;
2285 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2286 DECREF(v);
2287 DECREF(w);
2288 return x;
2289 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002290 err_setstr(TypeError, "bad operand type(s) for +");
2291 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292}
2293
2294static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002295sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 object *v, *w;
2297{
Guido van Rossum06186511995-01-07 12:40:10 +00002298 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002299 if (v->ob_type->tp_as_number != NULL) {
2300 object *x;
2301 if (coerce(&v, &w) != 0)
2302 return NULL;
2303 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2304 DECREF(v);
2305 DECREF(w);
2306 return x;
2307 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002308 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 return NULL;
2310}
2311
2312static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 object *v, *w;
2315{
2316 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002317 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002318 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002319 if (tp->tp_as_number != NULL &&
2320 w->ob_type->tp_as_sequence != NULL &&
2321 !is_instanceobject(v)) {
2322 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 object *tmp = v;
2324 v = w;
2325 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002326 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002328 if (tp->tp_as_number != NULL) {
2329 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002330 if (is_instanceobject(v)) {
2331 /* Instances of user-defined classes get their
2332 other argument uncoerced, so they may
2333 implement sequence*number as well as
2334 number*number. */
2335 INCREF(v);
2336 INCREF(w);
2337 }
2338 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002339 return NULL;
2340 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2341 DECREF(v);
2342 DECREF(w);
2343 return x;
2344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345 if (tp->tp_as_sequence != NULL) {
2346 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 err_setstr(TypeError,
2348 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 return NULL;
2350 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 return (*tp->tp_as_sequence->sq_repeat)
2352 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002354 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 return NULL;
2356}
2357
2358static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002359divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 object *v, *w;
2361{
Guido van Rossum06186511995-01-07 12:40:10 +00002362 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002363 if (v->ob_type->tp_as_number != NULL) {
2364 object *x;
2365 if (coerce(&v, &w) != 0)
2366 return NULL;
2367 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2368 DECREF(v);
2369 DECREF(w);
2370 return x;
2371 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 return NULL;
2374}
2375
2376static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002377mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 object *v, *w;
2379{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002380 if (is_stringobject(v)) {
2381 return formatstring(v, w);
2382 }
Guido van Rossum06186511995-01-07 12:40:10 +00002383 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002384 if (v->ob_type->tp_as_number != NULL) {
2385 object *x;
2386 if (coerce(&v, &w) != 0)
2387 return NULL;
2388 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2389 DECREF(v);
2390 DECREF(w);
2391 return x;
2392 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002393 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 return NULL;
2395}
2396
2397static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002398powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002399 object *v, *w;
2400{
2401 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002402 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002403 if (v->ob_type->tp_as_number == NULL ||
2404 w->ob_type->tp_as_number == NULL) {
2405 err_setstr(TypeError, "pow() requires numeric arguments");
2406 return NULL;
2407 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002408 if (coerce(&v, &w) != 0)
2409 return NULL;
2410 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2411 DECREF(v);
2412 DECREF(w);
2413 return res;
2414}
2415
2416static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002417neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 object *v;
2419{
2420 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002421 return (*v->ob_type->tp_as_number->nb_negative)(v);
2422 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 return NULL;
2424}
2425
2426static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002427pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 object *v;
2429{
2430 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002431 return (*v->ob_type->tp_as_number->nb_positive)(v);
2432 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 return NULL;
2434}
2435
2436static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002437invert(v)
2438 object *v;
2439{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002440 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002441 if (v->ob_type->tp_as_number != NULL &&
2442 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2443 return (*f)(v);
2444 err_setstr(TypeError, "bad operand type(s) for unary ~");
2445 return NULL;
2446}
2447
2448static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002449not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 object *v;
2451{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002452 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002453 object *w;
2454 if (outcome < 0)
2455 return NULL;
2456 if (outcome == 0)
2457 w = True;
2458 else
2459 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002460 INCREF(w);
2461 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462}
Guido van Rossum234f9421993-06-17 12:35:49 +00002463
2464
Guido van Rossum681d79a1995-07-18 14:51:37 +00002465/* External interface to call any callable object.
2466 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002467
2468object *
2469call_object(func, arg)
2470 object *func;
2471 object *arg;
2472{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002473 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2474}
Guido van Rossume59214e1994-08-30 08:01:59 +00002475
Guido van Rossum681d79a1995-07-18 14:51:37 +00002476object *
2477PyEval_CallObjectWithKeywords(func, arg, kw)
2478 object *func;
2479 object *arg;
2480 object *kw;
2481{
2482 ternaryfunc call;
2483 object *result;
2484
2485 if (arg == NULL)
2486 arg = newtupleobject(0);
2487 else if (!is_tupleobject(arg)) {
2488 err_setstr(TypeError, "argument list must be a tuple");
2489 return NULL;
2490 }
2491 else
2492 INCREF(arg);
2493
Guido van Rossume3e61c11995-08-04 04:14:47 +00002494 if (kw != NULL && !is_dictobject(kw)) {
2495 err_setstr(TypeError, "keyword list must be a dictionary");
2496 return NULL;
2497 }
2498
Guido van Rossum150b2df1996-12-05 23:17:11 +00002499 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002500 result = (*call)(func, arg, kw);
2501 else if (is_instancemethodobject(func) || is_funcobject(func))
2502 result = call_function(func, arg, kw);
2503 else
2504 result = call_builtin(func, arg, kw);
2505
2506 DECREF(arg);
2507
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002508 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002509 err_setstr(SystemError,
2510 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002511
2512 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002513}
2514
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002516call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002518 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002519 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 if (is_methodobject(func)) {
2522 method meth = getmethod(func);
2523 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002524 int flags = getflags(func);
2525 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002526 int size = gettuplesize(arg);
2527 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002528 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002529 else if (size == 0)
2530 arg = NULL;
2531 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002532 if (flags & METH_KEYWORDS)
2533 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002534 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002535 err_setstr(TypeError,
2536 "this function takes no keyword arguments");
2537 return NULL;
2538 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002539 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 }
2541 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002542 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002544 if (is_instanceobject(func)) {
2545 object *res, *call = getattr(func,"__call__");
2546 if (call == NULL) {
2547 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002548 err_setstr(AttributeError,
2549 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002550 return NULL;
2551 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002552 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002553 DECREF(call);
2554 return res;
2555 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002556 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 return NULL;
2558}
2559
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002563 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002564 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002566 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002567 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002568 object **d, **k;
2569 int nk, nd;
2570 object *result;
2571
2572 if (kw != NULL && !is_dictobject(kw)) {
2573 err_badcall();
2574 return NULL;
2575 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576
Guido van Rossume8122f11991-05-05 20:03:07 +00002577 if (is_instancemethodobject(func)) {
2578 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002579 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002580 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002581 if (self == NULL) {
2582 /* Unbound methods must be called with an instance of
2583 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002584 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002585 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002586 if (self != NULL &&
2587 is_instanceobject(self) &&
2588 issubclass((object *)
2589 (((instanceobject *)self)->in_class),
2590 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002591 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002592 else
2593 self = NULL;
2594 }
2595 if (self == NULL) {
2596 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002597 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002598 return NULL;
2599 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002600 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002601 }
2602 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002603 int argcount = gettuplesize(arg);
2604 object *newarg = newtupleobject(argcount + 1);
2605 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002606 if (newarg == NULL)
2607 return NULL;
2608 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002609 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002610 for (i = 0; i < argcount; i++) {
2611 object *v = GETTUPLEITEM(arg, i);
2612 XINCREF(v);
2613 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002614 }
2615 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 }
2617 }
2618 else {
2619 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002620 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 return NULL;
2622 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002623 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002625
2626 argdefs = PyFunction_GetDefaults(func);
2627 if (argdefs != NULL && is_tupleobject(argdefs)) {
2628 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2629 nd = gettuplesize(argdefs);
2630 }
2631 else {
2632 d = NULL;
2633 nd = 0;
2634 }
2635
2636 if (kw != NULL) {
2637 int pos, i;
2638 nk = getmappingsize(kw);
2639 k = NEW(object *, 2*nk);
2640 if (k == NULL) {
2641 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002642 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002643 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002644 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002645 pos = i = 0;
2646 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2647 i += 2;
2648 nk = i/2;
2649 /* XXX This is broken if the caller deletes dict items! */
2650 }
2651 else {
2652 k = NULL;
2653 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002654 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655
Guido van Rossum681d79a1995-07-18 14:51:37 +00002656 result = eval_code2(
2657 (codeobject *)getfunccode(func),
2658 getfuncglobals(func), (object *)NULL,
2659 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2660 k, nk,
2661 d, nd,
2662 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663
Guido van Rossum681d79a1995-07-18 14:51:37 +00002664 DECREF(arg);
2665 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666
Guido van Rossum681d79a1995-07-18 14:51:37 +00002667 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002668}
2669
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002670#define SLICE_ERROR_MSG \
2671 "standard sequence type does not support step size other than one"
2672
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002674apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675 object *v, *w;
2676{
2677 typeobject *tp = v->ob_type;
2678 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002679 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002680 return NULL;
2681 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002682 if (tp->tp_as_mapping != NULL) {
2683 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2684 }
2685 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002687 if (!is_intobject(w)) {
2688 if (PySlice_Check(w)) {
2689 err_setstr(ValueError, SLICE_ERROR_MSG);
2690 } else {
2691 err_setstr(TypeError,
2692 "sequence subscript not int");
2693 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 return NULL;
2695 }
2696 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002697 if (i < 0) {
2698 int len = (*tp->tp_as_sequence->sq_length)(v);
2699 if (len < 0)
2700 return NULL;
2701 i += len;
2702 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002703 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002704 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705}
2706
2707static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002708loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 object *v, *w;
2710{
2711 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002712 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002714 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002715 return NULL;
2716 }
2717 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002718 v = (*sq->sq_item)(v, i);
2719 if (v)
2720 return v;
2721 if (err_occurred() == IndexError)
2722 err_clear();
2723 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724}
2725
2726static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002727slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 object *v;
2729 int isize;
2730 int *pi;
2731{
2732 if (v != NULL) {
2733 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002734 err_setstr(TypeError, "slice index must be int");
2735 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002736 }
2737 *pi = getintvalue(v);
2738 if (*pi < 0)
2739 *pi += isize;
2740 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002741 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742}
2743
2744static object *
Guido van Rossum8861b741996-07-30 16:49:37 +00002745build_slice(u, v, w) /* u:v:w */
2746 object *u, *v, *w;
2747{
2748 return PySlice_New(u,v,w);
2749}
2750
2751static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002752apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 object *u, *v, *w;
2754{
2755 typeobject *tp = u->ob_type;
2756 int ilow, ihigh, isize;
2757 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002758 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 return NULL;
2760 }
2761 ilow = 0;
2762 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002763 if (isize < 0)
2764 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002765 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002767 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002769 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002771
2772static int
2773assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 object *w;
2775 object *key;
2776 object *v;
2777{
2778 typeobject *tp = w->ob_type;
2779 sequence_methods *sq;
2780 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002781 int (*func1)();
2782 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002783 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002784 (func1 = mp->mp_ass_subscript) != NULL) {
2785 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002786 }
2787 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002788 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002790 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002791 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002792 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002794 else {
2795 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002796 if (i < 0) {
2797 int len = (*sq->sq_length)(w);
2798 if (len < 0)
2799 return -1;
2800 i += len;
2801 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002802 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002803 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002806 err_setstr(TypeError,
2807 "can't assign to this subscripted object");
2808 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810}
2811
Guido van Rossum3f5da241990-12-20 15:06:42 +00002812static int
2813assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814 object *u, *v, *w, *x;
2815{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002816 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002817 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002818 if (sq == NULL) {
2819 err_setstr(TypeError, "assign to slice of non-sequence");
2820 return -1;
2821 }
2822 if (sq == NULL || sq->sq_ass_slice == NULL) {
2823 err_setstr(TypeError, "unassignable slice");
2824 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 }
2826 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002827 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002828 if (isize < 0)
2829 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002830 if (slice_index(v, isize, &ilow) != 0)
2831 return -1;
2832 if (slice_index(w, isize, &ihigh) != 0)
2833 return -1;
2834 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835}
2836
2837static int
2838cmp_exception(err, v)
2839 object *err, *v;
2840{
2841 if (is_tupleobject(v)) {
2842 int i, n;
2843 n = gettuplesize(v);
2844 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002845 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002846 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 return 1;
2848 }
2849 return 0;
2850 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002851 if (is_classobject(v) && is_classobject(err))
2852 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 return err == v;
2854}
2855
Guido van Rossum3f5da241990-12-20 15:06:42 +00002856static int
2857cmp_member(v, w)
2858 object *v, *w;
2859{
Guido van Rossume59214e1994-08-30 08:01:59 +00002860 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002861 object *x;
2862 sequence_methods *sq;
2863 /* Special case for char in string */
2864 if (is_stringobject(w)) {
2865 register char *s, *end;
2866 register char c;
2867 if (!is_stringobject(v) || getstringsize(v) != 1) {
2868 err_setstr(TypeError,
2869 "string member test needs char left operand");
2870 return -1;
2871 }
2872 c = getstringvalue(v)[0];
2873 s = getstringvalue(w);
2874 end = s + getstringsize(w);
2875 while (s < end) {
2876 if (c == *s++)
2877 return 1;
2878 }
2879 return 0;
2880 }
2881 sq = w->ob_type->tp_as_sequence;
2882 if (sq == NULL) {
2883 err_setstr(TypeError,
2884 "'in' or 'not in' needs sequence right argument");
2885 return -1;
2886 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002887 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002889 if (x == NULL) {
2890 if (err_occurred() == IndexError) {
2891 err_clear();
2892 break;
2893 }
2894 return -1;
2895 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002896 cmp = cmpobject(v, x);
2897 XDECREF(x);
2898 if (cmp == 0)
2899 return 1;
2900 }
2901 return 0;
2902}
2903
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002904static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002905cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002906 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 register object *v;
2908 register object *w;
2909{
2910 register int cmp;
2911 register int res = 0;
2912 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002913 case IS:
2914 case IS_NOT:
2915 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002916 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002917 res = !res;
2918 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919 case IN:
2920 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002921 res = cmp_member(v, w);
2922 if (res < 0)
2923 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002924 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002925 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926 break;
2927 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002928 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 break;
2930 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002931 cmp = cmpobject(v, w);
2932 switch (op) {
2933 case LT: res = cmp < 0; break;
2934 case LE: res = cmp <= 0; break;
2935 case EQ: res = cmp == 0; break;
2936 case NE: res = cmp != 0; break;
2937 case GT: res = cmp > 0; break;
2938 case GE: res = cmp >= 0; break;
2939 /* XXX no default? (res is initialized to 0 though) */
2940 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 }
2942 v = res ? True : False;
2943 INCREF(v);
2944 return v;
2945}
2946
Guido van Rossum3f5da241990-12-20 15:06:42 +00002947static int
2948import_from(locals, v, name)
2949 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002950 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002951 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002952{
2953 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002954 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002955 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002956 return -1;
2957 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002958 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002959 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002960 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002961 object *name, *value;
2962 pos = 0;
2963 while (mappinggetnext(w, &pos, &name, &value)) {
2964 if (!is_stringobject(name) ||
2965 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002966 continue;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002967#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002968 if (is_accessobject(value)) {
2969 value = getaccessvalue(value, (object *)NULL);
2970 if (value == NULL) {
2971 err_clear();
2972 continue;
2973 }
2974 }
2975 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002976#endif
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002977 INCREF(value);
2978 err = dict2insert(locals, name, value);
2979 DECREF(value);
2980 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002981 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002982 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002983 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002984 }
2985 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002986 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002987 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002988 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002989 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002990 getstringvalue(name));
2991 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002992 return -1;
2993 }
2994 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002995 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002996 }
2997}
2998
2999static object *
Guido van Rossum25831651993-05-19 14:50:45 +00003000build_class(methods, bases, name)
3001 object *methods; /* dictionary */
3002 object *bases; /* tuple containing classes */
3003 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00003004{
Guido van Rossum25831651993-05-19 14:50:45 +00003005 int i;
3006 if (!is_tupleobject(bases)) {
3007 err_setstr(SystemError, "build_class with non-tuple bases");
3008 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003009 }
Guido van Rossum25831651993-05-19 14:50:45 +00003010 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003011 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003012 return NULL;
3013 }
Guido van Rossum25831651993-05-19 14:50:45 +00003014 if (!is_stringobject(name)) {
3015 err_setstr(SystemError, "build_class witn non-string name");
3016 return NULL;
3017 }
3018 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00003019 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00003020 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003021 /* Call the base's *type*, if it is callable.
3022 This code is a hook for Donald Beaudry's
3023 and Jim Fulton's type extensions. In
3024 unexended Python it will never be triggered
3025 since its types are not callable. */
3026 if (base->ob_type->ob_type->tp_call) {
3027 object *args;
3028 object *class;
3029 args = mkvalue("(OOO)", name, bases, methods);
3030 class = call_object((object *)base->ob_type,
3031 args);
3032 DECREF(args);
3033 return class;
3034 }
Guido van Rossum25831651993-05-19 14:50:45 +00003035 err_setstr(TypeError,
3036 "base is not a class object");
3037 return NULL;
3038 }
3039 }
3040 return newclassobject(bases, methods, name);
3041}
3042
Guido van Rossum0dfcf751996-08-12 22:00:53 +00003043#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00003044static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00003045access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00003046 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00003047 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00003048 frameobject *f;
3049{
Guido van Rossumb3f72581993-05-21 19:56:10 +00003050 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00003051 object *value, *ac;
3052 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003053 int ret;
3054 fast_2_locals(f);
3055 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003056 if (value && is_accessobject(value)) {
3057 err_setstr(AccessError, "can't override access");
3058 return -1;
3059 }
3060 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00003061 if (value != NULL && value != None)
3062 type = value->ob_type;
3063 else
3064 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003065 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00003066 if (ac == NULL)
3067 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003068 ret = mappinginsert(f->f_locals, name, ac);
3069 DECREF(ac);
3070 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00003071 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003072}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00003073#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003074
3075static int
3076exec_statement(prog, globals, locals)
3077 object *prog;
3078 object *globals;
3079 object *locals;
3080{
3081 char *s;
3082 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003083 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003084 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003085
3086 if (is_tupleobject(prog) && globals == None && locals == None &&
3087 ((n = gettuplesize(prog)) == 2 || n == 3)) {
3088 /* Backward compatibility hack */
3089 globals = gettupleitem(prog, 1);
3090 if (n == 3)
3091 locals = gettupleitem(prog, 2);
3092 prog = gettupleitem(prog, 0);
3093 }
3094 if (globals == None) {
3095 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003096 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003097 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003098 plain = 1;
3099 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003100 }
3101 else if (locals == None)
3102 locals = globals;
3103 if (!is_stringobject(prog) &&
3104 !is_codeobject(prog) &&
3105 !is_fileobject(prog)) {
3106 err_setstr(TypeError,
3107 "exec 1st arg must be string, code or file object");
3108 return -1;
3109 }
3110 if (!is_dictobject(globals) || !is_dictobject(locals)) {
3111 err_setstr(TypeError,
3112 "exec 2nd/3rd args must be dict or None");
3113 return -1;
3114 }
Guido van Rossum6135a871995-01-09 17:53:26 +00003115 if (dictlookup(globals, "__builtins__") == NULL)
3116 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003117 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003118 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003119 return -1;
3120 return 0;
3121 }
3122 if (is_fileobject(prog)) {
3123 FILE *fp = getfilefile(prog);
3124 char *name = getstringvalue(getfilename(prog));
3125 if (run_file(fp, name, file_input, globals, locals) == NULL)
3126 return -1;
3127 return 0;
3128 }
3129 s = getstringvalue(prog);
3130 if (strlen(s) != getstringsize(prog)) {
3131 err_setstr(ValueError, "embedded '\\0' in exec string");
3132 return -1;
3133 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003134 v = run_string(s, file_input, globals, locals);
3135 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003136 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003137 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003138 if (plain)
3139 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003140 return 0;
3141}
Guido van Rossum24c13741995-02-14 09:42:43 +00003142
Guido van Rossum681d79a1995-07-18 14:51:37 +00003143/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00003144static object *
3145find_from_args(f, nexti)
3146 frameobject *f;
3147 int nexti;
3148{
3149 int opcode;
3150 int oparg;
3151 object *list, *name;
3152 unsigned char *next_instr;
3153
3154 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
3155 opcode = (*next_instr++);
3156 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00003157 INCREF(None);
3158 return None;
3159 }
3160
3161 list = newlistobject(0);
3162 if (list == NULL)
3163 return NULL;
3164
3165 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003166 oparg = (next_instr[1]<<8) + next_instr[0];
3167 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00003168 name = Getnamev(f, oparg);
3169 if (addlistitem(list, name) < 0) {
3170 DECREF(list);
3171 break;
3172 }
3173 opcode = (*next_instr++);
3174 } while (opcode == IMPORT_FROM);
3175
3176 return list;
3177}