blob: a59a1c9d8b96e25c6c99e66a810d5afd3d0ddd26 [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 Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossum3f5da241990-12-20 15:06:42 +000040#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000046#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000047
Guido van Rossumc6004111993-11-05 10:22:19 +000048#include <ctype.h>
49
Guido van Rossum04691fc1992-08-12 15:35:34 +000050/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000052
Guido van Rossum408027e1996-12-30 16:17:54 +000053#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000054/* For debugging the interpreter: */
55#define LLTRACE 1 /* Low-level trace feature */
56#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000057#endif
58
Guido van Rossum5b722181993-03-30 17:46:03 +000059
Guido van Rossum374a9221991-04-04 10:40:29 +000060/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000061
Guido van Rossum681d79a1995-07-18 14:51:37 +000062static object *eval_code2 PROTO((codeobject *,
63 object *, object *,
64 object **, int,
65 object **, int,
66 object **, int,
67 object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000068#ifdef LLTRACE
69static int prtrace PROTO((object *, char *));
70#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000071static void call_exc_trace PROTO((object **, object**, frameobject *));
72static int call_trace
73 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000074static object *add PROTO((object *, object *));
75static object *sub PROTO((object *, object *));
Guido van Rossum3b4da591996-06-19 21:49:17 +000076static object *powerop PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000077static object *mul PROTO((object *, object *));
78static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000079static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000080static object *neg PROTO((object *));
81static object *pos PROTO((object *));
82static object *not PROTO((object *));
83static object *invert PROTO((object *));
84static object *lshift PROTO((object *, object *));
85static object *rshift PROTO((object *, object *));
86static object *and PROTO((object *, object *));
87static object *xor PROTO((object *, object *));
88static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000089static object *call_builtin PROTO((object *, object *, object *));
90static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000091static object *apply_subscript PROTO((object *, object *));
92static object *loop_subscript PROTO((object *, object *));
93static int slice_index PROTO((object *, int, int *));
94static object *apply_slice PROTO((object *, object *, object *));
95static int assign_subscript PROTO((object *, object *, object *));
96static int assign_slice PROTO((object *, object *, object *, object *));
97static int cmp_exception PROTO((object *, object *));
98static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000099static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000100static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000101static object *build_class PROTO((object *, object *, object *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000102static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000103static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000104
105
Guido van Rossum950361c1997-01-24 13:49:28 +0000106/* Dynamic execution profile */
107#ifdef DYNAMIC_EXECUTION_PROFILE
108#ifdef DXPAIRS
109static long dxpairs[257][256];
110#define dxp dxpairs[256]
111#else
112static long dxp[256];
113#endif
114#endif
115
116
Guido van Rossum0a066c01992-03-27 17:29:15 +0000117/* Pointer to current frame, used to link new frames to */
118
Guido van Rossum374a9221991-04-04 10:40:29 +0000119static frameobject *current_frame;
120
Guido van Rossume59214e1994-08-30 08:01:59 +0000121#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123#include <errno.h>
124#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000125
Guido van Rossuma9672091994-09-14 13:31:22 +0000126static type_lock interpreter_lock = 0;
127static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128
129void
130init_save_thread()
131{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000133 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000134 interpreter_lock = allocate_lock();
135 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000136 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000138
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139#endif
140
Guido van Rossumff4949e1992-08-05 19:58:53 +0000141/* Functions save_thread and restore_thread are always defined so
142 dynamically loaded modules needn't be compiled separately for use
143 with and without threads: */
144
Guido van Rossum04691fc1992-08-12 15:35:34 +0000145object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146save_thread()
147{
Guido van Rossume59214e1994-08-30 08:01:59 +0000148#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000150 object *res;
151 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152 current_frame = NULL;
153 release_lock(interpreter_lock);
154 return res;
155 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000157 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158}
159
160void
161restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000162 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163{
Guido van Rossume59214e1994-08-30 08:01:59 +0000164#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165 if (interpreter_lock) {
166 int err;
167 err = errno;
168 acquire_lock(interpreter_lock, 1);
169 errno = err;
170 current_frame = (frameobject *)x;
171 }
172#endif
173}
174
175
Guido van Rossuma9672091994-09-14 13:31:22 +0000176/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
177 signal handlers or Mac I/O completion routines) can schedule calls
178 to a function to be called synchronously.
179 The synchronous function is called with one void* argument.
180 It should return 0 for success or -1 for failure -- failure should
181 be accompanied by an exception.
182
183 If registry succeeds, the registry function returns 0; if it fails
184 (e.g. due to too many pending calls) it returns -1 (without setting
185 an exception condition).
186
187 Note that because registry may occur from within signal handlers,
188 or other asynchronous events, calling malloc() is unsafe!
189
190#ifdef WITH_THREAD
191 Any thread can schedule pending calls, but only the main thread
192 will execute them.
193#endif
194
195 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
196 There are two possible race conditions:
197 (1) nested asynchronous registry calls;
198 (2) registry calls made while pending calls are being processed.
199 While (1) is very unlikely, (2) is a real possibility.
200 The current code is safe against (2), but not against (1).
201 The safety against (2) is derived from the fact that only one
202 thread (the main thread) ever takes things out of the queue.
203*/
204
Guido van Rossum8861b741996-07-30 16:49:37 +0000205static int ticker = 0; /* main loop counter to do periodic things */
206
Guido van Rossuma9672091994-09-14 13:31:22 +0000207#define NPENDINGCALLS 32
208static struct {
209 int (*func) PROTO((ANY *));
210 ANY *arg;
211} pendingcalls[NPENDINGCALLS];
212static volatile int pendingfirst = 0;
213static volatile int pendinglast = 0;
214
215int
216Py_AddPendingCall(func, arg)
217 int (*func) PROTO((ANY *));
218 ANY *arg;
219{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000220 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000221 int i, j;
222 /* XXX Begin critical section */
223 /* XXX If you want this to be safe against nested
224 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000225 if (busy)
226 return -1;
227 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000228 i = pendinglast;
229 j = (i + 1) % NPENDINGCALLS;
230 if (j == pendingfirst)
231 return -1; /* Queue full */
232 pendingcalls[i].func = func;
233 pendingcalls[i].arg = arg;
234 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000235 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000236 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000237 /* XXX End critical section */
238 return 0;
239}
240
Guido van Rossum180d7b41994-09-29 09:45:57 +0000241int
242Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000243{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000245#ifdef WITH_THREAD
Guido van Rossum1aa14831997-01-21 05:34:20 +0000246 if (main_thread && get_thread_ident() != main_thread) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000247 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000249 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000250#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000251 if (busy) {
252 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000254 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 for (;;) {
257 int i;
258 int (*func) PROTO((ANY *));
259 ANY *arg;
260 i = pendingfirst;
261 if (i == pendinglast)
262 break; /* Queue empty */
263 func = pendingcalls[i].func;
264 arg = pendingcalls[i].arg;
265 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 if (func(arg) < 0) {
267 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000268 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000270 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000271 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000273 return 0;
274}
275
276
Guido van Rossum374a9221991-04-04 10:40:29 +0000277/* Status code for main loop (reason for stack unwind) */
278
279enum why_code {
280 WHY_NOT, /* No error */
281 WHY_EXCEPTION, /* Exception occurred */
282 WHY_RERAISE, /* Exception re-raised by 'finally' */
283 WHY_RETURN, /* 'return' statement */
284 WHY_BREAK /* 'break' statement */
285};
286
Guido van Rossum1aa14831997-01-21 05:34:20 +0000287static enum why_code do_raise PROTO((object *, object *, object *));
288
Guido van Rossum374a9221991-04-04 10:40:29 +0000289
Guido van Rossum681d79a1995-07-18 14:51:37 +0000290/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000291
292object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000294 codeobject *co;
295 object *globals;
296 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297{
298 return eval_code2(co,
299 globals, locals,
300 (object **)NULL, 0,
301 (object **)NULL, 0,
302 (object **)NULL, 0,
303 (object *)NULL);
304}
305
306
307/* Interpreter main loop */
308
Guido van Rossum8861b741996-07-30 16:49:37 +0000309#ifndef MAX_RECURSION_DEPTH
310#define MAX_RECURSION_DEPTH 10000
311#endif
312
313static int recursion_depth = 0;
314
Guido van Rossum681d79a1995-07-18 14:51:37 +0000315static object *
316eval_code2(co, globals, locals,
317 args, argcount, kws, kwcount, defs, defcount, owner)
318 codeobject *co;
319 object *globals;
320 object *locals;
321 object **args;
322 int argcount;
323 object **kws; /* length: 2*kwcount */
324 int kwcount;
325 object **defs;
326 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000327 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000328{
Guido van Rossum950361c1997-01-24 13:49:28 +0000329#ifdef DXPAIRS
330 int lastopcode = 0;
331#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000332 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000333 register int opcode = 0; /* Current opcode */
334 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 register object **stack_pointer;
336 register enum why_code why; /* Reason for block stack unwind */
337 register int err; /* Error status -- nonzero if error */
338 register object *x; /* Result object -- NULL if error */
339 register object *v; /* Temporary objects popped off stack */
340 register object *w;
341 register object *u;
342 register object *t;
343 register frameobject *f; /* Current frame */
Guido van Rossum150b2df1996-12-05 23:17:11 +0000344 register object **fastlocals = NULL;
345 object *retval = NULL; /* Return value */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000346#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000347 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000348#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000349#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000351 char *filename = getstringvalue(co->co_filename);
352#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000353
354/* Code access macros */
355
356#define GETCONST(i) Getconst(f, i)
357#define GETNAME(i) Getname(f, i)
358#define GETNAMEV(i) Getnamev(f, i)
359#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
360#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
361#define NEXTOP() (*next_instr++)
362#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
363#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
364#define JUMPBY(x) (next_instr += (x))
365
366/* Stack manipulation macros */
367
368#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
369#define EMPTY() (STACK_LEVEL() == 0)
370#define TOP() (stack_pointer[-1])
371#define BASIC_PUSH(v) (*stack_pointer++ = (v))
372#define BASIC_POP() (*--stack_pointer)
373
Guido van Rossum96a42c81992-01-12 02:29:51 +0000374#ifdef LLTRACE
375#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
376#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000377#else
378#define PUSH(v) BASIC_PUSH(v)
379#define POP() BASIC_POP()
380#endif
381
Guido van Rossum681d79a1995-07-18 14:51:37 +0000382/* Local variable macros */
383
384#define GETLOCAL(i) (fastlocals[i])
385#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
386 GETLOCAL(i) = value; } while (0)
387
Guido van Rossum8861b741996-07-30 16:49:37 +0000388#ifdef USE_STACKCHECK
389 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
390 err_setstr(MemoryError, "Stack overflow");
391 return NULL;
392 }
393#endif
394
Guido van Rossum681d79a1995-07-18 14:51:37 +0000395 if (globals == NULL) {
396 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000397 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000398 }
399
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000400#ifdef LLTRACE
401 lltrace = dictlookup(globals, "__lltrace__") != NULL;
402#endif
403
Guido van Rossum374a9221991-04-04 10:40:29 +0000404 f = newframeobject(
405 current_frame, /*back*/
406 co, /*code*/
407 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000408 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000409 if (f == NULL)
410 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411
Guido van Rossum374a9221991-04-04 10:40:29 +0000412 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000413
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414 if (co->co_nlocals > 0)
Guido van Rossum76836021997-01-20 04:26:20 +0000415 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000416
417 if (co->co_argcount > 0 ||
418 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
419 int i;
420 int n = argcount;
421 object *kwdict = NULL;
422 if (co->co_flags & CO_VARKEYWORDS) {
423 kwdict = newmappingobject();
424 if (kwdict == NULL)
425 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000426 i = co->co_argcount;
427 if (co->co_flags & CO_VARARGS)
428 i++;
429 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000430 }
431 if (argcount > co->co_argcount) {
432 if (!(co->co_flags & CO_VARARGS)) {
433 err_setstr(TypeError, "too many arguments");
434 goto fail;
435 }
436 n = co->co_argcount;
437 }
438 for (i = 0; i < n; i++) {
439 x = args[i];
440 INCREF(x);
441 SETLOCAL(i, x);
442 }
443 if (co->co_flags & CO_VARARGS) {
444 u = newtupleobject(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000445 if (u == NULL)
446 goto fail;
447 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 for (i = n; i < argcount; i++) {
449 x = args[i];
450 INCREF(x);
451 SETTUPLEITEM(u, i-n, x);
452 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 }
454 for (i = 0; i < kwcount; i++) {
455 object *keyword = kws[2*i];
456 object *value = kws[2*i + 1];
457 int j;
458 /* XXX slow -- speed up using dictionary? */
459 for (j = 0; j < co->co_argcount; j++) {
460 object *nm = GETTUPLEITEM(co->co_varnames, j);
461 if (cmpobject(keyword, nm) == 0)
462 break;
463 }
464 if (j >= co->co_argcount) {
465 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000466 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 goto fail;
468 }
469 mappinginsert(kwdict, keyword, value);
470 }
471 else {
472 if (GETLOCAL(j) != NULL) {
473 err_setstr(TypeError,
474 "keyword parameter redefined");
475 goto fail;
476 }
477 INCREF(value);
478 SETLOCAL(j, value);
479 }
480 }
481 if (argcount < co->co_argcount) {
482 int m = co->co_argcount - defcount;
483 for (i = argcount; i < m; i++) {
484 if (GETLOCAL(i) == NULL) {
485 err_setstr(TypeError,
486 "not enough arguments");
487 goto fail;
488 }
489 }
490 if (n > m)
491 i = n - m;
492 else
493 i = 0;
494 for (; i < defcount; i++) {
495 if (GETLOCAL(m+i) == NULL) {
496 object *def = defs[i];
497 INCREF(def);
498 SETLOCAL(m+i, def);
499 }
500 }
501 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000502 }
503 else {
504 if (argcount > 0 || kwcount > 0) {
505 err_setstr(TypeError, "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000506 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507 }
508 }
509
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000510 if (sys_trace != NULL) {
511 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000512 be called on *every* entry to a code block.
513 Its return value, if not None, is a function that
514 will be called at the start of each executed line
515 of code. (Actually, the function must return
516 itself in order to continue tracing.)
517 The trace functions are called with three arguments:
518 a pointer to the current frame, a string indicating
519 why the function is called, and an argument which
520 depends on the situation. The global trace function
521 (sys.trace) is also called whenever an exception
522 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 if (call_trace(&sys_trace, &f->f_trace, f, "call",
524 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000525 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000526 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000528 }
529
530 if (sys_profile != NULL) {
531 /* Similar for sys_profile, except it needn't return
532 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000533 if (call_trace(&sys_profile, (object**)0, f, "call",
534 None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000535 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536 }
537 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000538
Guido van Rossum8861b741996-07-30 16:49:37 +0000539 if (++recursion_depth > MAX_RECURSION_DEPTH) {
540 --recursion_depth;
541 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
542 current_frame = f->f_back;
543 DECREF(f);
544 return NULL;
545 }
546
Guido van Rossum374a9221991-04-04 10:40:29 +0000547 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 stack_pointer = f->f_valuestack;
549
Guido van Rossum374a9221991-04-04 10:40:29 +0000550 why = WHY_NOT;
551 err = 0;
552 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000553
554 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000555 /* Do periodic things.
556 Doing this every time through the loop would add
557 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000558 So we do it only every Nth instruction.
559
560 The ticker is reset to zero if there are pending
Guido van Rossum70d44781997-01-21 06:15:24 +0000561 calls (see Py_AddPendingCall() and
Guido van Rossum8861b741996-07-30 16:49:37 +0000562 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000563
Guido van Rossum374a9221991-04-04 10:40:29 +0000564 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000565 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000566 if (pendingfirst != pendinglast) {
567 if (Py_MakePendingCalls() < 0) {
568 why = WHY_EXCEPTION;
569 goto on_error;
570 }
571 }
Guido van Rossum8c5df061997-01-24 04:19:24 +0000572#ifdef macintosh
573#undef HAVE_SIGNAL_H
574#endif
Guido van Rossum70d44781997-01-21 06:15:24 +0000575#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
576/* If we have true signals, the signal handler will call
577 Py_AddPendingCall() so we don't have to call sigcheck().
578 On the Mac and DOS, alas, we have to call it. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000579 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000580 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000581 goto on_error;
582 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000583#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584
Guido van Rossume59214e1994-08-30 08:01:59 +0000585#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000586 if (interpreter_lock) {
587 /* Give another thread a chance */
588
589 current_frame = NULL;
590 release_lock(interpreter_lock);
591
592 /* Other threads may run now */
593
594 acquire_lock(interpreter_lock, 1);
595 current_frame = f;
596 }
597#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000599
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000601
Guido van Rossum408027e1996-12-30 16:17:54 +0000602#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000603 f->f_lasti = INSTR_OFFSET();
604#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000605
606 opcode = NEXTOP();
607 if (HAS_ARG(opcode))
608 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000609#ifdef DYNAMIC_EXECUTION_PROFILE
610#ifdef DXPAIRS
611 dxpairs[lastopcode][opcode]++;
612 lastopcode = opcode;
613#endif
614 dxp[opcode]++;
615#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000616
Guido van Rossum96a42c81992-01-12 02:29:51 +0000617#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 /* Instruction tracing */
619
Guido van Rossum96a42c81992-01-12 02:29:51 +0000620 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 if (HAS_ARG(opcode)) {
622 printf("%d: %d, %d\n",
623 (int) (INSTR_OFFSET() - 3),
624 opcode, oparg);
625 }
626 else {
627 printf("%d: %d\n",
628 (int) (INSTR_OFFSET() - 1), opcode);
629 }
630 }
631#endif
632
633 /* Main switch on opcode */
634
635 switch (opcode) {
636
637 /* BEWARE!
638 It is essential that any operation that fails sets either
639 x to NULL, err to nonzero, or why to anything but WHY_NOT,
640 and that no operation that succeeds does this! */
641
642 /* case STOP_CODE: this is an error! */
643
644 case POP_TOP:
645 v = POP();
646 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000647 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000648
649 case ROT_TWO:
650 v = POP();
651 w = POP();
652 PUSH(v);
653 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000654 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000655
656 case ROT_THREE:
657 v = POP();
658 w = POP();
659 x = POP();
660 PUSH(v);
661 PUSH(x);
662 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000663 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000664
665 case DUP_TOP:
666 v = TOP();
667 INCREF(v);
668 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000669 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000670
671 case UNARY_POSITIVE:
672 v = POP();
673 x = pos(v);
674 DECREF(v);
675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000676 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 break;
678
679 case UNARY_NEGATIVE:
680 v = POP();
681 x = neg(v);
682 DECREF(v);
683 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000684 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 break;
686
687 case UNARY_NOT:
688 v = POP();
689 x = not(v);
690 DECREF(v);
691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000692 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000693 break;
694
695 case UNARY_CONVERT:
696 v = POP();
697 x = reprobject(v);
698 DECREF(v);
699 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000700 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000702
703 case UNARY_INVERT:
704 v = POP();
705 x = invert(v);
706 DECREF(v);
707 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000708 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000709 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);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000718 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000719 break;
720
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 case BINARY_MULTIPLY:
722 w = POP();
723 v = POP();
724 x = mul(v, w);
725 DECREF(v);
726 DECREF(w);
727 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000728 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 break;
730
731 case BINARY_DIVIDE:
732 w = POP();
733 v = POP();
734 x = divide(v, w);
735 DECREF(v);
736 DECREF(w);
737 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000738 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 break;
740
741 case BINARY_MODULO:
742 w = POP();
743 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000744 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 DECREF(v);
746 DECREF(w);
747 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000748 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000749 break;
750
751 case BINARY_ADD:
752 w = POP();
753 v = POP();
754 x = add(v, w);
755 DECREF(v);
756 DECREF(w);
757 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000758 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 break;
760
761 case BINARY_SUBTRACT:
762 w = POP();
763 v = POP();
764 x = sub(v, w);
765 DECREF(v);
766 DECREF(w);
767 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000768 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000769 break;
770
771 case BINARY_SUBSCR:
772 w = POP();
773 v = POP();
774 x = apply_subscript(v, w);
775 DECREF(v);
776 DECREF(w);
777 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000778 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 break;
780
Guido van Rossum7928cd71991-10-24 14:59:31 +0000781 case BINARY_LSHIFT:
782 w = POP();
783 v = POP();
784 x = lshift(v, w);
785 DECREF(v);
786 DECREF(w);
787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000788 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000789 break;
790
791 case BINARY_RSHIFT:
792 w = POP();
793 v = POP();
794 x = rshift(v, w);
795 DECREF(v);
796 DECREF(w);
797 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000798 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000799 break;
800
801 case BINARY_AND:
802 w = POP();
803 v = POP();
804 x = and(v, w);
805 DECREF(v);
806 DECREF(w);
807 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000808 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000809 break;
810
811 case BINARY_XOR:
812 w = POP();
813 v = POP();
814 x = xor(v, w);
815 DECREF(v);
816 DECREF(w);
817 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000818 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000819 break;
820
821 case BINARY_OR:
822 w = POP();
823 v = POP();
824 x = or(v, w);
825 DECREF(v);
826 DECREF(w);
827 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000828 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000829 break;
830
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 case SLICE+0:
832 case SLICE+1:
833 case SLICE+2:
834 case SLICE+3:
835 if ((opcode-SLICE) & 2)
836 w = POP();
837 else
838 w = NULL;
839 if ((opcode-SLICE) & 1)
840 v = POP();
841 else
842 v = NULL;
843 u = POP();
844 x = apply_slice(u, v, w);
845 DECREF(u);
846 XDECREF(v);
847 XDECREF(w);
848 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 break;
851
852 case STORE_SLICE+0:
853 case STORE_SLICE+1:
854 case STORE_SLICE+2:
855 case STORE_SLICE+3:
856 if ((opcode-STORE_SLICE) & 2)
857 w = POP();
858 else
859 w = NULL;
860 if ((opcode-STORE_SLICE) & 1)
861 v = POP();
862 else
863 v = NULL;
864 u = POP();
865 t = POP();
866 err = assign_slice(u, v, w, t); /* u[v:w] = t */
867 DECREF(t);
868 DECREF(u);
869 XDECREF(v);
870 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 break;
873
874 case DELETE_SLICE+0:
875 case DELETE_SLICE+1:
876 case DELETE_SLICE+2:
877 case DELETE_SLICE+3:
878 if ((opcode-DELETE_SLICE) & 2)
879 w = POP();
880 else
881 w = NULL;
882 if ((opcode-DELETE_SLICE) & 1)
883 v = POP();
884 else
885 v = NULL;
886 u = POP();
887 err = assign_slice(u, v, w, (object *)NULL);
888 /* del u[v:w] */
889 DECREF(u);
890 XDECREF(v);
891 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 break;
894
895 case STORE_SUBSCR:
896 w = POP();
897 v = POP();
898 u = POP();
899 /* v[w] = u */
900 err = assign_subscript(v, w, u);
901 DECREF(u);
902 DECREF(v);
903 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000904 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000905 break;
906
907 case DELETE_SUBSCR:
908 w = POP();
909 v = POP();
910 /* del v[w] */
911 err = assign_subscript(v, w, (object *)NULL);
912 DECREF(v);
913 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000914 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 break;
916
917 case PRINT_EXPR:
918 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000920 /* Before printing, also assign to '_' */
921 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000922 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000923 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000925 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000926 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000927 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 flushline();
929 }
930 DECREF(v);
931 break;
932
933 case PRINT_ITEM:
934 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000935 w = sysget("stdout");
936 if (softspace(w, 1))
937 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000938 err = writeobject(v, w, PRINT_RAW);
939 if (err == 0 && is_stringobject(v)) {
940 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 char *s = getstringvalue(v);
942 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000943 if (len > 0 &&
944 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000945 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000946 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000949 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 break;
951
952 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000953 x = sysget("stdout");
954 if (x == NULL)
955 err_setstr(RuntimeError, "lost sys.stdout");
956 else {
957 writestring("\n", x);
958 softspace(x, 0);
959 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 break;
961
962 case BREAK_LOOP:
963 why = WHY_BREAK;
964 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000965
Guido van Rossumf10570b1995-07-07 22:53:21 +0000966 case RAISE_VARARGS:
967 u = v = w = NULL;
968 switch (oparg) {
969 case 3:
970 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000971 /* Fallthrough */
972 case 2:
973 v = POP(); /* value */
974 /* Fallthrough */
975 case 1:
976 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000977 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000978 break;
979 default:
980 err_setstr(SystemError,
981 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000982 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000983 break;
984 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
986
987 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000988 if ((x = f->f_locals) == NULL) {
989 err_setstr(SystemError, "no locals");
990 break;
991 }
992 INCREF(x);
993 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000994 break;
995
996 case RETURN_VALUE:
997 retval = POP();
998 why = WHY_RETURN;
999 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001000
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001001 case EXEC_STMT:
1002 w = POP();
1003 v = POP();
1004 u = POP();
1005 err = exec_statement(u, v, w);
1006 DECREF(u);
1007 DECREF(v);
1008 DECREF(w);
1009 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001010
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 case POP_BLOCK:
1012 {
1013 block *b = pop_block(f);
1014 while (STACK_LEVEL() > b->b_level) {
1015 v = POP();
1016 DECREF(v);
1017 }
1018 }
1019 break;
1020
1021 case END_FINALLY:
1022 v = POP();
1023 if (is_intobject(v)) {
1024 why = (enum why_code) getintvalue(v);
1025 if (why == WHY_RETURN)
1026 retval = POP();
1027 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001028 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001030 u = POP();
1031 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001033 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 }
1035 else if (v != None) {
1036 err_setstr(SystemError,
1037 "'finally' pops bad exception");
1038 why = WHY_EXCEPTION;
1039 }
1040 DECREF(v);
1041 break;
1042
1043 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001044 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001046 w = POP();
1047 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001049 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 DECREF(v);
1051 DECREF(w);
1052 break;
1053
1054 case STORE_NAME:
1055 w = GETNAMEV(oparg);
1056 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001057 if ((x = f->f_locals) == NULL) {
1058 err_setstr(SystemError, "no locals");
1059 break;
1060 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001061 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 DECREF(v);
1063 break;
1064
1065 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001066 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001067 if ((x = f->f_locals) == NULL) {
1068 err_setstr(SystemError, "no locals");
1069 break;
1070 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001071 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001072 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001073 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001074
1075#ifdef CASE_TOO_BIG
1076 default: switch (opcode) {
1077#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001078
1079 case UNPACK_TUPLE:
1080 v = POP();
1081 if (!is_tupleobject(v)) {
1082 err_setstr(TypeError, "unpack non-tuple");
1083 why = WHY_EXCEPTION;
1084 }
1085 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001086 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 "unpack tuple of wrong size");
1088 why = WHY_EXCEPTION;
1089 }
1090 else {
1091 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001092 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001093 INCREF(w);
1094 PUSH(w);
1095 }
1096 }
1097 DECREF(v);
1098 break;
1099
1100 case UNPACK_LIST:
1101 v = POP();
1102 if (!is_listobject(v)) {
1103 err_setstr(TypeError, "unpack non-list");
1104 why = WHY_EXCEPTION;
1105 }
1106 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001107 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001108 "unpack list of wrong size");
1109 why = WHY_EXCEPTION;
1110 }
1111 else {
1112 for (; --oparg >= 0; ) {
1113 w = getlistitem(v, oparg);
1114 INCREF(w);
1115 PUSH(w);
1116 }
1117 }
1118 DECREF(v);
1119 break;
1120
1121 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001122 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 v = POP();
1124 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001125 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 DECREF(v);
1127 DECREF(u);
1128 break;
1129
1130 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001133 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 DECREF(v);
1135 break;
1136
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001137 case STORE_GLOBAL:
1138 w = GETNAMEV(oparg);
1139 v = POP();
1140 err = dict2insert(f->f_globals, w, v);
1141 DECREF(v);
1142 break;
1143
1144 case DELETE_GLOBAL:
1145 w = GETNAMEV(oparg);
1146 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001147 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001148 break;
1149
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 case LOAD_CONST:
1151 x = GETCONST(oparg);
1152 INCREF(x);
1153 PUSH(x);
1154 break;
1155
1156 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001157 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001158 if ((x = f->f_locals) == NULL) {
1159 err_setstr(SystemError, "no locals");
1160 break;
1161 }
1162 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001164 err_clear();
1165 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001167 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001168 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001170 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 break;
1172 }
1173 }
1174 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001175 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001176 PUSH(x);
1177 break;
1178
1179 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001180 w = GETNAMEV(oparg);
1181 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001183 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001184 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001186 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 break;
1188 }
1189 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001190 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 PUSH(x);
1192 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001193
Guido van Rossum9bfef441993-03-29 10:43:31 +00001194 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001195 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001196 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001197 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001198 gettupleitem(co->co_varnames,
1199 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001200 break;
1201 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001202 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001203 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001204 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001205 break;
1206
1207 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001208 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001209 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001210 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001211
1212 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001213 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001214 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001215
1216 case BUILD_TUPLE:
1217 x = newtupleobject(oparg);
1218 if (x != NULL) {
1219 for (; --oparg >= 0;) {
1220 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001221 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 }
1223 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001224 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 }
1226 break;
1227
1228 case BUILD_LIST:
1229 x = newlistobject(oparg);
1230 if (x != NULL) {
1231 for (; --oparg >= 0;) {
1232 w = POP();
1233 err = setlistitem(x, oparg, w);
1234 if (err != 0)
1235 break;
1236 }
1237 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001238 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 }
1240 break;
1241
1242 case BUILD_MAP:
1243 x = newdictobject();
1244 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001245 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 break;
1247
1248 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001249 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001251 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 DECREF(v);
1253 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001254 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 break;
1256
1257 case COMPARE_OP:
1258 w = POP();
1259 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001260 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 DECREF(v);
1262 DECREF(w);
1263 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001264 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
1266
1267 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001269 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270 if (x == NULL) {
1271 err_setstr(ImportError,
1272 "__import__ not found");
1273 break;
1274 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001275 if (is_methodobject(x)) {
1276 u = None;
1277 INCREF(u);
1278 }
1279 else {
1280 u = find_from_args(f, INSTR_OFFSET());
1281 if (u == NULL) {
1282 x = u;
1283 break;
1284 }
1285 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001286 w = mkvalue("(OOOO)",
1287 w,
1288 f->f_globals,
1289 f->f_locals == NULL ? None : f->f_locals,
1290 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001291 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292 if (w == NULL) {
1293 x = NULL;
1294 break;
1295 }
1296 x = call_object(x, w);
1297 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001298 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001299 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 break;
1301
1302 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001303 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001305 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 if ((x = f->f_locals) == NULL) {
1307 err_setstr(SystemError, "no locals");
1308 break;
1309 }
1310 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001311 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001312 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001314
Guido van Rossum374a9221991-04-04 10:40:29 +00001315 case JUMP_FORWARD:
1316 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001317 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001318
1319 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001320 err = testbool(TOP());
1321 if (err > 0)
1322 err = 0;
1323 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001325 else
1326 break;
1327 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328
1329 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001330 err = testbool(TOP());
1331 if (err > 0) {
1332 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001334 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001335 else if (err == 0)
1336 ;
1337 else
1338 break;
1339 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001340
1341 case JUMP_ABSOLUTE:
1342 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001343 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001344
1345 case FOR_LOOP:
1346 /* for v in s: ...
1347 On entry: stack contains s, i.
1348 On exit: stack contains s, i+1, s[i];
1349 but if loop exhausted:
1350 s, i are popped, and we jump */
1351 w = POP(); /* Loop index */
1352 v = POP(); /* Sequence object */
1353 u = loop_subscript(v, w);
1354 if (u != NULL) {
1355 PUSH(v);
1356 x = newintobject(getintvalue(w)+1);
1357 PUSH(x);
1358 DECREF(w);
1359 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001360 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 }
1362 else {
1363 DECREF(v);
1364 DECREF(w);
1365 /* A NULL can mean "s exhausted"
1366 but also an error: */
1367 if (err_occurred())
1368 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001371 continue;
1372 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001373 }
1374 break;
1375
1376 case SETUP_LOOP:
1377 case SETUP_EXCEPT:
1378 case SETUP_FINALLY:
1379 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1380 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001381 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001382
1383 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001384#ifdef LLTRACE
1385 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001386 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001387#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001388 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001389 if (f->f_trace == NULL)
1390 continue;
1391 /* Trace each line of code reached */
1392 f->f_lasti = INSTR_OFFSET();
1393 err = call_trace(&f->f_trace, &f->f_trace,
1394 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001395 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001396
1397 case CALL_FUNCTION:
1398 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001399 int na = oparg & 0xff;
1400 int nk = (oparg>>8) & 0xff;
1401 int n = na + 2*nk;
1402 object **pfunc = stack_pointer - n - 1;
1403 object *func = *pfunc;
1404 object *self = NULL;
1405 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001406 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001407 if (is_instancemethodobject(func)) {
1408 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001409 class = instancemethodgetclass(func);
1410 func = instancemethodgetfunc(func);
1411 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001412 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001413 INCREF(self);
1414 DECREF(*pfunc);
1415 *pfunc = self;
1416 na++;
1417 n++;
1418 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001419 else {
1420 /* Unbound methods must be
1421 called with an instance of
1422 the class (or a derived
1423 class) as first argument */
1424 if (na > 0 &&
1425 (self = stack_pointer[-n])
1426 != NULL &&
1427 is_instanceobject(self) &&
1428 issubclass(
1429 (object *)
1430 (((instanceobject *)self)
1431 ->in_class),
1432 class))
1433 /* Handy-dandy */ ;
1434 else {
1435 err_setstr(TypeError,
1436 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001437 x = NULL;
1438 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001439 }
1440 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 }
1442 else
1443 INCREF(func);
1444 if (is_funcobject(func)) {
1445 object *co = getfunccode(func);
1446 object *globals = getfuncglobals(func);
1447 object *argdefs = PyFunction_GetDefaults(func);
1448 object **d;
1449 int nd;
1450 if (argdefs != NULL) {
1451 d = &GETTUPLEITEM(argdefs, 0);
1452 nd = ((tupleobject *)argdefs)->ob_size;
1453 }
1454 else {
1455 d = NULL;
1456 nd = 0;
1457 }
1458 x = eval_code2(
1459 (codeobject *)co,
1460 globals, (object *)NULL,
1461 stack_pointer-n, na,
1462 stack_pointer-2*nk, nk,
1463 d, nd,
1464 class);
1465 }
1466 else {
1467 object *args = newtupleobject(na);
1468 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001469 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001470 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001471 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001472 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001473 if (nk > 0) {
1474 kwdict = newdictobject();
1475 if (kwdict == NULL) {
1476 x = NULL;
1477 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001478 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001479 err = 0;
1480 while (--nk >= 0) {
1481 object *value = POP();
1482 object *key = POP();
1483 err = mappinginsert(
1484 kwdict, key, value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001485 DECREF(key);
1486 DECREF(value);
1487 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001488 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001489 }
1490 if (err) {
1491 DECREF(args);
1492 DECREF(kwdict);
1493 break;
1494 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001496 while (--na >= 0) {
1497 w = POP();
1498 SETTUPLEITEM(args, na, w);
1499 }
1500 x = PyEval_CallObjectWithKeywords(
1501 func, args, kwdict);
1502 DECREF(args);
1503 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001504 }
1505 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001506 while (stack_pointer > pfunc) {
1507 w = POP();
1508 DECREF(w);
1509 }
1510 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001511 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001512 break;
1513 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001514
Guido van Rossum681d79a1995-07-18 14:51:37 +00001515 case MAKE_FUNCTION:
1516 v = POP(); /* code object */
1517 x = newfuncobject(v, f->f_globals);
1518 DECREF(v);
1519 /* XXX Maybe this should be a separate opcode? */
1520 if (x != NULL && oparg > 0) {
1521 v = newtupleobject(oparg);
1522 if (v == NULL) {
1523 DECREF(x);
1524 x = NULL;
1525 break;
1526 }
1527 while (--oparg >= 0) {
1528 w = POP();
1529 SETTUPLEITEM(v, oparg, w);
1530 }
1531 err = PyFunction_SetDefaults(x, v);
1532 DECREF(v);
1533 }
1534 PUSH(x);
1535 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001536
1537 case BUILD_SLICE:
1538 if (oparg == 3)
1539 w = POP();
1540 else
1541 w = NULL;
1542 v = POP();
1543 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001544 x = PySlice_New(u, v, w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001545 DECREF(u);
1546 DECREF(v);
1547 XDECREF(w);
1548 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001549 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001550 break;
1551
1552
Guido van Rossum374a9221991-04-04 10:40:29 +00001553 default:
1554 fprintf(stderr,
1555 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001556 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001558 why = WHY_EXCEPTION;
1559 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001560
1561#ifdef CASE_TOO_BIG
1562 }
1563#endif
1564
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 } /* switch */
1566
1567 on_error:
1568
1569 /* Quickly continue if no error occurred */
1570
1571 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 if (err == 0 && x != NULL) {
1573#ifdef CHECKEXC
1574 if (err_occurred())
1575 fprintf(stderr,
1576 "XXX undetected error\n");
1577 else
1578#endif
1579 continue; /* Normal, fast path */
1580 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 why = WHY_EXCEPTION;
1582 x = None;
1583 err = 0;
1584 }
1585
Guido van Rossum801dcae1992-04-08 11:32:32 +00001586#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 /* Double-check exception status */
1588
1589 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1590 if (!err_occurred()) {
1591 fprintf(stderr, "XXX ghost error\n");
1592 err_setstr(SystemError, "ghost error");
1593 why = WHY_EXCEPTION;
1594 }
1595 }
1596 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001597 if (err_occurred()) {
1598 fprintf(stderr,
1599 "XXX undetected error (why=%d)\n",
1600 why);
1601 why = WHY_EXCEPTION;
1602 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 }
1604#endif
1605
1606 /* Log traceback info if this is a real exception */
1607
1608 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001609 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001611 f->f_lasti -= 2;
1612 tb_here(f);
1613
Guido van Rossume59214e1994-08-30 08:01:59 +00001614 if (f->f_trace)
1615 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001616 if (sys_profile)
1617 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 }
1619
1620 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1621
1622 if (why == WHY_RERAISE)
1623 why = WHY_EXCEPTION;
1624
1625 /* Unwind stacks if a (pseudo) exception occurred */
1626
1627 while (why != WHY_NOT && f->f_iblock > 0) {
1628 block *b = pop_block(f);
1629 while (STACK_LEVEL() > b->b_level) {
1630 v = POP();
1631 XDECREF(v);
1632 }
1633 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1634 why = WHY_NOT;
1635 JUMPTO(b->b_handler);
1636 break;
1637 }
1638 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001639 (b->b_type == SETUP_EXCEPT &&
1640 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001642 object *exc, *val, *tb;
1643 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 if (val == NULL) {
1645 val = None;
1646 INCREF(val);
1647 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 /* Make the raw exception data
1649 available to the handler,
1650 so a program can emulate the
1651 Python main loop. Don't do
1652 this for 'finally'. */
1653 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001654 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 sysset("exc_value", val);
1656 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001658 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 PUSH(val);
1660 PUSH(exc);
1661 }
1662 else {
1663 if (why == WHY_RETURN)
1664 PUSH(retval);
1665 v = newintobject((long)why);
1666 PUSH(v);
1667 }
1668 why = WHY_NOT;
1669 JUMPTO(b->b_handler);
1670 break;
1671 }
1672 } /* unwind stack */
1673
1674 /* End the loop if we still have an error (or return) */
1675
1676 if (why != WHY_NOT)
1677 break;
1678
1679 } /* main loop */
1680
1681 /* Pop remaining stack entries */
1682
1683 while (!EMPTY()) {
1684 v = POP();
1685 XDECREF(v);
1686 }
1687
Guido van Rossum96a42c81992-01-12 02:29:51 +00001688 if (why != WHY_RETURN)
1689 retval = NULL;
1690
Guido van Rossume59214e1994-08-30 08:01:59 +00001691 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001692 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001693 if (call_trace(&f->f_trace, &f->f_trace, f,
1694 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001695 XDECREF(retval);
1696 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001697 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001698 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001699 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001700 }
1701
1702 if (sys_profile && why == WHY_RETURN) {
1703 if (call_trace(&sys_profile, (object**)0,
1704 f, "return", retval)) {
1705 XDECREF(retval);
1706 retval = NULL;
1707 why = WHY_EXCEPTION;
1708 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001709 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001710
Guido van Rossum8c5df061997-01-24 04:19:24 +00001711 --recursion_depth;
1712
1713 fail: /* Jump here from prelude on failure */
1714
Guido van Rossuma4240131997-01-21 21:18:36 +00001715 /* Kill all local variables */
1716
1717 {
1718 int i;
1719 for (i = co->co_nlocals; --i >= 0; ++fastlocals) {
1720 if (*fastlocals != NULL) {
1721 DECREF(*fastlocals);
1722 *fastlocals = NULL;
1723 }
1724 }
1725 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001726
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001728
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 current_frame = f->f_back;
1730 DECREF(f);
1731
Guido van Rossum96a42c81992-01-12 02:29:51 +00001732 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001733}
1734
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001735/* Logic for the raise statement (too complicated for inlining).
1736 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001737static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001738do_raise(type, value, tb)
1739 object *type, *value, *tb;
1740{
1741 /* We support the following forms of raise:
1742 raise <class>, <classinstance>
1743 raise <class>, <argument tuple>
1744 raise <class>, None
1745 raise <class>, <argument>
1746 raise <classinstance>, None
1747 raise <string>, <object>
1748 raise <string>, None
1749
1750 An omitted second argument is the same as None.
1751
1752 In addition, raise <tuple>, <anything> is the same as
1753 raising the tuple's first item (and it better have one!);
1754 this rule is applied recursively.
1755
1756 Finally, an optional third argument can be supplied, which
1757 gives the traceback to be substituted (useful when
1758 re-raising an exception after examining it). */
1759
1760 /* First, check the traceback argument, replacing None with
1761 NULL. */
1762 if (tb == None) {
1763 DECREF(tb);
1764 tb = NULL;
1765 }
1766 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1767 err_setstr(TypeError,
1768 "raise 3rd arg must be traceback or None");
1769 goto raise_error;
1770 }
1771
1772 /* Next, replace a missing value with None */
1773 if (value == NULL) {
1774 value = None;
1775 INCREF(value);
1776 }
1777
1778 /* Next, repeatedly, replace a tuple exception with its first item */
1779 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1780 object *tmp = type;
1781 type = GETTUPLEITEM(type, 0);
1782 INCREF(type);
1783 DECREF(tmp);
1784 }
1785
1786 /* Now switch on the exception's type */
1787 if (is_stringobject(type)) {
1788 ;
1789 }
1790 else if (is_classobject(type)) {
1791 /* Raising a class. If the value is an instance, it
1792 better be an instance of the class. If it is not,
1793 it will be used to create an instance. */
1794 if (is_instanceobject(value)) {
1795 object *inclass = (object*)
1796 (((instanceobject*)value)->in_class);
1797 if (!issubclass(inclass, type)) {
1798 err_setstr(TypeError,
1799 "raise <class>, <instance> requires that <instance> is a member of <class>");
1800 goto raise_error;
1801 }
1802 }
1803 else {
1804 /* Go instantiate the class */
1805 object *args, *res;
1806 if (value == None)
1807 args = mkvalue("()");
1808 else if (is_tupleobject(value)) {
1809 INCREF(value);
1810 args = value;
1811 }
1812 else
1813 args = mkvalue("(O)", value);
1814 if (args == NULL)
1815 goto raise_error;
1816 res = call_object(type, args);
1817 DECREF(args);
1818 if (res == NULL)
1819 goto raise_error;
1820 DECREF(value);
1821 value = res;
1822 }
1823 }
1824 else if (is_instanceobject(type)) {
1825 /* Raising an instance. The value should be a dummy. */
1826 if (value != None) {
1827 err_setstr(TypeError,
1828 "instance exception may not have a separate value");
1829 goto raise_error;
1830 }
1831 else {
1832 /* Normalize to raise <class>, <instance> */
1833 DECREF(value);
1834 value = type;
1835 type = (object*) ((instanceobject*)type)->in_class;
1836 INCREF(type);
1837 }
1838 }
1839 else {
1840 /* Not something you can raise. You get an exception
1841 anyway, just not what you specified :-) */
1842 err_setstr(TypeError,
1843 "exceptions must be strings, classes, or instances");
1844 goto raise_error;
1845 }
1846 err_restore(type, value, tb);
1847 if (tb == NULL)
1848 return WHY_EXCEPTION;
1849 else
1850 return WHY_RERAISE;
1851 raise_error:
1852 XDECREF(value);
1853 XDECREF(type);
1854 XDECREF(tb);
1855 return WHY_EXCEPTION;
1856}
1857
Guido van Rossum96a42c81992-01-12 02:29:51 +00001858#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001859static int
1860prtrace(v, str)
1861 object *v;
1862 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001865 if (printobject(v, stdout, 0) != 0)
1866 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001869#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001871static void
1872call_exc_trace(p_trace, p_newtrace, f)
1873 object **p_trace, **p_newtrace;
1874 frameobject *f;
1875{
1876 object *type, *value, *traceback, *arg;
1877 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001878 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001879 if (value == NULL) {
1880 value = None;
1881 INCREF(value);
1882 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001883 arg = mkvalue("(OOO)", type, value, traceback);
1884 if (arg == NULL) {
1885 err_restore(type, value, traceback);
1886 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001887 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001888 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1889 DECREF(arg);
1890 if (err == 0)
1891 err_restore(type, value, traceback);
1892 else {
1893 XDECREF(type);
1894 XDECREF(value);
1895 XDECREF(traceback);
1896 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001897}
1898
1899static int
1900call_trace(p_trace, p_newtrace, f, msg, arg)
1901 object **p_trace; /* in/out; may not be NULL;
1902 may not point to NULL variable initially */
1903 object **p_newtrace; /* in/out; may be NULL;
1904 may point to NULL variable;
1905 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001906 frameobject *f;
1907 char *msg;
1908 object *arg;
1909{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001910 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001911 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001912 static int tracing = 0;
1913
1914 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001915 /* Don't do recursive traces */
1916 if (p_newtrace) {
1917 XDECREF(*p_newtrace);
1918 *p_newtrace = NULL;
1919 }
1920 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001921 }
1922
Guido van Rossumf10570b1995-07-07 22:53:21 +00001923 args = newtupleobject(3);
1924 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001925 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001926 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001927 if (what == NULL)
1928 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001929 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001930 SETTUPLEITEM(args, 0, (object *)f);
1931 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001932 if (arg == NULL)
1933 arg = None;
1934 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001935 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001936 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001937 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001938 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001939 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001940 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001941 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001942 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001943 if (res == NULL) {
1944 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001945 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001946 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001947 *p_trace = NULL;
1948 if (p_newtrace) {
1949 XDECREF(*p_newtrace);
1950 *p_newtrace = NULL;
1951 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001952 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001953 }
1954 else {
1955 if (p_newtrace) {
1956 XDECREF(*p_newtrace);
1957 if (res == None)
1958 *p_newtrace = NULL;
1959 else {
1960 INCREF(res);
1961 *p_newtrace = res;
1962 }
1963 }
1964 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001965 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001966 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001967}
1968
Guido van Rossum3f5da241990-12-20 15:06:42 +00001969object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001970getbuiltins()
1971{
1972 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001973 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001974 else
1975 return current_frame->f_builtins;
1976}
1977
1978object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001979getlocals()
1980{
1981 if (current_frame == NULL)
1982 return NULL;
1983 fast_2_locals(current_frame);
1984 return current_frame->f_locals;
1985}
1986
1987object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988getglobals()
1989{
1990 if (current_frame == NULL)
1991 return NULL;
1992 else
1993 return current_frame->f_globals;
1994}
1995
Guido van Rossum81daa321993-05-20 14:24:46 +00001996object *
Guido van Rossume59214e1994-08-30 08:01:59 +00001997getframe()
1998{
1999 return (object *)current_frame;
2000}
2001
Guido van Rossum6135a871995-01-09 17:53:26 +00002002int
2003getrestricted()
2004{
2005 return current_frame == NULL ? 0 : current_frame->f_restricted;
2006}
2007
Guido van Rossum3f5da241990-12-20 15:06:42 +00002008void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009flushline()
2010{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002011 object *f = sysget("stdout");
2012 if (softspace(f, 0))
2013 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014}
2015
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016
Guido van Rossum06186511995-01-07 12:40:10 +00002017#define BINOP(opname, ropname, thisfunc) \
2018 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2019 ; \
2020 else \
2021 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002022
2023
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002024static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002025or(v, w)
2026 object *v, *w;
2027{
Guido van Rossum06186511995-01-07 12:40:10 +00002028 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002029 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002030 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002031 object * (*f) FPROTO((object *, object *));
2032 if (coerce(&v, &w) != 0)
2033 return NULL;
2034 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2035 x = (*f)(v, w);
2036 DECREF(v);
2037 DECREF(w);
2038 if (f != NULL)
2039 return x;
2040 }
2041 err_setstr(TypeError, "bad operand type(s) for |");
2042 return NULL;
2043}
2044
2045static object *
2046xor(v, w)
2047 object *v, *w;
2048{
Guido van Rossum06186511995-01-07 12:40:10 +00002049 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002050 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002051 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002052 object * (*f) FPROTO((object *, object *));
2053 if (coerce(&v, &w) != 0)
2054 return NULL;
2055 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2056 x = (*f)(v, w);
2057 DECREF(v);
2058 DECREF(w);
2059 if (f != NULL)
2060 return x;
2061 }
2062 err_setstr(TypeError, "bad operand type(s) for ^");
2063 return NULL;
2064}
2065
2066static object *
2067and(v, w)
2068 object *v, *w;
2069{
Guido van Rossum06186511995-01-07 12:40:10 +00002070 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002071 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002072 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002073 object * (*f) FPROTO((object *, object *));
2074 if (coerce(&v, &w) != 0)
2075 return NULL;
2076 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2077 x = (*f)(v, w);
2078 DECREF(v);
2079 DECREF(w);
2080 if (f != NULL)
2081 return x;
2082 }
2083 err_setstr(TypeError, "bad operand type(s) for &");
2084 return NULL;
2085}
2086
2087static object *
2088lshift(v, w)
2089 object *v, *w;
2090{
Guido van Rossum06186511995-01-07 12:40:10 +00002091 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002092 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002093 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002094 object * (*f) FPROTO((object *, object *));
2095 if (coerce(&v, &w) != 0)
2096 return NULL;
2097 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2098 x = (*f)(v, w);
2099 DECREF(v);
2100 DECREF(w);
2101 if (f != NULL)
2102 return x;
2103 }
2104 err_setstr(TypeError, "bad operand type(s) for <<");
2105 return NULL;
2106}
2107
2108static object *
2109rshift(v, w)
2110 object *v, *w;
2111{
Guido van Rossum06186511995-01-07 12:40:10 +00002112 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002113 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002114 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002115 object * (*f) FPROTO((object *, object *));
2116 if (coerce(&v, &w) != 0)
2117 return NULL;
2118 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2119 x = (*f)(v, w);
2120 DECREF(v);
2121 DECREF(w);
2122 if (f != NULL)
2123 return x;
2124 }
2125 err_setstr(TypeError, "bad operand type(s) for >>");
2126 return NULL;
2127}
2128
2129static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002130add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131 object *v, *w;
2132{
Guido van Rossum06186511995-01-07 12:40:10 +00002133 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002134 if (v->ob_type->tp_as_sequence != NULL)
2135 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2136 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002137 object *x;
2138 if (coerce(&v, &w) != 0)
2139 return NULL;
2140 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2141 DECREF(v);
2142 DECREF(w);
2143 return x;
2144 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002145 err_setstr(TypeError, "bad operand type(s) for +");
2146 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147}
2148
2149static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002150sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 object *v, *w;
2152{
Guido van Rossum06186511995-01-07 12:40:10 +00002153 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002154 if (v->ob_type->tp_as_number != NULL) {
2155 object *x;
2156 if (coerce(&v, &w) != 0)
2157 return NULL;
2158 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2159 DECREF(v);
2160 DECREF(w);
2161 return x;
2162 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002163 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 return NULL;
2165}
2166
2167static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002168mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 object *v, *w;
2170{
2171 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002172 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002173 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002174 if (tp->tp_as_number != NULL &&
2175 w->ob_type->tp_as_sequence != NULL &&
2176 !is_instanceobject(v)) {
2177 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 object *tmp = v;
2179 v = w;
2180 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002181 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002183 if (tp->tp_as_number != NULL) {
2184 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002185 if (is_instanceobject(v)) {
2186 /* Instances of user-defined classes get their
2187 other argument uncoerced, so they may
2188 implement sequence*number as well as
2189 number*number. */
2190 INCREF(v);
2191 INCREF(w);
2192 }
2193 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002194 return NULL;
2195 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2196 DECREF(v);
2197 DECREF(w);
2198 return x;
2199 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200 if (tp->tp_as_sequence != NULL) {
2201 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002202 err_setstr(TypeError,
2203 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 return NULL;
2205 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002206 return (*tp->tp_as_sequence->sq_repeat)
2207 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210 return NULL;
2211}
2212
2213static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002214divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 object *v, *w;
2216{
Guido van Rossum06186511995-01-07 12:40:10 +00002217 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002218 if (v->ob_type->tp_as_number != NULL) {
2219 object *x;
2220 if (coerce(&v, &w) != 0)
2221 return NULL;
2222 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2223 DECREF(v);
2224 DECREF(w);
2225 return x;
2226 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002227 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 return NULL;
2229}
2230
2231static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002232mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 object *v, *w;
2234{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002235 if (is_stringobject(v)) {
2236 return formatstring(v, w);
2237 }
Guido van Rossum06186511995-01-07 12:40:10 +00002238 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002239 if (v->ob_type->tp_as_number != NULL) {
2240 object *x;
2241 if (coerce(&v, &w) != 0)
2242 return NULL;
2243 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2244 DECREF(v);
2245 DECREF(w);
2246 return x;
2247 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002248 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002249 return NULL;
2250}
2251
2252static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002253powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002254 object *v, *w;
2255{
2256 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002257 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002258 if (v->ob_type->tp_as_number == NULL ||
2259 w->ob_type->tp_as_number == NULL) {
2260 err_setstr(TypeError, "pow() requires numeric arguments");
2261 return NULL;
2262 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002263 if (coerce(&v, &w) != 0)
2264 return NULL;
2265 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2266 DECREF(v);
2267 DECREF(w);
2268 return res;
2269}
2270
2271static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002272neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273 object *v;
2274{
2275 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002276 return (*v->ob_type->tp_as_number->nb_negative)(v);
2277 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278 return NULL;
2279}
2280
2281static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002282pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283 object *v;
2284{
2285 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002286 return (*v->ob_type->tp_as_number->nb_positive)(v);
2287 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 return NULL;
2289}
2290
2291static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002292invert(v)
2293 object *v;
2294{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002295 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002296 if (v->ob_type->tp_as_number != NULL &&
2297 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2298 return (*f)(v);
2299 err_setstr(TypeError, "bad operand type(s) for unary ~");
2300 return NULL;
2301}
2302
2303static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002305 object *v;
2306{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002307 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002308 object *w;
2309 if (outcome < 0)
2310 return NULL;
2311 if (outcome == 0)
2312 w = True;
2313 else
2314 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002315 INCREF(w);
2316 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002317}
Guido van Rossum234f9421993-06-17 12:35:49 +00002318
2319
Guido van Rossum681d79a1995-07-18 14:51:37 +00002320/* External interface to call any callable object.
2321 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002322
2323object *
2324call_object(func, arg)
2325 object *func;
2326 object *arg;
2327{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2329}
Guido van Rossume59214e1994-08-30 08:01:59 +00002330
Guido van Rossum681d79a1995-07-18 14:51:37 +00002331object *
2332PyEval_CallObjectWithKeywords(func, arg, kw)
2333 object *func;
2334 object *arg;
2335 object *kw;
2336{
2337 ternaryfunc call;
2338 object *result;
2339
2340 if (arg == NULL)
2341 arg = newtupleobject(0);
2342 else if (!is_tupleobject(arg)) {
2343 err_setstr(TypeError, "argument list must be a tuple");
2344 return NULL;
2345 }
2346 else
2347 INCREF(arg);
2348
Guido van Rossume3e61c11995-08-04 04:14:47 +00002349 if (kw != NULL && !is_dictobject(kw)) {
2350 err_setstr(TypeError, "keyword list must be a dictionary");
2351 return NULL;
2352 }
2353
Guido van Rossum150b2df1996-12-05 23:17:11 +00002354 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002355 result = (*call)(func, arg, kw);
2356 else if (is_instancemethodobject(func) || is_funcobject(func))
2357 result = call_function(func, arg, kw);
2358 else
2359 result = call_builtin(func, arg, kw);
2360
2361 DECREF(arg);
2362
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002363 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002364 err_setstr(SystemError,
2365 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002366
2367 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002368}
2369
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002371call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002373 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002374 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 if (is_methodobject(func)) {
2377 method meth = getmethod(func);
2378 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002379 int flags = getflags(func);
2380 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002381 int size = gettuplesize(arg);
2382 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002383 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002384 else if (size == 0)
2385 arg = NULL;
2386 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002387 if (flags & METH_KEYWORDS)
2388 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002389 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002390 err_setstr(TypeError,
2391 "this function takes no keyword arguments");
2392 return NULL;
2393 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 }
2396 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002397 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002399 if (is_instanceobject(func)) {
2400 object *res, *call = getattr(func,"__call__");
2401 if (call == NULL) {
2402 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002403 err_setstr(AttributeError,
2404 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002405 return NULL;
2406 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002407 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002408 DECREF(call);
2409 return res;
2410 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 return NULL;
2413}
2414
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002418 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002419 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002421 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002422 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423 object **d, **k;
2424 int nk, nd;
2425 object *result;
2426
2427 if (kw != NULL && !is_dictobject(kw)) {
2428 err_badcall();
2429 return NULL;
2430 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431
Guido van Rossume8122f11991-05-05 20:03:07 +00002432 if (is_instancemethodobject(func)) {
2433 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002434 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002435 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002436 if (self == NULL) {
2437 /* Unbound methods must be called with an instance of
2438 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002439 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002440 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002441 if (self != NULL &&
2442 is_instanceobject(self) &&
2443 issubclass((object *)
2444 (((instanceobject *)self)->in_class),
2445 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002446 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002447 else
2448 self = NULL;
2449 }
2450 if (self == NULL) {
2451 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002452 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002453 return NULL;
2454 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002455 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002456 }
2457 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002458 int argcount = gettuplesize(arg);
2459 object *newarg = newtupleobject(argcount + 1);
2460 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002461 if (newarg == NULL)
2462 return NULL;
2463 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002464 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002465 for (i = 0; i < argcount; i++) {
2466 object *v = GETTUPLEITEM(arg, i);
2467 XINCREF(v);
2468 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002469 }
2470 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 }
2472 }
2473 else {
2474 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002475 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 return NULL;
2477 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002478 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002480
2481 argdefs = PyFunction_GetDefaults(func);
2482 if (argdefs != NULL && is_tupleobject(argdefs)) {
2483 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2484 nd = gettuplesize(argdefs);
2485 }
2486 else {
2487 d = NULL;
2488 nd = 0;
2489 }
2490
2491 if (kw != NULL) {
2492 int pos, i;
2493 nk = getmappingsize(kw);
2494 k = NEW(object *, 2*nk);
2495 if (k == NULL) {
2496 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002497 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002498 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002499 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002500 pos = i = 0;
2501 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2502 i += 2;
2503 nk = i/2;
2504 /* XXX This is broken if the caller deletes dict items! */
2505 }
2506 else {
2507 k = NULL;
2508 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002509 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510
Guido van Rossum681d79a1995-07-18 14:51:37 +00002511 result = eval_code2(
2512 (codeobject *)getfunccode(func),
2513 getfuncglobals(func), (object *)NULL,
2514 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2515 k, nk,
2516 d, nd,
2517 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518
Guido van Rossum681d79a1995-07-18 14:51:37 +00002519 DECREF(arg);
2520 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521
Guido van Rossum681d79a1995-07-18 14:51:37 +00002522 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523}
2524
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002525#define SLICE_ERROR_MSG \
2526 "standard sequence type does not support step size other than one"
2527
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 object *v, *w;
2531{
2532 typeobject *tp = v->ob_type;
2533 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002534 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 return NULL;
2536 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002537 if (tp->tp_as_mapping != NULL) {
2538 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2539 }
2540 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002542 if (!is_intobject(w)) {
2543 if (PySlice_Check(w)) {
2544 err_setstr(ValueError, SLICE_ERROR_MSG);
2545 } else {
2546 err_setstr(TypeError,
2547 "sequence subscript not int");
2548 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 return NULL;
2550 }
2551 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002552 if (i < 0) {
2553 int len = (*tp->tp_as_sequence->sq_length)(v);
2554 if (len < 0)
2555 return NULL;
2556 i += len;
2557 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560}
2561
2562static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002563loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564 object *v, *w;
2565{
2566 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002567 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002568 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 return NULL;
2571 }
2572 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002573 v = (*sq->sq_item)(v, i);
2574 if (v)
2575 return v;
2576 if (err_occurred() == IndexError)
2577 err_clear();
2578 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579}
2580
2581static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002582slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583 object *v;
2584 int isize;
2585 int *pi;
2586{
2587 if (v != NULL) {
2588 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589 err_setstr(TypeError, "slice index must be int");
2590 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591 }
2592 *pi = getintvalue(v);
2593 if (*pi < 0)
2594 *pi += isize;
2595 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597}
2598
2599static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002600apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 object *u, *v, *w;
2602{
2603 typeobject *tp = u->ob_type;
2604 int ilow, ihigh, isize;
2605 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 return NULL;
2608 }
2609 ilow = 0;
2610 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002611 if (isize < 0)
2612 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002615 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002617 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002619
2620static int
2621assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 object *w;
2623 object *key;
2624 object *v;
2625{
2626 typeobject *tp = w->ob_type;
2627 sequence_methods *sq;
2628 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002629 int (*func1)();
2630 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002631 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002632 (func1 = mp->mp_ass_subscript) != NULL) {
2633 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002634 }
2635 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002636 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002638 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002639 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002642 else {
2643 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002644 if (i < 0) {
2645 int len = (*sq->sq_length)(w);
2646 if (len < 0)
2647 return -1;
2648 i += len;
2649 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002650 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002651 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002654 err_setstr(TypeError,
2655 "can't assign to this subscripted object");
2656 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658}
2659
Guido van Rossum3f5da241990-12-20 15:06:42 +00002660static int
2661assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 object *u, *v, *w, *x;
2663{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002666 if (sq == NULL) {
2667 err_setstr(TypeError, "assign to slice of non-sequence");
2668 return -1;
2669 }
2670 if (sq == NULL || sq->sq_ass_slice == NULL) {
2671 err_setstr(TypeError, "unassignable slice");
2672 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 }
2674 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002675 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002676 if (isize < 0)
2677 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002678 if (slice_index(v, isize, &ilow) != 0)
2679 return -1;
2680 if (slice_index(w, isize, &ihigh) != 0)
2681 return -1;
2682 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683}
2684
2685static int
2686cmp_exception(err, v)
2687 object *err, *v;
2688{
2689 if (is_tupleobject(v)) {
2690 int i, n;
2691 n = gettuplesize(v);
2692 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002693 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002694 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695 return 1;
2696 }
2697 return 0;
2698 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002699 if (is_classobject(v) && is_classobject(err))
2700 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 return err == v;
2702}
2703
Guido van Rossum3f5da241990-12-20 15:06:42 +00002704static int
2705cmp_member(v, w)
2706 object *v, *w;
2707{
Guido van Rossume59214e1994-08-30 08:01:59 +00002708 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002709 object *x;
2710 sequence_methods *sq;
2711 /* Special case for char in string */
2712 if (is_stringobject(w)) {
2713 register char *s, *end;
2714 register char c;
2715 if (!is_stringobject(v) || getstringsize(v) != 1) {
2716 err_setstr(TypeError,
2717 "string member test needs char left operand");
2718 return -1;
2719 }
2720 c = getstringvalue(v)[0];
2721 s = getstringvalue(w);
2722 end = s + getstringsize(w);
2723 while (s < end) {
2724 if (c == *s++)
2725 return 1;
2726 }
2727 return 0;
2728 }
2729 sq = w->ob_type->tp_as_sequence;
2730 if (sq == NULL) {
2731 err_setstr(TypeError,
2732 "'in' or 'not in' needs sequence right argument");
2733 return -1;
2734 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002735 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002736 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002737 if (x == NULL) {
2738 if (err_occurred() == IndexError) {
2739 err_clear();
2740 break;
2741 }
2742 return -1;
2743 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002744 cmp = cmpobject(v, x);
2745 XDECREF(x);
2746 if (cmp == 0)
2747 return 1;
2748 }
2749 return 0;
2750}
2751
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002754 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755 register object *v;
2756 register object *w;
2757{
2758 register int cmp;
2759 register int res = 0;
2760 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002761 case IS:
2762 case IS_NOT:
2763 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002764 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002765 res = !res;
2766 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 case IN:
2768 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002769 res = cmp_member(v, w);
2770 if (res < 0)
2771 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002772 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002773 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 break;
2775 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002776 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002777 break;
2778 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002779 cmp = cmpobject(v, w);
2780 switch (op) {
2781 case LT: res = cmp < 0; break;
2782 case LE: res = cmp <= 0; break;
2783 case EQ: res = cmp == 0; break;
2784 case NE: res = cmp != 0; break;
2785 case GT: res = cmp > 0; break;
2786 case GE: res = cmp >= 0; break;
2787 /* XXX no default? (res is initialized to 0 though) */
2788 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002789 }
2790 v = res ? True : False;
2791 INCREF(v);
2792 return v;
2793}
2794
Guido van Rossum3f5da241990-12-20 15:06:42 +00002795static int
2796import_from(locals, v, name)
2797 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002798 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002799 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002800{
2801 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002802 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002803 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002804 return -1;
2805 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002806 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002807 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002808 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002809 object *name, *value;
2810 pos = 0;
2811 while (mappinggetnext(w, &pos, &name, &value)) {
2812 if (!is_stringobject(name) ||
2813 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002814 continue;
Guido van Rossum1aa14831997-01-21 05:34:20 +00002815 INCREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002816 err = dict2insert(locals, name, value);
2817 DECREF(value);
2818 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002820 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002821 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002822 }
2823 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002824 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002825 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002826 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002827 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002828 getstringvalue(name));
2829 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002830 return -1;
2831 }
2832 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002833 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002834 }
2835}
2836
2837static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002838build_class(methods, bases, name)
2839 object *methods; /* dictionary */
2840 object *bases; /* tuple containing classes */
2841 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002842{
Guido van Rossum25831651993-05-19 14:50:45 +00002843 int i;
2844 if (!is_tupleobject(bases)) {
2845 err_setstr(SystemError, "build_class with non-tuple bases");
2846 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002847 }
Guido van Rossum25831651993-05-19 14:50:45 +00002848 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002849 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002850 return NULL;
2851 }
Guido van Rossum25831651993-05-19 14:50:45 +00002852 if (!is_stringobject(name)) {
2853 err_setstr(SystemError, "build_class witn non-string name");
2854 return NULL;
2855 }
2856 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002857 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002858 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002859 /* Call the base's *type*, if it is callable.
2860 This code is a hook for Donald Beaudry's
2861 and Jim Fulton's type extensions. In
2862 unexended Python it will never be triggered
2863 since its types are not callable. */
2864 if (base->ob_type->ob_type->tp_call) {
2865 object *args;
2866 object *class;
2867 args = mkvalue("(OOO)", name, bases, methods);
2868 class = call_object((object *)base->ob_type,
2869 args);
2870 DECREF(args);
2871 return class;
2872 }
Guido van Rossum25831651993-05-19 14:50:45 +00002873 err_setstr(TypeError,
2874 "base is not a class object");
2875 return NULL;
2876 }
2877 }
2878 return newclassobject(bases, methods, name);
2879}
2880
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002881static int
2882exec_statement(prog, globals, locals)
2883 object *prog;
2884 object *globals;
2885 object *locals;
2886{
2887 char *s;
2888 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002889 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002890 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002891
2892 if (is_tupleobject(prog) && globals == None && locals == None &&
2893 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2894 /* Backward compatibility hack */
2895 globals = gettupleitem(prog, 1);
2896 if (n == 3)
2897 locals = gettupleitem(prog, 2);
2898 prog = gettupleitem(prog, 0);
2899 }
2900 if (globals == None) {
2901 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002902 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002903 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002904 plain = 1;
2905 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002906 }
2907 else if (locals == None)
2908 locals = globals;
2909 if (!is_stringobject(prog) &&
2910 !is_codeobject(prog) &&
2911 !is_fileobject(prog)) {
2912 err_setstr(TypeError,
2913 "exec 1st arg must be string, code or file object");
2914 return -1;
2915 }
2916 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2917 err_setstr(TypeError,
2918 "exec 2nd/3rd args must be dict or None");
2919 return -1;
2920 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002921 if (dictlookup(globals, "__builtins__") == NULL)
2922 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002923 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002924 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002925 return -1;
2926 return 0;
2927 }
2928 if (is_fileobject(prog)) {
2929 FILE *fp = getfilefile(prog);
2930 char *name = getstringvalue(getfilename(prog));
2931 if (run_file(fp, name, file_input, globals, locals) == NULL)
2932 return -1;
2933 return 0;
2934 }
2935 s = getstringvalue(prog);
2936 if (strlen(s) != getstringsize(prog)) {
2937 err_setstr(ValueError, "embedded '\\0' in exec string");
2938 return -1;
2939 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002940 v = run_string(s, file_input, globals, locals);
2941 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002942 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002943 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002944 if (plain)
2945 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002946 return 0;
2947}
Guido van Rossum24c13741995-02-14 09:42:43 +00002948
Guido van Rossum1aa14831997-01-21 05:34:20 +00002949/* Hack for ni.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002950static object *
2951find_from_args(f, nexti)
2952 frameobject *f;
2953 int nexti;
2954{
2955 int opcode;
2956 int oparg;
2957 object *list, *name;
2958 unsigned char *next_instr;
2959
2960 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2961 opcode = (*next_instr++);
2962 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002963 INCREF(None);
2964 return None;
2965 }
2966
2967 list = newlistobject(0);
2968 if (list == NULL)
2969 return NULL;
2970
2971 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002972 oparg = (next_instr[1]<<8) + next_instr[0];
2973 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002974 name = Getnamev(f, oparg);
2975 if (addlistitem(list, name) < 0) {
2976 DECREF(list);
2977 break;
2978 }
2979 opcode = (*next_instr++);
2980 } while (opcode == IMPORT_FROM);
2981
2982 return list;
2983}
Guido van Rossum950361c1997-01-24 13:49:28 +00002984
2985
2986#ifdef DYNAMIC_EXECUTION_PROFILE
2987
2988PyObject *
2989getarray(a)
2990 long a[256];
2991{
2992 int i;
2993 PyObject *l = PyList_New(256);
2994 if (l == NULL) return NULL;
2995 for (i = 0; i < 256; i++) {
2996 PyObject *x = PyInt_FromLong(a[i]);
2997 if (x == NULL) {
2998 Py_DECREF(l);
2999 return NULL;
3000 }
3001 PyList_SetItem(l, i, x);
3002 }
3003 for (i = 0; i < 256; i++)
3004 a[i] = 0;
3005 return l;
3006}
3007
3008PyObject *
3009_Py_GetDXProfile(self, args)
3010 PyObject *self, *args;
3011{
3012#ifndef DXPAIRS
3013 return getarray(dxp);
3014#else
3015 int i;
3016 PyObject *l = PyList_New(257);
3017 if (l == NULL) return NULL;
3018 for (i = 0; i < 257; i++) {
3019 PyObject *x = getarray(dxpairs[i]);
3020 if (x == NULL) {
3021 Py_DECREF(l);
3022 return NULL;
3023 }
3024 PyList_SetItem(l, i, x);
3025 }
3026 return l;
3027#endif
3028}
3029
3030#endif