blob: 3d2375c7068f7321d82a0bbafcb521f9c9ac9d11 [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;
412 }
413 if (argcount > co->co_argcount) {
414 if (!(co->co_flags & CO_VARARGS)) {
415 err_setstr(TypeError, "too many arguments");
416 goto fail;
417 }
418 n = co->co_argcount;
419 }
420 for (i = 0; i < n; i++) {
421 x = args[i];
422 INCREF(x);
423 SETLOCAL(i, x);
424 }
425 if (co->co_flags & CO_VARARGS) {
426 u = newtupleobject(argcount - n);
427 for (i = n; i < argcount; i++) {
428 x = args[i];
429 INCREF(x);
430 SETTUPLEITEM(u, i-n, x);
431 }
432 SETLOCAL(co->co_argcount, u);
433 }
434 for (i = 0; i < kwcount; i++) {
435 object *keyword = kws[2*i];
436 object *value = kws[2*i + 1];
437 int j;
438 /* XXX slow -- speed up using dictionary? */
439 for (j = 0; j < co->co_argcount; j++) {
440 object *nm = GETTUPLEITEM(co->co_varnames, j);
441 if (cmpobject(keyword, nm) == 0)
442 break;
443 }
444 if (j >= co->co_argcount) {
445 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000446 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 goto fail;
448 }
449 mappinginsert(kwdict, keyword, value);
450 }
451 else {
452 if (GETLOCAL(j) != NULL) {
453 err_setstr(TypeError,
454 "keyword parameter redefined");
455 goto fail;
456 }
457 INCREF(value);
458 SETLOCAL(j, value);
459 }
460 }
461 if (argcount < co->co_argcount) {
462 int m = co->co_argcount - defcount;
463 for (i = argcount; i < m; i++) {
464 if (GETLOCAL(i) == NULL) {
465 err_setstr(TypeError,
466 "not enough arguments");
467 goto fail;
468 }
469 }
470 if (n > m)
471 i = n - m;
472 else
473 i = 0;
474 for (; i < defcount; i++) {
475 if (GETLOCAL(m+i) == NULL) {
476 object *def = defs[i];
477 INCREF(def);
478 SETLOCAL(m+i, def);
479 }
480 }
481 }
482 if (kwdict != NULL) {
483 i = co->co_argcount;
484 if (co->co_flags & CO_VARARGS)
485 i++;
486 SETLOCAL(i, kwdict);
487 }
488 if (0) {
489 fail:
490 XDECREF(kwdict);
491 goto fail2;
492 }
493 }
494 else {
495 if (argcount > 0 || kwcount > 0) {
496 err_setstr(TypeError, "no arguments expected");
497 fail2:
498 current_frame = f->f_back;
499 DECREF(f);
500 return NULL;
501 }
502 }
503
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000504 if (sys_trace != NULL) {
505 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000506 be called on *every* entry to a code block.
507 Its return value, if not None, is a function that
508 will be called at the start of each executed line
509 of code. (Actually, the function must return
510 itself in order to continue tracing.)
511 The trace functions are called with three arguments:
512 a pointer to the current frame, a string indicating
513 why the function is called, and an argument which
514 depends on the situation. The global trace function
515 (sys.trace) is also called whenever an exception
516 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517 if (call_trace(&sys_trace, &f->f_trace, f, "call",
518 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000519 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000520 current_frame = f->f_back;
521 DECREF(f);
522 return NULL;
523 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000524 }
525
526 if (sys_profile != NULL) {
527 /* Similar for sys_profile, except it needn't return
528 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 if (call_trace(&sys_profile, (object**)0, f, "call",
530 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000531 current_frame = f->f_back;
532 DECREF(f);
533 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000534 }
535 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000536
Guido van Rossum8861b741996-07-30 16:49:37 +0000537 if (++recursion_depth > MAX_RECURSION_DEPTH) {
538 --recursion_depth;
539 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
540 current_frame = f->f_back;
541 DECREF(f);
542 return NULL;
543 }
544
Guido van Rossum374a9221991-04-04 10:40:29 +0000545 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000546 stack_pointer = f->f_valuestack;
547
Guido van Rossum374a9221991-04-04 10:40:29 +0000548 why = WHY_NOT;
549 err = 0;
550 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000551
552 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000553 /* Do periodic things.
554 Doing this every time through the loop would add
555 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000556 So we do it only every Nth instruction.
557
558 The ticker is reset to zero if there are pending
Guido van Rossum70d44781997-01-21 06:15:24 +0000559 calls (see Py_AddPendingCall() and
Guido van Rossum8861b741996-07-30 16:49:37 +0000560 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000561
Guido van Rossum374a9221991-04-04 10:40:29 +0000562 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000563 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000564 if (pendingfirst != pendinglast) {
565 if (Py_MakePendingCalls() < 0) {
566 why = WHY_EXCEPTION;
567 goto on_error;
568 }
569 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000570#ifndef HAVE_SIGNAL_H /* Is this the right #define? */
571/* If we have true signals, the signal handler will call
572 Py_AddPendingCall() so we don't have to call sigcheck().
573 On the Mac and DOS, alas, we have to call it. */
Guido van Rossume59214e1994-08-30 08:01:59 +0000574 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000575 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000576 goto on_error;
577 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000578#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000579
Guido van Rossume59214e1994-08-30 08:01:59 +0000580#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000581 if (interpreter_lock) {
582 /* Give another thread a chance */
583
584 current_frame = NULL;
585 release_lock(interpreter_lock);
586
587 /* Other threads may run now */
588
589 acquire_lock(interpreter_lock, 1);
590 current_frame = f;
591 }
592#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000593 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000594
Guido van Rossum374a9221991-04-04 10:40:29 +0000595 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000596
Guido van Rossum408027e1996-12-30 16:17:54 +0000597#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000598 f->f_lasti = INSTR_OFFSET();
599#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000600
601 opcode = NEXTOP();
602 if (HAS_ARG(opcode))
603 oparg = NEXTARG();
604
Guido van Rossum96a42c81992-01-12 02:29:51 +0000605#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 /* Instruction tracing */
607
Guido van Rossum96a42c81992-01-12 02:29:51 +0000608 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000609 if (HAS_ARG(opcode)) {
610 printf("%d: %d, %d\n",
611 (int) (INSTR_OFFSET() - 3),
612 opcode, oparg);
613 }
614 else {
615 printf("%d: %d\n",
616 (int) (INSTR_OFFSET() - 1), opcode);
617 }
618 }
619#endif
620
621 /* Main switch on opcode */
622
623 switch (opcode) {
624
625 /* BEWARE!
626 It is essential that any operation that fails sets either
627 x to NULL, err to nonzero, or why to anything but WHY_NOT,
628 and that no operation that succeeds does this! */
629
630 /* case STOP_CODE: this is an error! */
631
632 case POP_TOP:
633 v = POP();
634 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000635 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000636
637 case ROT_TWO:
638 v = POP();
639 w = POP();
640 PUSH(v);
641 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000642 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000643
644 case ROT_THREE:
645 v = POP();
646 w = POP();
647 x = POP();
648 PUSH(v);
649 PUSH(x);
650 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000651 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000652
653 case DUP_TOP:
654 v = TOP();
655 INCREF(v);
656 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000657 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000658
659 case UNARY_POSITIVE:
660 v = POP();
661 x = pos(v);
662 DECREF(v);
663 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000664 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000665 break;
666
667 case UNARY_NEGATIVE:
668 v = POP();
669 x = neg(v);
670 DECREF(v);
671 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000672 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 break;
674
675 case UNARY_NOT:
676 v = POP();
677 x = not(v);
678 DECREF(v);
679 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000680 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 break;
682
683 case UNARY_CONVERT:
684 v = POP();
685 x = reprobject(v);
686 DECREF(v);
687 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000688 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000690
691 case UNARY_INVERT:
692 v = POP();
693 x = invert(v);
694 DECREF(v);
695 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000696 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000697 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000698
Guido van Rossum50564e81996-01-12 01:13:16 +0000699 case BINARY_POWER:
700 w = POP();
701 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000702 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000703 DECREF(v);
704 DECREF(w);
705 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000706 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000707 break;
708
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 case BINARY_MULTIPLY:
710 w = POP();
711 v = POP();
712 x = mul(v, w);
713 DECREF(v);
714 DECREF(w);
715 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000716 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 break;
718
719 case BINARY_DIVIDE:
720 w = POP();
721 v = POP();
722 x = divide(v, w);
723 DECREF(v);
724 DECREF(w);
725 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000726 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000727 break;
728
729 case BINARY_MODULO:
730 w = POP();
731 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000732 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 DECREF(v);
734 DECREF(w);
735 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 break;
738
739 case BINARY_ADD:
740 w = POP();
741 v = POP();
742 x = add(v, w);
743 DECREF(v);
744 DECREF(w);
745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 break;
748
749 case BINARY_SUBTRACT:
750 w = POP();
751 v = POP();
752 x = sub(v, w);
753 DECREF(v);
754 DECREF(w);
755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 break;
758
759 case BINARY_SUBSCR:
760 w = POP();
761 v = POP();
762 x = apply_subscript(v, w);
763 DECREF(v);
764 DECREF(w);
765 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000766 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 break;
768
Guido van Rossum7928cd71991-10-24 14:59:31 +0000769 case BINARY_LSHIFT:
770 w = POP();
771 v = POP();
772 x = lshift(v, w);
773 DECREF(v);
774 DECREF(w);
775 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000776 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000777 break;
778
779 case BINARY_RSHIFT:
780 w = POP();
781 v = POP();
782 x = rshift(v, w);
783 DECREF(v);
784 DECREF(w);
785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000786 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000787 break;
788
789 case BINARY_AND:
790 w = POP();
791 v = POP();
792 x = and(v, w);
793 DECREF(v);
794 DECREF(w);
795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000796 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000797 break;
798
799 case BINARY_XOR:
800 w = POP();
801 v = POP();
802 x = xor(v, w);
803 DECREF(v);
804 DECREF(w);
805 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000806 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000807 break;
808
809 case BINARY_OR:
810 w = POP();
811 v = POP();
812 x = or(v, w);
813 DECREF(v);
814 DECREF(w);
815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000817 break;
818
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 case SLICE+0:
820 case SLICE+1:
821 case SLICE+2:
822 case SLICE+3:
823 if ((opcode-SLICE) & 2)
824 w = POP();
825 else
826 w = NULL;
827 if ((opcode-SLICE) & 1)
828 v = POP();
829 else
830 v = NULL;
831 u = POP();
832 x = apply_slice(u, v, w);
833 DECREF(u);
834 XDECREF(v);
835 XDECREF(w);
836 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000837 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 break;
839
840 case STORE_SLICE+0:
841 case STORE_SLICE+1:
842 case STORE_SLICE+2:
843 case STORE_SLICE+3:
844 if ((opcode-STORE_SLICE) & 2)
845 w = POP();
846 else
847 w = NULL;
848 if ((opcode-STORE_SLICE) & 1)
849 v = POP();
850 else
851 v = NULL;
852 u = POP();
853 t = POP();
854 err = assign_slice(u, v, w, t); /* u[v:w] = t */
855 DECREF(t);
856 DECREF(u);
857 XDECREF(v);
858 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000859 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 break;
861
862 case DELETE_SLICE+0:
863 case DELETE_SLICE+1:
864 case DELETE_SLICE+2:
865 case DELETE_SLICE+3:
866 if ((opcode-DELETE_SLICE) & 2)
867 w = POP();
868 else
869 w = NULL;
870 if ((opcode-DELETE_SLICE) & 1)
871 v = POP();
872 else
873 v = NULL;
874 u = POP();
875 err = assign_slice(u, v, w, (object *)NULL);
876 /* del u[v:w] */
877 DECREF(u);
878 XDECREF(v);
879 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 break;
882
883 case STORE_SUBSCR:
884 w = POP();
885 v = POP();
886 u = POP();
887 /* v[w] = u */
888 err = assign_subscript(v, w, u);
889 DECREF(u);
890 DECREF(v);
891 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000892 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 break;
894
895 case DELETE_SUBSCR:
896 w = POP();
897 v = POP();
898 /* del v[w] */
899 err = assign_subscript(v, w, (object *)NULL);
900 DECREF(v);
901 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000902 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 break;
904
905 case PRINT_EXPR:
906 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000907 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000908 /* Before printing, also assign to '_' */
909 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000910 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000911 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000913 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000914 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000915 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 flushline();
917 }
918 DECREF(v);
919 break;
920
921 case PRINT_ITEM:
922 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000923 w = sysget("stdout");
924 if (softspace(w, 1))
925 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000926 err = writeobject(v, w, PRINT_RAW);
927 if (err == 0 && is_stringobject(v)) {
928 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 char *s = getstringvalue(v);
930 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000931 if (len > 0 &&
932 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000933 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000934 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000935 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000936 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000937 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 break;
939
940 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000941 x = sysget("stdout");
942 if (x == NULL)
943 err_setstr(RuntimeError, "lost sys.stdout");
944 else {
945 writestring("\n", x);
946 softspace(x, 0);
947 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 break;
949
950 case BREAK_LOOP:
951 why = WHY_BREAK;
952 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000953
Guido van Rossumf10570b1995-07-07 22:53:21 +0000954 case RAISE_VARARGS:
955 u = v = w = NULL;
956 switch (oparg) {
957 case 3:
958 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000959 /* Fallthrough */
960 case 2:
961 v = POP(); /* value */
962 /* Fallthrough */
963 case 1:
964 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000965 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000966 break;
967 default:
968 err_setstr(SystemError,
969 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000970 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000971 break;
972 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 break;
974
975 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000976 if ((x = f->f_locals) == NULL) {
977 err_setstr(SystemError, "no locals");
978 break;
979 }
980 INCREF(x);
981 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 break;
983
984 case RETURN_VALUE:
985 retval = POP();
986 why = WHY_RETURN;
987 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000988
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000989 case EXEC_STMT:
990 w = POP();
991 v = POP();
992 u = POP();
993 err = exec_statement(u, v, w);
994 DECREF(u);
995 DECREF(v);
996 DECREF(w);
997 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000998
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 case POP_BLOCK:
1000 {
1001 block *b = pop_block(f);
1002 while (STACK_LEVEL() > b->b_level) {
1003 v = POP();
1004 DECREF(v);
1005 }
1006 }
1007 break;
1008
1009 case END_FINALLY:
1010 v = POP();
1011 if (is_intobject(v)) {
1012 why = (enum why_code) getintvalue(v);
1013 if (why == WHY_RETURN)
1014 retval = POP();
1015 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001016 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001018 u = POP();
1019 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001020 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001021 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 }
1023 else if (v != None) {
1024 err_setstr(SystemError,
1025 "'finally' pops bad exception");
1026 why = WHY_EXCEPTION;
1027 }
1028 DECREF(v);
1029 break;
1030
1031 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001032 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001033 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001034 w = POP();
1035 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001037 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 DECREF(v);
1039 DECREF(w);
1040 break;
1041
1042 case STORE_NAME:
1043 w = GETNAMEV(oparg);
1044 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001045 if ((x = f->f_locals) == NULL) {
1046 err_setstr(SystemError, "no locals");
1047 break;
1048 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001049 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 DECREF(v);
1051 break;
1052
1053 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001054 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001055 if ((x = f->f_locals) == NULL) {
1056 err_setstr(SystemError, "no locals");
1057 break;
1058 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001059 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001060 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001061 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001062
1063#ifdef CASE_TOO_BIG
1064 default: switch (opcode) {
1065#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001066
1067 case UNPACK_TUPLE:
1068 v = POP();
1069 if (!is_tupleobject(v)) {
1070 err_setstr(TypeError, "unpack non-tuple");
1071 why = WHY_EXCEPTION;
1072 }
1073 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001074 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 "unpack tuple of wrong size");
1076 why = WHY_EXCEPTION;
1077 }
1078 else {
1079 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001080 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001081 INCREF(w);
1082 PUSH(w);
1083 }
1084 }
1085 DECREF(v);
1086 break;
1087
1088 case UNPACK_LIST:
1089 v = POP();
1090 if (!is_listobject(v)) {
1091 err_setstr(TypeError, "unpack non-list");
1092 why = WHY_EXCEPTION;
1093 }
1094 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001095 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001096 "unpack list of wrong size");
1097 why = WHY_EXCEPTION;
1098 }
1099 else {
1100 for (; --oparg >= 0; ) {
1101 w = getlistitem(v, oparg);
1102 INCREF(w);
1103 PUSH(w);
1104 }
1105 }
1106 DECREF(v);
1107 break;
1108
1109 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001110 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 v = POP();
1112 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001113 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001114 DECREF(v);
1115 DECREF(u);
1116 break;
1117
1118 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001121 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001122 DECREF(v);
1123 break;
1124
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001125 case STORE_GLOBAL:
1126 w = GETNAMEV(oparg);
1127 v = POP();
1128 err = dict2insert(f->f_globals, w, v);
1129 DECREF(v);
1130 break;
1131
1132 case DELETE_GLOBAL:
1133 w = GETNAMEV(oparg);
1134 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001135 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001136 break;
1137
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 case LOAD_CONST:
1139 x = GETCONST(oparg);
1140 INCREF(x);
1141 PUSH(x);
1142 break;
1143
1144 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001145 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001146 if ((x = f->f_locals) == NULL) {
1147 err_setstr(SystemError, "no locals");
1148 break;
1149 }
1150 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001152 err_clear();
1153 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001155 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001156 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001157 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001158 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 break;
1160 }
1161 }
1162 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001163 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001164 PUSH(x);
1165 break;
1166
1167 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001168 w = GETNAMEV(oparg);
1169 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001171 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001172 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001173 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001174 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001175 break;
1176 }
1177 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001178 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 PUSH(x);
1180 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001181
Guido van Rossum9bfef441993-03-29 10:43:31 +00001182 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001183 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001184 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001185 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001186 gettupleitem(co->co_varnames,
1187 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001188 break;
1189 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001190 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001191 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001192 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001193 break;
1194
1195 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001196 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001197 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001198 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001199
1200 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001201 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001202 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001203
1204 case BUILD_TUPLE:
1205 x = newtupleobject(oparg);
1206 if (x != NULL) {
1207 for (; --oparg >= 0;) {
1208 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001209 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 }
1211 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001212 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 }
1214 break;
1215
1216 case BUILD_LIST:
1217 x = newlistobject(oparg);
1218 if (x != NULL) {
1219 for (; --oparg >= 0;) {
1220 w = POP();
1221 err = setlistitem(x, oparg, w);
1222 if (err != 0)
1223 break;
1224 }
1225 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001226 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 }
1228 break;
1229
1230 case BUILD_MAP:
1231 x = newdictobject();
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 LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001237 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001239 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 DECREF(v);
1241 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001242 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
1244
1245 case COMPARE_OP:
1246 w = POP();
1247 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001248 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 DECREF(v);
1250 DECREF(w);
1251 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001252 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
1254
1255 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001256 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001257 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001258 if (x == NULL) {
1259 err_setstr(ImportError,
1260 "__import__ not found");
1261 break;
1262 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001263 if (is_methodobject(x)) {
1264 u = None;
1265 INCREF(u);
1266 }
1267 else {
1268 u = find_from_args(f, INSTR_OFFSET());
1269 if (u == NULL) {
1270 x = u;
1271 break;
1272 }
1273 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001274 w = mkvalue("(OOOO)",
1275 w,
1276 f->f_globals,
1277 f->f_locals == NULL ? None : f->f_locals,
1278 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001279 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001280 if (w == NULL) {
1281 x = NULL;
1282 break;
1283 }
1284 x = call_object(x, w);
1285 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001286 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001287 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
1289
1290 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001291 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001293 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001294 if ((x = f->f_locals) == NULL) {
1295 err_setstr(SystemError, "no locals");
1296 break;
1297 }
1298 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001299 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001300 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001302
Guido van Rossum374a9221991-04-04 10:40:29 +00001303 case JUMP_FORWARD:
1304 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001305 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001306
1307 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001308 err = testbool(TOP());
1309 if (err > 0)
1310 err = 0;
1311 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001313 else
1314 break;
1315 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001316
1317 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001318 err = testbool(TOP());
1319 if (err > 0) {
1320 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001322 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 else if (err == 0)
1324 ;
1325 else
1326 break;
1327 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328
1329 case JUMP_ABSOLUTE:
1330 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001331 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332
1333 case FOR_LOOP:
1334 /* for v in s: ...
1335 On entry: stack contains s, i.
1336 On exit: stack contains s, i+1, s[i];
1337 but if loop exhausted:
1338 s, i are popped, and we jump */
1339 w = POP(); /* Loop index */
1340 v = POP(); /* Sequence object */
1341 u = loop_subscript(v, w);
1342 if (u != NULL) {
1343 PUSH(v);
1344 x = newintobject(getintvalue(w)+1);
1345 PUSH(x);
1346 DECREF(w);
1347 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001348 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 }
1350 else {
1351 DECREF(v);
1352 DECREF(w);
1353 /* A NULL can mean "s exhausted"
1354 but also an error: */
1355 if (err_occurred())
1356 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001357 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001359 continue;
1360 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 }
1362 break;
1363
1364 case SETUP_LOOP:
1365 case SETUP_EXCEPT:
1366 case SETUP_FINALLY:
1367 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1368 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001369 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001370
1371 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001372#ifdef LLTRACE
1373 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001374 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001375#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001376 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001377 if (f->f_trace == NULL)
1378 continue;
1379 /* Trace each line of code reached */
1380 f->f_lasti = INSTR_OFFSET();
1381 err = call_trace(&f->f_trace, &f->f_trace,
1382 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001384
1385 case CALL_FUNCTION:
1386 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001387 int na = oparg & 0xff;
1388 int nk = (oparg>>8) & 0xff;
1389 int n = na + 2*nk;
1390 object **pfunc = stack_pointer - n - 1;
1391 object *func = *pfunc;
1392 object *self = NULL;
1393 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001394 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001395 if (is_instancemethodobject(func)) {
1396 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001397 class = instancemethodgetclass(func);
1398 func = instancemethodgetfunc(func);
1399 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001400 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001401 INCREF(self);
1402 DECREF(*pfunc);
1403 *pfunc = self;
1404 na++;
1405 n++;
1406 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001407 else {
1408 /* Unbound methods must be
1409 called with an instance of
1410 the class (or a derived
1411 class) as first argument */
1412 if (na > 0 &&
1413 (self = stack_pointer[-n])
1414 != NULL &&
1415 is_instanceobject(self) &&
1416 issubclass(
1417 (object *)
1418 (((instanceobject *)self)
1419 ->in_class),
1420 class))
1421 /* Handy-dandy */ ;
1422 else {
1423 err_setstr(TypeError,
1424 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001425 x = NULL;
1426 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 }
1428 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001429 }
1430 else
1431 INCREF(func);
1432 if (is_funcobject(func)) {
1433 object *co = getfunccode(func);
1434 object *globals = getfuncglobals(func);
1435 object *argdefs = PyFunction_GetDefaults(func);
1436 object **d;
1437 int nd;
1438 if (argdefs != NULL) {
1439 d = &GETTUPLEITEM(argdefs, 0);
1440 nd = ((tupleobject *)argdefs)->ob_size;
1441 }
1442 else {
1443 d = NULL;
1444 nd = 0;
1445 }
1446 x = eval_code2(
1447 (codeobject *)co,
1448 globals, (object *)NULL,
1449 stack_pointer-n, na,
1450 stack_pointer-2*nk, nk,
1451 d, nd,
1452 class);
1453 }
1454 else {
1455 object *args = newtupleobject(na);
1456 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001457 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001458 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001459 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001460 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001461 if (nk > 0) {
1462 kwdict = newdictobject();
1463 if (kwdict == NULL) {
1464 x = NULL;
1465 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001466 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001467 err = 0;
1468 while (--nk >= 0) {
1469 object *value = POP();
1470 object *key = POP();
1471 err = mappinginsert(
1472 kwdict, key, value);
1473 if (err) {
1474 DECREF(key);
1475 DECREF(value);
1476 break;
1477 }
1478 }
1479 if (err) {
1480 DECREF(args);
1481 DECREF(kwdict);
1482 break;
1483 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001484 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001485 while (--na >= 0) {
1486 w = POP();
1487 SETTUPLEITEM(args, na, w);
1488 }
1489 x = PyEval_CallObjectWithKeywords(
1490 func, args, kwdict);
1491 DECREF(args);
1492 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001493 }
1494 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 while (stack_pointer > pfunc) {
1496 w = POP();
1497 DECREF(w);
1498 }
1499 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001500 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001501 break;
1502 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001503
Guido van Rossum681d79a1995-07-18 14:51:37 +00001504 case MAKE_FUNCTION:
1505 v = POP(); /* code object */
1506 x = newfuncobject(v, f->f_globals);
1507 DECREF(v);
1508 /* XXX Maybe this should be a separate opcode? */
1509 if (x != NULL && oparg > 0) {
1510 v = newtupleobject(oparg);
1511 if (v == NULL) {
1512 DECREF(x);
1513 x = NULL;
1514 break;
1515 }
1516 while (--oparg >= 0) {
1517 w = POP();
1518 SETTUPLEITEM(v, oparg, w);
1519 }
1520 err = PyFunction_SetDefaults(x, v);
1521 DECREF(v);
1522 }
1523 PUSH(x);
1524 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001525
1526 case BUILD_SLICE:
1527 if (oparg == 3)
1528 w = POP();
1529 else
1530 w = NULL;
1531 v = POP();
1532 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001533 x = PySlice_New(u, v, w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001534 DECREF(u);
1535 DECREF(v);
1536 XDECREF(w);
1537 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001538 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001539 break;
1540
1541
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 default:
1543 fprintf(stderr,
1544 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001545 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001546 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 why = WHY_EXCEPTION;
1548 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001549
1550#ifdef CASE_TOO_BIG
1551 }
1552#endif
1553
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 } /* switch */
1555
1556 on_error:
1557
1558 /* Quickly continue if no error occurred */
1559
1560 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001561 if (err == 0 && x != NULL) {
1562#ifdef CHECKEXC
1563 if (err_occurred())
1564 fprintf(stderr,
1565 "XXX undetected error\n");
1566 else
1567#endif
1568 continue; /* Normal, fast path */
1569 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001570 why = WHY_EXCEPTION;
1571 x = None;
1572 err = 0;
1573 }
1574
Guido van Rossum801dcae1992-04-08 11:32:32 +00001575#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001576 /* Double-check exception status */
1577
1578 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1579 if (!err_occurred()) {
1580 fprintf(stderr, "XXX ghost error\n");
1581 err_setstr(SystemError, "ghost error");
1582 why = WHY_EXCEPTION;
1583 }
1584 }
1585 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001586 if (err_occurred()) {
1587 fprintf(stderr,
1588 "XXX undetected error (why=%d)\n",
1589 why);
1590 why = WHY_EXCEPTION;
1591 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001592 }
1593#endif
1594
1595 /* Log traceback info if this is a real exception */
1596
1597 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001598 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001600 f->f_lasti -= 2;
1601 tb_here(f);
1602
Guido van Rossume59214e1994-08-30 08:01:59 +00001603 if (f->f_trace)
1604 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001605 if (sys_profile)
1606 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 }
1608
1609 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1610
1611 if (why == WHY_RERAISE)
1612 why = WHY_EXCEPTION;
1613
1614 /* Unwind stacks if a (pseudo) exception occurred */
1615
1616 while (why != WHY_NOT && f->f_iblock > 0) {
1617 block *b = pop_block(f);
1618 while (STACK_LEVEL() > b->b_level) {
1619 v = POP();
1620 XDECREF(v);
1621 }
1622 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1623 why = WHY_NOT;
1624 JUMPTO(b->b_handler);
1625 break;
1626 }
1627 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001628 (b->b_type == SETUP_EXCEPT &&
1629 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001631 object *exc, *val, *tb;
1632 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 if (val == NULL) {
1634 val = None;
1635 INCREF(val);
1636 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 /* Make the raw exception data
1638 available to the handler,
1639 so a program can emulate the
1640 Python main loop. Don't do
1641 this for 'finally'. */
1642 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 sysset("exc_value", val);
1645 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001647 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 PUSH(val);
1649 PUSH(exc);
1650 }
1651 else {
1652 if (why == WHY_RETURN)
1653 PUSH(retval);
1654 v = newintobject((long)why);
1655 PUSH(v);
1656 }
1657 why = WHY_NOT;
1658 JUMPTO(b->b_handler);
1659 break;
1660 }
1661 } /* unwind stack */
1662
1663 /* End the loop if we still have an error (or return) */
1664
1665 if (why != WHY_NOT)
1666 break;
1667
1668 } /* main loop */
1669
1670 /* Pop remaining stack entries */
1671
1672 while (!EMPTY()) {
1673 v = POP();
1674 XDECREF(v);
1675 }
1676
Guido van Rossum96a42c81992-01-12 02:29:51 +00001677 if (why != WHY_RETURN)
1678 retval = NULL;
1679
Guido van Rossume59214e1994-08-30 08:01:59 +00001680 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001681 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001682 if (call_trace(&f->f_trace, &f->f_trace, f,
1683 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001684 XDECREF(retval);
1685 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001686 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001687 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001688 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001689 }
1690
1691 if (sys_profile && why == WHY_RETURN) {
1692 if (call_trace(&sys_profile, (object**)0,
1693 f, "return", retval)) {
1694 XDECREF(retval);
1695 retval = NULL;
1696 why = WHY_EXCEPTION;
1697 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001698 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001699
1700 /* Kill all local variables */
1701
1702 {
1703 int i;
1704 for (i = co->co_nlocals; --i >= 0; ++fastlocals) {
1705 if (*fastlocals != NULL) {
1706 DECREF(*fastlocals);
1707 *fastlocals = NULL;
1708 }
1709 }
1710 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001711
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001713
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 current_frame = f->f_back;
1715 DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +00001716 --recursion_depth;
Guido van Rossum374a9221991-04-04 10:40:29 +00001717
Guido van Rossum96a42c81992-01-12 02:29:51 +00001718 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001719}
1720
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001721/* Logic for the raise statement (too complicated for inlining).
1722 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001723static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001724do_raise(type, value, tb)
1725 object *type, *value, *tb;
1726{
1727 /* We support the following forms of raise:
1728 raise <class>, <classinstance>
1729 raise <class>, <argument tuple>
1730 raise <class>, None
1731 raise <class>, <argument>
1732 raise <classinstance>, None
1733 raise <string>, <object>
1734 raise <string>, None
1735
1736 An omitted second argument is the same as None.
1737
1738 In addition, raise <tuple>, <anything> is the same as
1739 raising the tuple's first item (and it better have one!);
1740 this rule is applied recursively.
1741
1742 Finally, an optional third argument can be supplied, which
1743 gives the traceback to be substituted (useful when
1744 re-raising an exception after examining it). */
1745
1746 /* First, check the traceback argument, replacing None with
1747 NULL. */
1748 if (tb == None) {
1749 DECREF(tb);
1750 tb = NULL;
1751 }
1752 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1753 err_setstr(TypeError,
1754 "raise 3rd arg must be traceback or None");
1755 goto raise_error;
1756 }
1757
1758 /* Next, replace a missing value with None */
1759 if (value == NULL) {
1760 value = None;
1761 INCREF(value);
1762 }
1763
1764 /* Next, repeatedly, replace a tuple exception with its first item */
1765 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1766 object *tmp = type;
1767 type = GETTUPLEITEM(type, 0);
1768 INCREF(type);
1769 DECREF(tmp);
1770 }
1771
1772 /* Now switch on the exception's type */
1773 if (is_stringobject(type)) {
1774 ;
1775 }
1776 else if (is_classobject(type)) {
1777 /* Raising a class. If the value is an instance, it
1778 better be an instance of the class. If it is not,
1779 it will be used to create an instance. */
1780 if (is_instanceobject(value)) {
1781 object *inclass = (object*)
1782 (((instanceobject*)value)->in_class);
1783 if (!issubclass(inclass, type)) {
1784 err_setstr(TypeError,
1785 "raise <class>, <instance> requires that <instance> is a member of <class>");
1786 goto raise_error;
1787 }
1788 }
1789 else {
1790 /* Go instantiate the class */
1791 object *args, *res;
1792 if (value == None)
1793 args = mkvalue("()");
1794 else if (is_tupleobject(value)) {
1795 INCREF(value);
1796 args = value;
1797 }
1798 else
1799 args = mkvalue("(O)", value);
1800 if (args == NULL)
1801 goto raise_error;
1802 res = call_object(type, args);
1803 DECREF(args);
1804 if (res == NULL)
1805 goto raise_error;
1806 DECREF(value);
1807 value = res;
1808 }
1809 }
1810 else if (is_instanceobject(type)) {
1811 /* Raising an instance. The value should be a dummy. */
1812 if (value != None) {
1813 err_setstr(TypeError,
1814 "instance exception may not have a separate value");
1815 goto raise_error;
1816 }
1817 else {
1818 /* Normalize to raise <class>, <instance> */
1819 DECREF(value);
1820 value = type;
1821 type = (object*) ((instanceobject*)type)->in_class;
1822 INCREF(type);
1823 }
1824 }
1825 else {
1826 /* Not something you can raise. You get an exception
1827 anyway, just not what you specified :-) */
1828 err_setstr(TypeError,
1829 "exceptions must be strings, classes, or instances");
1830 goto raise_error;
1831 }
1832 err_restore(type, value, tb);
1833 if (tb == NULL)
1834 return WHY_EXCEPTION;
1835 else
1836 return WHY_RERAISE;
1837 raise_error:
1838 XDECREF(value);
1839 XDECREF(type);
1840 XDECREF(tb);
1841 return WHY_EXCEPTION;
1842}
1843
Guido van Rossum96a42c81992-01-12 02:29:51 +00001844#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001845static int
1846prtrace(v, str)
1847 object *v;
1848 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001850 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001851 if (printobject(v, stdout, 0) != 0)
1852 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001853 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001854}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001855#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001857static void
1858call_exc_trace(p_trace, p_newtrace, f)
1859 object **p_trace, **p_newtrace;
1860 frameobject *f;
1861{
1862 object *type, *value, *traceback, *arg;
1863 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001865 if (value == NULL) {
1866 value = None;
1867 INCREF(value);
1868 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 arg = mkvalue("(OOO)", type, value, traceback);
1870 if (arg == NULL) {
1871 err_restore(type, value, traceback);
1872 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001873 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001874 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1875 DECREF(arg);
1876 if (err == 0)
1877 err_restore(type, value, traceback);
1878 else {
1879 XDECREF(type);
1880 XDECREF(value);
1881 XDECREF(traceback);
1882 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001883}
1884
1885static int
1886call_trace(p_trace, p_newtrace, f, msg, arg)
1887 object **p_trace; /* in/out; may not be NULL;
1888 may not point to NULL variable initially */
1889 object **p_newtrace; /* in/out; may be NULL;
1890 may point to NULL variable;
1891 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001892 frameobject *f;
1893 char *msg;
1894 object *arg;
1895{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001896 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001897 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001898 static int tracing = 0;
1899
1900 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001901 /* Don't do recursive traces */
1902 if (p_newtrace) {
1903 XDECREF(*p_newtrace);
1904 *p_newtrace = NULL;
1905 }
1906 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001907 }
1908
Guido van Rossumf10570b1995-07-07 22:53:21 +00001909 args = newtupleobject(3);
1910 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001911 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001912 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001913 if (what == NULL)
1914 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001915 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001916 SETTUPLEITEM(args, 0, (object *)f);
1917 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001918 if (arg == NULL)
1919 arg = None;
1920 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001921 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001922 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001923 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001924 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001925 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001926 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001927 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001928 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001929 if (res == NULL) {
1930 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001931 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001932 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001933 *p_trace = NULL;
1934 if (p_newtrace) {
1935 XDECREF(*p_newtrace);
1936 *p_newtrace = NULL;
1937 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001938 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001939 }
1940 else {
1941 if (p_newtrace) {
1942 XDECREF(*p_newtrace);
1943 if (res == None)
1944 *p_newtrace = NULL;
1945 else {
1946 INCREF(res);
1947 *p_newtrace = res;
1948 }
1949 }
1950 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001951 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001952 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001953}
1954
Guido van Rossum3f5da241990-12-20 15:06:42 +00001955object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001956getbuiltins()
1957{
1958 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001959 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001960 else
1961 return current_frame->f_builtins;
1962}
1963
1964object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001965getlocals()
1966{
1967 if (current_frame == NULL)
1968 return NULL;
1969 fast_2_locals(current_frame);
1970 return current_frame->f_locals;
1971}
1972
1973object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001974getglobals()
1975{
1976 if (current_frame == NULL)
1977 return NULL;
1978 else
1979 return current_frame->f_globals;
1980}
1981
Guido van Rossum81daa321993-05-20 14:24:46 +00001982object *
Guido van Rossume59214e1994-08-30 08:01:59 +00001983getframe()
1984{
1985 return (object *)current_frame;
1986}
1987
Guido van Rossum6135a871995-01-09 17:53:26 +00001988int
1989getrestricted()
1990{
1991 return current_frame == NULL ? 0 : current_frame->f_restricted;
1992}
1993
Guido van Rossum3f5da241990-12-20 15:06:42 +00001994void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995flushline()
1996{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001997 object *f = sysget("stdout");
1998 if (softspace(f, 0))
1999 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000}
2001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002002
Guido van Rossum06186511995-01-07 12:40:10 +00002003#define BINOP(opname, ropname, thisfunc) \
2004 if (!is_instanceobject(v) && !is_instanceobject(w)) \
2005 ; \
2006 else \
2007 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00002008
2009
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002011or(v, w)
2012 object *v, *w;
2013{
Guido van Rossum06186511995-01-07 12:40:10 +00002014 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002015 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002016 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002017 object * (*f) FPROTO((object *, object *));
2018 if (coerce(&v, &w) != 0)
2019 return NULL;
2020 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2021 x = (*f)(v, w);
2022 DECREF(v);
2023 DECREF(w);
2024 if (f != NULL)
2025 return x;
2026 }
2027 err_setstr(TypeError, "bad operand type(s) for |");
2028 return NULL;
2029}
2030
2031static object *
2032xor(v, w)
2033 object *v, *w;
2034{
Guido van Rossum06186511995-01-07 12:40:10 +00002035 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002036 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002037 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002038 object * (*f) FPROTO((object *, object *));
2039 if (coerce(&v, &w) != 0)
2040 return NULL;
2041 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2042 x = (*f)(v, w);
2043 DECREF(v);
2044 DECREF(w);
2045 if (f != NULL)
2046 return x;
2047 }
2048 err_setstr(TypeError, "bad operand type(s) for ^");
2049 return NULL;
2050}
2051
2052static object *
2053and(v, w)
2054 object *v, *w;
2055{
Guido van Rossum06186511995-01-07 12:40:10 +00002056 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002057 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002058 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002059 object * (*f) FPROTO((object *, object *));
2060 if (coerce(&v, &w) != 0)
2061 return NULL;
2062 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2063 x = (*f)(v, w);
2064 DECREF(v);
2065 DECREF(w);
2066 if (f != NULL)
2067 return x;
2068 }
2069 err_setstr(TypeError, "bad operand type(s) for &");
2070 return NULL;
2071}
2072
2073static object *
2074lshift(v, w)
2075 object *v, *w;
2076{
Guido van Rossum06186511995-01-07 12:40:10 +00002077 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002078 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002079 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002080 object * (*f) FPROTO((object *, object *));
2081 if (coerce(&v, &w) != 0)
2082 return NULL;
2083 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2084 x = (*f)(v, w);
2085 DECREF(v);
2086 DECREF(w);
2087 if (f != NULL)
2088 return x;
2089 }
2090 err_setstr(TypeError, "bad operand type(s) for <<");
2091 return NULL;
2092}
2093
2094static object *
2095rshift(v, w)
2096 object *v, *w;
2097{
Guido van Rossum06186511995-01-07 12:40:10 +00002098 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002099 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002100 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002101 object * (*f) FPROTO((object *, object *));
2102 if (coerce(&v, &w) != 0)
2103 return NULL;
2104 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2105 x = (*f)(v, w);
2106 DECREF(v);
2107 DECREF(w);
2108 if (f != NULL)
2109 return x;
2110 }
2111 err_setstr(TypeError, "bad operand type(s) for >>");
2112 return NULL;
2113}
2114
2115static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002116add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 object *v, *w;
2118{
Guido van Rossum06186511995-01-07 12:40:10 +00002119 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002120 if (v->ob_type->tp_as_sequence != NULL)
2121 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2122 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002123 object *x;
2124 if (coerce(&v, &w) != 0)
2125 return NULL;
2126 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2127 DECREF(v);
2128 DECREF(w);
2129 return x;
2130 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002131 err_setstr(TypeError, "bad operand type(s) for +");
2132 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133}
2134
2135static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002136sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 object *v, *w;
2138{
Guido van Rossum06186511995-01-07 12:40:10 +00002139 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002140 if (v->ob_type->tp_as_number != NULL) {
2141 object *x;
2142 if (coerce(&v, &w) != 0)
2143 return NULL;
2144 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2145 DECREF(v);
2146 DECREF(w);
2147 return x;
2148 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002149 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150 return NULL;
2151}
2152
2153static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002154mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155 object *v, *w;
2156{
2157 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002158 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002159 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002160 if (tp->tp_as_number != NULL &&
2161 w->ob_type->tp_as_sequence != NULL &&
2162 !is_instanceobject(v)) {
2163 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 object *tmp = v;
2165 v = w;
2166 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002167 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002169 if (tp->tp_as_number != NULL) {
2170 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002171 if (is_instanceobject(v)) {
2172 /* Instances of user-defined classes get their
2173 other argument uncoerced, so they may
2174 implement sequence*number as well as
2175 number*number. */
2176 INCREF(v);
2177 INCREF(w);
2178 }
2179 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002180 return NULL;
2181 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2182 DECREF(v);
2183 DECREF(w);
2184 return x;
2185 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 if (tp->tp_as_sequence != NULL) {
2187 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002188 err_setstr(TypeError,
2189 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 return NULL;
2191 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002192 return (*tp->tp_as_sequence->sq_repeat)
2193 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002194 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002195 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 return NULL;
2197}
2198
2199static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002200divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 object *v, *w;
2202{
Guido van Rossum06186511995-01-07 12:40:10 +00002203 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002204 if (v->ob_type->tp_as_number != NULL) {
2205 object *x;
2206 if (coerce(&v, &w) != 0)
2207 return NULL;
2208 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2209 DECREF(v);
2210 DECREF(w);
2211 return x;
2212 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002213 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 return NULL;
2215}
2216
2217static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002218mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 object *v, *w;
2220{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002221 if (is_stringobject(v)) {
2222 return formatstring(v, w);
2223 }
Guido van Rossum06186511995-01-07 12:40:10 +00002224 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002225 if (v->ob_type->tp_as_number != NULL) {
2226 object *x;
2227 if (coerce(&v, &w) != 0)
2228 return NULL;
2229 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2230 DECREF(v);
2231 DECREF(w);
2232 return x;
2233 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002234 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 return NULL;
2236}
2237
2238static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002239powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002240 object *v, *w;
2241{
2242 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002243 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002244 if (v->ob_type->tp_as_number == NULL ||
2245 w->ob_type->tp_as_number == NULL) {
2246 err_setstr(TypeError, "pow() requires numeric arguments");
2247 return NULL;
2248 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002249 if (coerce(&v, &w) != 0)
2250 return NULL;
2251 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2252 DECREF(v);
2253 DECREF(w);
2254 return res;
2255}
2256
2257static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002258neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 object *v;
2260{
2261 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002262 return (*v->ob_type->tp_as_number->nb_negative)(v);
2263 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264 return NULL;
2265}
2266
2267static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002268pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269 object *v;
2270{
2271 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002272 return (*v->ob_type->tp_as_number->nb_positive)(v);
2273 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002274 return NULL;
2275}
2276
2277static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002278invert(v)
2279 object *v;
2280{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002281 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002282 if (v->ob_type->tp_as_number != NULL &&
2283 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2284 return (*f)(v);
2285 err_setstr(TypeError, "bad operand type(s) for unary ~");
2286 return NULL;
2287}
2288
2289static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002290not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 object *v;
2292{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002293 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002294 object *w;
2295 if (outcome < 0)
2296 return NULL;
2297 if (outcome == 0)
2298 w = True;
2299 else
2300 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002301 INCREF(w);
2302 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303}
Guido van Rossum234f9421993-06-17 12:35:49 +00002304
2305
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306/* External interface to call any callable object.
2307 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002308
2309object *
2310call_object(func, arg)
2311 object *func;
2312 object *arg;
2313{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002314 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2315}
Guido van Rossume59214e1994-08-30 08:01:59 +00002316
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317object *
2318PyEval_CallObjectWithKeywords(func, arg, kw)
2319 object *func;
2320 object *arg;
2321 object *kw;
2322{
2323 ternaryfunc call;
2324 object *result;
2325
2326 if (arg == NULL)
2327 arg = newtupleobject(0);
2328 else if (!is_tupleobject(arg)) {
2329 err_setstr(TypeError, "argument list must be a tuple");
2330 return NULL;
2331 }
2332 else
2333 INCREF(arg);
2334
Guido van Rossume3e61c11995-08-04 04:14:47 +00002335 if (kw != NULL && !is_dictobject(kw)) {
2336 err_setstr(TypeError, "keyword list must be a dictionary");
2337 return NULL;
2338 }
2339
Guido van Rossum150b2df1996-12-05 23:17:11 +00002340 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341 result = (*call)(func, arg, kw);
2342 else if (is_instancemethodobject(func) || is_funcobject(func))
2343 result = call_function(func, arg, kw);
2344 else
2345 result = call_builtin(func, arg, kw);
2346
2347 DECREF(arg);
2348
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002349 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002350 err_setstr(SystemError,
2351 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002352
2353 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002354}
2355
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002357call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002359 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 if (is_methodobject(func)) {
2363 method meth = getmethod(func);
2364 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002365 int flags = getflags(func);
2366 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002367 int size = gettuplesize(arg);
2368 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002369 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002370 else if (size == 0)
2371 arg = NULL;
2372 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002373 if (flags & METH_KEYWORDS)
2374 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002375 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002376 err_setstr(TypeError,
2377 "this function takes no keyword arguments");
2378 return NULL;
2379 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 }
2382 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002383 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002385 if (is_instanceobject(func)) {
2386 object *res, *call = getattr(func,"__call__");
2387 if (call == NULL) {
2388 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002389 err_setstr(AttributeError,
2390 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002391 return NULL;
2392 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002393 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002394 DECREF(call);
2395 return res;
2396 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002397 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 return NULL;
2399}
2400
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002402call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002405 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002407 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002408 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002409 object **d, **k;
2410 int nk, nd;
2411 object *result;
2412
2413 if (kw != NULL && !is_dictobject(kw)) {
2414 err_badcall();
2415 return NULL;
2416 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417
Guido van Rossume8122f11991-05-05 20:03:07 +00002418 if (is_instancemethodobject(func)) {
2419 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002420 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002421 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002422 if (self == NULL) {
2423 /* Unbound methods must be called with an instance of
2424 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002426 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002427 if (self != NULL &&
2428 is_instanceobject(self) &&
2429 issubclass((object *)
2430 (((instanceobject *)self)->in_class),
2431 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002432 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002433 else
2434 self = NULL;
2435 }
2436 if (self == NULL) {
2437 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002438 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002439 return NULL;
2440 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002442 }
2443 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444 int argcount = gettuplesize(arg);
2445 object *newarg = newtupleobject(argcount + 1);
2446 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002447 if (newarg == NULL)
2448 return NULL;
2449 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002450 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 for (i = 0; i < argcount; i++) {
2452 object *v = GETTUPLEITEM(arg, i);
2453 XINCREF(v);
2454 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002455 }
2456 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457 }
2458 }
2459 else {
2460 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002461 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 return NULL;
2463 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002466
2467 argdefs = PyFunction_GetDefaults(func);
2468 if (argdefs != NULL && is_tupleobject(argdefs)) {
2469 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2470 nd = gettuplesize(argdefs);
2471 }
2472 else {
2473 d = NULL;
2474 nd = 0;
2475 }
2476
2477 if (kw != NULL) {
2478 int pos, i;
2479 nk = getmappingsize(kw);
2480 k = NEW(object *, 2*nk);
2481 if (k == NULL) {
2482 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002483 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002484 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002485 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 pos = i = 0;
2487 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2488 i += 2;
2489 nk = i/2;
2490 /* XXX This is broken if the caller deletes dict items! */
2491 }
2492 else {
2493 k = NULL;
2494 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002495 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496
Guido van Rossum681d79a1995-07-18 14:51:37 +00002497 result = eval_code2(
2498 (codeobject *)getfunccode(func),
2499 getfuncglobals(func), (object *)NULL,
2500 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2501 k, nk,
2502 d, nd,
2503 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504
Guido van Rossum681d79a1995-07-18 14:51:37 +00002505 DECREF(arg);
2506 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507
Guido van Rossum681d79a1995-07-18 14:51:37 +00002508 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509}
2510
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002511#define SLICE_ERROR_MSG \
2512 "standard sequence type does not support step size other than one"
2513
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002515apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 object *v, *w;
2517{
2518 typeobject *tp = v->ob_type;
2519 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002520 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 return NULL;
2522 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002523 if (tp->tp_as_mapping != NULL) {
2524 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2525 }
2526 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002528 if (!is_intobject(w)) {
2529 if (PySlice_Check(w)) {
2530 err_setstr(ValueError, SLICE_ERROR_MSG);
2531 } else {
2532 err_setstr(TypeError,
2533 "sequence subscript not int");
2534 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 return NULL;
2536 }
2537 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002538 if (i < 0) {
2539 int len = (*tp->tp_as_sequence->sq_length)(v);
2540 if (len < 0)
2541 return NULL;
2542 i += len;
2543 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546}
2547
2548static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 object *v, *w;
2551{
2552 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002553 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002555 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002556 return NULL;
2557 }
2558 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002559 v = (*sq->sq_item)(v, i);
2560 if (v)
2561 return v;
2562 if (err_occurred() == IndexError)
2563 err_clear();
2564 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565}
2566
2567static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 object *v;
2570 int isize;
2571 int *pi;
2572{
2573 if (v != NULL) {
2574 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 err_setstr(TypeError, "slice index must be int");
2576 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 }
2578 *pi = getintvalue(v);
2579 if (*pi < 0)
2580 *pi += isize;
2581 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002582 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583}
2584
2585static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002586apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587 object *u, *v, *w;
2588{
2589 typeobject *tp = u->ob_type;
2590 int ilow, ihigh, isize;
2591 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 return NULL;
2594 }
2595 ilow = 0;
2596 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002597 if (isize < 0)
2598 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002599 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605
2606static int
2607assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 object *w;
2609 object *key;
2610 object *v;
2611{
2612 typeobject *tp = w->ob_type;
2613 sequence_methods *sq;
2614 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002615 int (*func1)();
2616 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002617 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002618 (func1 = mp->mp_ass_subscript) != NULL) {
2619 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002620 }
2621 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002622 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002624 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002625 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002628 else {
2629 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002630 if (i < 0) {
2631 int len = (*sq->sq_length)(w);
2632 if (len < 0)
2633 return -1;
2634 i += len;
2635 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002636 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002637 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002640 err_setstr(TypeError,
2641 "can't assign to this subscripted object");
2642 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002644}
2645
Guido van Rossum3f5da241990-12-20 15:06:42 +00002646static int
2647assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 object *u, *v, *w, *x;
2649{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002650 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002652 if (sq == NULL) {
2653 err_setstr(TypeError, "assign to slice of non-sequence");
2654 return -1;
2655 }
2656 if (sq == NULL || sq->sq_ass_slice == NULL) {
2657 err_setstr(TypeError, "unassignable slice");
2658 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659 }
2660 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002661 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002662 if (isize < 0)
2663 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 if (slice_index(v, isize, &ilow) != 0)
2665 return -1;
2666 if (slice_index(w, isize, &ihigh) != 0)
2667 return -1;
2668 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669}
2670
2671static int
2672cmp_exception(err, v)
2673 object *err, *v;
2674{
2675 if (is_tupleobject(v)) {
2676 int i, n;
2677 n = gettuplesize(v);
2678 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002679 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002680 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681 return 1;
2682 }
2683 return 0;
2684 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002685 if (is_classobject(v) && is_classobject(err))
2686 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687 return err == v;
2688}
2689
Guido van Rossum3f5da241990-12-20 15:06:42 +00002690static int
2691cmp_member(v, w)
2692 object *v, *w;
2693{
Guido van Rossume59214e1994-08-30 08:01:59 +00002694 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002695 object *x;
2696 sequence_methods *sq;
2697 /* Special case for char in string */
2698 if (is_stringobject(w)) {
2699 register char *s, *end;
2700 register char c;
2701 if (!is_stringobject(v) || getstringsize(v) != 1) {
2702 err_setstr(TypeError,
2703 "string member test needs char left operand");
2704 return -1;
2705 }
2706 c = getstringvalue(v)[0];
2707 s = getstringvalue(w);
2708 end = s + getstringsize(w);
2709 while (s < end) {
2710 if (c == *s++)
2711 return 1;
2712 }
2713 return 0;
2714 }
2715 sq = w->ob_type->tp_as_sequence;
2716 if (sq == NULL) {
2717 err_setstr(TypeError,
2718 "'in' or 'not in' needs sequence right argument");
2719 return -1;
2720 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002721 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002722 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002723 if (x == NULL) {
2724 if (err_occurred() == IndexError) {
2725 err_clear();
2726 break;
2727 }
2728 return -1;
2729 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 cmp = cmpobject(v, x);
2731 XDECREF(x);
2732 if (cmp == 0)
2733 return 1;
2734 }
2735 return 0;
2736}
2737
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002739cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002740 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 register object *v;
2742 register object *w;
2743{
2744 register int cmp;
2745 register int res = 0;
2746 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002747 case IS:
2748 case IS_NOT:
2749 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002750 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002751 res = !res;
2752 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 case IN:
2754 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002755 res = cmp_member(v, w);
2756 if (res < 0)
2757 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002758 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760 break;
2761 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002762 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 break;
2764 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002765 cmp = cmpobject(v, w);
2766 switch (op) {
2767 case LT: res = cmp < 0; break;
2768 case LE: res = cmp <= 0; break;
2769 case EQ: res = cmp == 0; break;
2770 case NE: res = cmp != 0; break;
2771 case GT: res = cmp > 0; break;
2772 case GE: res = cmp >= 0; break;
2773 /* XXX no default? (res is initialized to 0 though) */
2774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 }
2776 v = res ? True : False;
2777 INCREF(v);
2778 return v;
2779}
2780
Guido van Rossum3f5da241990-12-20 15:06:42 +00002781static int
2782import_from(locals, v, name)
2783 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002784 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002785 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002786{
2787 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002788 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002789 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002790 return -1;
2791 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002792 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002793 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002794 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002795 object *name, *value;
2796 pos = 0;
2797 while (mappinggetnext(w, &pos, &name, &value)) {
2798 if (!is_stringobject(name) ||
2799 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002800 continue;
Guido van Rossum1aa14831997-01-21 05:34:20 +00002801 INCREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002802 err = dict2insert(locals, name, value);
2803 DECREF(value);
2804 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002805 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002806 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002807 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002808 }
2809 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002810 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002811 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002812 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002813 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002814 getstringvalue(name));
2815 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002816 return -1;
2817 }
2818 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002819 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002820 }
2821}
2822
2823static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002824build_class(methods, bases, name)
2825 object *methods; /* dictionary */
2826 object *bases; /* tuple containing classes */
2827 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002828{
Guido van Rossum25831651993-05-19 14:50:45 +00002829 int i;
2830 if (!is_tupleobject(bases)) {
2831 err_setstr(SystemError, "build_class with non-tuple bases");
2832 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002833 }
Guido van Rossum25831651993-05-19 14:50:45 +00002834 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002835 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002836 return NULL;
2837 }
Guido van Rossum25831651993-05-19 14:50:45 +00002838 if (!is_stringobject(name)) {
2839 err_setstr(SystemError, "build_class witn non-string name");
2840 return NULL;
2841 }
2842 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002843 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002844 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002845 /* Call the base's *type*, if it is callable.
2846 This code is a hook for Donald Beaudry's
2847 and Jim Fulton's type extensions. In
2848 unexended Python it will never be triggered
2849 since its types are not callable. */
2850 if (base->ob_type->ob_type->tp_call) {
2851 object *args;
2852 object *class;
2853 args = mkvalue("(OOO)", name, bases, methods);
2854 class = call_object((object *)base->ob_type,
2855 args);
2856 DECREF(args);
2857 return class;
2858 }
Guido van Rossum25831651993-05-19 14:50:45 +00002859 err_setstr(TypeError,
2860 "base is not a class object");
2861 return NULL;
2862 }
2863 }
2864 return newclassobject(bases, methods, name);
2865}
2866
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002867static int
2868exec_statement(prog, globals, locals)
2869 object *prog;
2870 object *globals;
2871 object *locals;
2872{
2873 char *s;
2874 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002875 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002876 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002877
2878 if (is_tupleobject(prog) && globals == None && locals == None &&
2879 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2880 /* Backward compatibility hack */
2881 globals = gettupleitem(prog, 1);
2882 if (n == 3)
2883 locals = gettupleitem(prog, 2);
2884 prog = gettupleitem(prog, 0);
2885 }
2886 if (globals == None) {
2887 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002889 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002890 plain = 1;
2891 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002892 }
2893 else if (locals == None)
2894 locals = globals;
2895 if (!is_stringobject(prog) &&
2896 !is_codeobject(prog) &&
2897 !is_fileobject(prog)) {
2898 err_setstr(TypeError,
2899 "exec 1st arg must be string, code or file object");
2900 return -1;
2901 }
2902 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2903 err_setstr(TypeError,
2904 "exec 2nd/3rd args must be dict or None");
2905 return -1;
2906 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002907 if (dictlookup(globals, "__builtins__") == NULL)
2908 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002909 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002910 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002911 return -1;
2912 return 0;
2913 }
2914 if (is_fileobject(prog)) {
2915 FILE *fp = getfilefile(prog);
2916 char *name = getstringvalue(getfilename(prog));
2917 if (run_file(fp, name, file_input, globals, locals) == NULL)
2918 return -1;
2919 return 0;
2920 }
2921 s = getstringvalue(prog);
2922 if (strlen(s) != getstringsize(prog)) {
2923 err_setstr(ValueError, "embedded '\\0' in exec string");
2924 return -1;
2925 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002926 v = run_string(s, file_input, globals, locals);
2927 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002928 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002929 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002930 if (plain)
2931 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002932 return 0;
2933}
Guido van Rossum24c13741995-02-14 09:42:43 +00002934
Guido van Rossum1aa14831997-01-21 05:34:20 +00002935/* Hack for ni.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002936static object *
2937find_from_args(f, nexti)
2938 frameobject *f;
2939 int nexti;
2940{
2941 int opcode;
2942 int oparg;
2943 object *list, *name;
2944 unsigned char *next_instr;
2945
2946 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2947 opcode = (*next_instr++);
2948 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002949 INCREF(None);
2950 return None;
2951 }
2952
2953 list = newlistobject(0);
2954 if (list == NULL)
2955 return NULL;
2956
2957 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002958 oparg = (next_instr[1]<<8) + next_instr[0];
2959 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002960 name = Getnamev(f, oparg);
2961 if (addlistitem(list, name) < 0) {
2962 DECREF(list);
2963 break;
2964 }
2965 opcode = (*next_instr++);
2966 } while (opcode == IMPORT_FROM);
2967
2968 return list;
2969}