blob: 23fefe42338d776adfe82e63b79eb26ef5efbce3 [file] [log] [blame]
Guido van Rossumc43b6851997-03-10 22:58:23 +00001
Guido van Rossumf70e43a1991-02-19 12:39:46 +00002/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00003Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
4The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00005
6 All Rights Reserved
7
Guido van Rossumd266eb41996-10-25 14:44:06 +00008Permission to use, copy, modify, and distribute this software and its
9documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +000010provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000011both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000012supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000013Centrum or CWI or Corporation for National Research Initiatives or
14CNRI not be used in advertising or publicity pertaining to
15distribution of the software without specific, written prior
16permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000017
Guido van Rossumd266eb41996-10-25 14:44:06 +000018While CWI is the initial source for this software, a modified version
19is made available by the Corporation for National Research Initiatives
20(CNRI) at the Internet address ftp://ftp.python.org.
21
22STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
23REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
24MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
25CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
26DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
27PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
28TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
29PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000030
31******************************************************************/
32
Guido van Rossum3f5da241990-12-20 15:06:42 +000033/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000034
Guido van Rossum681d79a1995-07-18 14:51:37 +000035/* XXX TO DO:
36 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000038 XXX document it!
39 */
40
Guido van Rossum3f5da241990-12-20 15:06:42 +000041#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042
Guido van Rossum10dc2e81990-11-18 17:27:39 +000043#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000044#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000045#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000046#include "opcode.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000047#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000048
Guido van Rossumc6004111993-11-05 10:22:19 +000049#include <ctype.h>
50
Guido van Rossum04691fc1992-08-12 15:35:34 +000051/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000053
Guido van Rossum408027e1996-12-30 16:17:54 +000054#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000055/* For debugging the interpreter: */
56#define LLTRACE 1 /* Low-level trace feature */
57#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000058#endif
59
Guido van Rossum5b722181993-03-30 17:46:03 +000060
Guido van Rossum374a9221991-04-04 10:40:29 +000061/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000062
Guido van Rossum681d79a1995-07-18 14:51:37 +000063static object *eval_code2 PROTO((codeobject *,
64 object *, object *,
65 object **, int,
66 object **, int,
67 object **, int,
68 object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000069#ifdef LLTRACE
70static int prtrace PROTO((object *, char *));
71#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000072static void call_exc_trace PROTO((object **, object**, frameobject *));
73static int call_trace
74 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075static object *add PROTO((object *, object *));
76static object *sub PROTO((object *, object *));
Guido van Rossum3b4da591996-06-19 21:49:17 +000077static object *powerop PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000078static object *mul PROTO((object *, object *));
79static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000080static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000081static object *neg PROTO((object *));
82static object *pos PROTO((object *));
83static object *not PROTO((object *));
84static object *invert PROTO((object *));
85static object *lshift PROTO((object *, object *));
86static object *rshift PROTO((object *, object *));
87static object *and PROTO((object *, object *));
88static object *xor PROTO((object *, object *));
89static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000090static object *call_builtin PROTO((object *, object *, object *));
91static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000092static object *apply_subscript PROTO((object *, object *));
93static object *loop_subscript PROTO((object *, object *));
94static int slice_index PROTO((object *, int, int *));
95static object *apply_slice PROTO((object *, object *, object *));
96static int assign_subscript PROTO((object *, object *, object *));
97static int assign_slice PROTO((object *, object *, object *, object *));
98static int cmp_exception PROTO((object *, object *));
99static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +0000100static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000101static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000102static object *build_class PROTO((object *, object *, object *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000103static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000104static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000105
106
Guido van Rossum950361c1997-01-24 13:49:28 +0000107/* Dynamic execution profile */
108#ifdef DYNAMIC_EXECUTION_PROFILE
109#ifdef DXPAIRS
110static long dxpairs[257][256];
111#define dxp dxpairs[256]
112#else
113static long dxp[256];
114#endif
115#endif
116
117
Guido van Rossum0a066c01992-03-27 17:29:15 +0000118/* Pointer to current frame, used to link new frames to */
119
Guido van Rossum374a9221991-04-04 10:40:29 +0000120static frameobject *current_frame;
121
Guido van Rossume59214e1994-08-30 08:01:59 +0000122#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000123
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124#include <errno.h>
125#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000126
Guido van Rossuma9672091994-09-14 13:31:22 +0000127static type_lock interpreter_lock = 0;
128static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129
130void
131init_save_thread()
132{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000134 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135 interpreter_lock = allocate_lock();
136 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000137 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000139
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000140#endif
141
Guido van Rossumff4949e1992-08-05 19:58:53 +0000142/* Functions save_thread and restore_thread are always defined so
143 dynamically loaded modules needn't be compiled separately for use
144 with and without threads: */
145
Guido van Rossum04691fc1992-08-12 15:35:34 +0000146object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000147save_thread()
148{
Guido van Rossume59214e1994-08-30 08:01:59 +0000149#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000150 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000151 object *res;
152 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153 current_frame = NULL;
154 release_lock(interpreter_lock);
155 return res;
156 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000157#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000158 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000159}
160
161void
162restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000163 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164{
Guido van Rossume59214e1994-08-30 08:01:59 +0000165#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166 if (interpreter_lock) {
167 int err;
168 err = errno;
169 acquire_lock(interpreter_lock, 1);
170 errno = err;
171 current_frame = (frameobject *)x;
172 }
173#endif
174}
175
176
Guido van Rossuma9672091994-09-14 13:31:22 +0000177/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
178 signal handlers or Mac I/O completion routines) can schedule calls
179 to a function to be called synchronously.
180 The synchronous function is called with one void* argument.
181 It should return 0 for success or -1 for failure -- failure should
182 be accompanied by an exception.
183
184 If registry succeeds, the registry function returns 0; if it fails
185 (e.g. due to too many pending calls) it returns -1 (without setting
186 an exception condition).
187
188 Note that because registry may occur from within signal handlers,
189 or other asynchronous events, calling malloc() is unsafe!
190
191#ifdef WITH_THREAD
192 Any thread can schedule pending calls, but only the main thread
193 will execute them.
194#endif
195
196 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
197 There are two possible race conditions:
198 (1) nested asynchronous registry calls;
199 (2) registry calls made while pending calls are being processed.
200 While (1) is very unlikely, (2) is a real possibility.
201 The current code is safe against (2), but not against (1).
202 The safety against (2) is derived from the fact that only one
203 thread (the main thread) ever takes things out of the queue.
204*/
205
Guido van Rossum8861b741996-07-30 16:49:37 +0000206static int ticker = 0; /* main loop counter to do periodic things */
207
Guido van Rossuma9672091994-09-14 13:31:22 +0000208#define NPENDINGCALLS 32
209static struct {
210 int (*func) PROTO((ANY *));
211 ANY *arg;
212} pendingcalls[NPENDINGCALLS];
213static volatile int pendingfirst = 0;
214static volatile int pendinglast = 0;
215
216int
217Py_AddPendingCall(func, arg)
218 int (*func) PROTO((ANY *));
219 ANY *arg;
220{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000221 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000222 int i, j;
223 /* XXX Begin critical section */
224 /* XXX If you want this to be safe against nested
225 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000226 if (busy)
227 return -1;
228 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000229 i = pendinglast;
230 j = (i + 1) % NPENDINGCALLS;
231 if (j == pendingfirst)
232 return -1; /* Queue full */
233 pendingcalls[i].func = func;
234 pendingcalls[i].arg = arg;
235 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000236 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000237 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000238 /* XXX End critical section */
239 return 0;
240}
241
Guido van Rossum180d7b41994-09-29 09:45:57 +0000242int
243Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000244{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246#ifdef WITH_THREAD
Guido van Rossum1aa14831997-01-21 05:34:20 +0000247 if (main_thread && get_thread_ident() != main_thread) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000248 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000250 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000251#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000252 if (busy) {
253 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000254 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000255 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000257 for (;;) {
258 int i;
259 int (*func) PROTO((ANY *));
260 ANY *arg;
261 i = pendingfirst;
262 if (i == pendinglast)
263 break; /* Queue empty */
264 func = pendingcalls[i].func;
265 arg = pendingcalls[i].arg;
266 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267 if (func(arg) < 0) {
268 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000269 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000270 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000272 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000273 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000274 return 0;
275}
276
277
Guido van Rossum374a9221991-04-04 10:40:29 +0000278/* Status code for main loop (reason for stack unwind) */
279
280enum why_code {
281 WHY_NOT, /* No error */
282 WHY_EXCEPTION, /* Exception occurred */
283 WHY_RERAISE, /* Exception re-raised by 'finally' */
284 WHY_RETURN, /* 'return' statement */
285 WHY_BREAK /* 'break' statement */
286};
287
Guido van Rossum1aa14831997-01-21 05:34:20 +0000288static enum why_code do_raise PROTO((object *, object *, object *));
289
Guido van Rossum374a9221991-04-04 10:40:29 +0000290
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000292
293object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000294eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000295 codeobject *co;
296 object *globals;
297 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000298{
299 return eval_code2(co,
300 globals, locals,
301 (object **)NULL, 0,
302 (object **)NULL, 0,
303 (object **)NULL, 0,
304 (object *)NULL);
305}
306
307
308/* Interpreter main loop */
309
Guido van Rossum8861b741996-07-30 16:49:37 +0000310#ifndef MAX_RECURSION_DEPTH
311#define MAX_RECURSION_DEPTH 10000
312#endif
313
314static int recursion_depth = 0;
315
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316static object *
317eval_code2(co, globals, locals,
318 args, argcount, kws, kwcount, defs, defcount, owner)
319 codeobject *co;
320 object *globals;
321 object *locals;
322 object **args;
323 int argcount;
324 object **kws; /* length: 2*kwcount */
325 int kwcount;
326 object **defs;
327 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000328 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000329{
Guido van Rossum950361c1997-01-24 13:49:28 +0000330#ifdef DXPAIRS
331 int lastopcode = 0;
332#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000333 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000334 register int opcode = 0; /* Current opcode */
335 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000336 register object **stack_pointer;
337 register enum why_code why; /* Reason for block stack unwind */
338 register int err; /* Error status -- nonzero if error */
339 register object *x; /* Result object -- NULL if error */
340 register object *v; /* Temporary objects popped off stack */
341 register object *w;
342 register object *u;
343 register object *t;
344 register frameobject *f; /* Current frame */
Guido van Rossum150b2df1996-12-05 23:17:11 +0000345 register object **fastlocals = NULL;
346 object *retval = NULL; /* Return value */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000347#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000348 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000349#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000350#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000351 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000352 char *filename = getstringvalue(co->co_filename);
353#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000354
355/* Code access macros */
356
357#define GETCONST(i) Getconst(f, i)
358#define GETNAME(i) Getname(f, i)
359#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000360#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000361#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
362#define NEXTOP() (*next_instr++)
363#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
364#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
365#define JUMPBY(x) (next_instr += (x))
366
367/* Stack manipulation macros */
368
369#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
370#define EMPTY() (STACK_LEVEL() == 0)
371#define TOP() (stack_pointer[-1])
372#define BASIC_PUSH(v) (*stack_pointer++ = (v))
373#define BASIC_POP() (*--stack_pointer)
374
Guido van Rossum96a42c81992-01-12 02:29:51 +0000375#ifdef LLTRACE
376#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
377#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000378#else
379#define PUSH(v) BASIC_PUSH(v)
380#define POP() BASIC_POP()
381#endif
382
Guido van Rossum681d79a1995-07-18 14:51:37 +0000383/* Local variable macros */
384
385#define GETLOCAL(i) (fastlocals[i])
386#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
387 GETLOCAL(i) = value; } while (0)
388
Guido van Rossum8861b741996-07-30 16:49:37 +0000389#ifdef USE_STACKCHECK
390 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
391 err_setstr(MemoryError, "Stack overflow");
392 return NULL;
393 }
394#endif
395
Guido van Rossum681d79a1995-07-18 14:51:37 +0000396 if (globals == NULL) {
397 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000398 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000399 }
400
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000401#ifdef LLTRACE
402 lltrace = dictlookup(globals, "__lltrace__") != NULL;
403#endif
404
Guido van Rossum374a9221991-04-04 10:40:29 +0000405 f = newframeobject(
406 current_frame, /*back*/
407 co, /*code*/
408 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000409 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000410 if (f == NULL)
411 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412
Guido van Rossum374a9221991-04-04 10:40:29 +0000413 current_frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000414 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000415
416 if (co->co_argcount > 0 ||
417 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
418 int i;
419 int n = argcount;
420 object *kwdict = NULL;
421 if (co->co_flags & CO_VARKEYWORDS) {
422 kwdict = newmappingobject();
423 if (kwdict == NULL)
424 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000425 i = co->co_argcount;
426 if (co->co_flags & CO_VARARGS)
427 i++;
428 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 }
430 if (argcount > co->co_argcount) {
431 if (!(co->co_flags & CO_VARARGS)) {
432 err_setstr(TypeError, "too many arguments");
433 goto fail;
434 }
435 n = co->co_argcount;
436 }
437 for (i = 0; i < n; i++) {
438 x = args[i];
439 INCREF(x);
440 SETLOCAL(i, x);
441 }
442 if (co->co_flags & CO_VARARGS) {
443 u = newtupleobject(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000444 if (u == NULL)
445 goto fail;
446 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 for (i = n; i < argcount; i++) {
448 x = args[i];
449 INCREF(x);
450 SETTUPLEITEM(u, i-n, x);
451 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452 }
453 for (i = 0; i < kwcount; i++) {
454 object *keyword = kws[2*i];
455 object *value = kws[2*i + 1];
456 int j;
457 /* XXX slow -- speed up using dictionary? */
458 for (j = 0; j < co->co_argcount; j++) {
459 object *nm = GETTUPLEITEM(co->co_varnames, j);
460 if (cmpobject(keyword, nm) == 0)
461 break;
462 }
463 if (j >= co->co_argcount) {
464 if (kwdict == NULL) {
Guido van Rossumc43b6851997-03-10 22:58:23 +0000465 PyErr_Format(TypeError,
466 "unexpected keyword argument: %.400s",
467 getstringvalue(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 goto fail;
469 }
470 mappinginsert(kwdict, keyword, value);
471 }
472 else {
473 if (GETLOCAL(j) != NULL) {
474 err_setstr(TypeError,
475 "keyword parameter redefined");
476 goto fail;
477 }
478 INCREF(value);
479 SETLOCAL(j, value);
480 }
481 }
482 if (argcount < co->co_argcount) {
483 int m = co->co_argcount - defcount;
484 for (i = argcount; i < m; i++) {
485 if (GETLOCAL(i) == NULL) {
486 err_setstr(TypeError,
487 "not enough arguments");
488 goto fail;
489 }
490 }
491 if (n > m)
492 i = n - m;
493 else
494 i = 0;
495 for (; i < defcount; i++) {
496 if (GETLOCAL(m+i) == NULL) {
497 object *def = defs[i];
498 INCREF(def);
499 SETLOCAL(m+i, def);
500 }
501 }
502 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 }
504 else {
505 if (argcount > 0 || kwcount > 0) {
506 err_setstr(TypeError, "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000507 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 }
509 }
510
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000511 if (sys_trace != NULL) {
512 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000513 be called on *every* entry to a code block.
514 Its return value, if not None, is a function that
515 will be called at the start of each executed line
516 of code. (Actually, the function must return
517 itself in order to continue tracing.)
518 The trace functions are called with three arguments:
519 a pointer to the current frame, a string indicating
520 why the function is called, and an argument which
521 depends on the situation. The global trace function
522 (sys.trace) is also called whenever an exception
523 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 if (call_trace(&sys_trace, &f->f_trace, f, "call",
525 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000526 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000527 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000528 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000529 }
530
531 if (sys_profile != NULL) {
532 /* Similar for sys_profile, except it needn't return
533 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 if (call_trace(&sys_profile, (object**)0, f, "call",
535 None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000536 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000537 }
538 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000539
Guido van Rossum8861b741996-07-30 16:49:37 +0000540 if (++recursion_depth > MAX_RECURSION_DEPTH) {
541 --recursion_depth;
542 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
543 current_frame = f->f_back;
544 DECREF(f);
545 return NULL;
546 }
547
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000548 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000549 stack_pointer = f->f_valuestack;
550
Guido van Rossum374a9221991-04-04 10:40:29 +0000551 why = WHY_NOT;
552 err = 0;
553 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000554
555 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000556 /* Do periodic things.
557 Doing this every time through the loop would add
558 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000559 So we do it only every Nth instruction.
560
561 The ticker is reset to zero if there are pending
Guido van Rossum70d44781997-01-21 06:15:24 +0000562 calls (see Py_AddPendingCall() and
Guido van Rossum8861b741996-07-30 16:49:37 +0000563 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000564
Guido van Rossum374a9221991-04-04 10:40:29 +0000565 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000566 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000567 if (pendingfirst != pendinglast) {
568 if (Py_MakePendingCalls() < 0) {
569 why = WHY_EXCEPTION;
570 goto on_error;
571 }
572 }
Guido van Rossum8c5df061997-01-24 04:19:24 +0000573#ifdef macintosh
574#undef HAVE_SIGNAL_H
575#endif
Guido van Rossum70d44781997-01-21 06:15:24 +0000576#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
577/* If we have true signals, the signal handler will call
578 Py_AddPendingCall() so we don't have to call sigcheck().
579 On the Mac and DOS, alas, we have to call it. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000580 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000581 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000582 goto on_error;
583 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000584#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585
Guido van Rossume59214e1994-08-30 08:01:59 +0000586#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 if (interpreter_lock) {
588 /* Give another thread a chance */
589
590 current_frame = NULL;
591 release_lock(interpreter_lock);
592
593 /* Other threads may run now */
594
595 acquire_lock(interpreter_lock, 1);
596 current_frame = f;
597 }
598#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000599 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000600
Guido van Rossum374a9221991-04-04 10:40:29 +0000601 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000602
Guido van Rossum408027e1996-12-30 16:17:54 +0000603#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000604 f->f_lasti = INSTR_OFFSET();
605#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000606
607 opcode = NEXTOP();
608 if (HAS_ARG(opcode))
609 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000610#ifdef DYNAMIC_EXECUTION_PROFILE
611#ifdef DXPAIRS
612 dxpairs[lastopcode][opcode]++;
613 lastopcode = opcode;
614#endif
615 dxp[opcode]++;
616#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000617
Guido van Rossum96a42c81992-01-12 02:29:51 +0000618#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 /* Instruction tracing */
620
Guido van Rossum96a42c81992-01-12 02:29:51 +0000621 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000622 if (HAS_ARG(opcode)) {
623 printf("%d: %d, %d\n",
624 (int) (INSTR_OFFSET() - 3),
625 opcode, oparg);
626 }
627 else {
628 printf("%d: %d\n",
629 (int) (INSTR_OFFSET() - 1), opcode);
630 }
631 }
632#endif
633
634 /* Main switch on opcode */
635
636 switch (opcode) {
637
638 /* BEWARE!
639 It is essential that any operation that fails sets either
640 x to NULL, err to nonzero, or why to anything but WHY_NOT,
641 and that no operation that succeeds does this! */
642
643 /* case STOP_CODE: this is an error! */
644
645 case POP_TOP:
646 v = POP();
647 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000648 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000649
650 case ROT_TWO:
651 v = POP();
652 w = POP();
653 PUSH(v);
654 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000655 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000656
657 case ROT_THREE:
658 v = POP();
659 w = POP();
660 x = POP();
661 PUSH(v);
662 PUSH(x);
663 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000664 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000665
666 case DUP_TOP:
667 v = TOP();
668 INCREF(v);
669 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000670 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000671
672 case UNARY_POSITIVE:
673 v = POP();
674 x = pos(v);
675 DECREF(v);
676 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000677 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 break;
679
680 case UNARY_NEGATIVE:
681 v = POP();
682 x = neg(v);
683 DECREF(v);
684 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000685 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000686 break;
687
688 case UNARY_NOT:
689 v = POP();
690 x = not(v);
691 DECREF(v);
692 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000693 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000694 break;
695
696 case UNARY_CONVERT:
697 v = POP();
698 x = reprobject(v);
699 DECREF(v);
700 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000701 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000703
704 case UNARY_INVERT:
705 v = POP();
706 x = invert(v);
707 DECREF(v);
708 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000709 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000710 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000711
Guido van Rossum50564e81996-01-12 01:13:16 +0000712 case BINARY_POWER:
713 w = POP();
714 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000715 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000716 DECREF(v);
717 DECREF(w);
718 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000719 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000720 break;
721
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 case BINARY_MULTIPLY:
723 w = POP();
724 v = POP();
725 x = mul(v, w);
726 DECREF(v);
727 DECREF(w);
728 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 break;
731
732 case BINARY_DIVIDE:
733 w = POP();
734 v = POP();
735 x = divide(v, w);
736 DECREF(v);
737 DECREF(w);
738 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000739 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000740 break;
741
742 case BINARY_MODULO:
743 w = POP();
744 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000745 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 DECREF(v);
747 DECREF(w);
748 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000749 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 break;
751
752 case BINARY_ADD:
753 w = POP();
754 v = POP();
755 x = add(v, w);
756 DECREF(v);
757 DECREF(w);
758 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000759 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 break;
761
762 case BINARY_SUBTRACT:
763 w = POP();
764 v = POP();
765 x = sub(v, w);
766 DECREF(v);
767 DECREF(w);
768 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000769 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 break;
771
772 case BINARY_SUBSCR:
773 w = POP();
774 v = POP();
775 x = apply_subscript(v, w);
776 DECREF(v);
777 DECREF(w);
778 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000779 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000780 break;
781
Guido van Rossum7928cd71991-10-24 14:59:31 +0000782 case BINARY_LSHIFT:
783 w = POP();
784 v = POP();
785 x = lshift(v, w);
786 DECREF(v);
787 DECREF(w);
788 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000789 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000790 break;
791
792 case BINARY_RSHIFT:
793 w = POP();
794 v = POP();
795 x = rshift(v, w);
796 DECREF(v);
797 DECREF(w);
798 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000799 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000800 break;
801
802 case BINARY_AND:
803 w = POP();
804 v = POP();
805 x = and(v, w);
806 DECREF(v);
807 DECREF(w);
808 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000809 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000810 break;
811
812 case BINARY_XOR:
813 w = POP();
814 v = POP();
815 x = xor(v, w);
816 DECREF(v);
817 DECREF(w);
818 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000819 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000820 break;
821
822 case BINARY_OR:
823 w = POP();
824 v = POP();
825 x = or(v, w);
826 DECREF(v);
827 DECREF(w);
828 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000829 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000830 break;
831
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 case SLICE+0:
833 case SLICE+1:
834 case SLICE+2:
835 case SLICE+3:
836 if ((opcode-SLICE) & 2)
837 w = POP();
838 else
839 w = NULL;
840 if ((opcode-SLICE) & 1)
841 v = POP();
842 else
843 v = NULL;
844 u = POP();
845 x = apply_slice(u, v, w);
846 DECREF(u);
847 XDECREF(v);
848 XDECREF(w);
849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 break;
852
853 case STORE_SLICE+0:
854 case STORE_SLICE+1:
855 case STORE_SLICE+2:
856 case STORE_SLICE+3:
857 if ((opcode-STORE_SLICE) & 2)
858 w = POP();
859 else
860 w = NULL;
861 if ((opcode-STORE_SLICE) & 1)
862 v = POP();
863 else
864 v = NULL;
865 u = POP();
866 t = POP();
867 err = assign_slice(u, v, w, t); /* u[v:w] = t */
868 DECREF(t);
869 DECREF(u);
870 XDECREF(v);
871 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000872 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 break;
874
875 case DELETE_SLICE+0:
876 case DELETE_SLICE+1:
877 case DELETE_SLICE+2:
878 case DELETE_SLICE+3:
879 if ((opcode-DELETE_SLICE) & 2)
880 w = POP();
881 else
882 w = NULL;
883 if ((opcode-DELETE_SLICE) & 1)
884 v = POP();
885 else
886 v = NULL;
887 u = POP();
888 err = assign_slice(u, v, w, (object *)NULL);
889 /* del u[v:w] */
890 DECREF(u);
891 XDECREF(v);
892 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 break;
895
896 case STORE_SUBSCR:
897 w = POP();
898 v = POP();
899 u = POP();
900 /* v[w] = u */
901 err = assign_subscript(v, w, u);
902 DECREF(u);
903 DECREF(v);
904 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000905 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 break;
907
908 case DELETE_SUBSCR:
909 w = POP();
910 v = POP();
911 /* del v[w] */
912 err = assign_subscript(v, w, (object *)NULL);
913 DECREF(v);
914 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000915 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 break;
917
918 case PRINT_EXPR:
919 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000921 /* Before printing, also assign to '_' */
922 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000923 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000924 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000926 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000927 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000928 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 flushline();
930 }
931 DECREF(v);
932 break;
933
934 case PRINT_ITEM:
935 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000936 w = sysget("stdout");
937 if (softspace(w, 1))
938 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000939 err = writeobject(v, w, PRINT_RAW);
940 if (err == 0 && is_stringobject(v)) {
941 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 char *s = getstringvalue(v);
943 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000944 if (len > 0 &&
945 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000946 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000947 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000950 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 break;
952
953 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000954 x = sysget("stdout");
955 if (x == NULL)
956 err_setstr(RuntimeError, "lost sys.stdout");
957 else {
958 writestring("\n", x);
959 softspace(x, 0);
960 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 break;
962
963 case BREAK_LOOP:
964 why = WHY_BREAK;
965 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000966
Guido van Rossumf10570b1995-07-07 22:53:21 +0000967 case RAISE_VARARGS:
968 u = v = w = NULL;
969 switch (oparg) {
970 case 3:
971 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000972 /* Fallthrough */
973 case 2:
974 v = POP(); /* value */
975 /* Fallthrough */
976 case 1:
977 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000978 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000979 break;
980 default:
981 err_setstr(SystemError,
982 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000983 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000984 break;
985 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 break;
987
988 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000989 if ((x = f->f_locals) == NULL) {
990 err_setstr(SystemError, "no locals");
991 break;
992 }
993 INCREF(x);
994 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 break;
996
997 case RETURN_VALUE:
998 retval = POP();
999 why = WHY_RETURN;
1000 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001001
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001002 case EXEC_STMT:
1003 w = POP();
1004 v = POP();
1005 u = POP();
1006 err = exec_statement(u, v, w);
1007 DECREF(u);
1008 DECREF(v);
1009 DECREF(w);
1010 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001011
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 case POP_BLOCK:
1013 {
1014 block *b = pop_block(f);
1015 while (STACK_LEVEL() > b->b_level) {
1016 v = POP();
1017 DECREF(v);
1018 }
1019 }
1020 break;
1021
1022 case END_FINALLY:
1023 v = POP();
1024 if (is_intobject(v)) {
1025 why = (enum why_code) getintvalue(v);
1026 if (why == WHY_RETURN)
1027 retval = POP();
1028 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001029 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001031 u = POP();
1032 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001034 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001035 }
1036 else if (v != None) {
1037 err_setstr(SystemError,
1038 "'finally' pops bad exception");
1039 why = WHY_EXCEPTION;
1040 }
1041 DECREF(v);
1042 break;
1043
1044 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001045 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001047 w = POP();
1048 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001050 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 DECREF(v);
1052 DECREF(w);
1053 break;
1054
1055 case STORE_NAME:
1056 w = GETNAMEV(oparg);
1057 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001058 if ((x = f->f_locals) == NULL) {
1059 err_setstr(SystemError, "no locals");
1060 break;
1061 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001062 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 DECREF(v);
1064 break;
1065
1066 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001067 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001068 if ((x = f->f_locals) == NULL) {
1069 err_setstr(SystemError, "no locals");
1070 break;
1071 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001072 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001073 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001074 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001075
1076#ifdef CASE_TOO_BIG
1077 default: switch (opcode) {
1078#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001079
1080 case UNPACK_TUPLE:
1081 v = POP();
1082 if (!is_tupleobject(v)) {
1083 err_setstr(TypeError, "unpack non-tuple");
1084 why = WHY_EXCEPTION;
1085 }
1086 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001087 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001088 "unpack tuple of wrong size");
1089 why = WHY_EXCEPTION;
1090 }
1091 else {
1092 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001093 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001094 INCREF(w);
1095 PUSH(w);
1096 }
1097 }
1098 DECREF(v);
1099 break;
1100
1101 case UNPACK_LIST:
1102 v = POP();
1103 if (!is_listobject(v)) {
1104 err_setstr(TypeError, "unpack non-list");
1105 why = WHY_EXCEPTION;
1106 }
1107 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001108 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 "unpack list of wrong size");
1110 why = WHY_EXCEPTION;
1111 }
1112 else {
1113 for (; --oparg >= 0; ) {
1114 w = getlistitem(v, oparg);
1115 INCREF(w);
1116 PUSH(w);
1117 }
1118 }
1119 DECREF(v);
1120 break;
1121
1122 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001123 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 v = POP();
1125 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001126 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001127 DECREF(v);
1128 DECREF(u);
1129 break;
1130
1131 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001132 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001134 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 DECREF(v);
1136 break;
1137
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001138 case STORE_GLOBAL:
1139 w = GETNAMEV(oparg);
1140 v = POP();
1141 err = dict2insert(f->f_globals, w, v);
1142 DECREF(v);
1143 break;
1144
1145 case DELETE_GLOBAL:
1146 w = GETNAMEV(oparg);
1147 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001148 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001149 break;
1150
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 case LOAD_CONST:
1152 x = GETCONST(oparg);
1153 INCREF(x);
1154 PUSH(x);
1155 break;
1156
1157 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001158 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001159 if ((x = f->f_locals) == NULL) {
1160 err_setstr(SystemError, "no locals");
1161 break;
1162 }
1163 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001165 err_clear();
1166 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001168 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001169 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001171 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001172 break;
1173 }
1174 }
1175 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001176 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 PUSH(x);
1178 break;
1179
1180 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001181 w = GETNAMEV(oparg);
1182 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001184 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001185 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001187 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001188 break;
1189 }
1190 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001191 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 PUSH(x);
1193 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001194
Guido van Rossum9bfef441993-03-29 10:43:31 +00001195 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001196 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001197 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001198 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001199 gettupleitem(co->co_varnames,
1200 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001201 break;
1202 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001203 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001204 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001205 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001206 break;
1207
1208 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001209 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001210 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001211 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001212
1213 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001214 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001215 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001216
1217 case BUILD_TUPLE:
1218 x = newtupleobject(oparg);
1219 if (x != NULL) {
1220 for (; --oparg >= 0;) {
1221 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001222 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 }
1224 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001225 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 }
1227 break;
1228
1229 case BUILD_LIST:
1230 x = newlistobject(oparg);
1231 if (x != NULL) {
1232 for (; --oparg >= 0;) {
1233 w = POP();
1234 err = setlistitem(x, oparg, w);
1235 if (err != 0)
1236 break;
1237 }
1238 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001239 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 }
1241 break;
1242
1243 case BUILD_MAP:
1244 x = newdictobject();
1245 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001246 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 break;
1248
1249 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001250 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001252 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 DECREF(v);
1254 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001255 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001256 break;
1257
1258 case COMPARE_OP:
1259 w = POP();
1260 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001261 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 DECREF(v);
1263 DECREF(w);
1264 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001265 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
1267
1268 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001269 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001270 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271 if (x == NULL) {
1272 err_setstr(ImportError,
1273 "__import__ not found");
1274 break;
1275 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001276 if (is_methodobject(x)) {
1277 u = None;
1278 INCREF(u);
1279 }
1280 else {
1281 u = find_from_args(f, INSTR_OFFSET());
1282 if (u == NULL) {
1283 x = u;
1284 break;
1285 }
1286 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001287 w = mkvalue("(OOOO)",
1288 w,
1289 f->f_globals,
1290 f->f_locals == NULL ? None : f->f_locals,
1291 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001292 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293 if (w == NULL) {
1294 x = NULL;
1295 break;
1296 }
1297 x = call_object(x, w);
1298 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001299 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001300 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
1302
1303 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001304 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001306 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001307 if ((x = f->f_locals) == NULL) {
1308 err_setstr(SystemError, "no locals");
1309 break;
1310 }
1311 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001312 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001313 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001315
Guido van Rossum374a9221991-04-04 10:40:29 +00001316 case JUMP_FORWARD:
1317 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001318 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001319
1320 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001321 err = testbool(TOP());
1322 if (err > 0)
1323 err = 0;
1324 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001325 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001326 else
1327 break;
1328 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001329
1330 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001331 err = testbool(TOP());
1332 if (err > 0) {
1333 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001335 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001336 else if (err == 0)
1337 ;
1338 else
1339 break;
1340 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001341
1342 case JUMP_ABSOLUTE:
1343 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001344 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001345
1346 case FOR_LOOP:
1347 /* for v in s: ...
1348 On entry: stack contains s, i.
1349 On exit: stack contains s, i+1, s[i];
1350 but if loop exhausted:
1351 s, i are popped, and we jump */
1352 w = POP(); /* Loop index */
1353 v = POP(); /* Sequence object */
1354 u = loop_subscript(v, w);
1355 if (u != NULL) {
1356 PUSH(v);
1357 x = newintobject(getintvalue(w)+1);
1358 PUSH(x);
1359 DECREF(w);
1360 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001361 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 }
1363 else {
1364 DECREF(v);
1365 DECREF(w);
1366 /* A NULL can mean "s exhausted"
1367 but also an error: */
1368 if (err_occurred())
1369 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001370 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001372 continue;
1373 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 }
1375 break;
1376
1377 case SETUP_LOOP:
1378 case SETUP_EXCEPT:
1379 case SETUP_FINALLY:
1380 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1381 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001382 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001383
1384 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001385#ifdef LLTRACE
1386 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001388#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001389 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001390 if (f->f_trace == NULL)
1391 continue;
1392 /* Trace each line of code reached */
1393 f->f_lasti = INSTR_OFFSET();
1394 err = call_trace(&f->f_trace, &f->f_trace,
1395 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001397
1398 case CALL_FUNCTION:
1399 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001400 int na = oparg & 0xff;
1401 int nk = (oparg>>8) & 0xff;
1402 int n = na + 2*nk;
1403 object **pfunc = stack_pointer - n - 1;
1404 object *func = *pfunc;
1405 object *self = NULL;
1406 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001407 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001408 if (is_instancemethodobject(func)) {
1409 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001410 class = instancemethodgetclass(func);
1411 func = instancemethodgetfunc(func);
1412 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001413 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001414 INCREF(self);
1415 DECREF(*pfunc);
1416 *pfunc = self;
1417 na++;
1418 n++;
1419 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001420 else {
1421 /* Unbound methods must be
1422 called with an instance of
1423 the class (or a derived
1424 class) as first argument */
1425 if (na > 0 &&
1426 (self = stack_pointer[-n])
1427 != NULL &&
1428 is_instanceobject(self) &&
1429 issubclass(
1430 (object *)
1431 (((instanceobject *)self)
1432 ->in_class),
1433 class))
1434 /* Handy-dandy */ ;
1435 else {
1436 err_setstr(TypeError,
1437 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001438 x = NULL;
1439 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001440 }
1441 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 }
1443 else
1444 INCREF(func);
1445 if (is_funcobject(func)) {
1446 object *co = getfunccode(func);
1447 object *globals = getfuncglobals(func);
1448 object *argdefs = PyFunction_GetDefaults(func);
1449 object **d;
1450 int nd;
1451 if (argdefs != NULL) {
1452 d = &GETTUPLEITEM(argdefs, 0);
1453 nd = ((tupleobject *)argdefs)->ob_size;
1454 }
1455 else {
1456 d = NULL;
1457 nd = 0;
1458 }
1459 x = eval_code2(
1460 (codeobject *)co,
1461 globals, (object *)NULL,
1462 stack_pointer-n, na,
1463 stack_pointer-2*nk, nk,
1464 d, nd,
1465 class);
1466 }
1467 else {
1468 object *args = newtupleobject(na);
1469 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001470 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001471 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001472 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001473 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001474 if (nk > 0) {
1475 kwdict = newdictobject();
1476 if (kwdict == NULL) {
1477 x = NULL;
1478 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001479 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001480 err = 0;
1481 while (--nk >= 0) {
1482 object *value = POP();
1483 object *key = POP();
1484 err = mappinginsert(
1485 kwdict, key, value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001486 DECREF(key);
1487 DECREF(value);
1488 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001489 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001490 }
1491 if (err) {
1492 DECREF(args);
1493 DECREF(kwdict);
1494 break;
1495 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001496 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001497 while (--na >= 0) {
1498 w = POP();
1499 SETTUPLEITEM(args, na, w);
1500 }
1501 x = PyEval_CallObjectWithKeywords(
1502 func, args, kwdict);
1503 DECREF(args);
1504 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001505 }
1506 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001507 while (stack_pointer > pfunc) {
1508 w = POP();
1509 DECREF(w);
1510 }
1511 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001512 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001513 break;
1514 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001515
Guido van Rossum681d79a1995-07-18 14:51:37 +00001516 case MAKE_FUNCTION:
1517 v = POP(); /* code object */
1518 x = newfuncobject(v, f->f_globals);
1519 DECREF(v);
1520 /* XXX Maybe this should be a separate opcode? */
1521 if (x != NULL && oparg > 0) {
1522 v = newtupleobject(oparg);
1523 if (v == NULL) {
1524 DECREF(x);
1525 x = NULL;
1526 break;
1527 }
1528 while (--oparg >= 0) {
1529 w = POP();
1530 SETTUPLEITEM(v, oparg, w);
1531 }
1532 err = PyFunction_SetDefaults(x, v);
1533 DECREF(v);
1534 }
1535 PUSH(x);
1536 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001537
1538 case BUILD_SLICE:
1539 if (oparg == 3)
1540 w = POP();
1541 else
1542 w = NULL;
1543 v = POP();
1544 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001545 x = PySlice_New(u, v, w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001546 DECREF(u);
1547 DECREF(v);
1548 XDECREF(w);
1549 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001550 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001551 break;
1552
1553
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 default:
1555 fprintf(stderr,
1556 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001557 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001558 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001559 why = WHY_EXCEPTION;
1560 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001561
1562#ifdef CASE_TOO_BIG
1563 }
1564#endif
1565
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 } /* switch */
1567
1568 on_error:
1569
1570 /* Quickly continue if no error occurred */
1571
1572 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001573 if (err == 0 && x != NULL) {
1574#ifdef CHECKEXC
1575 if (err_occurred())
1576 fprintf(stderr,
1577 "XXX undetected error\n");
1578 else
1579#endif
1580 continue; /* Normal, fast path */
1581 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 why = WHY_EXCEPTION;
1583 x = None;
1584 err = 0;
1585 }
1586
Guido van Rossum801dcae1992-04-08 11:32:32 +00001587#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 /* Double-check exception status */
1589
1590 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1591 if (!err_occurred()) {
1592 fprintf(stderr, "XXX ghost error\n");
1593 err_setstr(SystemError, "ghost error");
1594 why = WHY_EXCEPTION;
1595 }
1596 }
1597 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001598 if (err_occurred()) {
1599 fprintf(stderr,
1600 "XXX undetected error (why=%d)\n",
1601 why);
1602 why = WHY_EXCEPTION;
1603 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 }
1605#endif
1606
1607 /* Log traceback info if this is a real exception */
1608
1609 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001610 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001611 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001612 f->f_lasti -= 2;
1613 tb_here(f);
1614
Guido van Rossume59214e1994-08-30 08:01:59 +00001615 if (f->f_trace)
1616 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001617 if (sys_profile)
1618 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 }
1620
1621 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1622
1623 if (why == WHY_RERAISE)
1624 why = WHY_EXCEPTION;
1625
1626 /* Unwind stacks if a (pseudo) exception occurred */
1627
1628 while (why != WHY_NOT && f->f_iblock > 0) {
1629 block *b = pop_block(f);
1630 while (STACK_LEVEL() > b->b_level) {
1631 v = POP();
1632 XDECREF(v);
1633 }
1634 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1635 why = WHY_NOT;
1636 JUMPTO(b->b_handler);
1637 break;
1638 }
1639 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001640 (b->b_type == SETUP_EXCEPT &&
1641 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643 object *exc, *val, *tb;
1644 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001645 if (val == NULL) {
1646 val = None;
1647 INCREF(val);
1648 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 /* Make the raw exception data
1650 available to the handler,
1651 so a program can emulate the
1652 Python main loop. Don't do
1653 this for 'finally'. */
1654 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001655 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 sysset("exc_value", val);
1657 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001659 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 PUSH(val);
1661 PUSH(exc);
1662 }
1663 else {
1664 if (why == WHY_RETURN)
1665 PUSH(retval);
1666 v = newintobject((long)why);
1667 PUSH(v);
1668 }
1669 why = WHY_NOT;
1670 JUMPTO(b->b_handler);
1671 break;
1672 }
1673 } /* unwind stack */
1674
1675 /* End the loop if we still have an error (or return) */
1676
1677 if (why != WHY_NOT)
1678 break;
1679
1680 } /* main loop */
1681
1682 /* Pop remaining stack entries */
1683
1684 while (!EMPTY()) {
1685 v = POP();
1686 XDECREF(v);
1687 }
1688
Guido van Rossum96a42c81992-01-12 02:29:51 +00001689 if (why != WHY_RETURN)
1690 retval = NULL;
1691
Guido van Rossume59214e1994-08-30 08:01:59 +00001692 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001693 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001694 if (call_trace(&f->f_trace, &f->f_trace, f,
1695 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 XDECREF(retval);
1697 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001698 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001699 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001700 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001701 }
1702
1703 if (sys_profile && why == WHY_RETURN) {
1704 if (call_trace(&sys_profile, (object**)0,
1705 f, "return", retval)) {
1706 XDECREF(retval);
1707 retval = NULL;
1708 why = WHY_EXCEPTION;
1709 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001710 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001711
Guido van Rossum8c5df061997-01-24 04:19:24 +00001712 --recursion_depth;
1713
1714 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001715
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001717
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 current_frame = f->f_back;
1719 DECREF(f);
1720
Guido van Rossum96a42c81992-01-12 02:29:51 +00001721 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001722}
1723
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001724/* Logic for the raise statement (too complicated for inlining).
1725 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001726static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001727do_raise(type, value, tb)
1728 object *type, *value, *tb;
1729{
1730 /* We support the following forms of raise:
1731 raise <class>, <classinstance>
1732 raise <class>, <argument tuple>
1733 raise <class>, None
1734 raise <class>, <argument>
1735 raise <classinstance>, None
1736 raise <string>, <object>
1737 raise <string>, None
1738
1739 An omitted second argument is the same as None.
1740
1741 In addition, raise <tuple>, <anything> is the same as
1742 raising the tuple's first item (and it better have one!);
1743 this rule is applied recursively.
1744
1745 Finally, an optional third argument can be supplied, which
1746 gives the traceback to be substituted (useful when
1747 re-raising an exception after examining it). */
1748
1749 /* First, check the traceback argument, replacing None with
1750 NULL. */
1751 if (tb == None) {
1752 DECREF(tb);
1753 tb = NULL;
1754 }
1755 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1756 err_setstr(TypeError,
1757 "raise 3rd arg must be traceback or None");
1758 goto raise_error;
1759 }
1760
1761 /* Next, replace a missing value with None */
1762 if (value == NULL) {
1763 value = None;
1764 INCREF(value);
1765 }
1766
1767 /* Next, repeatedly, replace a tuple exception with its first item */
1768 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1769 object *tmp = type;
1770 type = GETTUPLEITEM(type, 0);
1771 INCREF(type);
1772 DECREF(tmp);
1773 }
1774
1775 /* Now switch on the exception's type */
1776 if (is_stringobject(type)) {
1777 ;
1778 }
1779 else if (is_classobject(type)) {
1780 /* Raising a class. If the value is an instance, it
1781 better be an instance of the class. If it is not,
1782 it will be used to create an instance. */
1783 if (is_instanceobject(value)) {
1784 object *inclass = (object*)
1785 (((instanceobject*)value)->in_class);
1786 if (!issubclass(inclass, type)) {
1787 err_setstr(TypeError,
1788 "raise <class>, <instance> requires that <instance> is a member of <class>");
1789 goto raise_error;
1790 }
1791 }
1792 else {
1793 /* Go instantiate the class */
1794 object *args, *res;
1795 if (value == None)
1796 args = mkvalue("()");
1797 else if (is_tupleobject(value)) {
1798 INCREF(value);
1799 args = value;
1800 }
1801 else
1802 args = mkvalue("(O)", value);
1803 if (args == NULL)
1804 goto raise_error;
1805 res = call_object(type, args);
1806 DECREF(args);
1807 if (res == NULL)
1808 goto raise_error;
1809 DECREF(value);
1810 value = res;
1811 }
1812 }
1813 else if (is_instanceobject(type)) {
1814 /* Raising an instance. The value should be a dummy. */
1815 if (value != None) {
1816 err_setstr(TypeError,
1817 "instance exception may not have a separate value");
1818 goto raise_error;
1819 }
1820 else {
1821 /* Normalize to raise <class>, <instance> */
1822 DECREF(value);
1823 value = type;
1824 type = (object*) ((instanceobject*)type)->in_class;
1825 INCREF(type);
1826 }
1827 }
1828 else {
1829 /* Not something you can raise. You get an exception
1830 anyway, just not what you specified :-) */
1831 err_setstr(TypeError,
1832 "exceptions must be strings, classes, or instances");
1833 goto raise_error;
1834 }
1835 err_restore(type, value, tb);
1836 if (tb == NULL)
1837 return WHY_EXCEPTION;
1838 else
1839 return WHY_RERAISE;
1840 raise_error:
1841 XDECREF(value);
1842 XDECREF(type);
1843 XDECREF(tb);
1844 return WHY_EXCEPTION;
1845}
1846
Guido van Rossum96a42c81992-01-12 02:29:51 +00001847#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001848static int
1849prtrace(v, str)
1850 object *v;
1851 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001852{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001853 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001854 if (printobject(v, stdout, 0) != 0)
1855 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001856 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001857}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001858#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001859
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001860static void
1861call_exc_trace(p_trace, p_newtrace, f)
1862 object **p_trace, **p_newtrace;
1863 frameobject *f;
1864{
1865 object *type, *value, *traceback, *arg;
1866 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001867 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001868 if (value == NULL) {
1869 value = None;
1870 INCREF(value);
1871 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872 arg = mkvalue("(OOO)", type, value, traceback);
1873 if (arg == NULL) {
1874 err_restore(type, value, traceback);
1875 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001876 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001877 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1878 DECREF(arg);
1879 if (err == 0)
1880 err_restore(type, value, traceback);
1881 else {
1882 XDECREF(type);
1883 XDECREF(value);
1884 XDECREF(traceback);
1885 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001886}
1887
1888static int
1889call_trace(p_trace, p_newtrace, f, msg, arg)
1890 object **p_trace; /* in/out; may not be NULL;
1891 may not point to NULL variable initially */
1892 object **p_newtrace; /* in/out; may be NULL;
1893 may point to NULL variable;
1894 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001895 frameobject *f;
1896 char *msg;
1897 object *arg;
1898{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001899 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001900 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001901 static int tracing = 0;
1902
1903 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001904 /* Don't do recursive traces */
1905 if (p_newtrace) {
1906 XDECREF(*p_newtrace);
1907 *p_newtrace = NULL;
1908 }
1909 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910 }
1911
Guido van Rossumf10570b1995-07-07 22:53:21 +00001912 args = newtupleobject(3);
1913 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001914 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001915 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001916 if (what == NULL)
1917 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001918 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001919 SETTUPLEITEM(args, 0, (object *)f);
1920 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001921 if (arg == NULL)
1922 arg = None;
1923 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001924 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001925 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001926 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001927 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001928 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001929 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001930 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001931 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001932 if (res == NULL) {
1933 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001934 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001935 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001936 *p_trace = NULL;
1937 if (p_newtrace) {
1938 XDECREF(*p_newtrace);
1939 *p_newtrace = NULL;
1940 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001941 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001942 }
1943 else {
1944 if (p_newtrace) {
1945 XDECREF(*p_newtrace);
1946 if (res == None)
1947 *p_newtrace = NULL;
1948 else {
1949 INCREF(res);
1950 *p_newtrace = res;
1951 }
1952 }
1953 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001954 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001955 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001956}
1957
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001959getbuiltins()
1960{
1961 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001962 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001963 else
1964 return current_frame->f_builtins;
1965}
1966
1967object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001968getlocals()
1969{
1970 if (current_frame == NULL)
1971 return NULL;
1972 fast_2_locals(current_frame);
1973 return current_frame->f_locals;
1974}
1975
1976object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977getglobals()
1978{
1979 if (current_frame == NULL)
1980 return NULL;
1981 else
1982 return current_frame->f_globals;
1983}
1984
Guido van Rossum81daa321993-05-20 14:24:46 +00001985object *
Guido van Rossume59214e1994-08-30 08:01:59 +00001986getframe()
1987{
1988 return (object *)current_frame;
1989}
1990
Guido van Rossum6135a871995-01-09 17:53:26 +00001991int
1992getrestricted()
1993{
1994 return current_frame == NULL ? 0 : current_frame->f_restricted;
1995}
1996
Guido van Rossum3f5da241990-12-20 15:06:42 +00001997void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001998flushline()
1999{
Guido van Rossum3165fe61992-09-25 21:59:05 +00002000 object *f = sysget("stdout");
2001 if (softspace(f, 0))
2002 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003}
2004
Guido van Rossum3f5da241990-12-20 15:06:42 +00002005
Guido van Rossum06186511995-01-07 12:40:10 +00002006#define BINOP(opname, ropname, thisfunc) \
2007 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2008 ; \
2009 else \
2010 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002011
2012
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002014or(v, w)
2015 object *v, *w;
2016{
Guido van Rossum06186511995-01-07 12:40:10 +00002017 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002018 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002019 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002020 object * (*f) FPROTO((object *, object *));
2021 if (coerce(&v, &w) != 0)
2022 return NULL;
2023 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2024 x = (*f)(v, w);
2025 DECREF(v);
2026 DECREF(w);
2027 if (f != NULL)
2028 return x;
2029 }
2030 err_setstr(TypeError, "bad operand type(s) for |");
2031 return NULL;
2032}
2033
2034static object *
2035xor(v, w)
2036 object *v, *w;
2037{
Guido van Rossum06186511995-01-07 12:40:10 +00002038 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002039 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002040 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002041 object * (*f) FPROTO((object *, object *));
2042 if (coerce(&v, &w) != 0)
2043 return NULL;
2044 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2045 x = (*f)(v, w);
2046 DECREF(v);
2047 DECREF(w);
2048 if (f != NULL)
2049 return x;
2050 }
2051 err_setstr(TypeError, "bad operand type(s) for ^");
2052 return NULL;
2053}
2054
2055static object *
2056and(v, w)
2057 object *v, *w;
2058{
Guido van Rossum06186511995-01-07 12:40:10 +00002059 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002060 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002061 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002062 object * (*f) FPROTO((object *, object *));
2063 if (coerce(&v, &w) != 0)
2064 return NULL;
2065 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2066 x = (*f)(v, w);
2067 DECREF(v);
2068 DECREF(w);
2069 if (f != NULL)
2070 return x;
2071 }
2072 err_setstr(TypeError, "bad operand type(s) for &");
2073 return NULL;
2074}
2075
2076static object *
2077lshift(v, w)
2078 object *v, *w;
2079{
Guido van Rossum06186511995-01-07 12:40:10 +00002080 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002081 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002082 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002083 object * (*f) FPROTO((object *, object *));
2084 if (coerce(&v, &w) != 0)
2085 return NULL;
2086 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2087 x = (*f)(v, w);
2088 DECREF(v);
2089 DECREF(w);
2090 if (f != NULL)
2091 return x;
2092 }
2093 err_setstr(TypeError, "bad operand type(s) for <<");
2094 return NULL;
2095}
2096
2097static object *
2098rshift(v, w)
2099 object *v, *w;
2100{
Guido van Rossum06186511995-01-07 12:40:10 +00002101 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002102 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002103 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002104 object * (*f) FPROTO((object *, object *));
2105 if (coerce(&v, &w) != 0)
2106 return NULL;
2107 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2108 x = (*f)(v, w);
2109 DECREF(v);
2110 DECREF(w);
2111 if (f != NULL)
2112 return x;
2113 }
2114 err_setstr(TypeError, "bad operand type(s) for >>");
2115 return NULL;
2116}
2117
2118static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 object *v, *w;
2121{
Guido van Rossum06186511995-01-07 12:40:10 +00002122 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002123 if (v->ob_type->tp_as_sequence != NULL)
2124 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2125 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002126 object *x;
2127 if (coerce(&v, &w) != 0)
2128 return NULL;
2129 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2130 DECREF(v);
2131 DECREF(w);
2132 return x;
2133 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002134 err_setstr(TypeError, "bad operand type(s) for +");
2135 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136}
2137
2138static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002139sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 object *v, *w;
2141{
Guido van Rossum06186511995-01-07 12:40:10 +00002142 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002143 if (v->ob_type->tp_as_number != NULL) {
2144 object *x;
2145 if (coerce(&v, &w) != 0)
2146 return NULL;
2147 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2148 DECREF(v);
2149 DECREF(w);
2150 return x;
2151 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002152 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 return NULL;
2154}
2155
2156static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002157mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 object *v, *w;
2159{
2160 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002161 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002162 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002163 if (tp->tp_as_number != NULL &&
2164 w->ob_type->tp_as_sequence != NULL &&
2165 !is_instanceobject(v)) {
2166 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 object *tmp = v;
2168 v = w;
2169 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002170 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002172 if (tp->tp_as_number != NULL) {
2173 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002174 if (is_instanceobject(v)) {
2175 /* Instances of user-defined classes get their
2176 other argument uncoerced, so they may
2177 implement sequence*number as well as
2178 number*number. */
2179 INCREF(v);
2180 INCREF(w);
2181 }
2182 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002183 return NULL;
2184 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2185 DECREF(v);
2186 DECREF(w);
2187 return x;
2188 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189 if (tp->tp_as_sequence != NULL) {
2190 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002191 err_setstr(TypeError,
2192 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 return NULL;
2194 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002195 return (*tp->tp_as_sequence->sq_repeat)
2196 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002198 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 return NULL;
2200}
2201
2202static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002203divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 object *v, *w;
2205{
Guido van Rossum06186511995-01-07 12:40:10 +00002206 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002207 if (v->ob_type->tp_as_number != NULL) {
2208 object *x;
2209 if (coerce(&v, &w) != 0)
2210 return NULL;
2211 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2212 DECREF(v);
2213 DECREF(w);
2214 return x;
2215 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002216 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217 return NULL;
2218}
2219
2220static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002221mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222 object *v, *w;
2223{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002224 if (is_stringobject(v)) {
2225 return formatstring(v, w);
2226 }
Guido van Rossum06186511995-01-07 12:40:10 +00002227 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002228 if (v->ob_type->tp_as_number != NULL) {
2229 object *x;
2230 if (coerce(&v, &w) != 0)
2231 return NULL;
2232 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2233 DECREF(v);
2234 DECREF(w);
2235 return x;
2236 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002237 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 return NULL;
2239}
2240
2241static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002242powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002243 object *v, *w;
2244{
2245 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002246 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002247 if (v->ob_type->tp_as_number == NULL ||
2248 w->ob_type->tp_as_number == NULL) {
2249 err_setstr(TypeError, "pow() requires numeric arguments");
2250 return NULL;
2251 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002252 if (coerce(&v, &w) != 0)
2253 return NULL;
2254 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2255 DECREF(v);
2256 DECREF(w);
2257 return res;
2258}
2259
2260static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002261neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262 object *v;
2263{
2264 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002265 return (*v->ob_type->tp_as_number->nb_negative)(v);
2266 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 return NULL;
2268}
2269
2270static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002271pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 object *v;
2273{
2274 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275 return (*v->ob_type->tp_as_number->nb_positive)(v);
2276 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002277 return NULL;
2278}
2279
2280static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002281invert(v)
2282 object *v;
2283{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002284 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002285 if (v->ob_type->tp_as_number != NULL &&
2286 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2287 return (*f)(v);
2288 err_setstr(TypeError, "bad operand type(s) for unary ~");
2289 return NULL;
2290}
2291
2292static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294 object *v;
2295{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002296 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002297 object *w;
2298 if (outcome < 0)
2299 return NULL;
2300 if (outcome == 0)
2301 w = True;
2302 else
2303 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002304 INCREF(w);
2305 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306}
Guido van Rossum234f9421993-06-17 12:35:49 +00002307
2308
Guido van Rossum681d79a1995-07-18 14:51:37 +00002309/* External interface to call any callable object.
2310 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002311
2312object *
2313call_object(func, arg)
2314 object *func;
2315 object *arg;
2316{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2318}
Guido van Rossume59214e1994-08-30 08:01:59 +00002319
Guido van Rossum681d79a1995-07-18 14:51:37 +00002320object *
2321PyEval_CallObjectWithKeywords(func, arg, kw)
2322 object *func;
2323 object *arg;
2324 object *kw;
2325{
2326 ternaryfunc call;
2327 object *result;
2328
2329 if (arg == NULL)
2330 arg = newtupleobject(0);
2331 else if (!is_tupleobject(arg)) {
2332 err_setstr(TypeError, "argument list must be a tuple");
2333 return NULL;
2334 }
2335 else
2336 INCREF(arg);
2337
Guido van Rossume3e61c11995-08-04 04:14:47 +00002338 if (kw != NULL && !is_dictobject(kw)) {
2339 err_setstr(TypeError, "keyword list must be a dictionary");
2340 return NULL;
2341 }
2342
Guido van Rossum150b2df1996-12-05 23:17:11 +00002343 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002344 result = (*call)(func, arg, kw);
2345 else if (is_instancemethodobject(func) || is_funcobject(func))
2346 result = call_function(func, arg, kw);
2347 else
2348 result = call_builtin(func, arg, kw);
2349
2350 DECREF(arg);
2351
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002352 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002353 err_setstr(SystemError,
2354 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002355
2356 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002357}
2358
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002362 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002363 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 if (is_methodobject(func)) {
2366 method meth = getmethod(func);
2367 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002368 int flags = getflags(func);
2369 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002370 int size = gettuplesize(arg);
2371 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002372 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002373 else if (size == 0)
2374 arg = NULL;
2375 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002376 if (flags & METH_KEYWORDS)
2377 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002378 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002379 err_setstr(TypeError,
2380 "this function takes no keyword arguments");
2381 return NULL;
2382 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002383 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 }
2385 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002386 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002388 if (is_instanceobject(func)) {
2389 object *res, *call = getattr(func,"__call__");
2390 if (call == NULL) {
2391 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002392 err_setstr(AttributeError,
2393 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002394 return NULL;
2395 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002396 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002397 DECREF(call);
2398 return res;
2399 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002400 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 return NULL;
2402}
2403
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002407 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002408 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002411 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002412 object **d, **k;
2413 int nk, nd;
2414 object *result;
2415
2416 if (kw != NULL && !is_dictobject(kw)) {
2417 err_badcall();
2418 return NULL;
2419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420
Guido van Rossume8122f11991-05-05 20:03:07 +00002421 if (is_instancemethodobject(func)) {
2422 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002423 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002424 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002425 if (self == NULL) {
2426 /* Unbound methods must be called with an instance of
2427 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002429 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002430 if (self != NULL &&
2431 is_instanceobject(self) &&
2432 issubclass((object *)
2433 (((instanceobject *)self)->in_class),
2434 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002436 else
2437 self = NULL;
2438 }
2439 if (self == NULL) {
2440 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002442 return NULL;
2443 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002445 }
2446 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002447 int argcount = gettuplesize(arg);
2448 object *newarg = newtupleobject(argcount + 1);
2449 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002450 if (newarg == NULL)
2451 return NULL;
2452 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002453 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002454 for (i = 0; i < argcount; i++) {
2455 object *v = GETTUPLEITEM(arg, i);
2456 XINCREF(v);
2457 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002458 }
2459 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 }
2461 }
2462 else {
2463 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002464 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 return NULL;
2466 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002467 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002469
2470 argdefs = PyFunction_GetDefaults(func);
2471 if (argdefs != NULL && is_tupleobject(argdefs)) {
2472 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2473 nd = gettuplesize(argdefs);
2474 }
2475 else {
2476 d = NULL;
2477 nd = 0;
2478 }
2479
2480 if (kw != NULL) {
2481 int pos, i;
2482 nk = getmappingsize(kw);
2483 k = NEW(object *, 2*nk);
2484 if (k == NULL) {
2485 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002486 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002487 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002488 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002489 pos = i = 0;
2490 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2491 i += 2;
2492 nk = i/2;
2493 /* XXX This is broken if the caller deletes dict items! */
2494 }
2495 else {
2496 k = NULL;
2497 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002498 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499
Guido van Rossum681d79a1995-07-18 14:51:37 +00002500 result = eval_code2(
2501 (codeobject *)getfunccode(func),
2502 getfuncglobals(func), (object *)NULL,
2503 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2504 k, nk,
2505 d, nd,
2506 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507
Guido van Rossum681d79a1995-07-18 14:51:37 +00002508 DECREF(arg);
2509 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510
Guido van Rossum681d79a1995-07-18 14:51:37 +00002511 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512}
2513
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002514#define SLICE_ERROR_MSG \
2515 "standard sequence type does not support step size other than one"
2516
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002518apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 object *v, *w;
2520{
2521 typeobject *tp = v->ob_type;
2522 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524 return NULL;
2525 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002526 if (tp->tp_as_mapping != NULL) {
2527 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2528 }
2529 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002531 if (!is_intobject(w)) {
2532 if (PySlice_Check(w)) {
2533 err_setstr(ValueError, SLICE_ERROR_MSG);
2534 } else {
2535 err_setstr(TypeError,
2536 "sequence subscript not int");
2537 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 return NULL;
2539 }
2540 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002541 if (i < 0) {
2542 int len = (*tp->tp_as_sequence->sq_length)(v);
2543 if (len < 0)
2544 return NULL;
2545 i += len;
2546 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549}
2550
2551static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553 object *v, *w;
2554{
2555 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002556 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002558 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559 return NULL;
2560 }
2561 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002562 v = (*sq->sq_item)(v, i);
2563 if (v)
2564 return v;
2565 if (err_occurred() == IndexError)
2566 err_clear();
2567 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002568}
2569
2570static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002571slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 object *v;
2573 int isize;
2574 int *pi;
2575{
2576 if (v != NULL) {
2577 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002578 err_setstr(TypeError, "slice index must be int");
2579 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 }
2581 *pi = getintvalue(v);
2582 if (*pi < 0)
2583 *pi += isize;
2584 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002585 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586}
2587
2588static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 object *u, *v, *w;
2591{
2592 typeobject *tp = u->ob_type;
2593 int ilow, ihigh, isize;
2594 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 return NULL;
2597 }
2598 ilow = 0;
2599 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002600 if (isize < 0)
2601 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002602 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002608
2609static int
2610assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 object *w;
2612 object *key;
2613 object *v;
2614{
2615 typeobject *tp = w->ob_type;
2616 sequence_methods *sq;
2617 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002618 int (*func1)();
2619 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002620 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002621 (func1 = mp->mp_ass_subscript) != NULL) {
2622 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002623 }
2624 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002625 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002627 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002628 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002629 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002631 else {
2632 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002633 if (i < 0) {
2634 int len = (*sq->sq_length)(w);
2635 if (len < 0)
2636 return -1;
2637 i += len;
2638 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002639 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002640 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002643 err_setstr(TypeError,
2644 "can't assign to this subscripted object");
2645 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647}
2648
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649static int
2650assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 object *u, *v, *w, *x;
2652{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002653 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002655 if (sq == NULL) {
2656 err_setstr(TypeError, "assign to slice of non-sequence");
2657 return -1;
2658 }
2659 if (sq == NULL || sq->sq_ass_slice == NULL) {
2660 err_setstr(TypeError, "unassignable slice");
2661 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 }
2663 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002665 if (isize < 0)
2666 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002667 if (slice_index(v, isize, &ilow) != 0)
2668 return -1;
2669 if (slice_index(w, isize, &ihigh) != 0)
2670 return -1;
2671 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002672}
2673
2674static int
2675cmp_exception(err, v)
2676 object *err, *v;
2677{
2678 if (is_tupleobject(v)) {
2679 int i, n;
2680 n = gettuplesize(v);
2681 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002682 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002683 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002684 return 1;
2685 }
2686 return 0;
2687 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002688 if (is_classobject(v) && is_classobject(err))
2689 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 return err == v;
2691}
2692
Guido van Rossum3f5da241990-12-20 15:06:42 +00002693static int
2694cmp_member(v, w)
2695 object *v, *w;
2696{
Guido van Rossume59214e1994-08-30 08:01:59 +00002697 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002698 object *x;
2699 sequence_methods *sq;
2700 /* Special case for char in string */
2701 if (is_stringobject(w)) {
2702 register char *s, *end;
2703 register char c;
2704 if (!is_stringobject(v) || getstringsize(v) != 1) {
2705 err_setstr(TypeError,
2706 "string member test needs char left operand");
2707 return -1;
2708 }
2709 c = getstringvalue(v)[0];
2710 s = getstringvalue(w);
2711 end = s + getstringsize(w);
2712 while (s < end) {
2713 if (c == *s++)
2714 return 1;
2715 }
2716 return 0;
2717 }
2718 sq = w->ob_type->tp_as_sequence;
2719 if (sq == NULL) {
2720 err_setstr(TypeError,
2721 "'in' or 'not in' needs sequence right argument");
2722 return -1;
2723 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002724 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002725 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002726 if (x == NULL) {
2727 if (err_occurred() == IndexError) {
2728 err_clear();
2729 break;
2730 }
2731 return -1;
2732 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002733 cmp = cmpobject(v, x);
2734 XDECREF(x);
2735 if (cmp == 0)
2736 return 1;
2737 }
2738 return 0;
2739}
2740
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002742cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002743 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 register object *v;
2745 register object *w;
2746{
2747 register int cmp;
2748 register int res = 0;
2749 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002750 case IS:
2751 case IS_NOT:
2752 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002753 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002754 res = !res;
2755 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 case IN:
2757 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002758 res = cmp_member(v, w);
2759 if (res < 0)
2760 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002761 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002762 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 break;
2764 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002765 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 break;
2767 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002768 cmp = cmpobject(v, w);
2769 switch (op) {
2770 case LT: res = cmp < 0; break;
2771 case LE: res = cmp <= 0; break;
2772 case EQ: res = cmp == 0; break;
2773 case NE: res = cmp != 0; break;
2774 case GT: res = cmp > 0; break;
2775 case GE: res = cmp >= 0; break;
2776 /* XXX no default? (res is initialized to 0 though) */
2777 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 }
2779 v = res ? True : False;
2780 INCREF(v);
2781 return v;
2782}
2783
Guido van Rossum3f5da241990-12-20 15:06:42 +00002784static int
2785import_from(locals, v, name)
2786 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002787 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002788 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002789{
2790 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002791 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002792 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002793 return -1;
2794 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002795 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002796 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002797 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002798 object *name, *value;
2799 pos = 0;
2800 while (mappinggetnext(w, &pos, &name, &value)) {
2801 if (!is_stringobject(name) ||
2802 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002803 continue;
Guido van Rossum1aa14831997-01-21 05:34:20 +00002804 INCREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002805 err = dict2insert(locals, name, value);
2806 DECREF(value);
2807 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002808 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002809 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002810 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002811 }
2812 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002813 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002814 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002815 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002816 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002817 getstringvalue(name));
2818 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 return -1;
2820 }
2821 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002822 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002823 }
2824}
2825
2826static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002827build_class(methods, bases, name)
2828 object *methods; /* dictionary */
2829 object *bases; /* tuple containing classes */
2830 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002831{
Guido van Rossum25831651993-05-19 14:50:45 +00002832 int i;
2833 if (!is_tupleobject(bases)) {
2834 err_setstr(SystemError, "build_class with non-tuple bases");
2835 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002836 }
Guido van Rossum25831651993-05-19 14:50:45 +00002837 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002838 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002839 return NULL;
2840 }
Guido van Rossum25831651993-05-19 14:50:45 +00002841 if (!is_stringobject(name)) {
2842 err_setstr(SystemError, "build_class witn non-string name");
2843 return NULL;
2844 }
2845 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002846 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002847 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002848 /* Call the base's *type*, if it is callable.
2849 This code is a hook for Donald Beaudry's
2850 and Jim Fulton's type extensions. In
2851 unexended Python it will never be triggered
2852 since its types are not callable. */
2853 if (base->ob_type->ob_type->tp_call) {
2854 object *args;
2855 object *class;
2856 args = mkvalue("(OOO)", name, bases, methods);
2857 class = call_object((object *)base->ob_type,
2858 args);
2859 DECREF(args);
2860 return class;
2861 }
Guido van Rossum25831651993-05-19 14:50:45 +00002862 err_setstr(TypeError,
2863 "base is not a class object");
2864 return NULL;
2865 }
2866 }
2867 return newclassobject(bases, methods, name);
2868}
2869
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002870static int
2871exec_statement(prog, globals, locals)
2872 object *prog;
2873 object *globals;
2874 object *locals;
2875{
2876 char *s;
2877 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002878 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002879 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002880
2881 if (is_tupleobject(prog) && globals == None && locals == None &&
2882 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2883 /* Backward compatibility hack */
2884 globals = gettupleitem(prog, 1);
2885 if (n == 3)
2886 locals = gettupleitem(prog, 2);
2887 prog = gettupleitem(prog, 0);
2888 }
2889 if (globals == None) {
2890 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002891 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002892 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002893 plain = 1;
2894 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002895 }
2896 else if (locals == None)
2897 locals = globals;
2898 if (!is_stringobject(prog) &&
2899 !is_codeobject(prog) &&
2900 !is_fileobject(prog)) {
2901 err_setstr(TypeError,
2902 "exec 1st arg must be string, code or file object");
2903 return -1;
2904 }
2905 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2906 err_setstr(TypeError,
2907 "exec 2nd/3rd args must be dict or None");
2908 return -1;
2909 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002910 if (dictlookup(globals, "__builtins__") == NULL)
2911 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002912 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002913 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002914 return -1;
2915 return 0;
2916 }
2917 if (is_fileobject(prog)) {
2918 FILE *fp = getfilefile(prog);
2919 char *name = getstringvalue(getfilename(prog));
2920 if (run_file(fp, name, file_input, globals, locals) == NULL)
2921 return -1;
2922 return 0;
2923 }
2924 s = getstringvalue(prog);
2925 if (strlen(s) != getstringsize(prog)) {
2926 err_setstr(ValueError, "embedded '\\0' in exec string");
2927 return -1;
2928 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002929 v = run_string(s, file_input, globals, locals);
2930 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002931 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002932 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002933 if (plain)
2934 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002935 return 0;
2936}
Guido van Rossum24c13741995-02-14 09:42:43 +00002937
Guido van Rossum1aa14831997-01-21 05:34:20 +00002938/* Hack for ni.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002939static object *
2940find_from_args(f, nexti)
2941 frameobject *f;
2942 int nexti;
2943{
2944 int opcode;
2945 int oparg;
2946 object *list, *name;
2947 unsigned char *next_instr;
2948
2949 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2950 opcode = (*next_instr++);
2951 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002952 INCREF(None);
2953 return None;
2954 }
2955
2956 list = newlistobject(0);
2957 if (list == NULL)
2958 return NULL;
2959
2960 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002961 oparg = (next_instr[1]<<8) + next_instr[0];
2962 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002963 name = Getnamev(f, oparg);
2964 if (addlistitem(list, name) < 0) {
2965 DECREF(list);
2966 break;
2967 }
2968 opcode = (*next_instr++);
2969 } while (opcode == IMPORT_FROM);
2970
2971 return list;
2972}
Guido van Rossum950361c1997-01-24 13:49:28 +00002973
2974
2975#ifdef DYNAMIC_EXECUTION_PROFILE
2976
2977PyObject *
2978getarray(a)
2979 long a[256];
2980{
2981 int i;
2982 PyObject *l = PyList_New(256);
2983 if (l == NULL) return NULL;
2984 for (i = 0; i < 256; i++) {
2985 PyObject *x = PyInt_FromLong(a[i]);
2986 if (x == NULL) {
2987 Py_DECREF(l);
2988 return NULL;
2989 }
2990 PyList_SetItem(l, i, x);
2991 }
2992 for (i = 0; i < 256; i++)
2993 a[i] = 0;
2994 return l;
2995}
2996
2997PyObject *
2998_Py_GetDXProfile(self, args)
2999 PyObject *self, *args;
3000{
3001#ifndef DXPAIRS
3002 return getarray(dxp);
3003#else
3004 int i;
3005 PyObject *l = PyList_New(257);
3006 if (l == NULL) return NULL;
3007 for (i = 0; i < 257; i++) {
3008 PyObject *x = getarray(dxpairs[i]);
3009 if (x == NULL) {
3010 Py_DECREF(l);
3011 return NULL;
3012 }
3013 PyList_SetItem(l, i, x);
3014 }
3015 return l;
3016#endif
3017}
3018
3019#endif