blob: 65aad61def9b029fdb02b0ff053bcb2ac19d24db [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)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000359#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000360#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 Rossumdeb0c5e1997-01-27 23:42:36 +0000413 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414
415 if (co->co_argcount > 0 ||
416 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
417 int i;
418 int n = argcount;
419 object *kwdict = NULL;
420 if (co->co_flags & CO_VARKEYWORDS) {
421 kwdict = newmappingobject();
422 if (kwdict == NULL)
423 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000424 i = co->co_argcount;
425 if (co->co_flags & CO_VARARGS)
426 i++;
427 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000428 }
429 if (argcount > co->co_argcount) {
430 if (!(co->co_flags & CO_VARARGS)) {
431 err_setstr(TypeError, "too many arguments");
432 goto fail;
433 }
434 n = co->co_argcount;
435 }
436 for (i = 0; i < n; i++) {
437 x = args[i];
438 INCREF(x);
439 SETLOCAL(i, x);
440 }
441 if (co->co_flags & CO_VARARGS) {
442 u = newtupleobject(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000443 if (u == NULL)
444 goto fail;
445 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 for (i = n; i < argcount; i++) {
447 x = args[i];
448 INCREF(x);
449 SETTUPLEITEM(u, i-n, x);
450 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 }
452 for (i = 0; i < kwcount; i++) {
453 object *keyword = kws[2*i];
454 object *value = kws[2*i + 1];
455 int j;
456 /* XXX slow -- speed up using dictionary? */
457 for (j = 0; j < co->co_argcount; j++) {
458 object *nm = GETTUPLEITEM(co->co_varnames, j);
459 if (cmpobject(keyword, nm) == 0)
460 break;
461 }
462 if (j >= co->co_argcount) {
463 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000464 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 goto fail;
466 }
467 mappinginsert(kwdict, keyword, value);
468 }
469 else {
470 if (GETLOCAL(j) != NULL) {
471 err_setstr(TypeError,
472 "keyword parameter redefined");
473 goto fail;
474 }
475 INCREF(value);
476 SETLOCAL(j, value);
477 }
478 }
479 if (argcount < co->co_argcount) {
480 int m = co->co_argcount - defcount;
481 for (i = argcount; i < m; i++) {
482 if (GETLOCAL(i) == NULL) {
483 err_setstr(TypeError,
484 "not enough arguments");
485 goto fail;
486 }
487 }
488 if (n > m)
489 i = n - m;
490 else
491 i = 0;
492 for (; i < defcount; i++) {
493 if (GETLOCAL(m+i) == NULL) {
494 object *def = defs[i];
495 INCREF(def);
496 SETLOCAL(m+i, def);
497 }
498 }
499 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 }
501 else {
502 if (argcount > 0 || kwcount > 0) {
503 err_setstr(TypeError, "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000504 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 }
506 }
507
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000508 if (sys_trace != NULL) {
509 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000510 be called on *every* entry to a code block.
511 Its return value, if not None, is a function that
512 will be called at the start of each executed line
513 of code. (Actually, the function must return
514 itself in order to continue tracing.)
515 The trace functions are called with three arguments:
516 a pointer to the current frame, a string indicating
517 why the function is called, and an argument which
518 depends on the situation. The global trace function
519 (sys.trace) is also called whenever an exception
520 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 if (call_trace(&sys_trace, &f->f_trace, f, "call",
522 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000523 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000524 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000525 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000526 }
527
528 if (sys_profile != NULL) {
529 /* Similar for sys_profile, except it needn't return
530 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 if (call_trace(&sys_profile, (object**)0, f, "call",
532 None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000533 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000534 }
535 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000536
Guido van Rossum8861b741996-07-30 16:49:37 +0000537 if (++recursion_depth > MAX_RECURSION_DEPTH) {
538 --recursion_depth;
539 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
540 current_frame = f->f_back;
541 DECREF(f);
542 return NULL;
543 }
544
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000545 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000546 stack_pointer = f->f_valuestack;
547
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 why = WHY_NOT;
549 err = 0;
550 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000551
552 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553 /* Do periodic things.
554 Doing this every time through the loop would add
555 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000556 So we do it only every Nth instruction.
557
558 The ticker is reset to zero if there are pending
Guido van Rossum70d44781997-01-21 06:15:24 +0000559 calls (see Py_AddPendingCall() and
Guido van Rossum8861b741996-07-30 16:49:37 +0000560 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000561
Guido van Rossum374a9221991-04-04 10:40:29 +0000562 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000563 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000564 if (pendingfirst != pendinglast) {
565 if (Py_MakePendingCalls() < 0) {
566 why = WHY_EXCEPTION;
567 goto on_error;
568 }
569 }
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570#ifdef macintosh
571#undef HAVE_SIGNAL_H
572#endif
Guido van Rossum70d44781997-01-21 06:15:24 +0000573#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
574/* If we have true signals, the signal handler will call
575 Py_AddPendingCall() so we don't have to call sigcheck().
576 On the Mac and DOS, alas, we have to call it. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000577 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000578 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000579 goto on_error;
580 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000581#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000582
Guido van Rossume59214e1994-08-30 08:01:59 +0000583#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584 if (interpreter_lock) {
585 /* Give another thread a chance */
586
587 current_frame = NULL;
588 release_lock(interpreter_lock);
589
590 /* Other threads may run now */
591
592 acquire_lock(interpreter_lock, 1);
593 current_frame = f;
594 }
595#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000596 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000597
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000599
Guido van Rossum408027e1996-12-30 16:17:54 +0000600#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000601 f->f_lasti = INSTR_OFFSET();
602#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000603
604 opcode = NEXTOP();
605 if (HAS_ARG(opcode))
606 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000607#ifdef DYNAMIC_EXECUTION_PROFILE
608#ifdef DXPAIRS
609 dxpairs[lastopcode][opcode]++;
610 lastopcode = opcode;
611#endif
612 dxp[opcode]++;
613#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000614
Guido van Rossum96a42c81992-01-12 02:29:51 +0000615#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 /* Instruction tracing */
617
Guido van Rossum96a42c81992-01-12 02:29:51 +0000618 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 if (HAS_ARG(opcode)) {
620 printf("%d: %d, %d\n",
621 (int) (INSTR_OFFSET() - 3),
622 opcode, oparg);
623 }
624 else {
625 printf("%d: %d\n",
626 (int) (INSTR_OFFSET() - 1), opcode);
627 }
628 }
629#endif
630
631 /* Main switch on opcode */
632
633 switch (opcode) {
634
635 /* BEWARE!
636 It is essential that any operation that fails sets either
637 x to NULL, err to nonzero, or why to anything but WHY_NOT,
638 and that no operation that succeeds does this! */
639
640 /* case STOP_CODE: this is an error! */
641
642 case POP_TOP:
643 v = POP();
644 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000645 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000646
647 case ROT_TWO:
648 v = POP();
649 w = POP();
650 PUSH(v);
651 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000652 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000653
654 case ROT_THREE:
655 v = POP();
656 w = POP();
657 x = POP();
658 PUSH(v);
659 PUSH(x);
660 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000661 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662
663 case DUP_TOP:
664 v = TOP();
665 INCREF(v);
666 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000667 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000668
669 case UNARY_POSITIVE:
670 v = POP();
671 x = pos(v);
672 DECREF(v);
673 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000674 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 break;
676
677 case UNARY_NEGATIVE:
678 v = POP();
679 x = neg(v);
680 DECREF(v);
681 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000682 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 break;
684
685 case UNARY_NOT:
686 v = POP();
687 x = not(v);
688 DECREF(v);
689 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 break;
692
693 case UNARY_CONVERT:
694 v = POP();
695 x = reprobject(v);
696 DECREF(v);
697 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000698 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000700
701 case UNARY_INVERT:
702 v = POP();
703 x = invert(v);
704 DECREF(v);
705 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000706 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000707 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000708
Guido van Rossum50564e81996-01-12 01:13:16 +0000709 case BINARY_POWER:
710 w = POP();
711 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000712 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000713 DECREF(v);
714 DECREF(w);
715 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000716 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000717 break;
718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 case BINARY_MULTIPLY:
720 w = POP();
721 v = POP();
722 x = mul(v, w);
723 DECREF(v);
724 DECREF(w);
725 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000726 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 break;
728
729 case BINARY_DIVIDE:
730 w = POP();
731 v = POP();
732 x = divide(v, w);
733 DECREF(v);
734 DECREF(w);
735 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 break;
738
739 case BINARY_MODULO:
740 w = POP();
741 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000742 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 DECREF(v);
744 DECREF(w);
745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 break;
748
749 case BINARY_ADD:
750 w = POP();
751 v = POP();
752 x = add(v, w);
753 DECREF(v);
754 DECREF(w);
755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 break;
758
759 case BINARY_SUBTRACT:
760 w = POP();
761 v = POP();
762 x = sub(v, w);
763 DECREF(v);
764 DECREF(w);
765 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000766 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 break;
768
769 case BINARY_SUBSCR:
770 w = POP();
771 v = POP();
772 x = apply_subscript(v, w);
773 DECREF(v);
774 DECREF(w);
775 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000776 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 break;
778
Guido van Rossum7928cd71991-10-24 14:59:31 +0000779 case BINARY_LSHIFT:
780 w = POP();
781 v = POP();
782 x = lshift(v, w);
783 DECREF(v);
784 DECREF(w);
785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000786 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000787 break;
788
789 case BINARY_RSHIFT:
790 w = POP();
791 v = POP();
792 x = rshift(v, w);
793 DECREF(v);
794 DECREF(w);
795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000796 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000797 break;
798
799 case BINARY_AND:
800 w = POP();
801 v = POP();
802 x = and(v, w);
803 DECREF(v);
804 DECREF(w);
805 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000806 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000807 break;
808
809 case BINARY_XOR:
810 w = POP();
811 v = POP();
812 x = xor(v, w);
813 DECREF(v);
814 DECREF(w);
815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000817 break;
818
819 case BINARY_OR:
820 w = POP();
821 v = POP();
822 x = or(v, w);
823 DECREF(v);
824 DECREF(w);
825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000826 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000827 break;
828
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 case SLICE+0:
830 case SLICE+1:
831 case SLICE+2:
832 case SLICE+3:
833 if ((opcode-SLICE) & 2)
834 w = POP();
835 else
836 w = NULL;
837 if ((opcode-SLICE) & 1)
838 v = POP();
839 else
840 v = NULL;
841 u = POP();
842 x = apply_slice(u, v, w);
843 DECREF(u);
844 XDECREF(v);
845 XDECREF(w);
846 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000847 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 break;
849
850 case STORE_SLICE+0:
851 case STORE_SLICE+1:
852 case STORE_SLICE+2:
853 case STORE_SLICE+3:
854 if ((opcode-STORE_SLICE) & 2)
855 w = POP();
856 else
857 w = NULL;
858 if ((opcode-STORE_SLICE) & 1)
859 v = POP();
860 else
861 v = NULL;
862 u = POP();
863 t = POP();
864 err = assign_slice(u, v, w, t); /* u[v:w] = t */
865 DECREF(t);
866 DECREF(u);
867 XDECREF(v);
868 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
871
872 case DELETE_SLICE+0:
873 case DELETE_SLICE+1:
874 case DELETE_SLICE+2:
875 case DELETE_SLICE+3:
876 if ((opcode-DELETE_SLICE) & 2)
877 w = POP();
878 else
879 w = NULL;
880 if ((opcode-DELETE_SLICE) & 1)
881 v = POP();
882 else
883 v = NULL;
884 u = POP();
885 err = assign_slice(u, v, w, (object *)NULL);
886 /* del u[v:w] */
887 DECREF(u);
888 XDECREF(v);
889 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 break;
892
893 case STORE_SUBSCR:
894 w = POP();
895 v = POP();
896 u = POP();
897 /* v[w] = u */
898 err = assign_subscript(v, w, u);
899 DECREF(u);
900 DECREF(v);
901 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
904
905 case DELETE_SUBSCR:
906 w = POP();
907 v = POP();
908 /* del v[w] */
909 err = assign_subscript(v, w, (object *)NULL);
910 DECREF(v);
911 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000912 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
914
915 case PRINT_EXPR:
916 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000918 /* Before printing, also assign to '_' */
919 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000920 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000921 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000923 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000924 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000925 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 flushline();
927 }
928 DECREF(v);
929 break;
930
931 case PRINT_ITEM:
932 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000933 w = sysget("stdout");
934 if (softspace(w, 1))
935 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000936 err = writeobject(v, w, PRINT_RAW);
937 if (err == 0 && is_stringobject(v)) {
938 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 char *s = getstringvalue(v);
940 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000941 if (len > 0 &&
942 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000943 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000944 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000947 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 break;
949
950 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000951 x = sysget("stdout");
952 if (x == NULL)
953 err_setstr(RuntimeError, "lost sys.stdout");
954 else {
955 writestring("\n", x);
956 softspace(x, 0);
957 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 break;
959
960 case BREAK_LOOP:
961 why = WHY_BREAK;
962 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000963
Guido van Rossumf10570b1995-07-07 22:53:21 +0000964 case RAISE_VARARGS:
965 u = v = w = NULL;
966 switch (oparg) {
967 case 3:
968 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000969 /* Fallthrough */
970 case 2:
971 v = POP(); /* value */
972 /* Fallthrough */
973 case 1:
974 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000975 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000976 break;
977 default:
978 err_setstr(SystemError,
979 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000980 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000981 break;
982 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
984
985 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000986 if ((x = f->f_locals) == NULL) {
987 err_setstr(SystemError, "no locals");
988 break;
989 }
990 INCREF(x);
991 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
993
994 case RETURN_VALUE:
995 retval = POP();
996 why = WHY_RETURN;
997 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000998
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000999 case EXEC_STMT:
1000 w = POP();
1001 v = POP();
1002 u = POP();
1003 err = exec_statement(u, v, w);
1004 DECREF(u);
1005 DECREF(v);
1006 DECREF(w);
1007 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001008
Guido van Rossum374a9221991-04-04 10:40:29 +00001009 case POP_BLOCK:
1010 {
1011 block *b = pop_block(f);
1012 while (STACK_LEVEL() > b->b_level) {
1013 v = POP();
1014 DECREF(v);
1015 }
1016 }
1017 break;
1018
1019 case END_FINALLY:
1020 v = POP();
1021 if (is_intobject(v)) {
1022 why = (enum why_code) getintvalue(v);
1023 if (why == WHY_RETURN)
1024 retval = POP();
1025 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001026 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001028 u = POP();
1029 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001031 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 }
1033 else if (v != None) {
1034 err_setstr(SystemError,
1035 "'finally' pops bad exception");
1036 why = WHY_EXCEPTION;
1037 }
1038 DECREF(v);
1039 break;
1040
1041 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001042 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001044 w = POP();
1045 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001047 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 DECREF(v);
1049 DECREF(w);
1050 break;
1051
1052 case STORE_NAME:
1053 w = GETNAMEV(oparg);
1054 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001055 if ((x = f->f_locals) == NULL) {
1056 err_setstr(SystemError, "no locals");
1057 break;
1058 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001059 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 DECREF(v);
1061 break;
1062
1063 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001064 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001065 if ((x = f->f_locals) == NULL) {
1066 err_setstr(SystemError, "no locals");
1067 break;
1068 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001069 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001070 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072
1073#ifdef CASE_TOO_BIG
1074 default: switch (opcode) {
1075#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001076
1077 case UNPACK_TUPLE:
1078 v = POP();
1079 if (!is_tupleobject(v)) {
1080 err_setstr(TypeError, "unpack non-tuple");
1081 why = WHY_EXCEPTION;
1082 }
1083 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001084 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001085 "unpack tuple of wrong size");
1086 why = WHY_EXCEPTION;
1087 }
1088 else {
1089 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001090 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001091 INCREF(w);
1092 PUSH(w);
1093 }
1094 }
1095 DECREF(v);
1096 break;
1097
1098 case UNPACK_LIST:
1099 v = POP();
1100 if (!is_listobject(v)) {
1101 err_setstr(TypeError, "unpack non-list");
1102 why = WHY_EXCEPTION;
1103 }
1104 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001105 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 "unpack list of wrong size");
1107 why = WHY_EXCEPTION;
1108 }
1109 else {
1110 for (; --oparg >= 0; ) {
1111 w = getlistitem(v, oparg);
1112 INCREF(w);
1113 PUSH(w);
1114 }
1115 }
1116 DECREF(v);
1117 break;
1118
1119 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001120 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 v = POP();
1122 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001123 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 DECREF(v);
1125 DECREF(u);
1126 break;
1127
1128 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001129 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 DECREF(v);
1133 break;
1134
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001135 case STORE_GLOBAL:
1136 w = GETNAMEV(oparg);
1137 v = POP();
1138 err = dict2insert(f->f_globals, w, v);
1139 DECREF(v);
1140 break;
1141
1142 case DELETE_GLOBAL:
1143 w = GETNAMEV(oparg);
1144 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001145 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001146 break;
1147
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 case LOAD_CONST:
1149 x = GETCONST(oparg);
1150 INCREF(x);
1151 PUSH(x);
1152 break;
1153
1154 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001155 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001156 if ((x = f->f_locals) == NULL) {
1157 err_setstr(SystemError, "no locals");
1158 break;
1159 }
1160 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001162 err_clear();
1163 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001165 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001166 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001168 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 break;
1170 }
1171 }
1172 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001173 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 PUSH(x);
1175 break;
1176
1177 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001178 w = GETNAMEV(oparg);
1179 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001181 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001182 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001184 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 break;
1186 }
1187 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001188 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 PUSH(x);
1190 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001191
Guido van Rossum9bfef441993-03-29 10:43:31 +00001192 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001193 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001194 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001195 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001196 gettupleitem(co->co_varnames,
1197 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001198 break;
1199 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001200 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001201 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001202 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001203 break;
1204
1205 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001206 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001207 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001208 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001209
1210 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001211 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001212 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001213
1214 case BUILD_TUPLE:
1215 x = newtupleobject(oparg);
1216 if (x != NULL) {
1217 for (; --oparg >= 0;) {
1218 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001219 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 }
1221 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 }
1224 break;
1225
1226 case BUILD_LIST:
1227 x = newlistobject(oparg);
1228 if (x != NULL) {
1229 for (; --oparg >= 0;) {
1230 w = POP();
1231 err = setlistitem(x, oparg, w);
1232 if (err != 0)
1233 break;
1234 }
1235 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001236 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 }
1238 break;
1239
1240 case BUILD_MAP:
1241 x = newdictobject();
1242 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001243 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
1245
1246 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001247 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001249 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 DECREF(v);
1251 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001252 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
1254
1255 case COMPARE_OP:
1256 w = POP();
1257 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001258 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 DECREF(v);
1260 DECREF(w);
1261 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001262 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 break;
1264
1265 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001267 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268 if (x == NULL) {
1269 err_setstr(ImportError,
1270 "__import__ not found");
1271 break;
1272 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001273 if (is_methodobject(x)) {
1274 u = None;
1275 INCREF(u);
1276 }
1277 else {
1278 u = find_from_args(f, INSTR_OFFSET());
1279 if (u == NULL) {
1280 x = u;
1281 break;
1282 }
1283 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001284 w = mkvalue("(OOOO)",
1285 w,
1286 f->f_globals,
1287 f->f_locals == NULL ? None : f->f_locals,
1288 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001289 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290 if (w == NULL) {
1291 x = NULL;
1292 break;
1293 }
1294 x = call_object(x, w);
1295 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001296 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001297 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
1299
1300 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001301 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001303 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001304 if ((x = f->f_locals) == NULL) {
1305 err_setstr(SystemError, "no locals");
1306 break;
1307 }
1308 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001309 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001310 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001312
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 case JUMP_FORWARD:
1314 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001315 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001316
1317 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001318 err = testbool(TOP());
1319 if (err > 0)
1320 err = 0;
1321 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 else
1324 break;
1325 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001326
1327 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001328 err = testbool(TOP());
1329 if (err > 0) {
1330 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001332 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001333 else if (err == 0)
1334 ;
1335 else
1336 break;
1337 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338
1339 case JUMP_ABSOLUTE:
1340 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001341 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001342
1343 case FOR_LOOP:
1344 /* for v in s: ...
1345 On entry: stack contains s, i.
1346 On exit: stack contains s, i+1, s[i];
1347 but if loop exhausted:
1348 s, i are popped, and we jump */
1349 w = POP(); /* Loop index */
1350 v = POP(); /* Sequence object */
1351 u = loop_subscript(v, w);
1352 if (u != NULL) {
1353 PUSH(v);
1354 x = newintobject(getintvalue(w)+1);
1355 PUSH(x);
1356 DECREF(w);
1357 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001358 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 }
1360 else {
1361 DECREF(v);
1362 DECREF(w);
1363 /* A NULL can mean "s exhausted"
1364 but also an error: */
1365 if (err_occurred())
1366 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001367 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 continue;
1370 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 }
1372 break;
1373
1374 case SETUP_LOOP:
1375 case SETUP_EXCEPT:
1376 case SETUP_FINALLY:
1377 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1378 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001379 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001380
1381 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001382#ifdef LLTRACE
1383 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001384 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001385#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001386 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001387 if (f->f_trace == NULL)
1388 continue;
1389 /* Trace each line of code reached */
1390 f->f_lasti = INSTR_OFFSET();
1391 err = call_trace(&f->f_trace, &f->f_trace,
1392 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001394
1395 case CALL_FUNCTION:
1396 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001397 int na = oparg & 0xff;
1398 int nk = (oparg>>8) & 0xff;
1399 int n = na + 2*nk;
1400 object **pfunc = stack_pointer - n - 1;
1401 object *func = *pfunc;
1402 object *self = NULL;
1403 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001404 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001405 if (is_instancemethodobject(func)) {
1406 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001407 class = instancemethodgetclass(func);
1408 func = instancemethodgetfunc(func);
1409 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001410 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001411 INCREF(self);
1412 DECREF(*pfunc);
1413 *pfunc = self;
1414 na++;
1415 n++;
1416 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001417 else {
1418 /* Unbound methods must be
1419 called with an instance of
1420 the class (or a derived
1421 class) as first argument */
1422 if (na > 0 &&
1423 (self = stack_pointer[-n])
1424 != NULL &&
1425 is_instanceobject(self) &&
1426 issubclass(
1427 (object *)
1428 (((instanceobject *)self)
1429 ->in_class),
1430 class))
1431 /* Handy-dandy */ ;
1432 else {
1433 err_setstr(TypeError,
1434 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001435 x = NULL;
1436 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001437 }
1438 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 }
1440 else
1441 INCREF(func);
1442 if (is_funcobject(func)) {
1443 object *co = getfunccode(func);
1444 object *globals = getfuncglobals(func);
1445 object *argdefs = PyFunction_GetDefaults(func);
1446 object **d;
1447 int nd;
1448 if (argdefs != NULL) {
1449 d = &GETTUPLEITEM(argdefs, 0);
1450 nd = ((tupleobject *)argdefs)->ob_size;
1451 }
1452 else {
1453 d = NULL;
1454 nd = 0;
1455 }
1456 x = eval_code2(
1457 (codeobject *)co,
1458 globals, (object *)NULL,
1459 stack_pointer-n, na,
1460 stack_pointer-2*nk, nk,
1461 d, nd,
1462 class);
1463 }
1464 else {
1465 object *args = newtupleobject(na);
1466 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001467 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001468 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001469 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001470 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001471 if (nk > 0) {
1472 kwdict = newdictobject();
1473 if (kwdict == NULL) {
1474 x = NULL;
1475 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001476 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001477 err = 0;
1478 while (--nk >= 0) {
1479 object *value = POP();
1480 object *key = POP();
1481 err = mappinginsert(
1482 kwdict, key, value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001483 DECREF(key);
1484 DECREF(value);
1485 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001486 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001487 }
1488 if (err) {
1489 DECREF(args);
1490 DECREF(kwdict);
1491 break;
1492 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001493 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001494 while (--na >= 0) {
1495 w = POP();
1496 SETTUPLEITEM(args, na, w);
1497 }
1498 x = PyEval_CallObjectWithKeywords(
1499 func, args, kwdict);
1500 DECREF(args);
1501 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001502 }
1503 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 while (stack_pointer > pfunc) {
1505 w = POP();
1506 DECREF(w);
1507 }
1508 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001509 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001510 break;
1511 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001512
Guido van Rossum681d79a1995-07-18 14:51:37 +00001513 case MAKE_FUNCTION:
1514 v = POP(); /* code object */
1515 x = newfuncobject(v, f->f_globals);
1516 DECREF(v);
1517 /* XXX Maybe this should be a separate opcode? */
1518 if (x != NULL && oparg > 0) {
1519 v = newtupleobject(oparg);
1520 if (v == NULL) {
1521 DECREF(x);
1522 x = NULL;
1523 break;
1524 }
1525 while (--oparg >= 0) {
1526 w = POP();
1527 SETTUPLEITEM(v, oparg, w);
1528 }
1529 err = PyFunction_SetDefaults(x, v);
1530 DECREF(v);
1531 }
1532 PUSH(x);
1533 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001534
1535 case BUILD_SLICE:
1536 if (oparg == 3)
1537 w = POP();
1538 else
1539 w = NULL;
1540 v = POP();
1541 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001542 x = PySlice_New(u, v, w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001543 DECREF(u);
1544 DECREF(v);
1545 XDECREF(w);
1546 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001547 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001548 break;
1549
1550
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 default:
1552 fprintf(stderr,
1553 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001554 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 why = WHY_EXCEPTION;
1557 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001558
1559#ifdef CASE_TOO_BIG
1560 }
1561#endif
1562
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 } /* switch */
1564
1565 on_error:
1566
1567 /* Quickly continue if no error occurred */
1568
1569 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001570 if (err == 0 && x != NULL) {
1571#ifdef CHECKEXC
1572 if (err_occurred())
1573 fprintf(stderr,
1574 "XXX undetected error\n");
1575 else
1576#endif
1577 continue; /* Normal, fast path */
1578 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 why = WHY_EXCEPTION;
1580 x = None;
1581 err = 0;
1582 }
1583
Guido van Rossum801dcae1992-04-08 11:32:32 +00001584#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 /* Double-check exception status */
1586
1587 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1588 if (!err_occurred()) {
1589 fprintf(stderr, "XXX ghost error\n");
1590 err_setstr(SystemError, "ghost error");
1591 why = WHY_EXCEPTION;
1592 }
1593 }
1594 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001595 if (err_occurred()) {
1596 fprintf(stderr,
1597 "XXX undetected error (why=%d)\n",
1598 why);
1599 why = WHY_EXCEPTION;
1600 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 }
1602#endif
1603
1604 /* Log traceback info if this is a real exception */
1605
1606 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001607 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001609 f->f_lasti -= 2;
1610 tb_here(f);
1611
Guido van Rossume59214e1994-08-30 08:01:59 +00001612 if (f->f_trace)
1613 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001614 if (sys_profile)
1615 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 }
1617
1618 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1619
1620 if (why == WHY_RERAISE)
1621 why = WHY_EXCEPTION;
1622
1623 /* Unwind stacks if a (pseudo) exception occurred */
1624
1625 while (why != WHY_NOT && f->f_iblock > 0) {
1626 block *b = pop_block(f);
1627 while (STACK_LEVEL() > b->b_level) {
1628 v = POP();
1629 XDECREF(v);
1630 }
1631 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1632 why = WHY_NOT;
1633 JUMPTO(b->b_handler);
1634 break;
1635 }
1636 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001637 (b->b_type == SETUP_EXCEPT &&
1638 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640 object *exc, *val, *tb;
1641 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 if (val == NULL) {
1643 val = None;
1644 INCREF(val);
1645 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 /* Make the raw exception data
1647 available to the handler,
1648 so a program can emulate the
1649 Python main loop. Don't do
1650 this for 'finally'. */
1651 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001652 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 sysset("exc_value", val);
1654 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001656 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 PUSH(val);
1658 PUSH(exc);
1659 }
1660 else {
1661 if (why == WHY_RETURN)
1662 PUSH(retval);
1663 v = newintobject((long)why);
1664 PUSH(v);
1665 }
1666 why = WHY_NOT;
1667 JUMPTO(b->b_handler);
1668 break;
1669 }
1670 } /* unwind stack */
1671
1672 /* End the loop if we still have an error (or return) */
1673
1674 if (why != WHY_NOT)
1675 break;
1676
1677 } /* main loop */
1678
1679 /* Pop remaining stack entries */
1680
1681 while (!EMPTY()) {
1682 v = POP();
1683 XDECREF(v);
1684 }
1685
Guido van Rossum96a42c81992-01-12 02:29:51 +00001686 if (why != WHY_RETURN)
1687 retval = NULL;
1688
Guido van Rossume59214e1994-08-30 08:01:59 +00001689 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001690 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001691 if (call_trace(&f->f_trace, &f->f_trace, f,
1692 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001693 XDECREF(retval);
1694 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001695 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001697 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001698 }
1699
1700 if (sys_profile && why == WHY_RETURN) {
1701 if (call_trace(&sys_profile, (object**)0,
1702 f, "return", retval)) {
1703 XDECREF(retval);
1704 retval = NULL;
1705 why = WHY_EXCEPTION;
1706 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001707 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001708
Guido van Rossum8c5df061997-01-24 04:19:24 +00001709 --recursion_depth;
1710
1711 fail: /* Jump here from prelude on failure */
1712
Guido van Rossuma4240131997-01-21 21:18:36 +00001713 /* Kill all local variables */
1714
1715 {
1716 int i;
1717 for (i = co->co_nlocals; --i >= 0; ++fastlocals) {
1718 if (*fastlocals != NULL) {
1719 DECREF(*fastlocals);
1720 *fastlocals = NULL;
1721 }
1722 }
1723 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001724
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001726
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 current_frame = f->f_back;
1728 DECREF(f);
1729
Guido van Rossum96a42c81992-01-12 02:29:51 +00001730 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001731}
1732
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001733/* Logic for the raise statement (too complicated for inlining).
1734 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001735static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001736do_raise(type, value, tb)
1737 object *type, *value, *tb;
1738{
1739 /* We support the following forms of raise:
1740 raise <class>, <classinstance>
1741 raise <class>, <argument tuple>
1742 raise <class>, None
1743 raise <class>, <argument>
1744 raise <classinstance>, None
1745 raise <string>, <object>
1746 raise <string>, None
1747
1748 An omitted second argument is the same as None.
1749
1750 In addition, raise <tuple>, <anything> is the same as
1751 raising the tuple's first item (and it better have one!);
1752 this rule is applied recursively.
1753
1754 Finally, an optional third argument can be supplied, which
1755 gives the traceback to be substituted (useful when
1756 re-raising an exception after examining it). */
1757
1758 /* First, check the traceback argument, replacing None with
1759 NULL. */
1760 if (tb == None) {
1761 DECREF(tb);
1762 tb = NULL;
1763 }
1764 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1765 err_setstr(TypeError,
1766 "raise 3rd arg must be traceback or None");
1767 goto raise_error;
1768 }
1769
1770 /* Next, replace a missing value with None */
1771 if (value == NULL) {
1772 value = None;
1773 INCREF(value);
1774 }
1775
1776 /* Next, repeatedly, replace a tuple exception with its first item */
1777 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1778 object *tmp = type;
1779 type = GETTUPLEITEM(type, 0);
1780 INCREF(type);
1781 DECREF(tmp);
1782 }
1783
1784 /* Now switch on the exception's type */
1785 if (is_stringobject(type)) {
1786 ;
1787 }
1788 else if (is_classobject(type)) {
1789 /* Raising a class. If the value is an instance, it
1790 better be an instance of the class. If it is not,
1791 it will be used to create an instance. */
1792 if (is_instanceobject(value)) {
1793 object *inclass = (object*)
1794 (((instanceobject*)value)->in_class);
1795 if (!issubclass(inclass, type)) {
1796 err_setstr(TypeError,
1797 "raise <class>, <instance> requires that <instance> is a member of <class>");
1798 goto raise_error;
1799 }
1800 }
1801 else {
1802 /* Go instantiate the class */
1803 object *args, *res;
1804 if (value == None)
1805 args = mkvalue("()");
1806 else if (is_tupleobject(value)) {
1807 INCREF(value);
1808 args = value;
1809 }
1810 else
1811 args = mkvalue("(O)", value);
1812 if (args == NULL)
1813 goto raise_error;
1814 res = call_object(type, args);
1815 DECREF(args);
1816 if (res == NULL)
1817 goto raise_error;
1818 DECREF(value);
1819 value = res;
1820 }
1821 }
1822 else if (is_instanceobject(type)) {
1823 /* Raising an instance. The value should be a dummy. */
1824 if (value != None) {
1825 err_setstr(TypeError,
1826 "instance exception may not have a separate value");
1827 goto raise_error;
1828 }
1829 else {
1830 /* Normalize to raise <class>, <instance> */
1831 DECREF(value);
1832 value = type;
1833 type = (object*) ((instanceobject*)type)->in_class;
1834 INCREF(type);
1835 }
1836 }
1837 else {
1838 /* Not something you can raise. You get an exception
1839 anyway, just not what you specified :-) */
1840 err_setstr(TypeError,
1841 "exceptions must be strings, classes, or instances");
1842 goto raise_error;
1843 }
1844 err_restore(type, value, tb);
1845 if (tb == NULL)
1846 return WHY_EXCEPTION;
1847 else
1848 return WHY_RERAISE;
1849 raise_error:
1850 XDECREF(value);
1851 XDECREF(type);
1852 XDECREF(tb);
1853 return WHY_EXCEPTION;
1854}
1855
Guido van Rossum96a42c81992-01-12 02:29:51 +00001856#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001857static int
1858prtrace(v, str)
1859 object *v;
1860 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001861{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001862 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001863 if (printobject(v, stdout, 0) != 0)
1864 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001865 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001868
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001869static void
1870call_exc_trace(p_trace, p_newtrace, f)
1871 object **p_trace, **p_newtrace;
1872 frameobject *f;
1873{
1874 object *type, *value, *traceback, *arg;
1875 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001876 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001877 if (value == NULL) {
1878 value = None;
1879 INCREF(value);
1880 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881 arg = mkvalue("(OOO)", type, value, traceback);
1882 if (arg == NULL) {
1883 err_restore(type, value, traceback);
1884 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001885 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001886 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1887 DECREF(arg);
1888 if (err == 0)
1889 err_restore(type, value, traceback);
1890 else {
1891 XDECREF(type);
1892 XDECREF(value);
1893 XDECREF(traceback);
1894 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001895}
1896
1897static int
1898call_trace(p_trace, p_newtrace, f, msg, arg)
1899 object **p_trace; /* in/out; may not be NULL;
1900 may not point to NULL variable initially */
1901 object **p_newtrace; /* in/out; may be NULL;
1902 may point to NULL variable;
1903 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001904 frameobject *f;
1905 char *msg;
1906 object *arg;
1907{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001908 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001909 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910 static int tracing = 0;
1911
1912 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001913 /* Don't do recursive traces */
1914 if (p_newtrace) {
1915 XDECREF(*p_newtrace);
1916 *p_newtrace = NULL;
1917 }
1918 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001919 }
1920
Guido van Rossumf10570b1995-07-07 22:53:21 +00001921 args = newtupleobject(3);
1922 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001923 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001924 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001925 if (what == NULL)
1926 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001927 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001928 SETTUPLEITEM(args, 0, (object *)f);
1929 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001930 if (arg == NULL)
1931 arg = None;
1932 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001933 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001934 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001935 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001936 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001937 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001938 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001939 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001940 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001941 if (res == NULL) {
1942 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001943 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001944 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001945 *p_trace = NULL;
1946 if (p_newtrace) {
1947 XDECREF(*p_newtrace);
1948 *p_newtrace = NULL;
1949 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001950 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001951 }
1952 else {
1953 if (p_newtrace) {
1954 XDECREF(*p_newtrace);
1955 if (res == None)
1956 *p_newtrace = NULL;
1957 else {
1958 INCREF(res);
1959 *p_newtrace = res;
1960 }
1961 }
1962 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001963 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001964 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001965}
1966
Guido van Rossum3f5da241990-12-20 15:06:42 +00001967object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001968getbuiltins()
1969{
1970 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001971 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001972 else
1973 return current_frame->f_builtins;
1974}
1975
1976object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001977getlocals()
1978{
1979 if (current_frame == NULL)
1980 return NULL;
1981 fast_2_locals(current_frame);
1982 return current_frame->f_locals;
1983}
1984
1985object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986getglobals()
1987{
1988 if (current_frame == NULL)
1989 return NULL;
1990 else
1991 return current_frame->f_globals;
1992}
1993
Guido van Rossum81daa321993-05-20 14:24:46 +00001994object *
Guido van Rossume59214e1994-08-30 08:01:59 +00001995getframe()
1996{
1997 return (object *)current_frame;
1998}
1999
Guido van Rossum6135a871995-01-09 17:53:26 +00002000int
2001getrestricted()
2002{
2003 return current_frame == NULL ? 0 : current_frame->f_restricted;
2004}
2005
Guido van Rossum3f5da241990-12-20 15:06:42 +00002006void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007flushline()
2008{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002009 object *f = sysget("stdout");
2010 if (softspace(f, 0))
2011 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012}
2013
Guido van Rossum3f5da241990-12-20 15:06:42 +00002014
Guido van Rossum06186511995-01-07 12:40:10 +00002015#define BINOP(opname, ropname, thisfunc) \
2016 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2017 ; \
2018 else \
2019 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002020
2021
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002023or(v, w)
2024 object *v, *w;
2025{
Guido van Rossum06186511995-01-07 12:40:10 +00002026 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002027 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002028 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002029 object * (*f) FPROTO((object *, object *));
2030 if (coerce(&v, &w) != 0)
2031 return NULL;
2032 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2033 x = (*f)(v, w);
2034 DECREF(v);
2035 DECREF(w);
2036 if (f != NULL)
2037 return x;
2038 }
2039 err_setstr(TypeError, "bad operand type(s) for |");
2040 return NULL;
2041}
2042
2043static object *
2044xor(v, w)
2045 object *v, *w;
2046{
Guido van Rossum06186511995-01-07 12:40:10 +00002047 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002048 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002049 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002050 object * (*f) FPROTO((object *, object *));
2051 if (coerce(&v, &w) != 0)
2052 return NULL;
2053 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2054 x = (*f)(v, w);
2055 DECREF(v);
2056 DECREF(w);
2057 if (f != NULL)
2058 return x;
2059 }
2060 err_setstr(TypeError, "bad operand type(s) for ^");
2061 return NULL;
2062}
2063
2064static object *
2065and(v, w)
2066 object *v, *w;
2067{
Guido van Rossum06186511995-01-07 12:40:10 +00002068 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002069 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002070 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002071 object * (*f) FPROTO((object *, object *));
2072 if (coerce(&v, &w) != 0)
2073 return NULL;
2074 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2075 x = (*f)(v, w);
2076 DECREF(v);
2077 DECREF(w);
2078 if (f != NULL)
2079 return x;
2080 }
2081 err_setstr(TypeError, "bad operand type(s) for &");
2082 return NULL;
2083}
2084
2085static object *
2086lshift(v, w)
2087 object *v, *w;
2088{
Guido van Rossum06186511995-01-07 12:40:10 +00002089 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002090 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002091 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002092 object * (*f) FPROTO((object *, object *));
2093 if (coerce(&v, &w) != 0)
2094 return NULL;
2095 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2096 x = (*f)(v, w);
2097 DECREF(v);
2098 DECREF(w);
2099 if (f != NULL)
2100 return x;
2101 }
2102 err_setstr(TypeError, "bad operand type(s) for <<");
2103 return NULL;
2104}
2105
2106static object *
2107rshift(v, w)
2108 object *v, *w;
2109{
Guido van Rossum06186511995-01-07 12:40:10 +00002110 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002111 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002112 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002113 object * (*f) FPROTO((object *, object *));
2114 if (coerce(&v, &w) != 0)
2115 return NULL;
2116 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2117 x = (*f)(v, w);
2118 DECREF(v);
2119 DECREF(w);
2120 if (f != NULL)
2121 return x;
2122 }
2123 err_setstr(TypeError, "bad operand type(s) for >>");
2124 return NULL;
2125}
2126
2127static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002128add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 object *v, *w;
2130{
Guido van Rossum06186511995-01-07 12:40:10 +00002131 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002132 if (v->ob_type->tp_as_sequence != NULL)
2133 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2134 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002135 object *x;
2136 if (coerce(&v, &w) != 0)
2137 return NULL;
2138 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2139 DECREF(v);
2140 DECREF(w);
2141 return x;
2142 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002143 err_setstr(TypeError, "bad operand type(s) for +");
2144 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145}
2146
2147static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 object *v, *w;
2150{
Guido van Rossum06186511995-01-07 12:40:10 +00002151 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002152 if (v->ob_type->tp_as_number != NULL) {
2153 object *x;
2154 if (coerce(&v, &w) != 0)
2155 return NULL;
2156 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2157 DECREF(v);
2158 DECREF(w);
2159 return x;
2160 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002161 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 return NULL;
2163}
2164
2165static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002166mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 object *v, *w;
2168{
2169 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002170 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002171 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002172 if (tp->tp_as_number != NULL &&
2173 w->ob_type->tp_as_sequence != NULL &&
2174 !is_instanceobject(v)) {
2175 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 object *tmp = v;
2177 v = w;
2178 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002179 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002181 if (tp->tp_as_number != NULL) {
2182 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002183 if (is_instanceobject(v)) {
2184 /* Instances of user-defined classes get their
2185 other argument uncoerced, so they may
2186 implement sequence*number as well as
2187 number*number. */
2188 INCREF(v);
2189 INCREF(w);
2190 }
2191 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002192 return NULL;
2193 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2194 DECREF(v);
2195 DECREF(w);
2196 return x;
2197 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 if (tp->tp_as_sequence != NULL) {
2199 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 err_setstr(TypeError,
2201 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 return NULL;
2203 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002204 return (*tp->tp_as_sequence->sq_repeat)
2205 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002207 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208 return NULL;
2209}
2210
2211static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002212divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 object *v, *w;
2214{
Guido van Rossum06186511995-01-07 12:40:10 +00002215 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002216 if (v->ob_type->tp_as_number != NULL) {
2217 object *x;
2218 if (coerce(&v, &w) != 0)
2219 return NULL;
2220 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2221 DECREF(v);
2222 DECREF(w);
2223 return x;
2224 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002225 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 return NULL;
2227}
2228
2229static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002230mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 object *v, *w;
2232{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002233 if (is_stringobject(v)) {
2234 return formatstring(v, w);
2235 }
Guido van Rossum06186511995-01-07 12:40:10 +00002236 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002237 if (v->ob_type->tp_as_number != NULL) {
2238 object *x;
2239 if (coerce(&v, &w) != 0)
2240 return NULL;
2241 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2242 DECREF(v);
2243 DECREF(w);
2244 return x;
2245 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 return NULL;
2248}
2249
2250static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002251powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002252 object *v, *w;
2253{
2254 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002255 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002256 if (v->ob_type->tp_as_number == NULL ||
2257 w->ob_type->tp_as_number == NULL) {
2258 err_setstr(TypeError, "pow() requires numeric arguments");
2259 return NULL;
2260 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002261 if (coerce(&v, &w) != 0)
2262 return NULL;
2263 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2264 DECREF(v);
2265 DECREF(w);
2266 return res;
2267}
2268
2269static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002270neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271 object *v;
2272{
2273 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274 return (*v->ob_type->tp_as_number->nb_negative)(v);
2275 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 return NULL;
2277}
2278
2279static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002280pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 object *v;
2282{
2283 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284 return (*v->ob_type->tp_as_number->nb_positive)(v);
2285 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 return NULL;
2287}
2288
2289static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002290invert(v)
2291 object *v;
2292{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002293 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002294 if (v->ob_type->tp_as_number != NULL &&
2295 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2296 return (*f)(v);
2297 err_setstr(TypeError, "bad operand type(s) for unary ~");
2298 return NULL;
2299}
2300
2301static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002302not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 object *v;
2304{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002305 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002306 object *w;
2307 if (outcome < 0)
2308 return NULL;
2309 if (outcome == 0)
2310 w = True;
2311 else
2312 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002313 INCREF(w);
2314 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315}
Guido van Rossum234f9421993-06-17 12:35:49 +00002316
2317
Guido van Rossum681d79a1995-07-18 14:51:37 +00002318/* External interface to call any callable object.
2319 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002320
2321object *
2322call_object(func, arg)
2323 object *func;
2324 object *arg;
2325{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002326 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2327}
Guido van Rossume59214e1994-08-30 08:01:59 +00002328
Guido van Rossum681d79a1995-07-18 14:51:37 +00002329object *
2330PyEval_CallObjectWithKeywords(func, arg, kw)
2331 object *func;
2332 object *arg;
2333 object *kw;
2334{
2335 ternaryfunc call;
2336 object *result;
2337
2338 if (arg == NULL)
2339 arg = newtupleobject(0);
2340 else if (!is_tupleobject(arg)) {
2341 err_setstr(TypeError, "argument list must be a tuple");
2342 return NULL;
2343 }
2344 else
2345 INCREF(arg);
2346
Guido van Rossume3e61c11995-08-04 04:14:47 +00002347 if (kw != NULL && !is_dictobject(kw)) {
2348 err_setstr(TypeError, "keyword list must be a dictionary");
2349 return NULL;
2350 }
2351
Guido van Rossum150b2df1996-12-05 23:17:11 +00002352 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002353 result = (*call)(func, arg, kw);
2354 else if (is_instancemethodobject(func) || is_funcobject(func))
2355 result = call_function(func, arg, kw);
2356 else
2357 result = call_builtin(func, arg, kw);
2358
2359 DECREF(arg);
2360
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002361 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002362 err_setstr(SystemError,
2363 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002364
2365 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002366}
2367
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002369call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002372 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 if (is_methodobject(func)) {
2375 method meth = getmethod(func);
2376 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002377 int flags = getflags(func);
2378 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002379 int size = gettuplesize(arg);
2380 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002381 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002382 else if (size == 0)
2383 arg = NULL;
2384 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002385 if (flags & METH_KEYWORDS)
2386 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002387 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002388 err_setstr(TypeError,
2389 "this function takes no keyword arguments");
2390 return NULL;
2391 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 }
2394 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002395 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002397 if (is_instanceobject(func)) {
2398 object *res, *call = getattr(func,"__call__");
2399 if (call == NULL) {
2400 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002401 err_setstr(AttributeError,
2402 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002403 return NULL;
2404 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002405 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002406 DECREF(call);
2407 return res;
2408 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002409 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 return NULL;
2411}
2412
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002414call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002416 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002417 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002419 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002420 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002421 object **d, **k;
2422 int nk, nd;
2423 object *result;
2424
2425 if (kw != NULL && !is_dictobject(kw)) {
2426 err_badcall();
2427 return NULL;
2428 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429
Guido van Rossume8122f11991-05-05 20:03:07 +00002430 if (is_instancemethodobject(func)) {
2431 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002432 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002433 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002434 if (self == NULL) {
2435 /* Unbound methods must be called with an instance of
2436 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002438 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002439 if (self != NULL &&
2440 is_instanceobject(self) &&
2441 issubclass((object *)
2442 (((instanceobject *)self)->in_class),
2443 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002445 else
2446 self = NULL;
2447 }
2448 if (self == NULL) {
2449 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002451 return NULL;
2452 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002453 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002454 }
2455 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002456 int argcount = gettuplesize(arg);
2457 object *newarg = newtupleobject(argcount + 1);
2458 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002459 if (newarg == NULL)
2460 return NULL;
2461 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002462 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002463 for (i = 0; i < argcount; i++) {
2464 object *v = GETTUPLEITEM(arg, i);
2465 XINCREF(v);
2466 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002467 }
2468 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 }
2470 }
2471 else {
2472 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002473 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 return NULL;
2475 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002476 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002478
2479 argdefs = PyFunction_GetDefaults(func);
2480 if (argdefs != NULL && is_tupleobject(argdefs)) {
2481 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2482 nd = gettuplesize(argdefs);
2483 }
2484 else {
2485 d = NULL;
2486 nd = 0;
2487 }
2488
2489 if (kw != NULL) {
2490 int pos, i;
2491 nk = getmappingsize(kw);
2492 k = NEW(object *, 2*nk);
2493 if (k == NULL) {
2494 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002495 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002496 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002497 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002498 pos = i = 0;
2499 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2500 i += 2;
2501 nk = i/2;
2502 /* XXX This is broken if the caller deletes dict items! */
2503 }
2504 else {
2505 k = NULL;
2506 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002507 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508
Guido van Rossum681d79a1995-07-18 14:51:37 +00002509 result = eval_code2(
2510 (codeobject *)getfunccode(func),
2511 getfuncglobals(func), (object *)NULL,
2512 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2513 k, nk,
2514 d, nd,
2515 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516
Guido van Rossum681d79a1995-07-18 14:51:37 +00002517 DECREF(arg);
2518 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519
Guido van Rossum681d79a1995-07-18 14:51:37 +00002520 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521}
2522
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002523#define SLICE_ERROR_MSG \
2524 "standard sequence type does not support step size other than one"
2525
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 object *v, *w;
2529{
2530 typeobject *tp = v->ob_type;
2531 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002532 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533 return NULL;
2534 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002535 if (tp->tp_as_mapping != NULL) {
2536 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2537 }
2538 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002540 if (!is_intobject(w)) {
2541 if (PySlice_Check(w)) {
2542 err_setstr(ValueError, SLICE_ERROR_MSG);
2543 } else {
2544 err_setstr(TypeError,
2545 "sequence subscript not int");
2546 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002547 return NULL;
2548 }
2549 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002550 if (i < 0) {
2551 int len = (*tp->tp_as_sequence->sq_length)(v);
2552 if (len < 0)
2553 return NULL;
2554 i += len;
2555 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002556 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558}
2559
2560static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 object *v, *w;
2563{
2564 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002565 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002567 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002568 return NULL;
2569 }
2570 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002571 v = (*sq->sq_item)(v, i);
2572 if (v)
2573 return v;
2574 if (err_occurred() == IndexError)
2575 err_clear();
2576 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577}
2578
2579static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002580slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 object *v;
2582 int isize;
2583 int *pi;
2584{
2585 if (v != NULL) {
2586 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 err_setstr(TypeError, "slice index must be int");
2588 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589 }
2590 *pi = getintvalue(v);
2591 if (*pi < 0)
2592 *pi += isize;
2593 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002594 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595}
2596
2597static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002598apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 object *u, *v, *w;
2600{
2601 typeobject *tp = u->ob_type;
2602 int ilow, ihigh, isize;
2603 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 return NULL;
2606 }
2607 ilow = 0;
2608 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002609 if (isize < 0)
2610 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002611 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002615 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002617
2618static int
2619assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 object *w;
2621 object *key;
2622 object *v;
2623{
2624 typeobject *tp = w->ob_type;
2625 sequence_methods *sq;
2626 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002627 int (*func1)();
2628 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002629 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002630 (func1 = mp->mp_ass_subscript) != NULL) {
2631 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002632 }
2633 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002634 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002637 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002638 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002640 else {
2641 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002642 if (i < 0) {
2643 int len = (*sq->sq_length)(w);
2644 if (len < 0)
2645 return -1;
2646 i += len;
2647 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002648 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002649 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 err_setstr(TypeError,
2653 "can't assign to this subscripted object");
2654 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656}
2657
Guido van Rossum3f5da241990-12-20 15:06:42 +00002658static int
2659assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 object *u, *v, *w, *x;
2661{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 if (sq == NULL) {
2665 err_setstr(TypeError, "assign to slice of non-sequence");
2666 return -1;
2667 }
2668 if (sq == NULL || sq->sq_ass_slice == NULL) {
2669 err_setstr(TypeError, "unassignable slice");
2670 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 }
2672 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002673 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002674 if (isize < 0)
2675 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002676 if (slice_index(v, isize, &ilow) != 0)
2677 return -1;
2678 if (slice_index(w, isize, &ihigh) != 0)
2679 return -1;
2680 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681}
2682
2683static int
2684cmp_exception(err, v)
2685 object *err, *v;
2686{
2687 if (is_tupleobject(v)) {
2688 int i, n;
2689 n = gettuplesize(v);
2690 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002691 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002692 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 return 1;
2694 }
2695 return 0;
2696 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002697 if (is_classobject(v) && is_classobject(err))
2698 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 return err == v;
2700}
2701
Guido van Rossum3f5da241990-12-20 15:06:42 +00002702static int
2703cmp_member(v, w)
2704 object *v, *w;
2705{
Guido van Rossume59214e1994-08-30 08:01:59 +00002706 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002707 object *x;
2708 sequence_methods *sq;
2709 /* Special case for char in string */
2710 if (is_stringobject(w)) {
2711 register char *s, *end;
2712 register char c;
2713 if (!is_stringobject(v) || getstringsize(v) != 1) {
2714 err_setstr(TypeError,
2715 "string member test needs char left operand");
2716 return -1;
2717 }
2718 c = getstringvalue(v)[0];
2719 s = getstringvalue(w);
2720 end = s + getstringsize(w);
2721 while (s < end) {
2722 if (c == *s++)
2723 return 1;
2724 }
2725 return 0;
2726 }
2727 sq = w->ob_type->tp_as_sequence;
2728 if (sq == NULL) {
2729 err_setstr(TypeError,
2730 "'in' or 'not in' needs sequence right argument");
2731 return -1;
2732 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002733 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002734 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002735 if (x == NULL) {
2736 if (err_occurred() == IndexError) {
2737 err_clear();
2738 break;
2739 }
2740 return -1;
2741 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002742 cmp = cmpobject(v, x);
2743 XDECREF(x);
2744 if (cmp == 0)
2745 return 1;
2746 }
2747 return 0;
2748}
2749
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002751cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002752 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 register object *v;
2754 register object *w;
2755{
2756 register int cmp;
2757 register int res = 0;
2758 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759 case IS:
2760 case IS_NOT:
2761 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002762 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002763 res = !res;
2764 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765 case IN:
2766 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002767 res = cmp_member(v, w);
2768 if (res < 0)
2769 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002770 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002771 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 break;
2773 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002774 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 break;
2776 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002777 cmp = cmpobject(v, w);
2778 switch (op) {
2779 case LT: res = cmp < 0; break;
2780 case LE: res = cmp <= 0; break;
2781 case EQ: res = cmp == 0; break;
2782 case NE: res = cmp != 0; break;
2783 case GT: res = cmp > 0; break;
2784 case GE: res = cmp >= 0; break;
2785 /* XXX no default? (res is initialized to 0 though) */
2786 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002787 }
2788 v = res ? True : False;
2789 INCREF(v);
2790 return v;
2791}
2792
Guido van Rossum3f5da241990-12-20 15:06:42 +00002793static int
2794import_from(locals, v, name)
2795 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002796 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002797 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002798{
2799 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002800 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002801 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002802 return -1;
2803 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002804 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002805 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002806 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002807 object *name, *value;
2808 pos = 0;
2809 while (mappinggetnext(w, &pos, &name, &value)) {
2810 if (!is_stringobject(name) ||
2811 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002812 continue;
Guido van Rossum1aa14831997-01-21 05:34:20 +00002813 INCREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002814 err = dict2insert(locals, name, value);
2815 DECREF(value);
2816 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002817 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002818 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002820 }
2821 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002822 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002823 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002824 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002825 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002826 getstringvalue(name));
2827 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002828 return -1;
2829 }
2830 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002831 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002832 }
2833}
2834
2835static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002836build_class(methods, bases, name)
2837 object *methods; /* dictionary */
2838 object *bases; /* tuple containing classes */
2839 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002840{
Guido van Rossum25831651993-05-19 14:50:45 +00002841 int i;
2842 if (!is_tupleobject(bases)) {
2843 err_setstr(SystemError, "build_class with non-tuple bases");
2844 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002845 }
Guido van Rossum25831651993-05-19 14:50:45 +00002846 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002847 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002848 return NULL;
2849 }
Guido van Rossum25831651993-05-19 14:50:45 +00002850 if (!is_stringobject(name)) {
2851 err_setstr(SystemError, "build_class witn non-string name");
2852 return NULL;
2853 }
2854 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002855 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002856 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002857 /* Call the base's *type*, if it is callable.
2858 This code is a hook for Donald Beaudry's
2859 and Jim Fulton's type extensions. In
2860 unexended Python it will never be triggered
2861 since its types are not callable. */
2862 if (base->ob_type->ob_type->tp_call) {
2863 object *args;
2864 object *class;
2865 args = mkvalue("(OOO)", name, bases, methods);
2866 class = call_object((object *)base->ob_type,
2867 args);
2868 DECREF(args);
2869 return class;
2870 }
Guido van Rossum25831651993-05-19 14:50:45 +00002871 err_setstr(TypeError,
2872 "base is not a class object");
2873 return NULL;
2874 }
2875 }
2876 return newclassobject(bases, methods, name);
2877}
2878
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002879static int
2880exec_statement(prog, globals, locals)
2881 object *prog;
2882 object *globals;
2883 object *locals;
2884{
2885 char *s;
2886 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002887 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002889
2890 if (is_tupleobject(prog) && globals == None && locals == None &&
2891 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2892 /* Backward compatibility hack */
2893 globals = gettupleitem(prog, 1);
2894 if (n == 3)
2895 locals = gettupleitem(prog, 2);
2896 prog = gettupleitem(prog, 0);
2897 }
2898 if (globals == None) {
2899 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002900 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002901 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002902 plain = 1;
2903 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002904 }
2905 else if (locals == None)
2906 locals = globals;
2907 if (!is_stringobject(prog) &&
2908 !is_codeobject(prog) &&
2909 !is_fileobject(prog)) {
2910 err_setstr(TypeError,
2911 "exec 1st arg must be string, code or file object");
2912 return -1;
2913 }
2914 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2915 err_setstr(TypeError,
2916 "exec 2nd/3rd args must be dict or None");
2917 return -1;
2918 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002919 if (dictlookup(globals, "__builtins__") == NULL)
2920 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002921 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002922 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002923 return -1;
2924 return 0;
2925 }
2926 if (is_fileobject(prog)) {
2927 FILE *fp = getfilefile(prog);
2928 char *name = getstringvalue(getfilename(prog));
2929 if (run_file(fp, name, file_input, globals, locals) == NULL)
2930 return -1;
2931 return 0;
2932 }
2933 s = getstringvalue(prog);
2934 if (strlen(s) != getstringsize(prog)) {
2935 err_setstr(ValueError, "embedded '\\0' in exec string");
2936 return -1;
2937 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002938 v = run_string(s, file_input, globals, locals);
2939 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002940 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002941 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002942 if (plain)
2943 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002944 return 0;
2945}
Guido van Rossum24c13741995-02-14 09:42:43 +00002946
Guido van Rossum1aa14831997-01-21 05:34:20 +00002947/* Hack for ni.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002948static object *
2949find_from_args(f, nexti)
2950 frameobject *f;
2951 int nexti;
2952{
2953 int opcode;
2954 int oparg;
2955 object *list, *name;
2956 unsigned char *next_instr;
2957
2958 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2959 opcode = (*next_instr++);
2960 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002961 INCREF(None);
2962 return None;
2963 }
2964
2965 list = newlistobject(0);
2966 if (list == NULL)
2967 return NULL;
2968
2969 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002970 oparg = (next_instr[1]<<8) + next_instr[0];
2971 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002972 name = Getnamev(f, oparg);
2973 if (addlistitem(list, name) < 0) {
2974 DECREF(list);
2975 break;
2976 }
2977 opcode = (*next_instr++);
2978 } while (opcode == IMPORT_FROM);
2979
2980 return list;
2981}
Guido van Rossum950361c1997-01-24 13:49:28 +00002982
2983
2984#ifdef DYNAMIC_EXECUTION_PROFILE
2985
2986PyObject *
2987getarray(a)
2988 long a[256];
2989{
2990 int i;
2991 PyObject *l = PyList_New(256);
2992 if (l == NULL) return NULL;
2993 for (i = 0; i < 256; i++) {
2994 PyObject *x = PyInt_FromLong(a[i]);
2995 if (x == NULL) {
2996 Py_DECREF(l);
2997 return NULL;
2998 }
2999 PyList_SetItem(l, i, x);
3000 }
3001 for (i = 0; i < 256; i++)
3002 a[i] = 0;
3003 return l;
3004}
3005
3006PyObject *
3007_Py_GetDXProfile(self, args)
3008 PyObject *self, *args;
3009{
3010#ifndef DXPAIRS
3011 return getarray(dxp);
3012#else
3013 int i;
3014 PyObject *l = PyList_New(257);
3015 if (l == NULL) return NULL;
3016 for (i = 0; i < 257; i++) {
3017 PyObject *x = getarray(dxpairs[i]);
3018 if (x == NULL) {
3019 Py_DECREF(l);
3020 return NULL;
3021 }
3022 PyList_SetItem(l, i, x);
3023 }
3024 return l;
3025#endif
3026}
3027
3028#endif