blob: 5b97244f84713910bef7296dcf6f7c05c1135d20 [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 Rossum0a066c01992-03-27 17:29:15 +0000106/* Pointer to current frame, used to link new frames to */
107
Guido van Rossum374a9221991-04-04 10:40:29 +0000108static frameobject *current_frame;
109
Guido van Rossume59214e1994-08-30 08:01:59 +0000110#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112#include <errno.h>
113#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000114
Guido van Rossuma9672091994-09-14 13:31:22 +0000115static type_lock interpreter_lock = 0;
116static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000117
118void
119init_save_thread()
120{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000122 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123 interpreter_lock = allocate_lock();
124 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000125 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000127
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128#endif
129
Guido van Rossumff4949e1992-08-05 19:58:53 +0000130/* Functions save_thread and restore_thread are always defined so
131 dynamically loaded modules needn't be compiled separately for use
132 with and without threads: */
133
Guido van Rossum04691fc1992-08-12 15:35:34 +0000134object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000135save_thread()
136{
Guido van Rossume59214e1994-08-30 08:01:59 +0000137#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000138 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000139 object *res;
140 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000141 current_frame = NULL;
142 release_lock(interpreter_lock);
143 return res;
144 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000146 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000147}
148
149void
150restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000151 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000152{
Guido van Rossume59214e1994-08-30 08:01:59 +0000153#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000154 if (interpreter_lock) {
155 int err;
156 err = errno;
157 acquire_lock(interpreter_lock, 1);
158 errno = err;
159 current_frame = (frameobject *)x;
160 }
161#endif
162}
163
164
Guido van Rossuma9672091994-09-14 13:31:22 +0000165/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
166 signal handlers or Mac I/O completion routines) can schedule calls
167 to a function to be called synchronously.
168 The synchronous function is called with one void* argument.
169 It should return 0 for success or -1 for failure -- failure should
170 be accompanied by an exception.
171
172 If registry succeeds, the registry function returns 0; if it fails
173 (e.g. due to too many pending calls) it returns -1 (without setting
174 an exception condition).
175
176 Note that because registry may occur from within signal handlers,
177 or other asynchronous events, calling malloc() is unsafe!
178
179#ifdef WITH_THREAD
180 Any thread can schedule pending calls, but only the main thread
181 will execute them.
182#endif
183
184 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
185 There are two possible race conditions:
186 (1) nested asynchronous registry calls;
187 (2) registry calls made while pending calls are being processed.
188 While (1) is very unlikely, (2) is a real possibility.
189 The current code is safe against (2), but not against (1).
190 The safety against (2) is derived from the fact that only one
191 thread (the main thread) ever takes things out of the queue.
192*/
193
Guido van Rossum8861b741996-07-30 16:49:37 +0000194static int ticker = 0; /* main loop counter to do periodic things */
195
Guido van Rossuma9672091994-09-14 13:31:22 +0000196#define NPENDINGCALLS 32
197static struct {
198 int (*func) PROTO((ANY *));
199 ANY *arg;
200} pendingcalls[NPENDINGCALLS];
201static volatile int pendingfirst = 0;
202static volatile int pendinglast = 0;
203
204int
205Py_AddPendingCall(func, arg)
206 int (*func) PROTO((ANY *));
207 ANY *arg;
208{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000209 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000210 int i, j;
211 /* XXX Begin critical section */
212 /* XXX If you want this to be safe against nested
213 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 if (busy)
215 return -1;
216 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000217 i = pendinglast;
218 j = (i + 1) % NPENDINGCALLS;
219 if (j == pendingfirst)
220 return -1; /* Queue full */
221 pendingcalls[i].func = func;
222 pendingcalls[i].arg = arg;
223 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000224 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000225 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000226 /* XXX End critical section */
227 return 0;
228}
229
Guido van Rossum180d7b41994-09-29 09:45:57 +0000230int
231Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000232{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000233 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000234#ifdef WITH_THREAD
Guido van Rossum1aa14831997-01-21 05:34:20 +0000235 if (main_thread && get_thread_ident() != main_thread) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000236 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000237 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000238 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000239#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000240 if (busy) {
241 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000242 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000243 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000245 for (;;) {
246 int i;
247 int (*func) PROTO((ANY *));
248 ANY *arg;
249 i = pendingfirst;
250 if (i == pendinglast)
251 break; /* Queue empty */
252 func = pendingcalls[i].func;
253 arg = pendingcalls[i].arg;
254 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 if (func(arg) < 0) {
256 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000257 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000258 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000259 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000260 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000261 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000262 return 0;
263}
264
265
Guido van Rossum374a9221991-04-04 10:40:29 +0000266/* Status code for main loop (reason for stack unwind) */
267
268enum why_code {
269 WHY_NOT, /* No error */
270 WHY_EXCEPTION, /* Exception occurred */
271 WHY_RERAISE, /* Exception re-raised by 'finally' */
272 WHY_RETURN, /* 'return' statement */
273 WHY_BREAK /* 'break' statement */
274};
275
Guido van Rossum1aa14831997-01-21 05:34:20 +0000276static enum why_code do_raise PROTO((object *, object *, object *));
277
Guido van Rossum374a9221991-04-04 10:40:29 +0000278
Guido van Rossum681d79a1995-07-18 14:51:37 +0000279/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000280
281object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000282eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000283 codeobject *co;
284 object *globals;
285 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000286{
287 return eval_code2(co,
288 globals, locals,
289 (object **)NULL, 0,
290 (object **)NULL, 0,
291 (object **)NULL, 0,
292 (object *)NULL);
293}
294
295
296/* Interpreter main loop */
297
Guido van Rossum8861b741996-07-30 16:49:37 +0000298#ifndef MAX_RECURSION_DEPTH
299#define MAX_RECURSION_DEPTH 10000
300#endif
301
302static int recursion_depth = 0;
303
Guido van Rossum681d79a1995-07-18 14:51:37 +0000304static object *
305eval_code2(co, globals, locals,
306 args, argcount, kws, kwcount, defs, defcount, owner)
307 codeobject *co;
308 object *globals;
309 object *locals;
310 object **args;
311 int argcount;
312 object **kws; /* length: 2*kwcount */
313 int kwcount;
314 object **defs;
315 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000316 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000317{
318 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000319 register int opcode = 0; /* Current opcode */
320 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000321 register object **stack_pointer;
322 register enum why_code why; /* Reason for block stack unwind */
323 register int err; /* Error status -- nonzero if error */
324 register object *x; /* Result object -- NULL if error */
325 register object *v; /* Temporary objects popped off stack */
326 register object *w;
327 register object *u;
328 register object *t;
329 register frameobject *f; /* Current frame */
Guido van Rossum150b2df1996-12-05 23:17:11 +0000330 register object **fastlocals = NULL;
331 object *retval = NULL; /* Return value */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000332#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000333 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000334#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000335#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000337 char *filename = getstringvalue(co->co_filename);
338#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000339
340/* Code access macros */
341
342#define GETCONST(i) Getconst(f, i)
343#define GETNAME(i) Getname(f, i)
344#define GETNAMEV(i) Getnamev(f, i)
345#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
346#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
347#define NEXTOP() (*next_instr++)
348#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
349#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
350#define JUMPBY(x) (next_instr += (x))
351
352/* Stack manipulation macros */
353
354#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
355#define EMPTY() (STACK_LEVEL() == 0)
356#define TOP() (stack_pointer[-1])
357#define BASIC_PUSH(v) (*stack_pointer++ = (v))
358#define BASIC_POP() (*--stack_pointer)
359
Guido van Rossum96a42c81992-01-12 02:29:51 +0000360#ifdef LLTRACE
361#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
362#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000363#else
364#define PUSH(v) BASIC_PUSH(v)
365#define POP() BASIC_POP()
366#endif
367
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368/* Local variable macros */
369
370#define GETLOCAL(i) (fastlocals[i])
371#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
372 GETLOCAL(i) = value; } while (0)
373
Guido van Rossum8861b741996-07-30 16:49:37 +0000374#ifdef USE_STACKCHECK
375 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
376 err_setstr(MemoryError, "Stack overflow");
377 return NULL;
378 }
379#endif
380
Guido van Rossum681d79a1995-07-18 14:51:37 +0000381 if (globals == NULL) {
382 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000383 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000384 }
385
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000386#ifdef LLTRACE
387 lltrace = dictlookup(globals, "__lltrace__") != NULL;
388#endif
389
Guido van Rossum374a9221991-04-04 10:40:29 +0000390 f = newframeobject(
391 current_frame, /*back*/
392 co, /*code*/
393 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000394 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000395 if (f == NULL)
396 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000397
Guido van Rossum374a9221991-04-04 10:40:29 +0000398 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000399
Guido van Rossum681d79a1995-07-18 14:51:37 +0000400 if (co->co_nlocals > 0)
Guido van Rossum76836021997-01-20 04:26:20 +0000401 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000402
403 if (co->co_argcount > 0 ||
404 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
405 int i;
406 int n = argcount;
407 object *kwdict = NULL;
408 if (co->co_flags & CO_VARKEYWORDS) {
409 kwdict = newmappingobject();
410 if (kwdict == NULL)
411 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000412 i = co->co_argcount;
413 if (co->co_flags & CO_VARARGS)
414 i++;
415 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000416 }
417 if (argcount > co->co_argcount) {
418 if (!(co->co_flags & CO_VARARGS)) {
419 err_setstr(TypeError, "too many arguments");
420 goto fail;
421 }
422 n = co->co_argcount;
423 }
424 for (i = 0; i < n; i++) {
425 x = args[i];
426 INCREF(x);
427 SETLOCAL(i, x);
428 }
429 if (co->co_flags & CO_VARARGS) {
430 u = newtupleobject(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000431 if (u == NULL)
432 goto fail;
433 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434 for (i = n; i < argcount; i++) {
435 x = args[i];
436 INCREF(x);
437 SETTUPLEITEM(u, i-n, x);
438 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439 }
440 for (i = 0; i < kwcount; i++) {
441 object *keyword = kws[2*i];
442 object *value = kws[2*i + 1];
443 int j;
444 /* XXX slow -- speed up using dictionary? */
445 for (j = 0; j < co->co_argcount; j++) {
446 object *nm = GETTUPLEITEM(co->co_varnames, j);
447 if (cmpobject(keyword, nm) == 0)
448 break;
449 }
450 if (j >= co->co_argcount) {
451 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000452 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 goto fail;
454 }
455 mappinginsert(kwdict, keyword, value);
456 }
457 else {
458 if (GETLOCAL(j) != NULL) {
459 err_setstr(TypeError,
460 "keyword parameter redefined");
461 goto fail;
462 }
463 INCREF(value);
464 SETLOCAL(j, value);
465 }
466 }
467 if (argcount < co->co_argcount) {
468 int m = co->co_argcount - defcount;
469 for (i = argcount; i < m; i++) {
470 if (GETLOCAL(i) == NULL) {
471 err_setstr(TypeError,
472 "not enough arguments");
473 goto fail;
474 }
475 }
476 if (n > m)
477 i = n - m;
478 else
479 i = 0;
480 for (; i < defcount; i++) {
481 if (GETLOCAL(m+i) == NULL) {
482 object *def = defs[i];
483 INCREF(def);
484 SETLOCAL(m+i, def);
485 }
486 }
487 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 }
489 else {
490 if (argcount > 0 || kwcount > 0) {
491 err_setstr(TypeError, "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000492 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000493 }
494 }
495
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000496 if (sys_trace != NULL) {
497 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000498 be called on *every* entry to a code block.
499 Its return value, if not None, is a function that
500 will be called at the start of each executed line
501 of code. (Actually, the function must return
502 itself in order to continue tracing.)
503 The trace functions are called with three arguments:
504 a pointer to the current frame, a string indicating
505 why the function is called, and an argument which
506 depends on the situation. The global trace function
507 (sys.trace) is also called whenever an exception
508 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 if (call_trace(&sys_trace, &f->f_trace, f, "call",
510 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000511 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000512 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000513 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000514 }
515
516 if (sys_profile != NULL) {
517 /* Similar for sys_profile, except it needn't return
518 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 if (call_trace(&sys_profile, (object**)0, f, "call",
520 None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000521 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000522 }
523 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000524
Guido van Rossum8861b741996-07-30 16:49:37 +0000525 if (++recursion_depth > MAX_RECURSION_DEPTH) {
526 --recursion_depth;
527 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
528 current_frame = f->f_back;
529 DECREF(f);
530 return NULL;
531 }
532
Guido van Rossum374a9221991-04-04 10:40:29 +0000533 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000534 stack_pointer = f->f_valuestack;
535
Guido van Rossum374a9221991-04-04 10:40:29 +0000536 why = WHY_NOT;
537 err = 0;
538 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000539
540 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541 /* Do periodic things.
542 Doing this every time through the loop would add
543 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000544 So we do it only every Nth instruction.
545
546 The ticker is reset to zero if there are pending
Guido van Rossum70d44781997-01-21 06:15:24 +0000547 calls (see Py_AddPendingCall() and
Guido van Rossum8861b741996-07-30 16:49:37 +0000548 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000549
Guido van Rossum374a9221991-04-04 10:40:29 +0000550 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000551 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000552 if (pendingfirst != pendinglast) {
553 if (Py_MakePendingCalls() < 0) {
554 why = WHY_EXCEPTION;
555 goto on_error;
556 }
557 }
Guido van Rossum8c5df061997-01-24 04:19:24 +0000558#ifdef macintosh
559#undef HAVE_SIGNAL_H
560#endif
Guido van Rossum70d44781997-01-21 06:15:24 +0000561#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
562/* If we have true signals, the signal handler will call
563 Py_AddPendingCall() so we don't have to call sigcheck().
564 On the Mac and DOS, alas, we have to call it. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000565 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000566 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000567 goto on_error;
568 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000569#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000570
Guido van Rossume59214e1994-08-30 08:01:59 +0000571#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000572 if (interpreter_lock) {
573 /* Give another thread a chance */
574
575 current_frame = NULL;
576 release_lock(interpreter_lock);
577
578 /* Other threads may run now */
579
580 acquire_lock(interpreter_lock, 1);
581 current_frame = f;
582 }
583#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000587
Guido van Rossum408027e1996-12-30 16:17:54 +0000588#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000589 f->f_lasti = INSTR_OFFSET();
590#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000591
592 opcode = NEXTOP();
593 if (HAS_ARG(opcode))
594 oparg = NEXTARG();
595
Guido van Rossum96a42c81992-01-12 02:29:51 +0000596#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000597 /* Instruction tracing */
598
Guido van Rossum96a42c81992-01-12 02:29:51 +0000599 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 if (HAS_ARG(opcode)) {
601 printf("%d: %d, %d\n",
602 (int) (INSTR_OFFSET() - 3),
603 opcode, oparg);
604 }
605 else {
606 printf("%d: %d\n",
607 (int) (INSTR_OFFSET() - 1), opcode);
608 }
609 }
610#endif
611
612 /* Main switch on opcode */
613
614 switch (opcode) {
615
616 /* BEWARE!
617 It is essential that any operation that fails sets either
618 x to NULL, err to nonzero, or why to anything but WHY_NOT,
619 and that no operation that succeeds does this! */
620
621 /* case STOP_CODE: this is an error! */
622
623 case POP_TOP:
624 v = POP();
625 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000626 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000627
628 case ROT_TWO:
629 v = POP();
630 w = POP();
631 PUSH(v);
632 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000633 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000634
635 case ROT_THREE:
636 v = POP();
637 w = POP();
638 x = POP();
639 PUSH(v);
640 PUSH(x);
641 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000642 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000643
644 case DUP_TOP:
645 v = TOP();
646 INCREF(v);
647 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000648 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000649
650 case UNARY_POSITIVE:
651 v = POP();
652 x = pos(v);
653 DECREF(v);
654 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000655 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 break;
657
658 case UNARY_NEGATIVE:
659 v = POP();
660 x = neg(v);
661 DECREF(v);
662 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000663 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000664 break;
665
666 case UNARY_NOT:
667 v = POP();
668 x = not(v);
669 DECREF(v);
670 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000671 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000672 break;
673
674 case UNARY_CONVERT:
675 v = POP();
676 x = reprobject(v);
677 DECREF(v);
678 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000679 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000681
682 case UNARY_INVERT:
683 v = POP();
684 x = invert(v);
685 DECREF(v);
686 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000687 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000688 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000689
Guido van Rossum50564e81996-01-12 01:13:16 +0000690 case BINARY_POWER:
691 w = POP();
692 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000693 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000694 DECREF(v);
695 DECREF(w);
696 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000697 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000698 break;
699
Guido van Rossum374a9221991-04-04 10:40:29 +0000700 case BINARY_MULTIPLY:
701 w = POP();
702 v = POP();
703 x = mul(v, w);
704 DECREF(v);
705 DECREF(w);
706 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000707 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 break;
709
710 case BINARY_DIVIDE:
711 w = POP();
712 v = POP();
713 x = divide(v, w);
714 DECREF(v);
715 DECREF(w);
716 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000717 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 break;
719
720 case BINARY_MODULO:
721 w = POP();
722 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000723 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 DECREF(v);
725 DECREF(w);
726 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 break;
729
730 case BINARY_ADD:
731 w = POP();
732 v = POP();
733 x = add(v, w);
734 DECREF(v);
735 DECREF(w);
736 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000737 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 break;
739
740 case BINARY_SUBTRACT:
741 w = POP();
742 v = POP();
743 x = sub(v, w);
744 DECREF(v);
745 DECREF(w);
746 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000747 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000748 break;
749
750 case BINARY_SUBSCR:
751 w = POP();
752 v = POP();
753 x = apply_subscript(v, w);
754 DECREF(v);
755 DECREF(w);
756 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000757 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 break;
759
Guido van Rossum7928cd71991-10-24 14:59:31 +0000760 case BINARY_LSHIFT:
761 w = POP();
762 v = POP();
763 x = lshift(v, w);
764 DECREF(v);
765 DECREF(w);
766 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000767 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000768 break;
769
770 case BINARY_RSHIFT:
771 w = POP();
772 v = POP();
773 x = rshift(v, w);
774 DECREF(v);
775 DECREF(w);
776 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000777 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000778 break;
779
780 case BINARY_AND:
781 w = POP();
782 v = POP();
783 x = and(v, w);
784 DECREF(v);
785 DECREF(w);
786 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000787 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000788 break;
789
790 case BINARY_XOR:
791 w = POP();
792 v = POP();
793 x = xor(v, w);
794 DECREF(v);
795 DECREF(w);
796 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000797 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000798 break;
799
800 case BINARY_OR:
801 w = POP();
802 v = POP();
803 x = or(v, w);
804 DECREF(v);
805 DECREF(w);
806 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000807 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000808 break;
809
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 case SLICE+0:
811 case SLICE+1:
812 case SLICE+2:
813 case SLICE+3:
814 if ((opcode-SLICE) & 2)
815 w = POP();
816 else
817 w = NULL;
818 if ((opcode-SLICE) & 1)
819 v = POP();
820 else
821 v = NULL;
822 u = POP();
823 x = apply_slice(u, v, w);
824 DECREF(u);
825 XDECREF(v);
826 XDECREF(w);
827 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000828 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000829 break;
830
831 case STORE_SLICE+0:
832 case STORE_SLICE+1:
833 case STORE_SLICE+2:
834 case STORE_SLICE+3:
835 if ((opcode-STORE_SLICE) & 2)
836 w = POP();
837 else
838 w = NULL;
839 if ((opcode-STORE_SLICE) & 1)
840 v = POP();
841 else
842 v = NULL;
843 u = POP();
844 t = POP();
845 err = assign_slice(u, v, w, t); /* u[v:w] = t */
846 DECREF(t);
847 DECREF(u);
848 XDECREF(v);
849 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 break;
852
853 case DELETE_SLICE+0:
854 case DELETE_SLICE+1:
855 case DELETE_SLICE+2:
856 case DELETE_SLICE+3:
857 if ((opcode-DELETE_SLICE) & 2)
858 w = POP();
859 else
860 w = NULL;
861 if ((opcode-DELETE_SLICE) & 1)
862 v = POP();
863 else
864 v = NULL;
865 u = POP();
866 err = assign_slice(u, v, w, (object *)NULL);
867 /* del u[v:w] */
868 DECREF(u);
869 XDECREF(v);
870 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 break;
873
874 case STORE_SUBSCR:
875 w = POP();
876 v = POP();
877 u = POP();
878 /* v[w] = u */
879 err = assign_subscript(v, w, u);
880 DECREF(u);
881 DECREF(v);
882 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000883 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 break;
885
886 case DELETE_SUBSCR:
887 w = POP();
888 v = POP();
889 /* del v[w] */
890 err = assign_subscript(v, w, (object *)NULL);
891 DECREF(v);
892 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 break;
895
896 case PRINT_EXPR:
897 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000899 /* Before printing, also assign to '_' */
900 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000901 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000902 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000904 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000905 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000906 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 flushline();
908 }
909 DECREF(v);
910 break;
911
912 case PRINT_ITEM:
913 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000914 w = sysget("stdout");
915 if (softspace(w, 1))
916 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000917 err = writeobject(v, w, PRINT_RAW);
918 if (err == 0 && is_stringobject(v)) {
919 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000920 char *s = getstringvalue(v);
921 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000922 if (len > 0 &&
923 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000924 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000925 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000928 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 break;
930
931 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000932 x = sysget("stdout");
933 if (x == NULL)
934 err_setstr(RuntimeError, "lost sys.stdout");
935 else {
936 writestring("\n", x);
937 softspace(x, 0);
938 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 break;
940
941 case BREAK_LOOP:
942 why = WHY_BREAK;
943 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000944
Guido van Rossumf10570b1995-07-07 22:53:21 +0000945 case RAISE_VARARGS:
946 u = v = w = NULL;
947 switch (oparg) {
948 case 3:
949 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000950 /* Fallthrough */
951 case 2:
952 v = POP(); /* value */
953 /* Fallthrough */
954 case 1:
955 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000956 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000957 break;
958 default:
959 err_setstr(SystemError,
960 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000961 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000962 break;
963 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 break;
965
966 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000967 if ((x = f->f_locals) == NULL) {
968 err_setstr(SystemError, "no locals");
969 break;
970 }
971 INCREF(x);
972 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 break;
974
975 case RETURN_VALUE:
976 retval = POP();
977 why = WHY_RETURN;
978 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000979
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000980 case EXEC_STMT:
981 w = POP();
982 v = POP();
983 u = POP();
984 err = exec_statement(u, v, w);
985 DECREF(u);
986 DECREF(v);
987 DECREF(w);
988 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000989
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 case POP_BLOCK:
991 {
992 block *b = pop_block(f);
993 while (STACK_LEVEL() > b->b_level) {
994 v = POP();
995 DECREF(v);
996 }
997 }
998 break;
999
1000 case END_FINALLY:
1001 v = POP();
1002 if (is_intobject(v)) {
1003 why = (enum why_code) getintvalue(v);
1004 if (why == WHY_RETURN)
1005 retval = POP();
1006 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001007 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001009 u = POP();
1010 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001012 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 }
1014 else if (v != None) {
1015 err_setstr(SystemError,
1016 "'finally' pops bad exception");
1017 why = WHY_EXCEPTION;
1018 }
1019 DECREF(v);
1020 break;
1021
1022 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001023 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001024 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001025 w = POP();
1026 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001028 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 DECREF(v);
1030 DECREF(w);
1031 break;
1032
1033 case STORE_NAME:
1034 w = GETNAMEV(oparg);
1035 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001036 if ((x = f->f_locals) == NULL) {
1037 err_setstr(SystemError, "no locals");
1038 break;
1039 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001040 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 DECREF(v);
1042 break;
1043
1044 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001045 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001046 if ((x = f->f_locals) == NULL) {
1047 err_setstr(SystemError, "no locals");
1048 break;
1049 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001050 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001051 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001053
1054#ifdef CASE_TOO_BIG
1055 default: switch (opcode) {
1056#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001057
1058 case UNPACK_TUPLE:
1059 v = POP();
1060 if (!is_tupleobject(v)) {
1061 err_setstr(TypeError, "unpack non-tuple");
1062 why = WHY_EXCEPTION;
1063 }
1064 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001065 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001066 "unpack tuple of wrong size");
1067 why = WHY_EXCEPTION;
1068 }
1069 else {
1070 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001071 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001072 INCREF(w);
1073 PUSH(w);
1074 }
1075 }
1076 DECREF(v);
1077 break;
1078
1079 case UNPACK_LIST:
1080 v = POP();
1081 if (!is_listobject(v)) {
1082 err_setstr(TypeError, "unpack non-list");
1083 why = WHY_EXCEPTION;
1084 }
1085 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001086 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 "unpack list of wrong size");
1088 why = WHY_EXCEPTION;
1089 }
1090 else {
1091 for (; --oparg >= 0; ) {
1092 w = getlistitem(v, oparg);
1093 INCREF(w);
1094 PUSH(w);
1095 }
1096 }
1097 DECREF(v);
1098 break;
1099
1100 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001101 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 v = POP();
1103 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001104 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 DECREF(v);
1106 DECREF(u);
1107 break;
1108
1109 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001110 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001112 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 DECREF(v);
1114 break;
1115
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001116 case STORE_GLOBAL:
1117 w = GETNAMEV(oparg);
1118 v = POP();
1119 err = dict2insert(f->f_globals, w, v);
1120 DECREF(v);
1121 break;
1122
1123 case DELETE_GLOBAL:
1124 w = GETNAMEV(oparg);
1125 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001126 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001127 break;
1128
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 case LOAD_CONST:
1130 x = GETCONST(oparg);
1131 INCREF(x);
1132 PUSH(x);
1133 break;
1134
1135 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001136 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001137 if ((x = f->f_locals) == NULL) {
1138 err_setstr(SystemError, "no locals");
1139 break;
1140 }
1141 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001143 err_clear();
1144 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001146 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001147 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001149 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 break;
1151 }
1152 }
1153 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001154 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 PUSH(x);
1156 break;
1157
1158 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001159 w = GETNAMEV(oparg);
1160 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001161 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001162 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001163 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001165 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 break;
1167 }
1168 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001169 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 PUSH(x);
1171 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001172
Guido van Rossum9bfef441993-03-29 10:43:31 +00001173 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001175 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001176 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001177 gettupleitem(co->co_varnames,
1178 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001179 break;
1180 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001181 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001182 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001183 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001184 break;
1185
1186 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001187 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001188 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001189 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001190
1191 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001192 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001193 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001194
1195 case BUILD_TUPLE:
1196 x = newtupleobject(oparg);
1197 if (x != NULL) {
1198 for (; --oparg >= 0;) {
1199 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001200 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 }
1202 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001203 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 }
1205 break;
1206
1207 case BUILD_LIST:
1208 x = newlistobject(oparg);
1209 if (x != NULL) {
1210 for (; --oparg >= 0;) {
1211 w = POP();
1212 err = setlistitem(x, oparg, w);
1213 if (err != 0)
1214 break;
1215 }
1216 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001217 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001218 }
1219 break;
1220
1221 case BUILD_MAP:
1222 x = newdictobject();
1223 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001224 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001225 break;
1226
1227 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001228 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001230 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 DECREF(v);
1232 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001233 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 break;
1235
1236 case COMPARE_OP:
1237 w = POP();
1238 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001239 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 DECREF(v);
1241 DECREF(w);
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 IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001248 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249 if (x == NULL) {
1250 err_setstr(ImportError,
1251 "__import__ not found");
1252 break;
1253 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001254 if (is_methodobject(x)) {
1255 u = None;
1256 INCREF(u);
1257 }
1258 else {
1259 u = find_from_args(f, INSTR_OFFSET());
1260 if (u == NULL) {
1261 x = u;
1262 break;
1263 }
1264 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001265 w = mkvalue("(OOOO)",
1266 w,
1267 f->f_globals,
1268 f->f_locals == NULL ? None : f->f_locals,
1269 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001270 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001271 if (w == NULL) {
1272 x = NULL;
1273 break;
1274 }
1275 x = call_object(x, w);
1276 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001277 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001278 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 break;
1280
1281 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001282 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001284 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001285 if ((x = f->f_locals) == NULL) {
1286 err_setstr(SystemError, "no locals");
1287 break;
1288 }
1289 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001290 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001291 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001293
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 case JUMP_FORWARD:
1295 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001296 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001297
1298 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001299 err = testbool(TOP());
1300 if (err > 0)
1301 err = 0;
1302 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001304 else
1305 break;
1306 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001307
1308 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001309 err = testbool(TOP());
1310 if (err > 0) {
1311 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001313 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001314 else if (err == 0)
1315 ;
1316 else
1317 break;
1318 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001319
1320 case JUMP_ABSOLUTE:
1321 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001322 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001323
1324 case FOR_LOOP:
1325 /* for v in s: ...
1326 On entry: stack contains s, i.
1327 On exit: stack contains s, i+1, s[i];
1328 but if loop exhausted:
1329 s, i are popped, and we jump */
1330 w = POP(); /* Loop index */
1331 v = POP(); /* Sequence object */
1332 u = loop_subscript(v, w);
1333 if (u != NULL) {
1334 PUSH(v);
1335 x = newintobject(getintvalue(w)+1);
1336 PUSH(x);
1337 DECREF(w);
1338 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001339 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 }
1341 else {
1342 DECREF(v);
1343 DECREF(w);
1344 /* A NULL can mean "s exhausted"
1345 but also an error: */
1346 if (err_occurred())
1347 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001348 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001350 continue;
1351 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 }
1353 break;
1354
1355 case SETUP_LOOP:
1356 case SETUP_EXCEPT:
1357 case SETUP_FINALLY:
1358 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1359 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001360 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361
1362 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001363#ifdef LLTRACE
1364 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001365 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001367 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001368 if (f->f_trace == NULL)
1369 continue;
1370 /* Trace each line of code reached */
1371 f->f_lasti = INSTR_OFFSET();
1372 err = call_trace(&f->f_trace, &f->f_trace,
1373 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001375
1376 case CALL_FUNCTION:
1377 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001378 int na = oparg & 0xff;
1379 int nk = (oparg>>8) & 0xff;
1380 int n = na + 2*nk;
1381 object **pfunc = stack_pointer - n - 1;
1382 object *func = *pfunc;
1383 object *self = NULL;
1384 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001385 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001386 if (is_instancemethodobject(func)) {
1387 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001388 class = instancemethodgetclass(func);
1389 func = instancemethodgetfunc(func);
1390 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001391 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001392 INCREF(self);
1393 DECREF(*pfunc);
1394 *pfunc = self;
1395 na++;
1396 n++;
1397 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001398 else {
1399 /* Unbound methods must be
1400 called with an instance of
1401 the class (or a derived
1402 class) as first argument */
1403 if (na > 0 &&
1404 (self = stack_pointer[-n])
1405 != NULL &&
1406 is_instanceobject(self) &&
1407 issubclass(
1408 (object *)
1409 (((instanceobject *)self)
1410 ->in_class),
1411 class))
1412 /* Handy-dandy */ ;
1413 else {
1414 err_setstr(TypeError,
1415 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001416 x = NULL;
1417 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001418 }
1419 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001420 }
1421 else
1422 INCREF(func);
1423 if (is_funcobject(func)) {
1424 object *co = getfunccode(func);
1425 object *globals = getfuncglobals(func);
1426 object *argdefs = PyFunction_GetDefaults(func);
1427 object **d;
1428 int nd;
1429 if (argdefs != NULL) {
1430 d = &GETTUPLEITEM(argdefs, 0);
1431 nd = ((tupleobject *)argdefs)->ob_size;
1432 }
1433 else {
1434 d = NULL;
1435 nd = 0;
1436 }
1437 x = eval_code2(
1438 (codeobject *)co,
1439 globals, (object *)NULL,
1440 stack_pointer-n, na,
1441 stack_pointer-2*nk, nk,
1442 d, nd,
1443 class);
1444 }
1445 else {
1446 object *args = newtupleobject(na);
1447 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001448 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001449 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001450 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001451 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001452 if (nk > 0) {
1453 kwdict = newdictobject();
1454 if (kwdict == NULL) {
1455 x = NULL;
1456 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001457 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001458 err = 0;
1459 while (--nk >= 0) {
1460 object *value = POP();
1461 object *key = POP();
1462 err = mappinginsert(
1463 kwdict, key, value);
1464 if (err) {
1465 DECREF(key);
1466 DECREF(value);
1467 break;
1468 }
1469 }
1470 if (err) {
1471 DECREF(args);
1472 DECREF(kwdict);
1473 break;
1474 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001475 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001476 while (--na >= 0) {
1477 w = POP();
1478 SETTUPLEITEM(args, na, w);
1479 }
1480 x = PyEval_CallObjectWithKeywords(
1481 func, args, kwdict);
1482 DECREF(args);
1483 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001484 }
1485 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001486 while (stack_pointer > pfunc) {
1487 w = POP();
1488 DECREF(w);
1489 }
1490 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001491 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001492 break;
1493 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001494
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 case MAKE_FUNCTION:
1496 v = POP(); /* code object */
1497 x = newfuncobject(v, f->f_globals);
1498 DECREF(v);
1499 /* XXX Maybe this should be a separate opcode? */
1500 if (x != NULL && oparg > 0) {
1501 v = newtupleobject(oparg);
1502 if (v == NULL) {
1503 DECREF(x);
1504 x = NULL;
1505 break;
1506 }
1507 while (--oparg >= 0) {
1508 w = POP();
1509 SETTUPLEITEM(v, oparg, w);
1510 }
1511 err = PyFunction_SetDefaults(x, v);
1512 DECREF(v);
1513 }
1514 PUSH(x);
1515 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001516
1517 case BUILD_SLICE:
1518 if (oparg == 3)
1519 w = POP();
1520 else
1521 w = NULL;
1522 v = POP();
1523 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001524 x = PySlice_New(u, v, w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001525 DECREF(u);
1526 DECREF(v);
1527 XDECREF(w);
1528 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001529 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001530 break;
1531
1532
Guido van Rossum374a9221991-04-04 10:40:29 +00001533 default:
1534 fprintf(stderr,
1535 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001536 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001537 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 why = WHY_EXCEPTION;
1539 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001540
1541#ifdef CASE_TOO_BIG
1542 }
1543#endif
1544
Guido van Rossum374a9221991-04-04 10:40:29 +00001545 } /* switch */
1546
1547 on_error:
1548
1549 /* Quickly continue if no error occurred */
1550
1551 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001552 if (err == 0 && x != NULL) {
1553#ifdef CHECKEXC
1554 if (err_occurred())
1555 fprintf(stderr,
1556 "XXX undetected error\n");
1557 else
1558#endif
1559 continue; /* Normal, fast path */
1560 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001561 why = WHY_EXCEPTION;
1562 x = None;
1563 err = 0;
1564 }
1565
Guido van Rossum801dcae1992-04-08 11:32:32 +00001566#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001567 /* Double-check exception status */
1568
1569 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1570 if (!err_occurred()) {
1571 fprintf(stderr, "XXX ghost error\n");
1572 err_setstr(SystemError, "ghost error");
1573 why = WHY_EXCEPTION;
1574 }
1575 }
1576 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001577 if (err_occurred()) {
1578 fprintf(stderr,
1579 "XXX undetected error (why=%d)\n",
1580 why);
1581 why = WHY_EXCEPTION;
1582 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 }
1584#endif
1585
1586 /* Log traceback info if this is a real exception */
1587
1588 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001589 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001591 f->f_lasti -= 2;
1592 tb_here(f);
1593
Guido van Rossume59214e1994-08-30 08:01:59 +00001594 if (f->f_trace)
1595 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001596 if (sys_profile)
1597 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 }
1599
1600 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1601
1602 if (why == WHY_RERAISE)
1603 why = WHY_EXCEPTION;
1604
1605 /* Unwind stacks if a (pseudo) exception occurred */
1606
1607 while (why != WHY_NOT && f->f_iblock > 0) {
1608 block *b = pop_block(f);
1609 while (STACK_LEVEL() > b->b_level) {
1610 v = POP();
1611 XDECREF(v);
1612 }
1613 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1614 why = WHY_NOT;
1615 JUMPTO(b->b_handler);
1616 break;
1617 }
1618 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001619 (b->b_type == SETUP_EXCEPT &&
1620 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001622 object *exc, *val, *tb;
1623 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001624 if (val == NULL) {
1625 val = None;
1626 INCREF(val);
1627 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 /* Make the raw exception data
1629 available to the handler,
1630 so a program can emulate the
1631 Python main loop. Don't do
1632 this for 'finally'. */
1633 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001634 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 sysset("exc_value", val);
1636 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001638 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001639 PUSH(val);
1640 PUSH(exc);
1641 }
1642 else {
1643 if (why == WHY_RETURN)
1644 PUSH(retval);
1645 v = newintobject((long)why);
1646 PUSH(v);
1647 }
1648 why = WHY_NOT;
1649 JUMPTO(b->b_handler);
1650 break;
1651 }
1652 } /* unwind stack */
1653
1654 /* End the loop if we still have an error (or return) */
1655
1656 if (why != WHY_NOT)
1657 break;
1658
1659 } /* main loop */
1660
1661 /* Pop remaining stack entries */
1662
1663 while (!EMPTY()) {
1664 v = POP();
1665 XDECREF(v);
1666 }
1667
Guido van Rossum96a42c81992-01-12 02:29:51 +00001668 if (why != WHY_RETURN)
1669 retval = NULL;
1670
Guido van Rossume59214e1994-08-30 08:01:59 +00001671 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001672 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001673 if (call_trace(&f->f_trace, &f->f_trace, f,
1674 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001675 XDECREF(retval);
1676 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001677 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001678 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001679 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001680 }
1681
1682 if (sys_profile && why == WHY_RETURN) {
1683 if (call_trace(&sys_profile, (object**)0,
1684 f, "return", retval)) {
1685 XDECREF(retval);
1686 retval = NULL;
1687 why = WHY_EXCEPTION;
1688 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001689 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001690
Guido van Rossum8c5df061997-01-24 04:19:24 +00001691 --recursion_depth;
1692
1693 fail: /* Jump here from prelude on failure */
1694
Guido van Rossuma4240131997-01-21 21:18:36 +00001695 /* Kill all local variables */
1696
1697 {
1698 int i;
1699 for (i = co->co_nlocals; --i >= 0; ++fastlocals) {
1700 if (*fastlocals != NULL) {
1701 DECREF(*fastlocals);
1702 *fastlocals = NULL;
1703 }
1704 }
1705 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001706
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001708
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 current_frame = f->f_back;
1710 DECREF(f);
1711
Guido van Rossum96a42c81992-01-12 02:29:51 +00001712 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001713}
1714
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001715/* Logic for the raise statement (too complicated for inlining).
1716 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001717static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001718do_raise(type, value, tb)
1719 object *type, *value, *tb;
1720{
1721 /* We support the following forms of raise:
1722 raise <class>, <classinstance>
1723 raise <class>, <argument tuple>
1724 raise <class>, None
1725 raise <class>, <argument>
1726 raise <classinstance>, None
1727 raise <string>, <object>
1728 raise <string>, None
1729
1730 An omitted second argument is the same as None.
1731
1732 In addition, raise <tuple>, <anything> is the same as
1733 raising the tuple's first item (and it better have one!);
1734 this rule is applied recursively.
1735
1736 Finally, an optional third argument can be supplied, which
1737 gives the traceback to be substituted (useful when
1738 re-raising an exception after examining it). */
1739
1740 /* First, check the traceback argument, replacing None with
1741 NULL. */
1742 if (tb == None) {
1743 DECREF(tb);
1744 tb = NULL;
1745 }
1746 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1747 err_setstr(TypeError,
1748 "raise 3rd arg must be traceback or None");
1749 goto raise_error;
1750 }
1751
1752 /* Next, replace a missing value with None */
1753 if (value == NULL) {
1754 value = None;
1755 INCREF(value);
1756 }
1757
1758 /* Next, repeatedly, replace a tuple exception with its first item */
1759 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1760 object *tmp = type;
1761 type = GETTUPLEITEM(type, 0);
1762 INCREF(type);
1763 DECREF(tmp);
1764 }
1765
1766 /* Now switch on the exception's type */
1767 if (is_stringobject(type)) {
1768 ;
1769 }
1770 else if (is_classobject(type)) {
1771 /* Raising a class. If the value is an instance, it
1772 better be an instance of the class. If it is not,
1773 it will be used to create an instance. */
1774 if (is_instanceobject(value)) {
1775 object *inclass = (object*)
1776 (((instanceobject*)value)->in_class);
1777 if (!issubclass(inclass, type)) {
1778 err_setstr(TypeError,
1779 "raise <class>, <instance> requires that <instance> is a member of <class>");
1780 goto raise_error;
1781 }
1782 }
1783 else {
1784 /* Go instantiate the class */
1785 object *args, *res;
1786 if (value == None)
1787 args = mkvalue("()");
1788 else if (is_tupleobject(value)) {
1789 INCREF(value);
1790 args = value;
1791 }
1792 else
1793 args = mkvalue("(O)", value);
1794 if (args == NULL)
1795 goto raise_error;
1796 res = call_object(type, args);
1797 DECREF(args);
1798 if (res == NULL)
1799 goto raise_error;
1800 DECREF(value);
1801 value = res;
1802 }
1803 }
1804 else if (is_instanceobject(type)) {
1805 /* Raising an instance. The value should be a dummy. */
1806 if (value != None) {
1807 err_setstr(TypeError,
1808 "instance exception may not have a separate value");
1809 goto raise_error;
1810 }
1811 else {
1812 /* Normalize to raise <class>, <instance> */
1813 DECREF(value);
1814 value = type;
1815 type = (object*) ((instanceobject*)type)->in_class;
1816 INCREF(type);
1817 }
1818 }
1819 else {
1820 /* Not something you can raise. You get an exception
1821 anyway, just not what you specified :-) */
1822 err_setstr(TypeError,
1823 "exceptions must be strings, classes, or instances");
1824 goto raise_error;
1825 }
1826 err_restore(type, value, tb);
1827 if (tb == NULL)
1828 return WHY_EXCEPTION;
1829 else
1830 return WHY_RERAISE;
1831 raise_error:
1832 XDECREF(value);
1833 XDECREF(type);
1834 XDECREF(tb);
1835 return WHY_EXCEPTION;
1836}
1837
Guido van Rossum96a42c81992-01-12 02:29:51 +00001838#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001839static int
1840prtrace(v, str)
1841 object *v;
1842 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001844 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001845 if (printobject(v, stdout, 0) != 0)
1846 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001847 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001851static void
1852call_exc_trace(p_trace, p_newtrace, f)
1853 object **p_trace, **p_newtrace;
1854 frameobject *f;
1855{
1856 object *type, *value, *traceback, *arg;
1857 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001858 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001859 if (value == NULL) {
1860 value = None;
1861 INCREF(value);
1862 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001863 arg = mkvalue("(OOO)", type, value, traceback);
1864 if (arg == NULL) {
1865 err_restore(type, value, traceback);
1866 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001867 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001868 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1869 DECREF(arg);
1870 if (err == 0)
1871 err_restore(type, value, traceback);
1872 else {
1873 XDECREF(type);
1874 XDECREF(value);
1875 XDECREF(traceback);
1876 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001877}
1878
1879static int
1880call_trace(p_trace, p_newtrace, f, msg, arg)
1881 object **p_trace; /* in/out; may not be NULL;
1882 may not point to NULL variable initially */
1883 object **p_newtrace; /* in/out; may be NULL;
1884 may point to NULL variable;
1885 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001886 frameobject *f;
1887 char *msg;
1888 object *arg;
1889{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001890 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001891 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001892 static int tracing = 0;
1893
1894 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001895 /* Don't do recursive traces */
1896 if (p_newtrace) {
1897 XDECREF(*p_newtrace);
1898 *p_newtrace = NULL;
1899 }
1900 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001901 }
1902
Guido van Rossumf10570b1995-07-07 22:53:21 +00001903 args = newtupleobject(3);
1904 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001905 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001906 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001907 if (what == NULL)
1908 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001909 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001910 SETTUPLEITEM(args, 0, (object *)f);
1911 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001912 if (arg == NULL)
1913 arg = None;
1914 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001915 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001916 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001917 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001918 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001919 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001920 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001921 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001922 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001923 if (res == NULL) {
1924 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001925 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001926 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001927 *p_trace = NULL;
1928 if (p_newtrace) {
1929 XDECREF(*p_newtrace);
1930 *p_newtrace = NULL;
1931 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001932 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001933 }
1934 else {
1935 if (p_newtrace) {
1936 XDECREF(*p_newtrace);
1937 if (res == None)
1938 *p_newtrace = NULL;
1939 else {
1940 INCREF(res);
1941 *p_newtrace = res;
1942 }
1943 }
1944 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001945 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001946 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001947}
1948
Guido van Rossum3f5da241990-12-20 15:06:42 +00001949object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001950getbuiltins()
1951{
1952 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001953 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001954 else
1955 return current_frame->f_builtins;
1956}
1957
1958object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001959getlocals()
1960{
1961 if (current_frame == NULL)
1962 return NULL;
1963 fast_2_locals(current_frame);
1964 return current_frame->f_locals;
1965}
1966
1967object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968getglobals()
1969{
1970 if (current_frame == NULL)
1971 return NULL;
1972 else
1973 return current_frame->f_globals;
1974}
1975
Guido van Rossum81daa321993-05-20 14:24:46 +00001976object *
Guido van Rossume59214e1994-08-30 08:01:59 +00001977getframe()
1978{
1979 return (object *)current_frame;
1980}
1981
Guido van Rossum6135a871995-01-09 17:53:26 +00001982int
1983getrestricted()
1984{
1985 return current_frame == NULL ? 0 : current_frame->f_restricted;
1986}
1987
Guido van Rossum3f5da241990-12-20 15:06:42 +00001988void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989flushline()
1990{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001991 object *f = sysget("stdout");
1992 if (softspace(f, 0))
1993 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994}
1995
Guido van Rossum3f5da241990-12-20 15:06:42 +00001996
Guido van Rossum06186511995-01-07 12:40:10 +00001997#define BINOP(opname, ropname, thisfunc) \
1998 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1999 ; \
2000 else \
2001 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002002
2003
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002004static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002005or(v, w)
2006 object *v, *w;
2007{
Guido van Rossum06186511995-01-07 12:40:10 +00002008 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002009 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002010 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002011 object * (*f) FPROTO((object *, object *));
2012 if (coerce(&v, &w) != 0)
2013 return NULL;
2014 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2015 x = (*f)(v, w);
2016 DECREF(v);
2017 DECREF(w);
2018 if (f != NULL)
2019 return x;
2020 }
2021 err_setstr(TypeError, "bad operand type(s) for |");
2022 return NULL;
2023}
2024
2025static object *
2026xor(v, w)
2027 object *v, *w;
2028{
Guido van Rossum06186511995-01-07 12:40:10 +00002029 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002030 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002031 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002032 object * (*f) FPROTO((object *, object *));
2033 if (coerce(&v, &w) != 0)
2034 return NULL;
2035 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2036 x = (*f)(v, w);
2037 DECREF(v);
2038 DECREF(w);
2039 if (f != NULL)
2040 return x;
2041 }
2042 err_setstr(TypeError, "bad operand type(s) for ^");
2043 return NULL;
2044}
2045
2046static object *
2047and(v, w)
2048 object *v, *w;
2049{
Guido van Rossum06186511995-01-07 12:40:10 +00002050 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002051 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002052 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002053 object * (*f) FPROTO((object *, object *));
2054 if (coerce(&v, &w) != 0)
2055 return NULL;
2056 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2057 x = (*f)(v, w);
2058 DECREF(v);
2059 DECREF(w);
2060 if (f != NULL)
2061 return x;
2062 }
2063 err_setstr(TypeError, "bad operand type(s) for &");
2064 return NULL;
2065}
2066
2067static object *
2068lshift(v, w)
2069 object *v, *w;
2070{
Guido van Rossum06186511995-01-07 12:40:10 +00002071 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002072 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002073 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002074 object * (*f) FPROTO((object *, object *));
2075 if (coerce(&v, &w) != 0)
2076 return NULL;
2077 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2078 x = (*f)(v, w);
2079 DECREF(v);
2080 DECREF(w);
2081 if (f != NULL)
2082 return x;
2083 }
2084 err_setstr(TypeError, "bad operand type(s) for <<");
2085 return NULL;
2086}
2087
2088static object *
2089rshift(v, w)
2090 object *v, *w;
2091{
Guido van Rossum06186511995-01-07 12:40:10 +00002092 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002093 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002094 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002095 object * (*f) FPROTO((object *, object *));
2096 if (coerce(&v, &w) != 0)
2097 return NULL;
2098 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2099 x = (*f)(v, w);
2100 DECREF(v);
2101 DECREF(w);
2102 if (f != NULL)
2103 return x;
2104 }
2105 err_setstr(TypeError, "bad operand type(s) for >>");
2106 return NULL;
2107}
2108
2109static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002110add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 object *v, *w;
2112{
Guido van Rossum06186511995-01-07 12:40:10 +00002113 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002114 if (v->ob_type->tp_as_sequence != NULL)
2115 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2116 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002117 object *x;
2118 if (coerce(&v, &w) != 0)
2119 return NULL;
2120 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2121 DECREF(v);
2122 DECREF(w);
2123 return x;
2124 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002125 err_setstr(TypeError, "bad operand type(s) for +");
2126 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127}
2128
2129static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002130sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131 object *v, *w;
2132{
Guido van Rossum06186511995-01-07 12:40:10 +00002133 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002134 if (v->ob_type->tp_as_number != NULL) {
2135 object *x;
2136 if (coerce(&v, &w) != 0)
2137 return NULL;
2138 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2139 DECREF(v);
2140 DECREF(w);
2141 return x;
2142 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002143 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144 return NULL;
2145}
2146
2147static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002148mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 object *v, *w;
2150{
2151 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002152 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002153 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002154 if (tp->tp_as_number != NULL &&
2155 w->ob_type->tp_as_sequence != NULL &&
2156 !is_instanceobject(v)) {
2157 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 object *tmp = v;
2159 v = w;
2160 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002161 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002163 if (tp->tp_as_number != NULL) {
2164 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002165 if (is_instanceobject(v)) {
2166 /* Instances of user-defined classes get their
2167 other argument uncoerced, so they may
2168 implement sequence*number as well as
2169 number*number. */
2170 INCREF(v);
2171 INCREF(w);
2172 }
2173 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002174 return NULL;
2175 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2176 DECREF(v);
2177 DECREF(w);
2178 return x;
2179 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 if (tp->tp_as_sequence != NULL) {
2181 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002182 err_setstr(TypeError,
2183 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 return NULL;
2185 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002186 return (*tp->tp_as_sequence->sq_repeat)
2187 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002188 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002189 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 return NULL;
2191}
2192
2193static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002194divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195 object *v, *w;
2196{
Guido van Rossum06186511995-01-07 12:40:10 +00002197 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002198 if (v->ob_type->tp_as_number != NULL) {
2199 object *x;
2200 if (coerce(&v, &w) != 0)
2201 return NULL;
2202 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2203 DECREF(v);
2204 DECREF(w);
2205 return x;
2206 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002207 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208 return NULL;
2209}
2210
2211static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002212mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 object *v, *w;
2214{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002215 if (is_stringobject(v)) {
2216 return formatstring(v, w);
2217 }
Guido van Rossum06186511995-01-07 12:40:10 +00002218 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002219 if (v->ob_type->tp_as_number != NULL) {
2220 object *x;
2221 if (coerce(&v, &w) != 0)
2222 return NULL;
2223 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2224 DECREF(v);
2225 DECREF(w);
2226 return x;
2227 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002228 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229 return NULL;
2230}
2231
2232static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002233powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002234 object *v, *w;
2235{
2236 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002237 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002238 if (v->ob_type->tp_as_number == NULL ||
2239 w->ob_type->tp_as_number == NULL) {
2240 err_setstr(TypeError, "pow() requires numeric arguments");
2241 return NULL;
2242 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002243 if (coerce(&v, &w) != 0)
2244 return NULL;
2245 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2246 DECREF(v);
2247 DECREF(w);
2248 return res;
2249}
2250
2251static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 object *v;
2254{
2255 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256 return (*v->ob_type->tp_as_number->nb_negative)(v);
2257 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 return NULL;
2259}
2260
2261static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263 object *v;
2264{
2265 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002266 return (*v->ob_type->tp_as_number->nb_positive)(v);
2267 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 return NULL;
2269}
2270
2271static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002272invert(v)
2273 object *v;
2274{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002275 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002276 if (v->ob_type->tp_as_number != NULL &&
2277 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2278 return (*f)(v);
2279 err_setstr(TypeError, "bad operand type(s) for unary ~");
2280 return NULL;
2281}
2282
2283static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 object *v;
2286{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002287 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002288 object *w;
2289 if (outcome < 0)
2290 return NULL;
2291 if (outcome == 0)
2292 w = True;
2293 else
2294 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002295 INCREF(w);
2296 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297}
Guido van Rossum234f9421993-06-17 12:35:49 +00002298
2299
Guido van Rossum681d79a1995-07-18 14:51:37 +00002300/* External interface to call any callable object.
2301 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002302
2303object *
2304call_object(func, arg)
2305 object *func;
2306 object *arg;
2307{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2309}
Guido van Rossume59214e1994-08-30 08:01:59 +00002310
Guido van Rossum681d79a1995-07-18 14:51:37 +00002311object *
2312PyEval_CallObjectWithKeywords(func, arg, kw)
2313 object *func;
2314 object *arg;
2315 object *kw;
2316{
2317 ternaryfunc call;
2318 object *result;
2319
2320 if (arg == NULL)
2321 arg = newtupleobject(0);
2322 else if (!is_tupleobject(arg)) {
2323 err_setstr(TypeError, "argument list must be a tuple");
2324 return NULL;
2325 }
2326 else
2327 INCREF(arg);
2328
Guido van Rossume3e61c11995-08-04 04:14:47 +00002329 if (kw != NULL && !is_dictobject(kw)) {
2330 err_setstr(TypeError, "keyword list must be a dictionary");
2331 return NULL;
2332 }
2333
Guido van Rossum150b2df1996-12-05 23:17:11 +00002334 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002335 result = (*call)(func, arg, kw);
2336 else if (is_instancemethodobject(func) || is_funcobject(func))
2337 result = call_function(func, arg, kw);
2338 else
2339 result = call_builtin(func, arg, kw);
2340
2341 DECREF(arg);
2342
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002343 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002344 err_setstr(SystemError,
2345 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002346
2347 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002348}
2349
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002353 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002354 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 if (is_methodobject(func)) {
2357 method meth = getmethod(func);
2358 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002359 int flags = getflags(func);
2360 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002361 int size = gettuplesize(arg);
2362 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002363 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002364 else if (size == 0)
2365 arg = NULL;
2366 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002367 if (flags & METH_KEYWORDS)
2368 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002369 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002370 err_setstr(TypeError,
2371 "this function takes no keyword arguments");
2372 return NULL;
2373 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002374 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 }
2376 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002377 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002379 if (is_instanceobject(func)) {
2380 object *res, *call = getattr(func,"__call__");
2381 if (call == NULL) {
2382 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002383 err_setstr(AttributeError,
2384 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002385 return NULL;
2386 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002387 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002388 DECREF(call);
2389 return res;
2390 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002391 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 return NULL;
2393}
2394
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002396call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002398 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002399 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002401 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002402 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002403 object **d, **k;
2404 int nk, nd;
2405 object *result;
2406
2407 if (kw != NULL && !is_dictobject(kw)) {
2408 err_badcall();
2409 return NULL;
2410 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411
Guido van Rossume8122f11991-05-05 20:03:07 +00002412 if (is_instancemethodobject(func)) {
2413 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002414 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002415 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002416 if (self == NULL) {
2417 /* Unbound methods must be called with an instance of
2418 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002419 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002420 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002421 if (self != NULL &&
2422 is_instanceobject(self) &&
2423 issubclass((object *)
2424 (((instanceobject *)self)->in_class),
2425 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002427 else
2428 self = NULL;
2429 }
2430 if (self == NULL) {
2431 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002433 return NULL;
2434 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002436 }
2437 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002438 int argcount = gettuplesize(arg);
2439 object *newarg = newtupleobject(argcount + 1);
2440 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002441 if (newarg == NULL)
2442 return NULL;
2443 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002444 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002445 for (i = 0; i < argcount; i++) {
2446 object *v = GETTUPLEITEM(arg, i);
2447 XINCREF(v);
2448 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002449 }
2450 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 }
2452 }
2453 else {
2454 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456 return NULL;
2457 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002458 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002460
2461 argdefs = PyFunction_GetDefaults(func);
2462 if (argdefs != NULL && is_tupleobject(argdefs)) {
2463 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2464 nd = gettuplesize(argdefs);
2465 }
2466 else {
2467 d = NULL;
2468 nd = 0;
2469 }
2470
2471 if (kw != NULL) {
2472 int pos, i;
2473 nk = getmappingsize(kw);
2474 k = NEW(object *, 2*nk);
2475 if (k == NULL) {
2476 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002477 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002478 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002479 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002480 pos = i = 0;
2481 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2482 i += 2;
2483 nk = i/2;
2484 /* XXX This is broken if the caller deletes dict items! */
2485 }
2486 else {
2487 k = NULL;
2488 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002489 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490
Guido van Rossum681d79a1995-07-18 14:51:37 +00002491 result = eval_code2(
2492 (codeobject *)getfunccode(func),
2493 getfuncglobals(func), (object *)NULL,
2494 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2495 k, nk,
2496 d, nd,
2497 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498
Guido van Rossum681d79a1995-07-18 14:51:37 +00002499 DECREF(arg);
2500 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501
Guido van Rossum681d79a1995-07-18 14:51:37 +00002502 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503}
2504
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002505#define SLICE_ERROR_MSG \
2506 "standard sequence type does not support step size other than one"
2507
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002509apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510 object *v, *w;
2511{
2512 typeobject *tp = v->ob_type;
2513 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 return NULL;
2516 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002517 if (tp->tp_as_mapping != NULL) {
2518 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2519 }
2520 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002522 if (!is_intobject(w)) {
2523 if (PySlice_Check(w)) {
2524 err_setstr(ValueError, SLICE_ERROR_MSG);
2525 } else {
2526 err_setstr(TypeError,
2527 "sequence subscript not int");
2528 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 return NULL;
2530 }
2531 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002532 if (i < 0) {
2533 int len = (*tp->tp_as_sequence->sq_length)(v);
2534 if (len < 0)
2535 return NULL;
2536 i += len;
2537 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540}
2541
2542static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002543loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 object *v, *w;
2545{
2546 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002547 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 return NULL;
2551 }
2552 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002553 v = (*sq->sq_item)(v, i);
2554 if (v)
2555 return v;
2556 if (err_occurred() == IndexError)
2557 err_clear();
2558 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559}
2560
2561static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002562slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563 object *v;
2564 int isize;
2565 int *pi;
2566{
2567 if (v != NULL) {
2568 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002569 err_setstr(TypeError, "slice index must be int");
2570 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 }
2572 *pi = getintvalue(v);
2573 if (*pi < 0)
2574 *pi += isize;
2575 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577}
2578
2579static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002580apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 object *u, *v, *w;
2582{
2583 typeobject *tp = u->ob_type;
2584 int ilow, ihigh, isize;
2585 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002586 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587 return NULL;
2588 }
2589 ilow = 0;
2590 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002591 if (isize < 0)
2592 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002595 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002597 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599
2600static int
2601assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 object *w;
2603 object *key;
2604 object *v;
2605{
2606 typeobject *tp = w->ob_type;
2607 sequence_methods *sq;
2608 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002609 int (*func1)();
2610 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002611 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002612 (func1 = mp->mp_ass_subscript) != NULL) {
2613 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002614 }
2615 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002616 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002618 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002619 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002620 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002622 else {
2623 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002624 if (i < 0) {
2625 int len = (*sq->sq_length)(w);
2626 if (len < 0)
2627 return -1;
2628 i += len;
2629 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002630 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002631 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 err_setstr(TypeError,
2635 "can't assign to this subscripted object");
2636 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638}
2639
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640static int
2641assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 object *u, *v, *w, *x;
2643{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002644 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002646 if (sq == NULL) {
2647 err_setstr(TypeError, "assign to slice of non-sequence");
2648 return -1;
2649 }
2650 if (sq == NULL || sq->sq_ass_slice == NULL) {
2651 err_setstr(TypeError, "unassignable slice");
2652 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 }
2654 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002655 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002656 if (isize < 0)
2657 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002658 if (slice_index(v, isize, &ilow) != 0)
2659 return -1;
2660 if (slice_index(w, isize, &ihigh) != 0)
2661 return -1;
2662 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663}
2664
2665static int
2666cmp_exception(err, v)
2667 object *err, *v;
2668{
2669 if (is_tupleobject(v)) {
2670 int i, n;
2671 n = gettuplesize(v);
2672 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002673 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002674 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002675 return 1;
2676 }
2677 return 0;
2678 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002679 if (is_classobject(v) && is_classobject(err))
2680 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 return err == v;
2682}
2683
Guido van Rossum3f5da241990-12-20 15:06:42 +00002684static int
2685cmp_member(v, w)
2686 object *v, *w;
2687{
Guido van Rossume59214e1994-08-30 08:01:59 +00002688 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002689 object *x;
2690 sequence_methods *sq;
2691 /* Special case for char in string */
2692 if (is_stringobject(w)) {
2693 register char *s, *end;
2694 register char c;
2695 if (!is_stringobject(v) || getstringsize(v) != 1) {
2696 err_setstr(TypeError,
2697 "string member test needs char left operand");
2698 return -1;
2699 }
2700 c = getstringvalue(v)[0];
2701 s = getstringvalue(w);
2702 end = s + getstringsize(w);
2703 while (s < end) {
2704 if (c == *s++)
2705 return 1;
2706 }
2707 return 0;
2708 }
2709 sq = w->ob_type->tp_as_sequence;
2710 if (sq == NULL) {
2711 err_setstr(TypeError,
2712 "'in' or 'not in' needs sequence right argument");
2713 return -1;
2714 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002715 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002716 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002717 if (x == NULL) {
2718 if (err_occurred() == IndexError) {
2719 err_clear();
2720 break;
2721 }
2722 return -1;
2723 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002724 cmp = cmpobject(v, x);
2725 XDECREF(x);
2726 if (cmp == 0)
2727 return 1;
2728 }
2729 return 0;
2730}
2731
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002733cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002734 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 register object *v;
2736 register object *w;
2737{
2738 register int cmp;
2739 register int res = 0;
2740 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002741 case IS:
2742 case IS_NOT:
2743 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002744 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002745 res = !res;
2746 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 case IN:
2748 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002749 res = cmp_member(v, w);
2750 if (res < 0)
2751 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002752 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002754 break;
2755 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002756 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757 break;
2758 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759 cmp = cmpobject(v, w);
2760 switch (op) {
2761 case LT: res = cmp < 0; break;
2762 case LE: res = cmp <= 0; break;
2763 case EQ: res = cmp == 0; break;
2764 case NE: res = cmp != 0; break;
2765 case GT: res = cmp > 0; break;
2766 case GE: res = cmp >= 0; break;
2767 /* XXX no default? (res is initialized to 0 though) */
2768 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 }
2770 v = res ? True : False;
2771 INCREF(v);
2772 return v;
2773}
2774
Guido van Rossum3f5da241990-12-20 15:06:42 +00002775static int
2776import_from(locals, v, name)
2777 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002778 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002779 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002780{
2781 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002782 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002783 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002784 return -1;
2785 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002786 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002787 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002788 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002789 object *name, *value;
2790 pos = 0;
2791 while (mappinggetnext(w, &pos, &name, &value)) {
2792 if (!is_stringobject(name) ||
2793 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002794 continue;
Guido van Rossum1aa14831997-01-21 05:34:20 +00002795 INCREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002796 err = dict2insert(locals, name, value);
2797 DECREF(value);
2798 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002799 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002800 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002801 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002802 }
2803 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002804 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002805 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002806 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002807 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002808 getstringvalue(name));
2809 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002810 return -1;
2811 }
2812 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002813 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002814 }
2815}
2816
2817static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002818build_class(methods, bases, name)
2819 object *methods; /* dictionary */
2820 object *bases; /* tuple containing classes */
2821 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002822{
Guido van Rossum25831651993-05-19 14:50:45 +00002823 int i;
2824 if (!is_tupleobject(bases)) {
2825 err_setstr(SystemError, "build_class with non-tuple bases");
2826 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002827 }
Guido van Rossum25831651993-05-19 14:50:45 +00002828 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002829 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002830 return NULL;
2831 }
Guido van Rossum25831651993-05-19 14:50:45 +00002832 if (!is_stringobject(name)) {
2833 err_setstr(SystemError, "build_class witn non-string name");
2834 return NULL;
2835 }
2836 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002837 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002838 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002839 /* Call the base's *type*, if it is callable.
2840 This code is a hook for Donald Beaudry's
2841 and Jim Fulton's type extensions. In
2842 unexended Python it will never be triggered
2843 since its types are not callable. */
2844 if (base->ob_type->ob_type->tp_call) {
2845 object *args;
2846 object *class;
2847 args = mkvalue("(OOO)", name, bases, methods);
2848 class = call_object((object *)base->ob_type,
2849 args);
2850 DECREF(args);
2851 return class;
2852 }
Guido van Rossum25831651993-05-19 14:50:45 +00002853 err_setstr(TypeError,
2854 "base is not a class object");
2855 return NULL;
2856 }
2857 }
2858 return newclassobject(bases, methods, name);
2859}
2860
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002861static int
2862exec_statement(prog, globals, locals)
2863 object *prog;
2864 object *globals;
2865 object *locals;
2866{
2867 char *s;
2868 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002869 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002870 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002871
2872 if (is_tupleobject(prog) && globals == None && locals == None &&
2873 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2874 /* Backward compatibility hack */
2875 globals = gettupleitem(prog, 1);
2876 if (n == 3)
2877 locals = gettupleitem(prog, 2);
2878 prog = gettupleitem(prog, 0);
2879 }
2880 if (globals == None) {
2881 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002882 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002883 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002884 plain = 1;
2885 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002886 }
2887 else if (locals == None)
2888 locals = globals;
2889 if (!is_stringobject(prog) &&
2890 !is_codeobject(prog) &&
2891 !is_fileobject(prog)) {
2892 err_setstr(TypeError,
2893 "exec 1st arg must be string, code or file object");
2894 return -1;
2895 }
2896 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2897 err_setstr(TypeError,
2898 "exec 2nd/3rd args must be dict or None");
2899 return -1;
2900 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002901 if (dictlookup(globals, "__builtins__") == NULL)
2902 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002903 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002904 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002905 return -1;
2906 return 0;
2907 }
2908 if (is_fileobject(prog)) {
2909 FILE *fp = getfilefile(prog);
2910 char *name = getstringvalue(getfilename(prog));
2911 if (run_file(fp, name, file_input, globals, locals) == NULL)
2912 return -1;
2913 return 0;
2914 }
2915 s = getstringvalue(prog);
2916 if (strlen(s) != getstringsize(prog)) {
2917 err_setstr(ValueError, "embedded '\\0' in exec string");
2918 return -1;
2919 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002920 v = run_string(s, file_input, globals, locals);
2921 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002922 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002923 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002924 if (plain)
2925 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002926 return 0;
2927}
Guido van Rossum24c13741995-02-14 09:42:43 +00002928
Guido van Rossum1aa14831997-01-21 05:34:20 +00002929/* Hack for ni.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002930static object *
2931find_from_args(f, nexti)
2932 frameobject *f;
2933 int nexti;
2934{
2935 int opcode;
2936 int oparg;
2937 object *list, *name;
2938 unsigned char *next_instr;
2939
2940 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2941 opcode = (*next_instr++);
2942 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002943 INCREF(None);
2944 return None;
2945 }
2946
2947 list = newlistobject(0);
2948 if (list == NULL)
2949 return NULL;
2950
2951 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002952 oparg = (next_instr[1]<<8) + next_instr[0];
2953 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002954 name = Getnamev(f, oparg);
2955 if (addlistitem(list, name) < 0) {
2956 DECREF(list);
2957 break;
2958 }
2959 opcode = (*next_instr++);
2960 } while (opcode == IMPORT_FROM);
2961
2962 return list;
2963}