blob: dbfaf7dc97965b9696fa5403b9f4fc242abc5833 [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);
652 break;
653
654 case ROT_TWO:
655 v = POP();
656 w = POP();
657 PUSH(v);
658 PUSH(w);
659 break;
660
661 case ROT_THREE:
662 v = POP();
663 w = POP();
664 x = POP();
665 PUSH(v);
666 PUSH(x);
667 PUSH(w);
668 break;
669
670 case DUP_TOP:
671 v = TOP();
672 INCREF(v);
673 PUSH(v);
674 break;
675
676 case UNARY_POSITIVE:
677 v = POP();
678 x = pos(v);
679 DECREF(v);
680 PUSH(x);
681 break;
682
683 case UNARY_NEGATIVE:
684 v = POP();
685 x = neg(v);
686 DECREF(v);
687 PUSH(x);
688 break;
689
690 case UNARY_NOT:
691 v = POP();
692 x = not(v);
693 DECREF(v);
694 PUSH(x);
695 break;
696
697 case UNARY_CONVERT:
698 v = POP();
699 x = reprobject(v);
700 DECREF(v);
701 PUSH(x);
702 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000703
704 case UNARY_INVERT:
705 v = POP();
706 x = invert(v);
707 DECREF(v);
708 PUSH(x);
709 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000710
Guido van Rossum50564e81996-01-12 01:13:16 +0000711 case BINARY_POWER:
712 w = POP();
713 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000714 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000715 DECREF(v);
716 DECREF(w);
717 PUSH(x);
718 break;
719
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 case BINARY_MULTIPLY:
721 w = POP();
722 v = POP();
723 x = mul(v, w);
724 DECREF(v);
725 DECREF(w);
726 PUSH(x);
727 break;
728
729 case BINARY_DIVIDE:
730 w = POP();
731 v = POP();
732 x = divide(v, w);
733 DECREF(v);
734 DECREF(w);
735 PUSH(x);
736 break;
737
738 case BINARY_MODULO:
739 w = POP();
740 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000741 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 DECREF(v);
743 DECREF(w);
744 PUSH(x);
745 break;
746
747 case BINARY_ADD:
748 w = POP();
749 v = POP();
750 x = add(v, w);
751 DECREF(v);
752 DECREF(w);
753 PUSH(x);
754 break;
755
756 case BINARY_SUBTRACT:
757 w = POP();
758 v = POP();
759 x = sub(v, w);
760 DECREF(v);
761 DECREF(w);
762 PUSH(x);
763 break;
764
765 case BINARY_SUBSCR:
766 w = POP();
767 v = POP();
768 x = apply_subscript(v, w);
769 DECREF(v);
770 DECREF(w);
771 PUSH(x);
772 break;
773
Guido van Rossum7928cd71991-10-24 14:59:31 +0000774 case BINARY_LSHIFT:
775 w = POP();
776 v = POP();
777 x = lshift(v, w);
778 DECREF(v);
779 DECREF(w);
780 PUSH(x);
781 break;
782
783 case BINARY_RSHIFT:
784 w = POP();
785 v = POP();
786 x = rshift(v, w);
787 DECREF(v);
788 DECREF(w);
789 PUSH(x);
790 break;
791
792 case BINARY_AND:
793 w = POP();
794 v = POP();
795 x = and(v, w);
796 DECREF(v);
797 DECREF(w);
798 PUSH(x);
799 break;
800
801 case BINARY_XOR:
802 w = POP();
803 v = POP();
804 x = xor(v, w);
805 DECREF(v);
806 DECREF(w);
807 PUSH(x);
808 break;
809
810 case BINARY_OR:
811 w = POP();
812 v = POP();
813 x = or(v, w);
814 DECREF(v);
815 DECREF(w);
816 PUSH(x);
817 break;
818
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 case SLICE+0:
820 case SLICE+1:
821 case SLICE+2:
822 case SLICE+3:
823 if ((opcode-SLICE) & 2)
824 w = POP();
825 else
826 w = NULL;
827 if ((opcode-SLICE) & 1)
828 v = POP();
829 else
830 v = NULL;
831 u = POP();
832 x = apply_slice(u, v, w);
833 DECREF(u);
834 XDECREF(v);
835 XDECREF(w);
836 PUSH(x);
837 break;
838
839 case STORE_SLICE+0:
840 case STORE_SLICE+1:
841 case STORE_SLICE+2:
842 case STORE_SLICE+3:
843 if ((opcode-STORE_SLICE) & 2)
844 w = POP();
845 else
846 w = NULL;
847 if ((opcode-STORE_SLICE) & 1)
848 v = POP();
849 else
850 v = NULL;
851 u = POP();
852 t = POP();
853 err = assign_slice(u, v, w, t); /* u[v:w] = t */
854 DECREF(t);
855 DECREF(u);
856 XDECREF(v);
857 XDECREF(w);
858 break;
859
860 case DELETE_SLICE+0:
861 case DELETE_SLICE+1:
862 case DELETE_SLICE+2:
863 case DELETE_SLICE+3:
864 if ((opcode-DELETE_SLICE) & 2)
865 w = POP();
866 else
867 w = NULL;
868 if ((opcode-DELETE_SLICE) & 1)
869 v = POP();
870 else
871 v = NULL;
872 u = POP();
873 err = assign_slice(u, v, w, (object *)NULL);
874 /* del u[v:w] */
875 DECREF(u);
876 XDECREF(v);
877 XDECREF(w);
878 break;
879
880 case STORE_SUBSCR:
881 w = POP();
882 v = POP();
883 u = POP();
884 /* v[w] = u */
885 err = assign_subscript(v, w, u);
886 DECREF(u);
887 DECREF(v);
888 DECREF(w);
889 break;
890
891 case DELETE_SUBSCR:
892 w = POP();
893 v = POP();
894 /* del v[w] */
895 err = assign_subscript(v, w, (object *)NULL);
896 DECREF(v);
897 DECREF(w);
898 break;
899
900 case PRINT_EXPR:
901 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000903 /* Before printing, also assign to '_' */
904 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000905 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000906 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000908 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000909 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000910 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 flushline();
912 }
913 DECREF(v);
914 break;
915
916 case PRINT_ITEM:
917 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000918 w = sysget("stdout");
919 if (softspace(w, 1))
920 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000921 err = writeobject(v, w, PRINT_RAW);
922 if (err == 0 && is_stringobject(v)) {
923 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 char *s = getstringvalue(v);
925 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000926 if (len > 0 &&
927 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000928 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000929 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 DECREF(v);
932 break;
933
934 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000935 x = sysget("stdout");
936 if (x == NULL)
937 err_setstr(RuntimeError, "lost sys.stdout");
938 else {
939 writestring("\n", x);
940 softspace(x, 0);
941 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
943
944 case BREAK_LOOP:
945 why = WHY_BREAK;
946 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000947
Guido van Rossumf10570b1995-07-07 22:53:21 +0000948 case RAISE_VARARGS:
949 u = v = w = NULL;
950 switch (oparg) {
951 case 3:
952 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000953 /* Fallthrough */
954 case 2:
955 v = POP(); /* value */
956 /* Fallthrough */
957 case 1:
958 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000959 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000960 break;
961 default:
962 err_setstr(SystemError,
963 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000964 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000965 break;
966 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 break;
968
969 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000970 if ((x = f->f_locals) == NULL) {
971 err_setstr(SystemError, "no locals");
972 break;
973 }
974 INCREF(x);
975 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 break;
977
978 case RETURN_VALUE:
979 retval = POP();
980 why = WHY_RETURN;
981 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000982
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000983 case EXEC_STMT:
984 w = POP();
985 v = POP();
986 u = POP();
987 err = exec_statement(u, v, w);
988 DECREF(u);
989 DECREF(v);
990 DECREF(w);
991 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000992
Guido van Rossum374a9221991-04-04 10:40:29 +0000993 case POP_BLOCK:
994 {
995 block *b = pop_block(f);
996 while (STACK_LEVEL() > b->b_level) {
997 v = POP();
998 DECREF(v);
999 }
1000 }
1001 break;
1002
1003 case END_FINALLY:
1004 v = POP();
1005 if (is_intobject(v)) {
1006 why = (enum why_code) getintvalue(v);
1007 if (why == WHY_RETURN)
1008 retval = POP();
1009 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001010 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001012 u = POP();
1013 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001014 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001015 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 }
1017 else if (v != None) {
1018 err_setstr(SystemError,
1019 "'finally' pops bad exception");
1020 why = WHY_EXCEPTION;
1021 }
1022 DECREF(v);
1023 break;
1024
1025 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001026 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001028 w = POP();
1029 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001031 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 DECREF(v);
1033 DECREF(w);
1034 break;
1035
1036 case STORE_NAME:
1037 w = GETNAMEV(oparg);
1038 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001039 if ((x = f->f_locals) == NULL) {
1040 err_setstr(SystemError, "no locals");
1041 break;
1042 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001043#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001044 u = dict2lookup(x, w);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001045 if (u == NULL) {
1046 if (defmode != 0) {
1047 if (v != None)
1048 u = (object *)v->ob_type;
1049 else
1050 u = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001051 x = newaccessobject(v, x,
Guido van Rossumb3f72581993-05-21 19:56:10 +00001052 (typeobject *)u,
1053 defmode);
1054 DECREF(v);
1055 if (x == NULL)
1056 break;
1057 v = x;
1058 }
1059 }
1060 else if (is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001061 err = setaccessvalue(u, x, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001062 DECREF(v);
1063 break;
1064 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001065#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001066 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001067 DECREF(v);
1068 break;
1069
1070 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001071 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001072 if ((x = f->f_locals) == NULL) {
1073 err_setstr(SystemError, "no locals");
1074 break;
1075 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001076#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001077 u = dict2lookup(x, w);
Guido van Rossum25831651993-05-19 14:50:45 +00001078 if (u != NULL && is_accessobject(u)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001079 err = setaccessvalue(u, x,
Guido van Rossum25831651993-05-19 14:50:45 +00001080 (object *)NULL);
1081 break;
1082 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001083#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001084 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001085 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001086 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001087
1088#ifdef CASE_TOO_BIG
1089 default: switch (opcode) {
1090#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001091
1092 case UNPACK_TUPLE:
1093 v = POP();
1094 if (!is_tupleobject(v)) {
1095 err_setstr(TypeError, "unpack non-tuple");
1096 why = WHY_EXCEPTION;
1097 }
1098 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001099 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001100 "unpack tuple of wrong size");
1101 why = WHY_EXCEPTION;
1102 }
1103 else {
Guido van Rossum62f7d151997-01-17 21:05:28 +00001104#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001105 if (!CHECK_STACK(oparg)) {
1106 x = NULL;
1107 break;
1108 }
Guido van Rossum62f7d151997-01-17 21:05:28 +00001109#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001111 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001112 INCREF(w);
1113 PUSH(w);
1114 }
1115 }
1116 DECREF(v);
1117 break;
1118
1119 case UNPACK_LIST:
1120 v = POP();
1121 if (!is_listobject(v)) {
1122 err_setstr(TypeError, "unpack non-list");
1123 why = WHY_EXCEPTION;
1124 }
1125 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001126 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001127 "unpack list of wrong size");
1128 why = WHY_EXCEPTION;
1129 }
1130 else {
Guido van Rossum62f7d151997-01-17 21:05:28 +00001131#ifdef CHECK_STACK
Guido van Rossuma9e7dc11992-10-18 18:53:57 +00001132 if (!CHECK_STACK(oparg)) {
1133 x = NULL;
1134 break;
1135 }
Guido van Rossum62f7d151997-01-17 21:05:28 +00001136#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 for (; --oparg >= 0; ) {
1138 w = getlistitem(v, oparg);
1139 INCREF(w);
1140 PUSH(w);
1141 }
1142 }
1143 DECREF(v);
1144 break;
1145
1146 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001147 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 v = POP();
1149 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001150 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 DECREF(v);
1152 DECREF(u);
1153 break;
1154
1155 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001156 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001158 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 DECREF(v);
1160 break;
1161
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001162 case STORE_GLOBAL:
1163 w = GETNAMEV(oparg);
1164 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001165#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001166 if (f->f_locals != NULL) {
1167 u = dict2lookup(f->f_locals, w);
1168 if (u != NULL && is_accessobject(u)) {
1169 err = setaccessvalue(u, f->f_globals,
1170 v);
1171 DECREF(v);
1172 break;
1173 }
Guido van Rossum25831651993-05-19 14:50:45 +00001174 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001175#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001176 err = dict2insert(f->f_globals, w, v);
1177 DECREF(v);
1178 break;
1179
1180 case DELETE_GLOBAL:
1181 w = GETNAMEV(oparg);
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001182#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001183 if (f->f_locals != NULL) {
1184 u = dict2lookup(f->f_locals, w);
1185 if (u != NULL && is_accessobject(u)) {
1186 err = setaccessvalue(u, f->f_globals,
1187 (object *)NULL);
1188 break;
1189 }
Guido van Rossum25831651993-05-19 14:50:45 +00001190 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001191#endif
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001192 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001193 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001194 break;
1195
Guido van Rossum374a9221991-04-04 10:40:29 +00001196 case LOAD_CONST:
1197 x = GETCONST(oparg);
1198 INCREF(x);
1199 PUSH(x);
1200 break;
1201
1202 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001203 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001204 if ((x = f->f_locals) == NULL) {
1205 err_setstr(SystemError, "no locals");
1206 break;
1207 }
1208 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001210 err_clear();
1211 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001213 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001214 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001216 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001217 break;
1218 }
1219 }
1220 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001221#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001222 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001223 x = getaccessvalue(x, f->f_globals /* XXX */);
Guido van Rossum25831651993-05-19 14:50:45 +00001224 if (x == NULL)
1225 break;
1226 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001227 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001228#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001229 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 PUSH(x);
1231 break;
1232
1233 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001234 w = GETNAMEV(oparg);
1235 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001237 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001238 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001240 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 break;
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);
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;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001255
1256#if 0
Guido van Rossum374a9221991-04-04 10:40:29 +00001257 case LOAD_LOCAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001258 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001259 if ((x = f->f_locals) == NULL) {
1260 err_setstr(SystemError, "no locals");
1261 break;
1262 }
1263 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001265 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
1267 }
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_locals);
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
1274 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 PUSH(x);
1276 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001277#endif
Guido van Rossum9bfef441993-03-29 10:43:31 +00001278
1279 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001280 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001281 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001282 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001283 gettupleitem(co->co_varnames,
1284 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001285 break;
1286 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001287#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001288 if (is_accessobject(x)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001289 x = getaccessvalue(x, f->f_locals);
Guido van Rossum25831651993-05-19 14:50:45 +00001290 if (x == NULL)
1291 break;
1292 }
Guido van Rossum81daa321993-05-20 14:24:46 +00001293 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001294#endif
Guido van Rossum81daa321993-05-20 14:24:46 +00001295 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001296 PUSH(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001297 break;
1298
1299 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001300 v = POP();
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001301#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001302 w = GETLOCAL(oparg);
Guido van Rossum25831651993-05-19 14:50:45 +00001303 if (w != NULL && is_accessobject(w)) {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001304 err = setaccessvalue(w, f->f_locals, v);
Guido van Rossum25831651993-05-19 14:50:45 +00001305 DECREF(v);
1306 break;
1307 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001308#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001309 SETLOCAL(oparg, v);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001310 break;
1311
1312 case DELETE_FAST:
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001313#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum681d79a1995-07-18 14:51:37 +00001314 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001315 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001316 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001317 gettupleitem(co->co_varnames,
1318 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001319 break;
1320 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001321 if (is_accessobject(x)) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001322 err = setaccessvalue(x, f->f_locals,
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00001323 (object *)NULL);
Guido van Rossum25831651993-05-19 14:50:45 +00001324 break;
1325 }
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001326#endif
Guido van Rossum681d79a1995-07-18 14:51:37 +00001327 SETLOCAL(oparg, NULL);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001328 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001329
1330 case BUILD_TUPLE:
1331 x = newtupleobject(oparg);
1332 if (x != NULL) {
1333 for (; --oparg >= 0;) {
1334 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001335 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 }
1337 PUSH(x);
1338 }
1339 break;
1340
1341 case BUILD_LIST:
1342 x = newlistobject(oparg);
1343 if (x != NULL) {
1344 for (; --oparg >= 0;) {
1345 w = POP();
1346 err = setlistitem(x, oparg, w);
1347 if (err != 0)
1348 break;
1349 }
1350 PUSH(x);
1351 }
1352 break;
1353
1354 case BUILD_MAP:
1355 x = newdictobject();
1356 PUSH(x);
1357 break;
1358
1359 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001360 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001362 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 DECREF(v);
1364 PUSH(x);
1365 break;
1366
1367 case COMPARE_OP:
1368 w = POP();
1369 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001370 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 DECREF(v);
1372 DECREF(w);
1373 PUSH(x);
1374 break;
1375
1376 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001377 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001378 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001379 if (x == NULL) {
1380 err_setstr(ImportError,
1381 "__import__ not found");
1382 break;
1383 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001384 if (is_methodobject(x)) {
1385 u = None;
1386 INCREF(u);
1387 }
1388 else {
1389 u = find_from_args(f, INSTR_OFFSET());
1390 if (u == NULL) {
1391 x = u;
1392 break;
1393 }
1394 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001395 w = mkvalue("(OOOO)",
1396 w,
1397 f->f_globals,
1398 f->f_locals == NULL ? None : f->f_locals,
1399 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001400 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001401 if (w == NULL) {
1402 x = NULL;
1403 break;
1404 }
1405 x = call_object(x, w);
1406 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001407 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001408 break;
1409
1410 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001411 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001413 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001414 if ((x = f->f_locals) == NULL) {
1415 err_setstr(SystemError, "no locals");
1416 break;
1417 }
1418 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001419 locals_2_fast(f, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001421
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001422#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00001423 case ACCESS_MODE:
1424 v = POP();
1425 w = GETNAMEV(oparg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00001426 if (getstringvalue(w)[0] == '*')
1427 defmode = getintvalue(v);
1428 else
1429 err = access_statement(w, v, f);
Guido van Rossum25831651993-05-19 14:50:45 +00001430 DECREF(v);
1431 break;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00001432#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001433
1434 case JUMP_FORWARD:
1435 JUMPBY(oparg);
1436 break;
1437
1438 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001439 err = testbool(TOP());
1440 if (err > 0)
1441 err = 0;
1442 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 JUMPBY(oparg);
1444 break;
1445
1446 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001447 err = testbool(TOP());
1448 if (err > 0) {
1449 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001451 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 break;
1453
1454 case JUMP_ABSOLUTE:
1455 JUMPTO(oparg);
1456 break;
1457
1458 case FOR_LOOP:
1459 /* for v in s: ...
1460 On entry: stack contains s, i.
1461 On exit: stack contains s, i+1, s[i];
1462 but if loop exhausted:
1463 s, i are popped, and we jump */
1464 w = POP(); /* Loop index */
1465 v = POP(); /* Sequence object */
1466 u = loop_subscript(v, w);
1467 if (u != NULL) {
1468 PUSH(v);
1469 x = newintobject(getintvalue(w)+1);
1470 PUSH(x);
1471 DECREF(w);
1472 PUSH(u);
1473 }
1474 else {
1475 DECREF(v);
1476 DECREF(w);
1477 /* A NULL can mean "s exhausted"
1478 but also an error: */
1479 if (err_occurred())
1480 why = WHY_EXCEPTION;
1481 else
1482 JUMPBY(oparg);
1483 }
1484 break;
1485
1486 case SETUP_LOOP:
1487 case SETUP_EXCEPT:
1488 case SETUP_FINALLY:
1489 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1490 STACK_LEVEL());
1491 break;
1492
1493 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001494#ifdef LLTRACE
1495 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001496 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001498 f->f_lineno = oparg;
Guido van Rossume59214e1994-08-30 08:01:59 +00001499 if (f->f_trace != NULL) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001500 /* Trace each line of code reached */
1501 f->f_lasti = INSTR_OFFSET();
Guido van Rossume59214e1994-08-30 08:01:59 +00001502 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001503 f, "line", None);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001504 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001506
1507 case CALL_FUNCTION:
1508 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001509 int na = oparg & 0xff;
1510 int nk = (oparg>>8) & 0xff;
1511 int n = na + 2*nk;
1512 object **pfunc = stack_pointer - n - 1;
1513 object *func = *pfunc;
1514 object *self = NULL;
1515 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001516 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001517 if (is_instancemethodobject(func)) {
1518 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 class = instancemethodgetclass(func);
1520 func = instancemethodgetfunc(func);
1521 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001522 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001523 INCREF(self);
1524 DECREF(*pfunc);
1525 *pfunc = self;
1526 na++;
1527 n++;
1528 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001529 else {
1530 /* Unbound methods must be
1531 called with an instance of
1532 the class (or a derived
1533 class) as first argument */
1534 if (na > 0 &&
1535 (self = stack_pointer[-n])
1536 != NULL &&
1537 is_instanceobject(self) &&
1538 issubclass(
1539 (object *)
1540 (((instanceobject *)self)
1541 ->in_class),
1542 class))
1543 /* Handy-dandy */ ;
1544 else {
1545 err_setstr(TypeError,
1546 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001547 x = NULL;
1548 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001549 }
1550 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001551 }
1552 else
1553 INCREF(func);
1554 if (is_funcobject(func)) {
1555 object *co = getfunccode(func);
1556 object *globals = getfuncglobals(func);
1557 object *argdefs = PyFunction_GetDefaults(func);
1558 object **d;
1559 int nd;
1560 if (argdefs != NULL) {
1561 d = &GETTUPLEITEM(argdefs, 0);
1562 nd = ((tupleobject *)argdefs)->ob_size;
1563 }
1564 else {
1565 d = NULL;
1566 nd = 0;
1567 }
1568 x = eval_code2(
1569 (codeobject *)co,
1570 globals, (object *)NULL,
1571 stack_pointer-n, na,
1572 stack_pointer-2*nk, nk,
1573 d, nd,
1574 class);
1575 }
1576 else {
1577 object *args = newtupleobject(na);
1578 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001579 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001581 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001582 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001583 if (nk > 0) {
1584 kwdict = newdictobject();
1585 if (kwdict == NULL) {
1586 x = NULL;
1587 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001589 err = 0;
1590 while (--nk >= 0) {
1591 object *value = POP();
1592 object *key = POP();
1593 err = mappinginsert(
1594 kwdict, key, value);
1595 if (err) {
1596 DECREF(key);
1597 DECREF(value);
1598 break;
1599 }
1600 }
1601 if (err) {
1602 DECREF(args);
1603 DECREF(kwdict);
1604 break;
1605 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001607 while (--na >= 0) {
1608 w = POP();
1609 SETTUPLEITEM(args, na, w);
1610 }
1611 x = PyEval_CallObjectWithKeywords(
1612 func, args, kwdict);
1613 DECREF(args);
1614 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615 }
1616 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617 while (stack_pointer > pfunc) {
1618 w = POP();
1619 DECREF(w);
1620 }
1621 PUSH(x);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001622 break;
1623 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001624
Guido van Rossum681d79a1995-07-18 14:51:37 +00001625 case MAKE_FUNCTION:
1626 v = POP(); /* code object */
1627 x = newfuncobject(v, f->f_globals);
1628 DECREF(v);
1629 /* XXX Maybe this should be a separate opcode? */
1630 if (x != NULL && oparg > 0) {
1631 v = newtupleobject(oparg);
1632 if (v == NULL) {
1633 DECREF(x);
1634 x = NULL;
1635 break;
1636 }
1637 while (--oparg >= 0) {
1638 w = POP();
1639 SETTUPLEITEM(v, oparg, w);
1640 }
1641 err = PyFunction_SetDefaults(x, v);
1642 DECREF(v);
1643 }
1644 PUSH(x);
1645 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001646
1647 case BUILD_SLICE:
1648 if (oparg == 3)
1649 w = POP();
1650 else
1651 w = NULL;
1652 v = POP();
1653 u = POP();
1654 x = build_slice(u,v,w);
1655 DECREF(u);
1656 DECREF(v);
1657 XDECREF(w);
1658 PUSH(x);
1659 break;
1660
1661
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 default:
1663 fprintf(stderr,
1664 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001665 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 why = WHY_EXCEPTION;
1668 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001669
1670#ifdef CASE_TOO_BIG
1671 }
1672#endif
1673
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 } /* switch */
1675
1676 on_error:
1677
1678 /* Quickly continue if no error occurred */
1679
1680 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 if (err == 0 && x != NULL) {
1682#ifdef CHECKEXC
1683 if (err_occurred())
1684 fprintf(stderr,
1685 "XXX undetected error\n");
1686 else
1687#endif
1688 continue; /* Normal, fast path */
1689 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 why = WHY_EXCEPTION;
1691 x = None;
1692 err = 0;
1693 }
1694
Guido van Rossum801dcae1992-04-08 11:32:32 +00001695#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 /* Double-check exception status */
1697
1698 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1699 if (!err_occurred()) {
1700 fprintf(stderr, "XXX ghost error\n");
1701 err_setstr(SystemError, "ghost error");
1702 why = WHY_EXCEPTION;
1703 }
1704 }
1705 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001706 if (err_occurred()) {
1707 fprintf(stderr,
1708 "XXX undetected error (why=%d)\n",
1709 why);
1710 why = WHY_EXCEPTION;
1711 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 }
1713#endif
1714
1715 /* Log traceback info if this is a real exception */
1716
1717 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001718 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001720 f->f_lasti -= 2;
1721 tb_here(f);
1722
Guido van Rossume59214e1994-08-30 08:01:59 +00001723 if (f->f_trace)
1724 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001725 if (sys_profile)
1726 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 }
1728
1729 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1730
1731 if (why == WHY_RERAISE)
1732 why = WHY_EXCEPTION;
1733
1734 /* Unwind stacks if a (pseudo) exception occurred */
1735
1736 while (why != WHY_NOT && f->f_iblock > 0) {
1737 block *b = pop_block(f);
1738 while (STACK_LEVEL() > b->b_level) {
1739 v = POP();
1740 XDECREF(v);
1741 }
1742 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1743 why = WHY_NOT;
1744 JUMPTO(b->b_handler);
1745 break;
1746 }
1747 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001748 (b->b_type == SETUP_EXCEPT &&
1749 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751 object *exc, *val, *tb;
1752 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001753 if (val == NULL) {
1754 val = None;
1755 INCREF(val);
1756 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 /* Make the raw exception data
1758 available to the handler,
1759 so a program can emulate the
1760 Python main loop. Don't do
1761 this for 'finally'. */
1762 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001763 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 sysset("exc_value", val);
1765 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001767 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 PUSH(val);
1769 PUSH(exc);
1770 }
1771 else {
1772 if (why == WHY_RETURN)
1773 PUSH(retval);
1774 v = newintobject((long)why);
1775 PUSH(v);
1776 }
1777 why = WHY_NOT;
1778 JUMPTO(b->b_handler);
1779 break;
1780 }
1781 } /* unwind stack */
1782
1783 /* End the loop if we still have an error (or return) */
1784
1785 if (why != WHY_NOT)
1786 break;
1787
1788 } /* main loop */
1789
1790 /* Pop remaining stack entries */
1791
1792 while (!EMPTY()) {
1793 v = POP();
1794 XDECREF(v);
1795 }
1796
Guido van Rossum96a42c81992-01-12 02:29:51 +00001797 if (why != WHY_RETURN)
1798 retval = NULL;
1799
Guido van Rossume59214e1994-08-30 08:01:59 +00001800 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001801 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001802 if (call_trace(&f->f_trace, &f->f_trace, f,
1803 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001804 XDECREF(retval);
1805 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001806 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001807 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001808 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001809 }
1810
1811 if (sys_profile && why == WHY_RETURN) {
1812 if (call_trace(&sys_profile, (object**)0,
1813 f, "return", retval)) {
1814 XDECREF(retval);
1815 retval = NULL;
1816 why = WHY_EXCEPTION;
1817 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001818 }
1819
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001821
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 current_frame = f->f_back;
1823 DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +00001824 --recursion_depth;
Guido van Rossum374a9221991-04-04 10:40:29 +00001825
Guido van Rossum96a42c81992-01-12 02:29:51 +00001826 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001827}
1828
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001829/* Logic for the raise statement (too complicated for inlining).
1830 This *consumes* a reference count to each of its arguments. */
1831static int
1832do_raise(type, value, tb)
1833 object *type, *value, *tb;
1834{
1835 /* We support the following forms of raise:
1836 raise <class>, <classinstance>
1837 raise <class>, <argument tuple>
1838 raise <class>, None
1839 raise <class>, <argument>
1840 raise <classinstance>, None
1841 raise <string>, <object>
1842 raise <string>, None
1843
1844 An omitted second argument is the same as None.
1845
1846 In addition, raise <tuple>, <anything> is the same as
1847 raising the tuple's first item (and it better have one!);
1848 this rule is applied recursively.
1849
1850 Finally, an optional third argument can be supplied, which
1851 gives the traceback to be substituted (useful when
1852 re-raising an exception after examining it). */
1853
1854 /* First, check the traceback argument, replacing None with
1855 NULL. */
1856 if (tb == None) {
1857 DECREF(tb);
1858 tb = NULL;
1859 }
1860 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1861 err_setstr(TypeError,
1862 "raise 3rd arg must be traceback or None");
1863 goto raise_error;
1864 }
1865
1866 /* Next, replace a missing value with None */
1867 if (value == NULL) {
1868 value = None;
1869 INCREF(value);
1870 }
1871
1872 /* Next, repeatedly, replace a tuple exception with its first item */
1873 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1874 object *tmp = type;
1875 type = GETTUPLEITEM(type, 0);
1876 INCREF(type);
1877 DECREF(tmp);
1878 }
1879
1880 /* Now switch on the exception's type */
1881 if (is_stringobject(type)) {
1882 ;
1883 }
1884 else if (is_classobject(type)) {
1885 /* Raising a class. If the value is an instance, it
1886 better be an instance of the class. If it is not,
1887 it will be used to create an instance. */
1888 if (is_instanceobject(value)) {
1889 object *inclass = (object*)
1890 (((instanceobject*)value)->in_class);
1891 if (!issubclass(inclass, type)) {
1892 err_setstr(TypeError,
1893 "raise <class>, <instance> requires that <instance> is a member of <class>");
1894 goto raise_error;
1895 }
1896 }
1897 else {
1898 /* Go instantiate the class */
1899 object *args, *res;
1900 if (value == None)
1901 args = mkvalue("()");
1902 else if (is_tupleobject(value)) {
1903 INCREF(value);
1904 args = value;
1905 }
1906 else
1907 args = mkvalue("(O)", value);
1908 if (args == NULL)
1909 goto raise_error;
1910 res = call_object(type, args);
1911 DECREF(args);
1912 if (res == NULL)
1913 goto raise_error;
1914 DECREF(value);
1915 value = res;
1916 }
1917 }
1918 else if (is_instanceobject(type)) {
1919 /* Raising an instance. The value should be a dummy. */
1920 if (value != None) {
1921 err_setstr(TypeError,
1922 "instance exception may not have a separate value");
1923 goto raise_error;
1924 }
1925 else {
1926 /* Normalize to raise <class>, <instance> */
1927 DECREF(value);
1928 value = type;
1929 type = (object*) ((instanceobject*)type)->in_class;
1930 INCREF(type);
1931 }
1932 }
1933 else {
1934 /* Not something you can raise. You get an exception
1935 anyway, just not what you specified :-) */
1936 err_setstr(TypeError,
1937 "exceptions must be strings, classes, or instances");
1938 goto raise_error;
1939 }
1940 err_restore(type, value, tb);
1941 if (tb == NULL)
1942 return WHY_EXCEPTION;
1943 else
1944 return WHY_RERAISE;
1945 raise_error:
1946 XDECREF(value);
1947 XDECREF(type);
1948 XDECREF(tb);
1949 return WHY_EXCEPTION;
1950}
1951
Guido van Rossum96a42c81992-01-12 02:29:51 +00001952#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953static int
1954prtrace(v, str)
1955 object *v;
1956 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001957{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001959 if (printobject(v, stdout, 0) != 0)
1960 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001965static void
1966call_exc_trace(p_trace, p_newtrace, f)
1967 object **p_trace, **p_newtrace;
1968 frameobject *f;
1969{
1970 object *type, *value, *traceback, *arg;
1971 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001973 if (value == NULL) {
1974 value = None;
1975 INCREF(value);
1976 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977 arg = mkvalue("(OOO)", type, value, traceback);
1978 if (arg == NULL) {
1979 err_restore(type, value, traceback);
1980 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001981 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1983 DECREF(arg);
1984 if (err == 0)
1985 err_restore(type, value, traceback);
1986 else {
1987 XDECREF(type);
1988 XDECREF(value);
1989 XDECREF(traceback);
1990 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001991}
1992
1993static int
1994call_trace(p_trace, p_newtrace, f, msg, arg)
1995 object **p_trace; /* in/out; may not be NULL;
1996 may not point to NULL variable initially */
1997 object **p_newtrace; /* in/out; may be NULL;
1998 may point to NULL variable;
1999 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002000 frameobject *f;
2001 char *msg;
2002 object *arg;
2003{
Guido van Rossumf10570b1995-07-07 22:53:21 +00002004 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002005 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002006 static int tracing = 0;
2007
2008 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002009 /* Don't do recursive traces */
2010 if (p_newtrace) {
2011 XDECREF(*p_newtrace);
2012 *p_newtrace = NULL;
2013 }
2014 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002015 }
2016
Guido van Rossumf10570b1995-07-07 22:53:21 +00002017 args = newtupleobject(3);
2018 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002019 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002020 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002021 if (what == NULL)
2022 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002023 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002024 SETTUPLEITEM(args, 0, (object *)f);
2025 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002026 if (arg == NULL)
2027 arg = None;
2028 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002029 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002030 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00002031 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002032 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00002033 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002034 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002035 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002036 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002037 if (res == NULL) {
2038 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00002039 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00002040 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002041 *p_trace = NULL;
2042 if (p_newtrace) {
2043 XDECREF(*p_newtrace);
2044 *p_newtrace = NULL;
2045 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002046 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002047 }
2048 else {
2049 if (p_newtrace) {
2050 XDECREF(*p_newtrace);
2051 if (res == None)
2052 *p_newtrace = NULL;
2053 else {
2054 INCREF(res);
2055 *p_newtrace = res;
2056 }
2057 }
2058 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002059 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002060 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002061}
2062
Guido van Rossum3f5da241990-12-20 15:06:42 +00002063object *
Guido van Rossum6135a871995-01-09 17:53:26 +00002064getbuiltins()
2065{
2066 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00002067 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00002068 else
2069 return current_frame->f_builtins;
2070}
2071
2072object *
Guido van Rossum5b722181993-03-30 17:46:03 +00002073getlocals()
2074{
2075 if (current_frame == NULL)
2076 return NULL;
2077 fast_2_locals(current_frame);
2078 return current_frame->f_locals;
2079}
2080
2081object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002082getglobals()
2083{
2084 if (current_frame == NULL)
2085 return NULL;
2086 else
2087 return current_frame->f_globals;
2088}
2089
Guido van Rossum81daa321993-05-20 14:24:46 +00002090object *
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002091getowner()
Guido van Rossum81daa321993-05-20 14:24:46 +00002092{
2093 if (current_frame == NULL)
2094 return NULL;
2095 else
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002096 return current_frame->f_owner;
Guido van Rossum81daa321993-05-20 14:24:46 +00002097}
2098
Guido van Rossume59214e1994-08-30 08:01:59 +00002099object *
2100getframe()
2101{
2102 return (object *)current_frame;
2103}
2104
Guido van Rossum6135a871995-01-09 17:53:26 +00002105int
2106getrestricted()
2107{
2108 return current_frame == NULL ? 0 : current_frame->f_restricted;
2109}
2110
Guido van Rossum3f5da241990-12-20 15:06:42 +00002111void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112flushline()
2113{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002114 object *f = sysget("stdout");
2115 if (softspace(f, 0))
2116 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117}
2118
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119
Guido van Rossum06186511995-01-07 12:40:10 +00002120#define BINOP(opname, ropname, thisfunc) \
2121 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2122 ; \
2123 else \
2124 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002125
2126
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002128or(v, w)
2129 object *v, *w;
2130{
Guido van Rossum06186511995-01-07 12:40:10 +00002131 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002132 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002133 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002134 object * (*f) FPROTO((object *, object *));
2135 if (coerce(&v, &w) != 0)
2136 return NULL;
2137 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2138 x = (*f)(v, w);
2139 DECREF(v);
2140 DECREF(w);
2141 if (f != NULL)
2142 return x;
2143 }
2144 err_setstr(TypeError, "bad operand type(s) for |");
2145 return NULL;
2146}
2147
2148static object *
2149xor(v, w)
2150 object *v, *w;
2151{
Guido van Rossum06186511995-01-07 12:40:10 +00002152 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002153 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002154 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002155 object * (*f) FPROTO((object *, object *));
2156 if (coerce(&v, &w) != 0)
2157 return NULL;
2158 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2159 x = (*f)(v, w);
2160 DECREF(v);
2161 DECREF(w);
2162 if (f != NULL)
2163 return x;
2164 }
2165 err_setstr(TypeError, "bad operand type(s) for ^");
2166 return NULL;
2167}
2168
2169static object *
2170and(v, w)
2171 object *v, *w;
2172{
Guido van Rossum06186511995-01-07 12:40:10 +00002173 BINOP("__and__", "__rand__", and);
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_and) != 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 *
2191lshift(v, w)
2192 object *v, *w;
2193{
Guido van Rossum06186511995-01-07 12:40:10 +00002194 BINOP("__lshift__", "__rlshift__", lshift);
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_lshift) != 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 *
2212rshift(v, w)
2213 object *v, *w;
2214{
Guido van Rossum06186511995-01-07 12:40:10 +00002215 BINOP("__rshift__", "__rrshift__", rshift);
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_rshift) != 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 *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002233add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234 object *v, *w;
2235{
Guido van Rossum06186511995-01-07 12:40:10 +00002236 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002237 if (v->ob_type->tp_as_sequence != NULL)
2238 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2239 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002240 object *x;
2241 if (coerce(&v, &w) != 0)
2242 return NULL;
2243 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2244 DECREF(v);
2245 DECREF(w);
2246 return x;
2247 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002248 err_setstr(TypeError, "bad operand type(s) for +");
2249 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250}
2251
2252static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002253sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254 object *v, *w;
2255{
Guido van Rossum06186511995-01-07 12:40:10 +00002256 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002257 if (v->ob_type->tp_as_number != NULL) {
2258 object *x;
2259 if (coerce(&v, &w) != 0)
2260 return NULL;
2261 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2262 DECREF(v);
2263 DECREF(w);
2264 return x;
2265 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002266 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 return NULL;
2268}
2269
2270static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 object *v, *w;
2273{
2274 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002275 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002276 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002277 if (tp->tp_as_number != NULL &&
2278 w->ob_type->tp_as_sequence != NULL &&
2279 !is_instanceobject(v)) {
2280 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 object *tmp = v;
2282 v = w;
2283 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002284 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002286 if (tp->tp_as_number != NULL) {
2287 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002288 if (is_instanceobject(v)) {
2289 /* Instances of user-defined classes get their
2290 other argument uncoerced, so they may
2291 implement sequence*number as well as
2292 number*number. */
2293 INCREF(v);
2294 INCREF(w);
2295 }
2296 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002297 return NULL;
2298 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2299 DECREF(v);
2300 DECREF(w);
2301 return x;
2302 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 if (tp->tp_as_sequence != NULL) {
2304 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002305 err_setstr(TypeError,
2306 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 return NULL;
2308 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002309 return (*tp->tp_as_sequence->sq_repeat)
2310 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002312 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313 return NULL;
2314}
2315
2316static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002317divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 object *v, *w;
2319{
Guido van Rossum06186511995-01-07 12:40:10 +00002320 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002321 if (v->ob_type->tp_as_number != NULL) {
2322 object *x;
2323 if (coerce(&v, &w) != 0)
2324 return NULL;
2325 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2326 DECREF(v);
2327 DECREF(w);
2328 return x;
2329 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002330 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 return NULL;
2332}
2333
2334static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002335mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 object *v, *w;
2337{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002338 if (is_stringobject(v)) {
2339 return formatstring(v, w);
2340 }
Guido van Rossum06186511995-01-07 12:40:10 +00002341 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002342 if (v->ob_type->tp_as_number != NULL) {
2343 object *x;
2344 if (coerce(&v, &w) != 0)
2345 return NULL;
2346 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2347 DECREF(v);
2348 DECREF(w);
2349 return x;
2350 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002351 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 return NULL;
2353}
2354
2355static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002356powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002357 object *v, *w;
2358{
2359 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002360 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002361 if (v->ob_type->tp_as_number == NULL ||
2362 w->ob_type->tp_as_number == NULL) {
2363 err_setstr(TypeError, "pow() requires numeric arguments");
2364 return NULL;
2365 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002366 if (coerce(&v, &w) != 0)
2367 return NULL;
2368 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2369 DECREF(v);
2370 DECREF(w);
2371 return res;
2372}
2373
2374static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002375neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 object *v;
2377{
2378 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002379 return (*v->ob_type->tp_as_number->nb_negative)(v);
2380 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 return NULL;
2382}
2383
2384static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002385pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 object *v;
2387{
2388 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002389 return (*v->ob_type->tp_as_number->nb_positive)(v);
2390 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 return NULL;
2392}
2393
2394static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002395invert(v)
2396 object *v;
2397{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002398 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002399 if (v->ob_type->tp_as_number != NULL &&
2400 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2401 return (*f)(v);
2402 err_setstr(TypeError, "bad operand type(s) for unary ~");
2403 return NULL;
2404}
2405
2406static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002407not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 object *v;
2409{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002410 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002411 object *w;
2412 if (outcome < 0)
2413 return NULL;
2414 if (outcome == 0)
2415 w = True;
2416 else
2417 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002418 INCREF(w);
2419 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420}
Guido van Rossum234f9421993-06-17 12:35:49 +00002421
2422
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423/* External interface to call any callable object.
2424 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002425
2426object *
2427call_object(func, arg)
2428 object *func;
2429 object *arg;
2430{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002431 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2432}
Guido van Rossume59214e1994-08-30 08:01:59 +00002433
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434object *
2435PyEval_CallObjectWithKeywords(func, arg, kw)
2436 object *func;
2437 object *arg;
2438 object *kw;
2439{
2440 ternaryfunc call;
2441 object *result;
2442
2443 if (arg == NULL)
2444 arg = newtupleobject(0);
2445 else if (!is_tupleobject(arg)) {
2446 err_setstr(TypeError, "argument list must be a tuple");
2447 return NULL;
2448 }
2449 else
2450 INCREF(arg);
2451
Guido van Rossume3e61c11995-08-04 04:14:47 +00002452 if (kw != NULL && !is_dictobject(kw)) {
2453 err_setstr(TypeError, "keyword list must be a dictionary");
2454 return NULL;
2455 }
2456
Guido van Rossum150b2df1996-12-05 23:17:11 +00002457 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002458 result = (*call)(func, arg, kw);
2459 else if (is_instancemethodobject(func) || is_funcobject(func))
2460 result = call_function(func, arg, kw);
2461 else
2462 result = call_builtin(func, arg, kw);
2463
2464 DECREF(arg);
2465
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002466 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002467 err_setstr(SystemError,
2468 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002469
2470 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002471}
2472
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002474call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002476 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002477 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 if (is_methodobject(func)) {
2480 method meth = getmethod(func);
2481 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002482 int flags = getflags(func);
2483 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002484 int size = gettuplesize(arg);
2485 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002486 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002487 else if (size == 0)
2488 arg = NULL;
2489 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002490 if (flags & METH_KEYWORDS)
2491 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002492 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002493 err_setstr(TypeError,
2494 "this function takes no keyword arguments");
2495 return NULL;
2496 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 }
2499 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002500 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002502 if (is_instanceobject(func)) {
2503 object *res, *call = getattr(func,"__call__");
2504 if (call == NULL) {
2505 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002506 err_setstr(AttributeError,
2507 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002508 return NULL;
2509 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002510 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002511 DECREF(call);
2512 return res;
2513 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 return NULL;
2516}
2517
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002519call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002522 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002524 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002525 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002526 object **d, **k;
2527 int nk, nd;
2528 object *result;
2529
2530 if (kw != NULL && !is_dictobject(kw)) {
2531 err_badcall();
2532 return NULL;
2533 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534
Guido van Rossume8122f11991-05-05 20:03:07 +00002535 if (is_instancemethodobject(func)) {
2536 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002537 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002538 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002539 if (self == NULL) {
2540 /* Unbound methods must be called with an instance of
2541 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002542 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002543 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002544 if (self != NULL &&
2545 is_instanceobject(self) &&
2546 issubclass((object *)
2547 (((instanceobject *)self)->in_class),
2548 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002549 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002550 else
2551 self = NULL;
2552 }
2553 if (self == NULL) {
2554 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002555 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002556 return NULL;
2557 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002558 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002559 }
2560 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002561 int argcount = gettuplesize(arg);
2562 object *newarg = newtupleobject(argcount + 1);
2563 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002564 if (newarg == NULL)
2565 return NULL;
2566 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002567 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002568 for (i = 0; i < argcount; i++) {
2569 object *v = GETTUPLEITEM(arg, i);
2570 XINCREF(v);
2571 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002572 }
2573 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 }
2575 }
2576 else {
2577 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002578 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 return NULL;
2580 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002581 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002583
2584 argdefs = PyFunction_GetDefaults(func);
2585 if (argdefs != NULL && is_tupleobject(argdefs)) {
2586 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2587 nd = gettuplesize(argdefs);
2588 }
2589 else {
2590 d = NULL;
2591 nd = 0;
2592 }
2593
2594 if (kw != NULL) {
2595 int pos, i;
2596 nk = getmappingsize(kw);
2597 k = NEW(object *, 2*nk);
2598 if (k == NULL) {
2599 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002600 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002601 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002602 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002603 pos = i = 0;
2604 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2605 i += 2;
2606 nk = i/2;
2607 /* XXX This is broken if the caller deletes dict items! */
2608 }
2609 else {
2610 k = NULL;
2611 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002612 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002613
Guido van Rossum681d79a1995-07-18 14:51:37 +00002614 result = eval_code2(
2615 (codeobject *)getfunccode(func),
2616 getfuncglobals(func), (object *)NULL,
2617 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2618 k, nk,
2619 d, nd,
2620 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621
Guido van Rossum681d79a1995-07-18 14:51:37 +00002622 DECREF(arg);
2623 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002624
Guido van Rossum681d79a1995-07-18 14:51:37 +00002625 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626}
2627
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002628#define SLICE_ERROR_MSG \
2629 "standard sequence type does not support step size other than one"
2630
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002632apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 object *v, *w;
2634{
2635 typeobject *tp = v->ob_type;
2636 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002637 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 return NULL;
2639 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002640 if (tp->tp_as_mapping != NULL) {
2641 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2642 }
2643 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002645 if (!is_intobject(w)) {
2646 if (PySlice_Check(w)) {
2647 err_setstr(ValueError, SLICE_ERROR_MSG);
2648 } else {
2649 err_setstr(TypeError,
2650 "sequence subscript not int");
2651 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 return NULL;
2653 }
2654 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002655 if (i < 0) {
2656 int len = (*tp->tp_as_sequence->sq_length)(v);
2657 if (len < 0)
2658 return NULL;
2659 i += len;
2660 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002661 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663}
2664
2665static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 object *v, *w;
2668{
2669 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002670 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002672 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 return NULL;
2674 }
2675 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002676 v = (*sq->sq_item)(v, i);
2677 if (v)
2678 return v;
2679 if (err_occurred() == IndexError)
2680 err_clear();
2681 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682}
2683
2684static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002685slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686 object *v;
2687 int isize;
2688 int *pi;
2689{
2690 if (v != NULL) {
2691 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002692 err_setstr(TypeError, "slice index must be int");
2693 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 }
2695 *pi = getintvalue(v);
2696 if (*pi < 0)
2697 *pi += isize;
2698 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002699 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700}
2701
2702static object *
Guido van Rossum8861b741996-07-30 16:49:37 +00002703build_slice(u, v, w) /* u:v:w */
2704 object *u, *v, *w;
2705{
2706 return PySlice_New(u,v,w);
2707}
2708
2709static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002710apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 object *u, *v, *w;
2712{
2713 typeobject *tp = u->ob_type;
2714 int ilow, ihigh, isize;
2715 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002716 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717 return NULL;
2718 }
2719 ilow = 0;
2720 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002721 if (isize < 0)
2722 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002723 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002725 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002727 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002729
2730static int
2731assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 object *w;
2733 object *key;
2734 object *v;
2735{
2736 typeobject *tp = w->ob_type;
2737 sequence_methods *sq;
2738 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002739 int (*func1)();
2740 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002741 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002742 (func1 = mp->mp_ass_subscript) != NULL) {
2743 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002744 }
2745 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002746 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002748 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002749 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002750 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002752 else {
2753 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002754 if (i < 0) {
2755 int len = (*sq->sq_length)(w);
2756 if (len < 0)
2757 return -1;
2758 i += len;
2759 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002760 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002761 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002764 err_setstr(TypeError,
2765 "can't assign to this subscripted object");
2766 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768}
2769
Guido van Rossum3f5da241990-12-20 15:06:42 +00002770static int
2771assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 object *u, *v, *w, *x;
2773{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002774 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002776 if (sq == NULL) {
2777 err_setstr(TypeError, "assign to slice of non-sequence");
2778 return -1;
2779 }
2780 if (sq == NULL || sq->sq_ass_slice == NULL) {
2781 err_setstr(TypeError, "unassignable slice");
2782 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783 }
2784 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002785 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002786 if (isize < 0)
2787 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002788 if (slice_index(v, isize, &ilow) != 0)
2789 return -1;
2790 if (slice_index(w, isize, &ihigh) != 0)
2791 return -1;
2792 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793}
2794
2795static int
2796cmp_exception(err, v)
2797 object *err, *v;
2798{
2799 if (is_tupleobject(v)) {
2800 int i, n;
2801 n = gettuplesize(v);
2802 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002803 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002804 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805 return 1;
2806 }
2807 return 0;
2808 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002809 if (is_classobject(v) && is_classobject(err))
2810 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002811 return err == v;
2812}
2813
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814static int
2815cmp_member(v, w)
2816 object *v, *w;
2817{
Guido van Rossume59214e1994-08-30 08:01:59 +00002818 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 object *x;
2820 sequence_methods *sq;
2821 /* Special case for char in string */
2822 if (is_stringobject(w)) {
2823 register char *s, *end;
2824 register char c;
2825 if (!is_stringobject(v) || getstringsize(v) != 1) {
2826 err_setstr(TypeError,
2827 "string member test needs char left operand");
2828 return -1;
2829 }
2830 c = getstringvalue(v)[0];
2831 s = getstringvalue(w);
2832 end = s + getstringsize(w);
2833 while (s < end) {
2834 if (c == *s++)
2835 return 1;
2836 }
2837 return 0;
2838 }
2839 sq = w->ob_type->tp_as_sequence;
2840 if (sq == NULL) {
2841 err_setstr(TypeError,
2842 "'in' or 'not in' needs sequence right argument");
2843 return -1;
2844 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002845 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002846 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002847 if (x == NULL) {
2848 if (err_occurred() == IndexError) {
2849 err_clear();
2850 break;
2851 }
2852 return -1;
2853 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002854 cmp = cmpobject(v, x);
2855 XDECREF(x);
2856 if (cmp == 0)
2857 return 1;
2858 }
2859 return 0;
2860}
2861
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002863cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002864 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002865 register object *v;
2866 register object *w;
2867{
2868 register int cmp;
2869 register int res = 0;
2870 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002871 case IS:
2872 case IS_NOT:
2873 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002874 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002875 res = !res;
2876 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 case IN:
2878 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002879 res = cmp_member(v, w);
2880 if (res < 0)
2881 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002882 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002883 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 break;
2885 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 break;
2888 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002889 cmp = cmpobject(v, w);
2890 switch (op) {
2891 case LT: res = cmp < 0; break;
2892 case LE: res = cmp <= 0; break;
2893 case EQ: res = cmp == 0; break;
2894 case NE: res = cmp != 0; break;
2895 case GT: res = cmp > 0; break;
2896 case GE: res = cmp >= 0; break;
2897 /* XXX no default? (res is initialized to 0 though) */
2898 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 }
2900 v = res ? True : False;
2901 INCREF(v);
2902 return v;
2903}
2904
Guido van Rossum3f5da241990-12-20 15:06:42 +00002905static int
2906import_from(locals, v, name)
2907 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002908 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002909 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002910{
2911 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002912 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002913 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002914 return -1;
2915 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002916 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002917 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002918 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002919 object *name, *value;
2920 pos = 0;
2921 while (mappinggetnext(w, &pos, &name, &value)) {
2922 if (!is_stringobject(name) ||
2923 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002924 continue;
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002925#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002926 if (is_accessobject(value)) {
2927 value = getaccessvalue(value, (object *)NULL);
2928 if (value == NULL) {
2929 err_clear();
2930 continue;
2931 }
2932 }
2933 else
Guido van Rossum0dfcf751996-08-12 22:00:53 +00002934#endif
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002935 INCREF(value);
2936 err = dict2insert(locals, name, value);
2937 DECREF(value);
2938 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002939 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002940 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002941 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002942 }
2943 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002944 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002945 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002946 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002947 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002948 getstringvalue(name));
2949 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002950 return -1;
2951 }
2952 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002953 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002954 }
2955}
2956
2957static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002958build_class(methods, bases, name)
2959 object *methods; /* dictionary */
2960 object *bases; /* tuple containing classes */
2961 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002962{
Guido van Rossum25831651993-05-19 14:50:45 +00002963 int i;
2964 if (!is_tupleobject(bases)) {
2965 err_setstr(SystemError, "build_class with non-tuple bases");
2966 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002967 }
Guido van Rossum25831651993-05-19 14:50:45 +00002968 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002969 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002970 return NULL;
2971 }
Guido van Rossum25831651993-05-19 14:50:45 +00002972 if (!is_stringobject(name)) {
2973 err_setstr(SystemError, "build_class witn non-string name");
2974 return NULL;
2975 }
2976 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002977 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002978 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002979 /* Call the base's *type*, if it is callable.
2980 This code is a hook for Donald Beaudry's
2981 and Jim Fulton's type extensions. In
2982 unexended Python it will never be triggered
2983 since its types are not callable. */
2984 if (base->ob_type->ob_type->tp_call) {
2985 object *args;
2986 object *class;
2987 args = mkvalue("(OOO)", name, bases, methods);
2988 class = call_object((object *)base->ob_type,
2989 args);
2990 DECREF(args);
2991 return class;
2992 }
Guido van Rossum25831651993-05-19 14:50:45 +00002993 err_setstr(TypeError,
2994 "base is not a class object");
2995 return NULL;
2996 }
2997 }
2998 return newclassobject(bases, methods, name);
2999}
3000
Guido van Rossum0dfcf751996-08-12 22:00:53 +00003001#ifdef SUPPORT_OBSOLETE_ACCESS
Guido van Rossum25831651993-05-19 14:50:45 +00003002static int
Guido van Rossumb3f72581993-05-21 19:56:10 +00003003access_statement(name, vmode, f)
Guido van Rossum25831651993-05-19 14:50:45 +00003004 object *name;
Guido van Rossumb3f72581993-05-21 19:56:10 +00003005 object *vmode;
Guido van Rossum25831651993-05-19 14:50:45 +00003006 frameobject *f;
3007{
Guido van Rossumb3f72581993-05-21 19:56:10 +00003008 int mode = getintvalue(vmode);
Guido van Rossum81daa321993-05-20 14:24:46 +00003009 object *value, *ac;
3010 typeobject *type;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003011 int ret;
3012 fast_2_locals(f);
3013 value = dict2lookup(f->f_locals, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003014 if (value && is_accessobject(value)) {
3015 err_setstr(AccessError, "can't override access");
3016 return -1;
3017 }
3018 err_clear();
Guido van Rossum81daa321993-05-20 14:24:46 +00003019 if (value != NULL && value != None)
3020 type = value->ob_type;
3021 else
3022 type = NULL;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003023 ac = newaccessobject(value, f->f_locals, type, mode);
Guido van Rossum25831651993-05-19 14:50:45 +00003024 if (ac == NULL)
3025 return -1;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003026 ret = mappinginsert(f->f_locals, name, ac);
3027 DECREF(ac);
3028 locals_2_fast(f, 0);
Guido van Rossum25831651993-05-19 14:50:45 +00003029 return ret;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003030}
Guido van Rossum0dfcf751996-08-12 22:00:53 +00003031#endif
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003032
3033static int
3034exec_statement(prog, globals, locals)
3035 object *prog;
3036 object *globals;
3037 object *locals;
3038{
3039 char *s;
3040 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003041 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043
3044 if (is_tupleobject(prog) && globals == None && locals == None &&
3045 ((n = gettuplesize(prog)) == 2 || n == 3)) {
3046 /* Backward compatibility hack */
3047 globals = gettupleitem(prog, 1);
3048 if (n == 3)
3049 locals = gettupleitem(prog, 2);
3050 prog = gettupleitem(prog, 0);
3051 }
3052 if (globals == None) {
3053 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003054 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003055 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003056 plain = 1;
3057 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003058 }
3059 else if (locals == None)
3060 locals = globals;
3061 if (!is_stringobject(prog) &&
3062 !is_codeobject(prog) &&
3063 !is_fileobject(prog)) {
3064 err_setstr(TypeError,
3065 "exec 1st arg must be string, code or file object");
3066 return -1;
3067 }
3068 if (!is_dictobject(globals) || !is_dictobject(locals)) {
3069 err_setstr(TypeError,
3070 "exec 2nd/3rd args must be dict or None");
3071 return -1;
3072 }
Guido van Rossum6135a871995-01-09 17:53:26 +00003073 if (dictlookup(globals, "__builtins__") == NULL)
3074 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003075 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003076 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003077 return -1;
3078 return 0;
3079 }
3080 if (is_fileobject(prog)) {
3081 FILE *fp = getfilefile(prog);
3082 char *name = getstringvalue(getfilename(prog));
3083 if (run_file(fp, name, file_input, globals, locals) == NULL)
3084 return -1;
3085 return 0;
3086 }
3087 s = getstringvalue(prog);
3088 if (strlen(s) != getstringsize(prog)) {
3089 err_setstr(ValueError, "embedded '\\0' in exec string");
3090 return -1;
3091 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003092 v = run_string(s, file_input, globals, locals);
3093 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003094 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00003095 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003096 if (plain)
3097 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003098 return 0;
3099}
Guido van Rossum24c13741995-02-14 09:42:43 +00003100
Guido van Rossum681d79a1995-07-18 14:51:37 +00003101/* Hack for newimp.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00003102static object *
3103find_from_args(f, nexti)
3104 frameobject *f;
3105 int nexti;
3106{
3107 int opcode;
3108 int oparg;
3109 object *list, *name;
3110 unsigned char *next_instr;
3111
3112 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
3113 opcode = (*next_instr++);
3114 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00003115 INCREF(None);
3116 return None;
3117 }
3118
3119 list = newlistobject(0);
3120 if (list == NULL)
3121 return NULL;
3122
3123 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003124 oparg = (next_instr[1]<<8) + next_instr[0];
3125 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00003126 name = Getnamev(f, oparg);
3127 if (addlistitem(list, name) < 0) {
3128 DECREF(list);
3129 break;
3130 }
3131 opcode = (*next_instr++);
3132 } while (opcode == IMPORT_FROM);
3133
3134 return list;
3135}