blob: 37a41687fbb5260493c3dc10a36f12cf93d73e1e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossum3f5da241990-12-20 15:06:42 +000040#include "allobjects.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
Guido van Rossumdb3165e1993-10-18 17:06:59 +000046#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000047
Guido van Rossumc6004111993-11-05 10:22:19 +000048#include <ctype.h>
49
Guido van Rossum04691fc1992-08-12 15:35:34 +000050/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000052
Guido van Rossum408027e1996-12-30 16:17:54 +000053#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000054/* For debugging the interpreter: */
55#define LLTRACE 1 /* Low-level trace feature */
56#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000057#endif
58
Guido van Rossum5b722181993-03-30 17:46:03 +000059
Guido van Rossum374a9221991-04-04 10:40:29 +000060/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000061
Guido van Rossum681d79a1995-07-18 14:51:37 +000062static object *eval_code2 PROTO((codeobject *,
63 object *, object *,
64 object **, int,
65 object **, int,
66 object **, int,
67 object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000068#ifdef LLTRACE
69static int prtrace PROTO((object *, char *));
70#endif
Guido van Rossum9c8d70d1992-03-23 18:19:28 +000071static void call_exc_trace PROTO((object **, object**, frameobject *));
72static int call_trace
73 PROTO((object **, object **, frameobject *, char *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000074static object *add PROTO((object *, object *));
75static object *sub PROTO((object *, object *));
Guido van Rossum3b4da591996-06-19 21:49:17 +000076static object *powerop PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000077static object *mul PROTO((object *, object *));
78static object *divide PROTO((object *, object *));
Guido van Rossum06186511995-01-07 12:40:10 +000079static object *mod PROTO((object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000080static object *neg PROTO((object *));
81static object *pos PROTO((object *));
82static object *not PROTO((object *));
83static object *invert PROTO((object *));
84static object *lshift PROTO((object *, object *));
85static object *rshift PROTO((object *, object *));
86static object *and PROTO((object *, object *));
87static object *xor PROTO((object *, object *));
88static object *or PROTO((object *, object *));
Guido van Rossum681d79a1995-07-18 14:51:37 +000089static object *call_builtin PROTO((object *, object *, object *));
90static object *call_function PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000091static object *apply_subscript PROTO((object *, object *));
92static object *loop_subscript PROTO((object *, object *));
93static int slice_index PROTO((object *, int, int *));
94static object *apply_slice PROTO((object *, object *, object *));
95static int assign_subscript PROTO((object *, object *, object *));
96static int assign_slice PROTO((object *, object *, object *, object *));
97static int cmp_exception PROTO((object *, object *));
98static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +000099static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000100static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000101static object *build_class PROTO((object *, object *, object *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000102static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000103static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000104
105
Guido van Rossum950361c1997-01-24 13:49:28 +0000106/* Dynamic execution profile */
107#ifdef DYNAMIC_EXECUTION_PROFILE
108#ifdef DXPAIRS
109static long dxpairs[257][256];
110#define dxp dxpairs[256]
111#else
112static long dxp[256];
113#endif
114#endif
115
116
Guido van Rossum0a066c01992-03-27 17:29:15 +0000117/* Pointer to current frame, used to link new frames to */
118
Guido van Rossum374a9221991-04-04 10:40:29 +0000119static frameobject *current_frame;
120
Guido van Rossume59214e1994-08-30 08:01:59 +0000121#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000122
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123#include <errno.h>
124#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000125
Guido van Rossuma9672091994-09-14 13:31:22 +0000126static type_lock interpreter_lock = 0;
127static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128
129void
130init_save_thread()
131{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000133 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000134 interpreter_lock = allocate_lock();
135 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000136 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000137}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000138
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139#endif
140
Guido van Rossumff4949e1992-08-05 19:58:53 +0000141/* Functions save_thread and restore_thread are always defined so
142 dynamically loaded modules needn't be compiled separately for use
143 with and without threads: */
144
Guido van Rossum04691fc1992-08-12 15:35:34 +0000145object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146save_thread()
147{
Guido van Rossume59214e1994-08-30 08:01:59 +0000148#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000150 object *res;
151 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152 current_frame = NULL;
153 release_lock(interpreter_lock);
154 return res;
155 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000157 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158}
159
160void
161restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000162 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163{
Guido van Rossume59214e1994-08-30 08:01:59 +0000164#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165 if (interpreter_lock) {
166 int err;
167 err = errno;
168 acquire_lock(interpreter_lock, 1);
169 errno = err;
170 current_frame = (frameobject *)x;
171 }
172#endif
173}
174
175
Guido van Rossuma9672091994-09-14 13:31:22 +0000176/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
177 signal handlers or Mac I/O completion routines) can schedule calls
178 to a function to be called synchronously.
179 The synchronous function is called with one void* argument.
180 It should return 0 for success or -1 for failure -- failure should
181 be accompanied by an exception.
182
183 If registry succeeds, the registry function returns 0; if it fails
184 (e.g. due to too many pending calls) it returns -1 (without setting
185 an exception condition).
186
187 Note that because registry may occur from within signal handlers,
188 or other asynchronous events, calling malloc() is unsafe!
189
190#ifdef WITH_THREAD
191 Any thread can schedule pending calls, but only the main thread
192 will execute them.
193#endif
194
195 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
196 There are two possible race conditions:
197 (1) nested asynchronous registry calls;
198 (2) registry calls made while pending calls are being processed.
199 While (1) is very unlikely, (2) is a real possibility.
200 The current code is safe against (2), but not against (1).
201 The safety against (2) is derived from the fact that only one
202 thread (the main thread) ever takes things out of the queue.
203*/
204
Guido van Rossum8861b741996-07-30 16:49:37 +0000205static int ticker = 0; /* main loop counter to do periodic things */
206
Guido van Rossuma9672091994-09-14 13:31:22 +0000207#define NPENDINGCALLS 32
208static struct {
209 int (*func) PROTO((ANY *));
210 ANY *arg;
211} pendingcalls[NPENDINGCALLS];
212static volatile int pendingfirst = 0;
213static volatile int pendinglast = 0;
214
215int
216Py_AddPendingCall(func, arg)
217 int (*func) PROTO((ANY *));
218 ANY *arg;
219{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000220 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000221 int i, j;
222 /* XXX Begin critical section */
223 /* XXX If you want this to be safe against nested
224 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000225 if (busy)
226 return -1;
227 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000228 i = pendinglast;
229 j = (i + 1) % NPENDINGCALLS;
230 if (j == pendingfirst)
231 return -1; /* Queue full */
232 pendingcalls[i].func = func;
233 pendingcalls[i].arg = arg;
234 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000235 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000236 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000237 /* XXX End critical section */
238 return 0;
239}
240
Guido van Rossum180d7b41994-09-29 09:45:57 +0000241int
242Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000243{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000245#ifdef WITH_THREAD
Guido van Rossum1aa14831997-01-21 05:34:20 +0000246 if (main_thread && get_thread_ident() != main_thread) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000247 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000249 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000250#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000251 if (busy) {
252 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000254 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 for (;;) {
257 int i;
258 int (*func) PROTO((ANY *));
259 ANY *arg;
260 i = pendingfirst;
261 if (i == pendinglast)
262 break; /* Queue empty */
263 func = pendingcalls[i].func;
264 arg = pendingcalls[i].arg;
265 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 if (func(arg) < 0) {
267 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000268 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000270 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000271 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000273 return 0;
274}
275
276
Guido van Rossum374a9221991-04-04 10:40:29 +0000277/* Status code for main loop (reason for stack unwind) */
278
279enum why_code {
280 WHY_NOT, /* No error */
281 WHY_EXCEPTION, /* Exception occurred */
282 WHY_RERAISE, /* Exception re-raised by 'finally' */
283 WHY_RETURN, /* 'return' statement */
284 WHY_BREAK /* 'break' statement */
285};
286
Guido van Rossum1aa14831997-01-21 05:34:20 +0000287static enum why_code do_raise PROTO((object *, object *, object *));
288
Guido van Rossum374a9221991-04-04 10:40:29 +0000289
Guido van Rossum681d79a1995-07-18 14:51:37 +0000290/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000291
292object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000294 codeobject *co;
295 object *globals;
296 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297{
298 return eval_code2(co,
299 globals, locals,
300 (object **)NULL, 0,
301 (object **)NULL, 0,
302 (object **)NULL, 0,
303 (object *)NULL);
304}
305
306
307/* Interpreter main loop */
308
Guido van Rossum8861b741996-07-30 16:49:37 +0000309#ifndef MAX_RECURSION_DEPTH
310#define MAX_RECURSION_DEPTH 10000
311#endif
312
313static int recursion_depth = 0;
314
Guido van Rossum681d79a1995-07-18 14:51:37 +0000315static object *
316eval_code2(co, globals, locals,
317 args, argcount, kws, kwcount, defs, defcount, owner)
318 codeobject *co;
319 object *globals;
320 object *locals;
321 object **args;
322 int argcount;
323 object **kws; /* length: 2*kwcount */
324 int kwcount;
325 object **defs;
326 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000327 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000328{
Guido van Rossum950361c1997-01-24 13:49:28 +0000329#ifdef DXPAIRS
330 int lastopcode = 0;
331#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000332 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000333 register int opcode = 0; /* Current opcode */
334 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000335 register object **stack_pointer;
336 register enum why_code why; /* Reason for block stack unwind */
337 register int err; /* Error status -- nonzero if error */
338 register object *x; /* Result object -- NULL if error */
339 register object *v; /* Temporary objects popped off stack */
340 register object *w;
341 register object *u;
342 register object *t;
343 register frameobject *f; /* Current frame */
Guido van Rossum150b2df1996-12-05 23:17:11 +0000344 register object **fastlocals = NULL;
345 object *retval = NULL; /* Return value */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000346#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000347 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000348#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000349#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000351 char *filename = getstringvalue(co->co_filename);
352#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000353
354/* Code access macros */
355
356#define GETCONST(i) Getconst(f, i)
357#define GETNAME(i) Getname(f, i)
358#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000359#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000360#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
361#define NEXTOP() (*next_instr++)
362#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
363#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
364#define JUMPBY(x) (next_instr += (x))
365
366/* Stack manipulation macros */
367
368#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
369#define EMPTY() (STACK_LEVEL() == 0)
370#define TOP() (stack_pointer[-1])
371#define BASIC_PUSH(v) (*stack_pointer++ = (v))
372#define BASIC_POP() (*--stack_pointer)
373
Guido van Rossum96a42c81992-01-12 02:29:51 +0000374#ifdef LLTRACE
375#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
376#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000377#else
378#define PUSH(v) BASIC_PUSH(v)
379#define POP() BASIC_POP()
380#endif
381
Guido van Rossum681d79a1995-07-18 14:51:37 +0000382/* Local variable macros */
383
384#define GETLOCAL(i) (fastlocals[i])
385#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
386 GETLOCAL(i) = value; } while (0)
387
Guido van Rossum8861b741996-07-30 16:49:37 +0000388#ifdef USE_STACKCHECK
389 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
390 err_setstr(MemoryError, "Stack overflow");
391 return NULL;
392 }
393#endif
394
Guido van Rossum681d79a1995-07-18 14:51:37 +0000395 if (globals == NULL) {
396 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000397 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000398 }
399
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000400#ifdef LLTRACE
401 lltrace = dictlookup(globals, "__lltrace__") != NULL;
402#endif
403
Guido van Rossum374a9221991-04-04 10:40:29 +0000404 f = newframeobject(
405 current_frame, /*back*/
406 co, /*code*/
407 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000408 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000409 if (f == NULL)
410 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411
Guido van Rossum374a9221991-04-04 10:40:29 +0000412 current_frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000413 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000414
415 if (co->co_argcount > 0 ||
416 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
417 int i;
418 int n = argcount;
419 object *kwdict = NULL;
420 if (co->co_flags & CO_VARKEYWORDS) {
421 kwdict = newmappingobject();
422 if (kwdict == NULL)
423 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000424 i = co->co_argcount;
425 if (co->co_flags & CO_VARARGS)
426 i++;
427 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000428 }
429 if (argcount > co->co_argcount) {
430 if (!(co->co_flags & CO_VARARGS)) {
431 err_setstr(TypeError, "too many arguments");
432 goto fail;
433 }
434 n = co->co_argcount;
435 }
436 for (i = 0; i < n; i++) {
437 x = args[i];
438 INCREF(x);
439 SETLOCAL(i, x);
440 }
441 if (co->co_flags & CO_VARARGS) {
442 u = newtupleobject(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000443 if (u == NULL)
444 goto fail;
445 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 for (i = n; i < argcount; i++) {
447 x = args[i];
448 INCREF(x);
449 SETTUPLEITEM(u, i-n, x);
450 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 }
452 for (i = 0; i < kwcount; i++) {
453 object *keyword = kws[2*i];
454 object *value = kws[2*i + 1];
455 int j;
456 /* XXX slow -- speed up using dictionary? */
457 for (j = 0; j < co->co_argcount; j++) {
458 object *nm = GETTUPLEITEM(co->co_varnames, j);
459 if (cmpobject(keyword, nm) == 0)
460 break;
461 }
462 if (j >= co->co_argcount) {
463 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000464 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 goto fail;
466 }
467 mappinginsert(kwdict, keyword, value);
468 }
469 else {
470 if (GETLOCAL(j) != NULL) {
471 err_setstr(TypeError,
472 "keyword parameter redefined");
473 goto fail;
474 }
475 INCREF(value);
476 SETLOCAL(j, value);
477 }
478 }
479 if (argcount < co->co_argcount) {
480 int m = co->co_argcount - defcount;
481 for (i = argcount; i < m; i++) {
482 if (GETLOCAL(i) == NULL) {
483 err_setstr(TypeError,
484 "not enough arguments");
485 goto fail;
486 }
487 }
488 if (n > m)
489 i = n - m;
490 else
491 i = 0;
492 for (; i < defcount; i++) {
493 if (GETLOCAL(m+i) == NULL) {
494 object *def = defs[i];
495 INCREF(def);
496 SETLOCAL(m+i, def);
497 }
498 }
499 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 }
501 else {
502 if (argcount > 0 || kwcount > 0) {
503 err_setstr(TypeError, "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000504 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 }
506 }
507
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000508 if (sys_trace != NULL) {
509 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000510 be called on *every* entry to a code block.
511 Its return value, if not None, is a function that
512 will be called at the start of each executed line
513 of code. (Actually, the function must return
514 itself in order to continue tracing.)
515 The trace functions are called with three arguments:
516 a pointer to the current frame, a string indicating
517 why the function is called, and an argument which
518 depends on the situation. The global trace function
519 (sys.trace) is also called whenever an exception
520 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000521 if (call_trace(&sys_trace, &f->f_trace, f, "call",
522 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000523 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000524 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000525 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000526 }
527
528 if (sys_profile != NULL) {
529 /* Similar for sys_profile, except it needn't return
530 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 if (call_trace(&sys_profile, (object**)0, f, "call",
532 None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000533 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000534 }
535 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000536
Guido van Rossum8861b741996-07-30 16:49:37 +0000537 if (++recursion_depth > MAX_RECURSION_DEPTH) {
538 --recursion_depth;
539 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
540 current_frame = f->f_back;
541 DECREF(f);
542 return NULL;
543 }
544
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000545 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000546 stack_pointer = f->f_valuestack;
547
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 why = WHY_NOT;
549 err = 0;
550 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000551
552 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553 /* Do periodic things.
554 Doing this every time through the loop would add
555 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000556 So we do it only every Nth instruction.
557
558 The ticker is reset to zero if there are pending
Guido van Rossum70d44781997-01-21 06:15:24 +0000559 calls (see Py_AddPendingCall() and
Guido van Rossum8861b741996-07-30 16:49:37 +0000560 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000561
Guido van Rossum374a9221991-04-04 10:40:29 +0000562 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000563 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000564 if (pendingfirst != pendinglast) {
565 if (Py_MakePendingCalls() < 0) {
566 why = WHY_EXCEPTION;
567 goto on_error;
568 }
569 }
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570#ifdef macintosh
571#undef HAVE_SIGNAL_H
572#endif
Guido van Rossum70d44781997-01-21 06:15:24 +0000573#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
574/* If we have true signals, the signal handler will call
575 Py_AddPendingCall() so we don't have to call sigcheck().
576 On the Mac and DOS, alas, we have to call it. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000577 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000578 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000579 goto on_error;
580 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000581#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000582
Guido van Rossume59214e1994-08-30 08:01:59 +0000583#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584 if (interpreter_lock) {
585 /* Give another thread a chance */
586
587 current_frame = NULL;
588 release_lock(interpreter_lock);
589
590 /* Other threads may run now */
591
592 acquire_lock(interpreter_lock, 1);
593 current_frame = f;
594 }
595#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000596 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000597
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000599
Guido van Rossum408027e1996-12-30 16:17:54 +0000600#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000601 f->f_lasti = INSTR_OFFSET();
602#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000603
604 opcode = NEXTOP();
605 if (HAS_ARG(opcode))
606 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000607#ifdef DYNAMIC_EXECUTION_PROFILE
608#ifdef DXPAIRS
609 dxpairs[lastopcode][opcode]++;
610 lastopcode = opcode;
611#endif
612 dxp[opcode]++;
613#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000614
Guido van Rossum96a42c81992-01-12 02:29:51 +0000615#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 /* Instruction tracing */
617
Guido van Rossum96a42c81992-01-12 02:29:51 +0000618 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000619 if (HAS_ARG(opcode)) {
620 printf("%d: %d, %d\n",
621 (int) (INSTR_OFFSET() - 3),
622 opcode, oparg);
623 }
624 else {
625 printf("%d: %d\n",
626 (int) (INSTR_OFFSET() - 1), opcode);
627 }
628 }
629#endif
630
631 /* Main switch on opcode */
632
633 switch (opcode) {
634
635 /* BEWARE!
636 It is essential that any operation that fails sets either
637 x to NULL, err to nonzero, or why to anything but WHY_NOT,
638 and that no operation that succeeds does this! */
639
640 /* case STOP_CODE: this is an error! */
641
642 case POP_TOP:
643 v = POP();
644 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000645 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000646
647 case ROT_TWO:
648 v = POP();
649 w = POP();
650 PUSH(v);
651 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000652 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000653
654 case ROT_THREE:
655 v = POP();
656 w = POP();
657 x = POP();
658 PUSH(v);
659 PUSH(x);
660 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000661 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000662
663 case DUP_TOP:
664 v = TOP();
665 INCREF(v);
666 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000667 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000668
669 case UNARY_POSITIVE:
670 v = POP();
671 x = pos(v);
672 DECREF(v);
673 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000674 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 break;
676
677 case UNARY_NEGATIVE:
678 v = POP();
679 x = neg(v);
680 DECREF(v);
681 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000682 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 break;
684
685 case UNARY_NOT:
686 v = POP();
687 x = not(v);
688 DECREF(v);
689 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 break;
692
693 case UNARY_CONVERT:
694 v = POP();
695 x = reprobject(v);
696 DECREF(v);
697 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000698 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000700
701 case UNARY_INVERT:
702 v = POP();
703 x = invert(v);
704 DECREF(v);
705 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000706 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000707 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000708
Guido van Rossum50564e81996-01-12 01:13:16 +0000709 case BINARY_POWER:
710 w = POP();
711 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000712 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000713 DECREF(v);
714 DECREF(w);
715 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000716 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000717 break;
718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 case BINARY_MULTIPLY:
720 w = POP();
721 v = POP();
722 x = mul(v, w);
723 DECREF(v);
724 DECREF(w);
725 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000726 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 break;
728
729 case BINARY_DIVIDE:
730 w = POP();
731 v = POP();
732 x = divide(v, w);
733 DECREF(v);
734 DECREF(w);
735 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 break;
738
739 case BINARY_MODULO:
740 w = POP();
741 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000742 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 DECREF(v);
744 DECREF(w);
745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 break;
748
749 case BINARY_ADD:
750 w = POP();
751 v = POP();
752 x = add(v, w);
753 DECREF(v);
754 DECREF(w);
755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 break;
758
759 case BINARY_SUBTRACT:
760 w = POP();
761 v = POP();
762 x = sub(v, w);
763 DECREF(v);
764 DECREF(w);
765 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000766 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 break;
768
769 case BINARY_SUBSCR:
770 w = POP();
771 v = POP();
772 x = apply_subscript(v, w);
773 DECREF(v);
774 DECREF(w);
775 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000776 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 break;
778
Guido van Rossum7928cd71991-10-24 14:59:31 +0000779 case BINARY_LSHIFT:
780 w = POP();
781 v = POP();
782 x = lshift(v, w);
783 DECREF(v);
784 DECREF(w);
785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000786 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000787 break;
788
789 case BINARY_RSHIFT:
790 w = POP();
791 v = POP();
792 x = rshift(v, w);
793 DECREF(v);
794 DECREF(w);
795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000796 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000797 break;
798
799 case BINARY_AND:
800 w = POP();
801 v = POP();
802 x = and(v, w);
803 DECREF(v);
804 DECREF(w);
805 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000806 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000807 break;
808
809 case BINARY_XOR:
810 w = POP();
811 v = POP();
812 x = xor(v, w);
813 DECREF(v);
814 DECREF(w);
815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000817 break;
818
819 case BINARY_OR:
820 w = POP();
821 v = POP();
822 x = or(v, w);
823 DECREF(v);
824 DECREF(w);
825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000826 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000827 break;
828
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 case SLICE+0:
830 case SLICE+1:
831 case SLICE+2:
832 case SLICE+3:
833 if ((opcode-SLICE) & 2)
834 w = POP();
835 else
836 w = NULL;
837 if ((opcode-SLICE) & 1)
838 v = POP();
839 else
840 v = NULL;
841 u = POP();
842 x = apply_slice(u, v, w);
843 DECREF(u);
844 XDECREF(v);
845 XDECREF(w);
846 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000847 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 break;
849
850 case STORE_SLICE+0:
851 case STORE_SLICE+1:
852 case STORE_SLICE+2:
853 case STORE_SLICE+3:
854 if ((opcode-STORE_SLICE) & 2)
855 w = POP();
856 else
857 w = NULL;
858 if ((opcode-STORE_SLICE) & 1)
859 v = POP();
860 else
861 v = NULL;
862 u = POP();
863 t = POP();
864 err = assign_slice(u, v, w, t); /* u[v:w] = t */
865 DECREF(t);
866 DECREF(u);
867 XDECREF(v);
868 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
871
872 case DELETE_SLICE+0:
873 case DELETE_SLICE+1:
874 case DELETE_SLICE+2:
875 case DELETE_SLICE+3:
876 if ((opcode-DELETE_SLICE) & 2)
877 w = POP();
878 else
879 w = NULL;
880 if ((opcode-DELETE_SLICE) & 1)
881 v = POP();
882 else
883 v = NULL;
884 u = POP();
885 err = assign_slice(u, v, w, (object *)NULL);
886 /* del u[v:w] */
887 DECREF(u);
888 XDECREF(v);
889 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 break;
892
893 case STORE_SUBSCR:
894 w = POP();
895 v = POP();
896 u = POP();
897 /* v[w] = u */
898 err = assign_subscript(v, w, u);
899 DECREF(u);
900 DECREF(v);
901 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
904
905 case DELETE_SUBSCR:
906 w = POP();
907 v = POP();
908 /* del v[w] */
909 err = assign_subscript(v, w, (object *)NULL);
910 DECREF(v);
911 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000912 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
914
915 case PRINT_EXPR:
916 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000918 /* Before printing, also assign to '_' */
919 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000920 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000921 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000923 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000924 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000925 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 flushline();
927 }
928 DECREF(v);
929 break;
930
931 case PRINT_ITEM:
932 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000933 w = sysget("stdout");
934 if (softspace(w, 1))
935 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000936 err = writeobject(v, w, PRINT_RAW);
937 if (err == 0 && is_stringobject(v)) {
938 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 char *s = getstringvalue(v);
940 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000941 if (len > 0 &&
942 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000943 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000944 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000947 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 break;
949
950 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000951 x = sysget("stdout");
952 if (x == NULL)
953 err_setstr(RuntimeError, "lost sys.stdout");
954 else {
955 writestring("\n", x);
956 softspace(x, 0);
957 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 break;
959
960 case BREAK_LOOP:
961 why = WHY_BREAK;
962 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000963
Guido van Rossumf10570b1995-07-07 22:53:21 +0000964 case RAISE_VARARGS:
965 u = v = w = NULL;
966 switch (oparg) {
967 case 3:
968 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000969 /* Fallthrough */
970 case 2:
971 v = POP(); /* value */
972 /* Fallthrough */
973 case 1:
974 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000975 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000976 break;
977 default:
978 err_setstr(SystemError,
979 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000980 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000981 break;
982 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000983 break;
984
985 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000986 if ((x = f->f_locals) == NULL) {
987 err_setstr(SystemError, "no locals");
988 break;
989 }
990 INCREF(x);
991 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 break;
993
994 case RETURN_VALUE:
995 retval = POP();
996 why = WHY_RETURN;
997 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000998
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000999 case EXEC_STMT:
1000 w = POP();
1001 v = POP();
1002 u = POP();
1003 err = exec_statement(u, v, w);
1004 DECREF(u);
1005 DECREF(v);
1006 DECREF(w);
1007 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001008
Guido van Rossum374a9221991-04-04 10:40:29 +00001009 case POP_BLOCK:
1010 {
1011 block *b = pop_block(f);
1012 while (STACK_LEVEL() > b->b_level) {
1013 v = POP();
1014 DECREF(v);
1015 }
1016 }
1017 break;
1018
1019 case END_FINALLY:
1020 v = POP();
1021 if (is_intobject(v)) {
1022 why = (enum why_code) getintvalue(v);
1023 if (why == WHY_RETURN)
1024 retval = POP();
1025 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001026 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001028 u = POP();
1029 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001031 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 }
1033 else if (v != None) {
1034 err_setstr(SystemError,
1035 "'finally' pops bad exception");
1036 why = WHY_EXCEPTION;
1037 }
1038 DECREF(v);
1039 break;
1040
1041 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001042 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001044 w = POP();
1045 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001047 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 DECREF(v);
1049 DECREF(w);
1050 break;
1051
1052 case STORE_NAME:
1053 w = GETNAMEV(oparg);
1054 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001055 if ((x = f->f_locals) == NULL) {
1056 err_setstr(SystemError, "no locals");
1057 break;
1058 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001059 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 DECREF(v);
1061 break;
1062
1063 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001064 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001065 if ((x = f->f_locals) == NULL) {
1066 err_setstr(SystemError, "no locals");
1067 break;
1068 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001069 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001070 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001072
1073#ifdef CASE_TOO_BIG
1074 default: switch (opcode) {
1075#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001076
1077 case UNPACK_TUPLE:
1078 v = POP();
1079 if (!is_tupleobject(v)) {
1080 err_setstr(TypeError, "unpack non-tuple");
1081 why = WHY_EXCEPTION;
1082 }
1083 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001084 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001085 "unpack tuple of wrong size");
1086 why = WHY_EXCEPTION;
1087 }
1088 else {
1089 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001090 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001091 INCREF(w);
1092 PUSH(w);
1093 }
1094 }
1095 DECREF(v);
1096 break;
1097
1098 case UNPACK_LIST:
1099 v = POP();
1100 if (!is_listobject(v)) {
1101 err_setstr(TypeError, "unpack non-list");
1102 why = WHY_EXCEPTION;
1103 }
1104 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001105 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 "unpack list of wrong size");
1107 why = WHY_EXCEPTION;
1108 }
1109 else {
1110 for (; --oparg >= 0; ) {
1111 w = getlistitem(v, oparg);
1112 INCREF(w);
1113 PUSH(w);
1114 }
1115 }
1116 DECREF(v);
1117 break;
1118
1119 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001120 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 v = POP();
1122 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001123 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 DECREF(v);
1125 DECREF(u);
1126 break;
1127
1128 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001129 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 DECREF(v);
1133 break;
1134
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001135 case STORE_GLOBAL:
1136 w = GETNAMEV(oparg);
1137 v = POP();
1138 err = dict2insert(f->f_globals, w, v);
1139 DECREF(v);
1140 break;
1141
1142 case DELETE_GLOBAL:
1143 w = GETNAMEV(oparg);
1144 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001145 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001146 break;
1147
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 case LOAD_CONST:
1149 x = GETCONST(oparg);
1150 INCREF(x);
1151 PUSH(x);
1152 break;
1153
1154 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001155 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001156 if ((x = f->f_locals) == NULL) {
1157 err_setstr(SystemError, "no locals");
1158 break;
1159 }
1160 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001162 err_clear();
1163 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001165 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001166 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001168 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 break;
1170 }
1171 }
1172 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001173 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001174 PUSH(x);
1175 break;
1176
1177 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001178 w = GETNAMEV(oparg);
1179 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001181 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001182 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001184 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001185 break;
1186 }
1187 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001188 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 PUSH(x);
1190 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001191
Guido van Rossum9bfef441993-03-29 10:43:31 +00001192 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001193 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001194 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001195 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001196 gettupleitem(co->co_varnames,
1197 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001198 break;
1199 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001200 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001201 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001202 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001203 break;
1204
1205 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001206 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001207 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001208 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001209
1210 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001211 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001212 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001213
1214 case BUILD_TUPLE:
1215 x = newtupleobject(oparg);
1216 if (x != NULL) {
1217 for (; --oparg >= 0;) {
1218 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001219 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 }
1221 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 }
1224 break;
1225
1226 case BUILD_LIST:
1227 x = newlistobject(oparg);
1228 if (x != NULL) {
1229 for (; --oparg >= 0;) {
1230 w = POP();
1231 err = setlistitem(x, oparg, w);
1232 if (err != 0)
1233 break;
1234 }
1235 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001236 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 }
1238 break;
1239
1240 case BUILD_MAP:
1241 x = newdictobject();
1242 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001243 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
1245
1246 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001247 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001249 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 DECREF(v);
1251 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001252 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
1254
1255 case COMPARE_OP:
1256 w = POP();
1257 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001258 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 DECREF(v);
1260 DECREF(w);
1261 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001262 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 break;
1264
1265 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001266 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001267 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001268 if (x == NULL) {
1269 err_setstr(ImportError,
1270 "__import__ not found");
1271 break;
1272 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001273 if (is_methodobject(x)) {
1274 u = None;
1275 INCREF(u);
1276 }
1277 else {
1278 u = find_from_args(f, INSTR_OFFSET());
1279 if (u == NULL) {
1280 x = u;
1281 break;
1282 }
1283 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001284 w = mkvalue("(OOOO)",
1285 w,
1286 f->f_globals,
1287 f->f_locals == NULL ? None : f->f_locals,
1288 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001289 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290 if (w == NULL) {
1291 x = NULL;
1292 break;
1293 }
1294 x = call_object(x, w);
1295 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001296 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001297 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
1299
1300 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001301 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001303 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001304 if ((x = f->f_locals) == NULL) {
1305 err_setstr(SystemError, "no locals");
1306 break;
1307 }
1308 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001309 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001310 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001311 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001312
Guido van Rossum374a9221991-04-04 10:40:29 +00001313 case JUMP_FORWARD:
1314 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001315 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001316
1317 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001318 err = testbool(TOP());
1319 if (err > 0)
1320 err = 0;
1321 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 else
1324 break;
1325 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001326
1327 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001328 err = testbool(TOP());
1329 if (err > 0) {
1330 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001332 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001333 else if (err == 0)
1334 ;
1335 else
1336 break;
1337 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338
1339 case JUMP_ABSOLUTE:
1340 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001341 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001342
1343 case FOR_LOOP:
1344 /* for v in s: ...
1345 On entry: stack contains s, i.
1346 On exit: stack contains s, i+1, s[i];
1347 but if loop exhausted:
1348 s, i are popped, and we jump */
1349 w = POP(); /* Loop index */
1350 v = POP(); /* Sequence object */
1351 u = loop_subscript(v, w);
1352 if (u != NULL) {
1353 PUSH(v);
1354 x = newintobject(getintvalue(w)+1);
1355 PUSH(x);
1356 DECREF(w);
1357 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001358 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 }
1360 else {
1361 DECREF(v);
1362 DECREF(w);
1363 /* A NULL can mean "s exhausted"
1364 but also an error: */
1365 if (err_occurred())
1366 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001367 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 continue;
1370 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001371 }
1372 break;
1373
1374 case SETUP_LOOP:
1375 case SETUP_EXCEPT:
1376 case SETUP_FINALLY:
1377 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1378 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001379 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001380
1381 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001382#ifdef LLTRACE
1383 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001384 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001385#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001386 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001387 if (f->f_trace == NULL)
1388 continue;
1389 /* Trace each line of code reached */
1390 f->f_lasti = INSTR_OFFSET();
1391 err = call_trace(&f->f_trace, &f->f_trace,
1392 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001394
1395 case CALL_FUNCTION:
1396 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001397 int na = oparg & 0xff;
1398 int nk = (oparg>>8) & 0xff;
1399 int n = na + 2*nk;
1400 object **pfunc = stack_pointer - n - 1;
1401 object *func = *pfunc;
1402 object *self = NULL;
1403 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001404 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001405 if (is_instancemethodobject(func)) {
1406 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001407 class = instancemethodgetclass(func);
1408 func = instancemethodgetfunc(func);
1409 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001410 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001411 INCREF(self);
1412 DECREF(*pfunc);
1413 *pfunc = self;
1414 na++;
1415 n++;
1416 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001417 else {
1418 /* Unbound methods must be
1419 called with an instance of
1420 the class (or a derived
1421 class) as first argument */
1422 if (na > 0 &&
1423 (self = stack_pointer[-n])
1424 != NULL &&
1425 is_instanceobject(self) &&
1426 issubclass(
1427 (object *)
1428 (((instanceobject *)self)
1429 ->in_class),
1430 class))
1431 /* Handy-dandy */ ;
1432 else {
1433 err_setstr(TypeError,
1434 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001435 x = NULL;
1436 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001437 }
1438 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 }
1440 else
1441 INCREF(func);
1442 if (is_funcobject(func)) {
1443 object *co = getfunccode(func);
1444 object *globals = getfuncglobals(func);
1445 object *argdefs = PyFunction_GetDefaults(func);
1446 object **d;
1447 int nd;
1448 if (argdefs != NULL) {
1449 d = &GETTUPLEITEM(argdefs, 0);
1450 nd = ((tupleobject *)argdefs)->ob_size;
1451 }
1452 else {
1453 d = NULL;
1454 nd = 0;
1455 }
1456 x = eval_code2(
1457 (codeobject *)co,
1458 globals, (object *)NULL,
1459 stack_pointer-n, na,
1460 stack_pointer-2*nk, nk,
1461 d, nd,
1462 class);
1463 }
1464 else {
1465 object *args = newtupleobject(na);
1466 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001467 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001468 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001469 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001470 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001471 if (nk > 0) {
1472 kwdict = newdictobject();
1473 if (kwdict == NULL) {
1474 x = NULL;
1475 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001476 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001477 err = 0;
1478 while (--nk >= 0) {
1479 object *value = POP();
1480 object *key = POP();
1481 err = mappinginsert(
1482 kwdict, key, value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001483 DECREF(key);
1484 DECREF(value);
1485 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001486 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001487 }
1488 if (err) {
1489 DECREF(args);
1490 DECREF(kwdict);
1491 break;
1492 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001493 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001494 while (--na >= 0) {
1495 w = POP();
1496 SETTUPLEITEM(args, na, w);
1497 }
1498 x = PyEval_CallObjectWithKeywords(
1499 func, args, kwdict);
1500 DECREF(args);
1501 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001502 }
1503 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 while (stack_pointer > pfunc) {
1505 w = POP();
1506 DECREF(w);
1507 }
1508 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001509 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001510 break;
1511 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001512
Guido van Rossum681d79a1995-07-18 14:51:37 +00001513 case MAKE_FUNCTION:
1514 v = POP(); /* code object */
1515 x = newfuncobject(v, f->f_globals);
1516 DECREF(v);
1517 /* XXX Maybe this should be a separate opcode? */
1518 if (x != NULL && oparg > 0) {
1519 v = newtupleobject(oparg);
1520 if (v == NULL) {
1521 DECREF(x);
1522 x = NULL;
1523 break;
1524 }
1525 while (--oparg >= 0) {
1526 w = POP();
1527 SETTUPLEITEM(v, oparg, w);
1528 }
1529 err = PyFunction_SetDefaults(x, v);
1530 DECREF(v);
1531 }
1532 PUSH(x);
1533 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001534
1535 case BUILD_SLICE:
1536 if (oparg == 3)
1537 w = POP();
1538 else
1539 w = NULL;
1540 v = POP();
1541 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001542 x = PySlice_New(u, v, w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001543 DECREF(u);
1544 DECREF(v);
1545 XDECREF(w);
1546 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001547 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001548 break;
1549
1550
Guido van Rossum374a9221991-04-04 10:40:29 +00001551 default:
1552 fprintf(stderr,
1553 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001554 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 why = WHY_EXCEPTION;
1557 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001558
1559#ifdef CASE_TOO_BIG
1560 }
1561#endif
1562
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 } /* switch */
1564
1565 on_error:
1566
1567 /* Quickly continue if no error occurred */
1568
1569 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001570 if (err == 0 && x != NULL) {
1571#ifdef CHECKEXC
1572 if (err_occurred())
1573 fprintf(stderr,
1574 "XXX undetected error\n");
1575 else
1576#endif
1577 continue; /* Normal, fast path */
1578 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 why = WHY_EXCEPTION;
1580 x = None;
1581 err = 0;
1582 }
1583
Guido van Rossum801dcae1992-04-08 11:32:32 +00001584#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 /* Double-check exception status */
1586
1587 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1588 if (!err_occurred()) {
1589 fprintf(stderr, "XXX ghost error\n");
1590 err_setstr(SystemError, "ghost error");
1591 why = WHY_EXCEPTION;
1592 }
1593 }
1594 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001595 if (err_occurred()) {
1596 fprintf(stderr,
1597 "XXX undetected error (why=%d)\n",
1598 why);
1599 why = WHY_EXCEPTION;
1600 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 }
1602#endif
1603
1604 /* Log traceback info if this is a real exception */
1605
1606 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001607 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001609 f->f_lasti -= 2;
1610 tb_here(f);
1611
Guido van Rossume59214e1994-08-30 08:01:59 +00001612 if (f->f_trace)
1613 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001614 if (sys_profile)
1615 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 }
1617
1618 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1619
1620 if (why == WHY_RERAISE)
1621 why = WHY_EXCEPTION;
1622
1623 /* Unwind stacks if a (pseudo) exception occurred */
1624
1625 while (why != WHY_NOT && f->f_iblock > 0) {
1626 block *b = pop_block(f);
1627 while (STACK_LEVEL() > b->b_level) {
1628 v = POP();
1629 XDECREF(v);
1630 }
1631 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1632 why = WHY_NOT;
1633 JUMPTO(b->b_handler);
1634 break;
1635 }
1636 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001637 (b->b_type == SETUP_EXCEPT &&
1638 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001640 object *exc, *val, *tb;
1641 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 if (val == NULL) {
1643 val = None;
1644 INCREF(val);
1645 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 /* Make the raw exception data
1647 available to the handler,
1648 so a program can emulate the
1649 Python main loop. Don't do
1650 this for 'finally'. */
1651 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001652 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001653 sysset("exc_value", val);
1654 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001656 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 PUSH(val);
1658 PUSH(exc);
1659 }
1660 else {
1661 if (why == WHY_RETURN)
1662 PUSH(retval);
1663 v = newintobject((long)why);
1664 PUSH(v);
1665 }
1666 why = WHY_NOT;
1667 JUMPTO(b->b_handler);
1668 break;
1669 }
1670 } /* unwind stack */
1671
1672 /* End the loop if we still have an error (or return) */
1673
1674 if (why != WHY_NOT)
1675 break;
1676
1677 } /* main loop */
1678
1679 /* Pop remaining stack entries */
1680
1681 while (!EMPTY()) {
1682 v = POP();
1683 XDECREF(v);
1684 }
1685
Guido van Rossum96a42c81992-01-12 02:29:51 +00001686 if (why != WHY_RETURN)
1687 retval = NULL;
1688
Guido van Rossume59214e1994-08-30 08:01:59 +00001689 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001690 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001691 if (call_trace(&f->f_trace, &f->f_trace, f,
1692 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001693 XDECREF(retval);
1694 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001695 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001697 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001698 }
1699
1700 if (sys_profile && why == WHY_RETURN) {
1701 if (call_trace(&sys_profile, (object**)0,
1702 f, "return", retval)) {
1703 XDECREF(retval);
1704 retval = NULL;
1705 why = WHY_EXCEPTION;
1706 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001707 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001708
Guido van Rossum8c5df061997-01-24 04:19:24 +00001709 --recursion_depth;
1710
1711 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001712
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001714
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 current_frame = f->f_back;
1716 DECREF(f);
1717
Guido van Rossum96a42c81992-01-12 02:29:51 +00001718 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001719}
1720
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001721/* Logic for the raise statement (too complicated for inlining).
1722 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001723static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001724do_raise(type, value, tb)
1725 object *type, *value, *tb;
1726{
1727 /* We support the following forms of raise:
1728 raise <class>, <classinstance>
1729 raise <class>, <argument tuple>
1730 raise <class>, None
1731 raise <class>, <argument>
1732 raise <classinstance>, None
1733 raise <string>, <object>
1734 raise <string>, None
1735
1736 An omitted second argument is the same as None.
1737
1738 In addition, raise <tuple>, <anything> is the same as
1739 raising the tuple's first item (and it better have one!);
1740 this rule is applied recursively.
1741
1742 Finally, an optional third argument can be supplied, which
1743 gives the traceback to be substituted (useful when
1744 re-raising an exception after examining it). */
1745
1746 /* First, check the traceback argument, replacing None with
1747 NULL. */
1748 if (tb == None) {
1749 DECREF(tb);
1750 tb = NULL;
1751 }
1752 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1753 err_setstr(TypeError,
1754 "raise 3rd arg must be traceback or None");
1755 goto raise_error;
1756 }
1757
1758 /* Next, replace a missing value with None */
1759 if (value == NULL) {
1760 value = None;
1761 INCREF(value);
1762 }
1763
1764 /* Next, repeatedly, replace a tuple exception with its first item */
1765 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1766 object *tmp = type;
1767 type = GETTUPLEITEM(type, 0);
1768 INCREF(type);
1769 DECREF(tmp);
1770 }
1771
1772 /* Now switch on the exception's type */
1773 if (is_stringobject(type)) {
1774 ;
1775 }
1776 else if (is_classobject(type)) {
1777 /* Raising a class. If the value is an instance, it
1778 better be an instance of the class. If it is not,
1779 it will be used to create an instance. */
1780 if (is_instanceobject(value)) {
1781 object *inclass = (object*)
1782 (((instanceobject*)value)->in_class);
1783 if (!issubclass(inclass, type)) {
1784 err_setstr(TypeError,
1785 "raise <class>, <instance> requires that <instance> is a member of <class>");
1786 goto raise_error;
1787 }
1788 }
1789 else {
1790 /* Go instantiate the class */
1791 object *args, *res;
1792 if (value == None)
1793 args = mkvalue("()");
1794 else if (is_tupleobject(value)) {
1795 INCREF(value);
1796 args = value;
1797 }
1798 else
1799 args = mkvalue("(O)", value);
1800 if (args == NULL)
1801 goto raise_error;
1802 res = call_object(type, args);
1803 DECREF(args);
1804 if (res == NULL)
1805 goto raise_error;
1806 DECREF(value);
1807 value = res;
1808 }
1809 }
1810 else if (is_instanceobject(type)) {
1811 /* Raising an instance. The value should be a dummy. */
1812 if (value != None) {
1813 err_setstr(TypeError,
1814 "instance exception may not have a separate value");
1815 goto raise_error;
1816 }
1817 else {
1818 /* Normalize to raise <class>, <instance> */
1819 DECREF(value);
1820 value = type;
1821 type = (object*) ((instanceobject*)type)->in_class;
1822 INCREF(type);
1823 }
1824 }
1825 else {
1826 /* Not something you can raise. You get an exception
1827 anyway, just not what you specified :-) */
1828 err_setstr(TypeError,
1829 "exceptions must be strings, classes, or instances");
1830 goto raise_error;
1831 }
1832 err_restore(type, value, tb);
1833 if (tb == NULL)
1834 return WHY_EXCEPTION;
1835 else
1836 return WHY_RERAISE;
1837 raise_error:
1838 XDECREF(value);
1839 XDECREF(type);
1840 XDECREF(tb);
1841 return WHY_EXCEPTION;
1842}
1843
Guido van Rossum96a42c81992-01-12 02:29:51 +00001844#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001845static int
1846prtrace(v, str)
1847 object *v;
1848 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001850 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001851 if (printobject(v, stdout, 0) != 0)
1852 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001853 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001855#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001857static void
1858call_exc_trace(p_trace, p_newtrace, f)
1859 object **p_trace, **p_newtrace;
1860 frameobject *f;
1861{
1862 object *type, *value, *traceback, *arg;
1863 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001865 if (value == NULL) {
1866 value = None;
1867 INCREF(value);
1868 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 arg = mkvalue("(OOO)", type, value, traceback);
1870 if (arg == NULL) {
1871 err_restore(type, value, traceback);
1872 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001873 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001874 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1875 DECREF(arg);
1876 if (err == 0)
1877 err_restore(type, value, traceback);
1878 else {
1879 XDECREF(type);
1880 XDECREF(value);
1881 XDECREF(traceback);
1882 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001883}
1884
1885static int
1886call_trace(p_trace, p_newtrace, f, msg, arg)
1887 object **p_trace; /* in/out; may not be NULL;
1888 may not point to NULL variable initially */
1889 object **p_newtrace; /* in/out; may be NULL;
1890 may point to NULL variable;
1891 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001892 frameobject *f;
1893 char *msg;
1894 object *arg;
1895{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001896 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001897 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001898 static int tracing = 0;
1899
1900 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001901 /* Don't do recursive traces */
1902 if (p_newtrace) {
1903 XDECREF(*p_newtrace);
1904 *p_newtrace = NULL;
1905 }
1906 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001907 }
1908
Guido van Rossumf10570b1995-07-07 22:53:21 +00001909 args = newtupleobject(3);
1910 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001911 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001912 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001913 if (what == NULL)
1914 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001915 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001916 SETTUPLEITEM(args, 0, (object *)f);
1917 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001918 if (arg == NULL)
1919 arg = None;
1920 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001921 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001922 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001923 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001924 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001925 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001926 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001927 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001928 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001929 if (res == NULL) {
1930 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001931 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001932 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001933 *p_trace = NULL;
1934 if (p_newtrace) {
1935 XDECREF(*p_newtrace);
1936 *p_newtrace = NULL;
1937 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001938 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001939 }
1940 else {
1941 if (p_newtrace) {
1942 XDECREF(*p_newtrace);
1943 if (res == None)
1944 *p_newtrace = NULL;
1945 else {
1946 INCREF(res);
1947 *p_newtrace = res;
1948 }
1949 }
1950 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001951 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001952 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001953}
1954
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001956getbuiltins()
1957{
1958 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001959 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001960 else
1961 return current_frame->f_builtins;
1962}
1963
1964object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001965getlocals()
1966{
1967 if (current_frame == NULL)
1968 return NULL;
1969 fast_2_locals(current_frame);
1970 return current_frame->f_locals;
1971}
1972
1973object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001974getglobals()
1975{
1976 if (current_frame == NULL)
1977 return NULL;
1978 else
1979 return current_frame->f_globals;
1980}
1981
Guido van Rossum81daa321993-05-20 14:24:46 +00001982object *
Guido van Rossume59214e1994-08-30 08:01:59 +00001983getframe()
1984{
1985 return (object *)current_frame;
1986}
1987
Guido van Rossum6135a871995-01-09 17:53:26 +00001988int
1989getrestricted()
1990{
1991 return current_frame == NULL ? 0 : current_frame->f_restricted;
1992}
1993
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995flushline()
1996{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001997 object *f = sysget("stdout");
1998 if (softspace(f, 0))
1999 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000}
2001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002002
Guido van Rossum06186511995-01-07 12:40:10 +00002003#define BINOP(opname, ropname, thisfunc) \
2004 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2005 ; \
2006 else \
2007 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002008
2009
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002011or(v, w)
2012 object *v, *w;
2013{
Guido van Rossum06186511995-01-07 12:40:10 +00002014 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002015 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002016 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002017 object * (*f) FPROTO((object *, object *));
2018 if (coerce(&v, &w) != 0)
2019 return NULL;
2020 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2021 x = (*f)(v, w);
2022 DECREF(v);
2023 DECREF(w);
2024 if (f != NULL)
2025 return x;
2026 }
2027 err_setstr(TypeError, "bad operand type(s) for |");
2028 return NULL;
2029}
2030
2031static object *
2032xor(v, w)
2033 object *v, *w;
2034{
Guido van Rossum06186511995-01-07 12:40:10 +00002035 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002036 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002037 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002038 object * (*f) FPROTO((object *, object *));
2039 if (coerce(&v, &w) != 0)
2040 return NULL;
2041 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2042 x = (*f)(v, w);
2043 DECREF(v);
2044 DECREF(w);
2045 if (f != NULL)
2046 return x;
2047 }
2048 err_setstr(TypeError, "bad operand type(s) for ^");
2049 return NULL;
2050}
2051
2052static object *
2053and(v, w)
2054 object *v, *w;
2055{
Guido van Rossum06186511995-01-07 12:40:10 +00002056 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002057 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002058 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002059 object * (*f) FPROTO((object *, object *));
2060 if (coerce(&v, &w) != 0)
2061 return NULL;
2062 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2063 x = (*f)(v, w);
2064 DECREF(v);
2065 DECREF(w);
2066 if (f != NULL)
2067 return x;
2068 }
2069 err_setstr(TypeError, "bad operand type(s) for &");
2070 return NULL;
2071}
2072
2073static object *
2074lshift(v, w)
2075 object *v, *w;
2076{
Guido van Rossum06186511995-01-07 12:40:10 +00002077 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002078 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002079 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002080 object * (*f) FPROTO((object *, object *));
2081 if (coerce(&v, &w) != 0)
2082 return NULL;
2083 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2084 x = (*f)(v, w);
2085 DECREF(v);
2086 DECREF(w);
2087 if (f != NULL)
2088 return x;
2089 }
2090 err_setstr(TypeError, "bad operand type(s) for <<");
2091 return NULL;
2092}
2093
2094static object *
2095rshift(v, w)
2096 object *v, *w;
2097{
Guido van Rossum06186511995-01-07 12:40:10 +00002098 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002099 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002100 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002101 object * (*f) FPROTO((object *, object *));
2102 if (coerce(&v, &w) != 0)
2103 return NULL;
2104 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2105 x = (*f)(v, w);
2106 DECREF(v);
2107 DECREF(w);
2108 if (f != NULL)
2109 return x;
2110 }
2111 err_setstr(TypeError, "bad operand type(s) for >>");
2112 return NULL;
2113}
2114
2115static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002116add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 object *v, *w;
2118{
Guido van Rossum06186511995-01-07 12:40:10 +00002119 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002120 if (v->ob_type->tp_as_sequence != NULL)
2121 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2122 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002123 object *x;
2124 if (coerce(&v, &w) != 0)
2125 return NULL;
2126 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2127 DECREF(v);
2128 DECREF(w);
2129 return x;
2130 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002131 err_setstr(TypeError, "bad operand type(s) for +");
2132 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133}
2134
2135static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002136sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 object *v, *w;
2138{
Guido van Rossum06186511995-01-07 12:40:10 +00002139 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002140 if (v->ob_type->tp_as_number != NULL) {
2141 object *x;
2142 if (coerce(&v, &w) != 0)
2143 return NULL;
2144 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2145 DECREF(v);
2146 DECREF(w);
2147 return x;
2148 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002149 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150 return NULL;
2151}
2152
2153static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002154mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 object *v, *w;
2156{
2157 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002158 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002159 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002160 if (tp->tp_as_number != NULL &&
2161 w->ob_type->tp_as_sequence != NULL &&
2162 !is_instanceobject(v)) {
2163 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 object *tmp = v;
2165 v = w;
2166 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002167 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002169 if (tp->tp_as_number != NULL) {
2170 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002171 if (is_instanceobject(v)) {
2172 /* Instances of user-defined classes get their
2173 other argument uncoerced, so they may
2174 implement sequence*number as well as
2175 number*number. */
2176 INCREF(v);
2177 INCREF(w);
2178 }
2179 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002180 return NULL;
2181 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2182 DECREF(v);
2183 DECREF(w);
2184 return x;
2185 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 if (tp->tp_as_sequence != NULL) {
2187 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002188 err_setstr(TypeError,
2189 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 return NULL;
2191 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002192 return (*tp->tp_as_sequence->sq_repeat)
2193 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002195 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 return NULL;
2197}
2198
2199static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002200divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 object *v, *w;
2202{
Guido van Rossum06186511995-01-07 12:40:10 +00002203 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002204 if (v->ob_type->tp_as_number != NULL) {
2205 object *x;
2206 if (coerce(&v, &w) != 0)
2207 return NULL;
2208 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2209 DECREF(v);
2210 DECREF(w);
2211 return x;
2212 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002213 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 return NULL;
2215}
2216
2217static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002218mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 object *v, *w;
2220{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002221 if (is_stringobject(v)) {
2222 return formatstring(v, w);
2223 }
Guido van Rossum06186511995-01-07 12:40:10 +00002224 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002225 if (v->ob_type->tp_as_number != NULL) {
2226 object *x;
2227 if (coerce(&v, &w) != 0)
2228 return NULL;
2229 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2230 DECREF(v);
2231 DECREF(w);
2232 return x;
2233 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002234 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 return NULL;
2236}
2237
2238static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002239powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002240 object *v, *w;
2241{
2242 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002243 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002244 if (v->ob_type->tp_as_number == NULL ||
2245 w->ob_type->tp_as_number == NULL) {
2246 err_setstr(TypeError, "pow() requires numeric arguments");
2247 return NULL;
2248 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002249 if (coerce(&v, &w) != 0)
2250 return NULL;
2251 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2252 DECREF(v);
2253 DECREF(w);
2254 return res;
2255}
2256
2257static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002258neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 object *v;
2260{
2261 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262 return (*v->ob_type->tp_as_number->nb_negative)(v);
2263 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 return NULL;
2265}
2266
2267static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002268pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269 object *v;
2270{
2271 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002272 return (*v->ob_type->tp_as_number->nb_positive)(v);
2273 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 return NULL;
2275}
2276
2277static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002278invert(v)
2279 object *v;
2280{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002281 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002282 if (v->ob_type->tp_as_number != NULL &&
2283 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2284 return (*f)(v);
2285 err_setstr(TypeError, "bad operand type(s) for unary ~");
2286 return NULL;
2287}
2288
2289static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 object *v;
2292{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002294 object *w;
2295 if (outcome < 0)
2296 return NULL;
2297 if (outcome == 0)
2298 w = True;
2299 else
2300 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002301 INCREF(w);
2302 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303}
Guido van Rossum234f9421993-06-17 12:35:49 +00002304
2305
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306/* External interface to call any callable object.
2307 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002308
2309object *
2310call_object(func, arg)
2311 object *func;
2312 object *arg;
2313{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002314 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2315}
Guido van Rossume59214e1994-08-30 08:01:59 +00002316
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317object *
2318PyEval_CallObjectWithKeywords(func, arg, kw)
2319 object *func;
2320 object *arg;
2321 object *kw;
2322{
2323 ternaryfunc call;
2324 object *result;
2325
2326 if (arg == NULL)
2327 arg = newtupleobject(0);
2328 else if (!is_tupleobject(arg)) {
2329 err_setstr(TypeError, "argument list must be a tuple");
2330 return NULL;
2331 }
2332 else
2333 INCREF(arg);
2334
Guido van Rossume3e61c11995-08-04 04:14:47 +00002335 if (kw != NULL && !is_dictobject(kw)) {
2336 err_setstr(TypeError, "keyword list must be a dictionary");
2337 return NULL;
2338 }
2339
Guido van Rossum150b2df1996-12-05 23:17:11 +00002340 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341 result = (*call)(func, arg, kw);
2342 else if (is_instancemethodobject(func) || is_funcobject(func))
2343 result = call_function(func, arg, kw);
2344 else
2345 result = call_builtin(func, arg, kw);
2346
2347 DECREF(arg);
2348
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002349 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002350 err_setstr(SystemError,
2351 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002352
2353 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002354}
2355
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002357call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 if (is_methodobject(func)) {
2363 method meth = getmethod(func);
2364 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002365 int flags = getflags(func);
2366 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002367 int size = gettuplesize(arg);
2368 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002369 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002370 else if (size == 0)
2371 arg = NULL;
2372 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002373 if (flags & METH_KEYWORDS)
2374 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002375 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002376 err_setstr(TypeError,
2377 "this function takes no keyword arguments");
2378 return NULL;
2379 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 }
2382 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002383 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002385 if (is_instanceobject(func)) {
2386 object *res, *call = getattr(func,"__call__");
2387 if (call == NULL) {
2388 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002389 err_setstr(AttributeError,
2390 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002391 return NULL;
2392 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002393 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002394 DECREF(call);
2395 return res;
2396 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002397 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 return NULL;
2399}
2400
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002402call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002407 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002408 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002409 object **d, **k;
2410 int nk, nd;
2411 object *result;
2412
2413 if (kw != NULL && !is_dictobject(kw)) {
2414 err_badcall();
2415 return NULL;
2416 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417
Guido van Rossume8122f11991-05-05 20:03:07 +00002418 if (is_instancemethodobject(func)) {
2419 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002420 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002421 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002422 if (self == NULL) {
2423 /* Unbound methods must be called with an instance of
2424 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002426 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002427 if (self != NULL &&
2428 is_instanceobject(self) &&
2429 issubclass((object *)
2430 (((instanceobject *)self)->in_class),
2431 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002433 else
2434 self = NULL;
2435 }
2436 if (self == NULL) {
2437 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002438 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002439 return NULL;
2440 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002442 }
2443 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 int argcount = gettuplesize(arg);
2445 object *newarg = newtupleobject(argcount + 1);
2446 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002447 if (newarg == NULL)
2448 return NULL;
2449 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002450 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 for (i = 0; i < argcount; i++) {
2452 object *v = GETTUPLEITEM(arg, i);
2453 XINCREF(v);
2454 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002455 }
2456 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 }
2458 }
2459 else {
2460 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002461 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 return NULL;
2463 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002466
2467 argdefs = PyFunction_GetDefaults(func);
2468 if (argdefs != NULL && is_tupleobject(argdefs)) {
2469 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2470 nd = gettuplesize(argdefs);
2471 }
2472 else {
2473 d = NULL;
2474 nd = 0;
2475 }
2476
2477 if (kw != NULL) {
2478 int pos, i;
2479 nk = getmappingsize(kw);
2480 k = NEW(object *, 2*nk);
2481 if (k == NULL) {
2482 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002483 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002484 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002485 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 pos = i = 0;
2487 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2488 i += 2;
2489 nk = i/2;
2490 /* XXX This is broken if the caller deletes dict items! */
2491 }
2492 else {
2493 k = NULL;
2494 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002495 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496
Guido van Rossum681d79a1995-07-18 14:51:37 +00002497 result = eval_code2(
2498 (codeobject *)getfunccode(func),
2499 getfuncglobals(func), (object *)NULL,
2500 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2501 k, nk,
2502 d, nd,
2503 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504
Guido van Rossum681d79a1995-07-18 14:51:37 +00002505 DECREF(arg);
2506 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507
Guido van Rossum681d79a1995-07-18 14:51:37 +00002508 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509}
2510
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002511#define SLICE_ERROR_MSG \
2512 "standard sequence type does not support step size other than one"
2513
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002515apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 object *v, *w;
2517{
2518 typeobject *tp = v->ob_type;
2519 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002520 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 return NULL;
2522 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002523 if (tp->tp_as_mapping != NULL) {
2524 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2525 }
2526 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002528 if (!is_intobject(w)) {
2529 if (PySlice_Check(w)) {
2530 err_setstr(ValueError, SLICE_ERROR_MSG);
2531 } else {
2532 err_setstr(TypeError,
2533 "sequence subscript not int");
2534 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 return NULL;
2536 }
2537 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002538 if (i < 0) {
2539 int len = (*tp->tp_as_sequence->sq_length)(v);
2540 if (len < 0)
2541 return NULL;
2542 i += len;
2543 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546}
2547
2548static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 object *v, *w;
2551{
2552 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002553 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002555 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556 return NULL;
2557 }
2558 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002559 v = (*sq->sq_item)(v, i);
2560 if (v)
2561 return v;
2562 if (err_occurred() == IndexError)
2563 err_clear();
2564 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565}
2566
2567static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 object *v;
2570 int isize;
2571 int *pi;
2572{
2573 if (v != NULL) {
2574 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 err_setstr(TypeError, "slice index must be int");
2576 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 }
2578 *pi = getintvalue(v);
2579 if (*pi < 0)
2580 *pi += isize;
2581 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002582 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583}
2584
2585static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002586apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587 object *u, *v, *w;
2588{
2589 typeobject *tp = u->ob_type;
2590 int ilow, ihigh, isize;
2591 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 return NULL;
2594 }
2595 ilow = 0;
2596 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002597 if (isize < 0)
2598 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605
2606static int
2607assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 object *w;
2609 object *key;
2610 object *v;
2611{
2612 typeobject *tp = w->ob_type;
2613 sequence_methods *sq;
2614 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002615 int (*func1)();
2616 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002617 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002618 (func1 = mp->mp_ass_subscript) != NULL) {
2619 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002620 }
2621 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002622 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002624 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002625 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002628 else {
2629 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002630 if (i < 0) {
2631 int len = (*sq->sq_length)(w);
2632 if (len < 0)
2633 return -1;
2634 i += len;
2635 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002636 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002637 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640 err_setstr(TypeError,
2641 "can't assign to this subscripted object");
2642 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644}
2645
Guido van Rossum3f5da241990-12-20 15:06:42 +00002646static int
2647assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 object *u, *v, *w, *x;
2649{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 if (sq == NULL) {
2653 err_setstr(TypeError, "assign to slice of non-sequence");
2654 return -1;
2655 }
2656 if (sq == NULL || sq->sq_ass_slice == NULL) {
2657 err_setstr(TypeError, "unassignable slice");
2658 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 }
2660 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002661 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002662 if (isize < 0)
2663 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 if (slice_index(v, isize, &ilow) != 0)
2665 return -1;
2666 if (slice_index(w, isize, &ihigh) != 0)
2667 return -1;
2668 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669}
2670
2671static int
2672cmp_exception(err, v)
2673 object *err, *v;
2674{
2675 if (is_tupleobject(v)) {
2676 int i, n;
2677 n = gettuplesize(v);
2678 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002679 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002680 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 return 1;
2682 }
2683 return 0;
2684 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002685 if (is_classobject(v) && is_classobject(err))
2686 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 return err == v;
2688}
2689
Guido van Rossum3f5da241990-12-20 15:06:42 +00002690static int
2691cmp_member(v, w)
2692 object *v, *w;
2693{
Guido van Rossume59214e1994-08-30 08:01:59 +00002694 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002695 object *x;
2696 sequence_methods *sq;
2697 /* Special case for char in string */
2698 if (is_stringobject(w)) {
2699 register char *s, *end;
2700 register char c;
2701 if (!is_stringobject(v) || getstringsize(v) != 1) {
2702 err_setstr(TypeError,
2703 "string member test needs char left operand");
2704 return -1;
2705 }
2706 c = getstringvalue(v)[0];
2707 s = getstringvalue(w);
2708 end = s + getstringsize(w);
2709 while (s < end) {
2710 if (c == *s++)
2711 return 1;
2712 }
2713 return 0;
2714 }
2715 sq = w->ob_type->tp_as_sequence;
2716 if (sq == NULL) {
2717 err_setstr(TypeError,
2718 "'in' or 'not in' needs sequence right argument");
2719 return -1;
2720 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002721 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002722 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002723 if (x == NULL) {
2724 if (err_occurred() == IndexError) {
2725 err_clear();
2726 break;
2727 }
2728 return -1;
2729 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 cmp = cmpobject(v, x);
2731 XDECREF(x);
2732 if (cmp == 0)
2733 return 1;
2734 }
2735 return 0;
2736}
2737
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002739cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002740 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 register object *v;
2742 register object *w;
2743{
2744 register int cmp;
2745 register int res = 0;
2746 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002747 case IS:
2748 case IS_NOT:
2749 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002750 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002751 res = !res;
2752 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 case IN:
2754 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002755 res = cmp_member(v, w);
2756 if (res < 0)
2757 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002758 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 break;
2761 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002762 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 break;
2764 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002765 cmp = cmpobject(v, w);
2766 switch (op) {
2767 case LT: res = cmp < 0; break;
2768 case LE: res = cmp <= 0; break;
2769 case EQ: res = cmp == 0; break;
2770 case NE: res = cmp != 0; break;
2771 case GT: res = cmp > 0; break;
2772 case GE: res = cmp >= 0; break;
2773 /* XXX no default? (res is initialized to 0 though) */
2774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 }
2776 v = res ? True : False;
2777 INCREF(v);
2778 return v;
2779}
2780
Guido van Rossum3f5da241990-12-20 15:06:42 +00002781static int
2782import_from(locals, v, name)
2783 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002784 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002785 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002786{
2787 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002789 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002790 return -1;
2791 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002792 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002793 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002794 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002795 object *name, *value;
2796 pos = 0;
2797 while (mappinggetnext(w, &pos, &name, &value)) {
2798 if (!is_stringobject(name) ||
2799 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002800 continue;
Guido van Rossum1aa14831997-01-21 05:34:20 +00002801 INCREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002802 err = dict2insert(locals, name, value);
2803 DECREF(value);
2804 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002805 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002806 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002807 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002808 }
2809 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002810 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002812 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002813 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002814 getstringvalue(name));
2815 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002816 return -1;
2817 }
2818 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002819 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002820 }
2821}
2822
2823static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002824build_class(methods, bases, name)
2825 object *methods; /* dictionary */
2826 object *bases; /* tuple containing classes */
2827 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002828{
Guido van Rossum25831651993-05-19 14:50:45 +00002829 int i;
2830 if (!is_tupleobject(bases)) {
2831 err_setstr(SystemError, "build_class with non-tuple bases");
2832 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002833 }
Guido van Rossum25831651993-05-19 14:50:45 +00002834 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002835 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002836 return NULL;
2837 }
Guido van Rossum25831651993-05-19 14:50:45 +00002838 if (!is_stringobject(name)) {
2839 err_setstr(SystemError, "build_class witn non-string name");
2840 return NULL;
2841 }
2842 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002843 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002844 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002845 /* Call the base's *type*, if it is callable.
2846 This code is a hook for Donald Beaudry's
2847 and Jim Fulton's type extensions. In
2848 unexended Python it will never be triggered
2849 since its types are not callable. */
2850 if (base->ob_type->ob_type->tp_call) {
2851 object *args;
2852 object *class;
2853 args = mkvalue("(OOO)", name, bases, methods);
2854 class = call_object((object *)base->ob_type,
2855 args);
2856 DECREF(args);
2857 return class;
2858 }
Guido van Rossum25831651993-05-19 14:50:45 +00002859 err_setstr(TypeError,
2860 "base is not a class object");
2861 return NULL;
2862 }
2863 }
2864 return newclassobject(bases, methods, name);
2865}
2866
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002867static int
2868exec_statement(prog, globals, locals)
2869 object *prog;
2870 object *globals;
2871 object *locals;
2872{
2873 char *s;
2874 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002875 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002876 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002877
2878 if (is_tupleobject(prog) && globals == None && locals == None &&
2879 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2880 /* Backward compatibility hack */
2881 globals = gettupleitem(prog, 1);
2882 if (n == 3)
2883 locals = gettupleitem(prog, 2);
2884 prog = gettupleitem(prog, 0);
2885 }
2886 if (globals == None) {
2887 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002889 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002890 plain = 1;
2891 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002892 }
2893 else if (locals == None)
2894 locals = globals;
2895 if (!is_stringobject(prog) &&
2896 !is_codeobject(prog) &&
2897 !is_fileobject(prog)) {
2898 err_setstr(TypeError,
2899 "exec 1st arg must be string, code or file object");
2900 return -1;
2901 }
2902 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2903 err_setstr(TypeError,
2904 "exec 2nd/3rd args must be dict or None");
2905 return -1;
2906 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002907 if (dictlookup(globals, "__builtins__") == NULL)
2908 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002909 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002910 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002911 return -1;
2912 return 0;
2913 }
2914 if (is_fileobject(prog)) {
2915 FILE *fp = getfilefile(prog);
2916 char *name = getstringvalue(getfilename(prog));
2917 if (run_file(fp, name, file_input, globals, locals) == NULL)
2918 return -1;
2919 return 0;
2920 }
2921 s = getstringvalue(prog);
2922 if (strlen(s) != getstringsize(prog)) {
2923 err_setstr(ValueError, "embedded '\\0' in exec string");
2924 return -1;
2925 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002926 v = run_string(s, file_input, globals, locals);
2927 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002928 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002929 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002930 if (plain)
2931 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002932 return 0;
2933}
Guido van Rossum24c13741995-02-14 09:42:43 +00002934
Guido van Rossum1aa14831997-01-21 05:34:20 +00002935/* Hack for ni.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002936static object *
2937find_from_args(f, nexti)
2938 frameobject *f;
2939 int nexti;
2940{
2941 int opcode;
2942 int oparg;
2943 object *list, *name;
2944 unsigned char *next_instr;
2945
2946 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2947 opcode = (*next_instr++);
2948 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002949 INCREF(None);
2950 return None;
2951 }
2952
2953 list = newlistobject(0);
2954 if (list == NULL)
2955 return NULL;
2956
2957 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002958 oparg = (next_instr[1]<<8) + next_instr[0];
2959 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002960 name = Getnamev(f, oparg);
2961 if (addlistitem(list, name) < 0) {
2962 DECREF(list);
2963 break;
2964 }
2965 opcode = (*next_instr++);
2966 } while (opcode == IMPORT_FROM);
2967
2968 return list;
2969}
Guido van Rossum950361c1997-01-24 13:49:28 +00002970
2971
2972#ifdef DYNAMIC_EXECUTION_PROFILE
2973
2974PyObject *
2975getarray(a)
2976 long a[256];
2977{
2978 int i;
2979 PyObject *l = PyList_New(256);
2980 if (l == NULL) return NULL;
2981 for (i = 0; i < 256; i++) {
2982 PyObject *x = PyInt_FromLong(a[i]);
2983 if (x == NULL) {
2984 Py_DECREF(l);
2985 return NULL;
2986 }
2987 PyList_SetItem(l, i, x);
2988 }
2989 for (i = 0; i < 256; i++)
2990 a[i] = 0;
2991 return l;
2992}
2993
2994PyObject *
2995_Py_GetDXProfile(self, args)
2996 PyObject *self, *args;
2997{
2998#ifndef DXPAIRS
2999 return getarray(dxp);
3000#else
3001 int i;
3002 PyObject *l = PyList_New(257);
3003 if (l == NULL) return NULL;
3004 for (i = 0; i < 257; i++) {
3005 PyObject *x = getarray(dxpairs[i]);
3006 if (x == NULL) {
3007 Py_DECREF(l);
3008 return NULL;
3009 }
3010 PyList_SetItem(l, i, x);
3011 }
3012 return l;
3013#endif
3014}
3015
3016#endif