blob: accb56eef252e9404d42adc5c7589a404dd4f72f [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 *));
Guido van Rossum8861b741996-07-30 16:49:37 +000095static object *build_slice PROTO((object *, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000096static int assign_subscript PROTO((object *, object *, object *));
97static int assign_slice PROTO((object *, object *, object *, object *));
98static int cmp_exception PROTO((object *, object *));
99static int cmp_member PROTO((object *, object *));
Guido van Rossum5b7313a1992-04-06 13:24:57 +0000100static object *cmp_outcome PROTO((int, object *, object *));
Guido van Rossum0a066c01992-03-27 17:29:15 +0000101static int import_from PROTO((object *, object *, object *));
Guido van Rossum25831651993-05-19 14:50:45 +0000102static object *build_class PROTO((object *, object *, object *));
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000103static int exec_statement PROTO((object *, object *, object *));
Guido van Rossum24c13741995-02-14 09:42:43 +0000104static object *find_from_args PROTO((frameobject *, int));
Guido van Rossum374a9221991-04-04 10:40:29 +0000105
106
Guido van Rossum0a066c01992-03-27 17:29:15 +0000107/* Pointer to current frame, used to link new frames to */
108
Guido van Rossum374a9221991-04-04 10:40:29 +0000109static frameobject *current_frame;
110
Guido van Rossume59214e1994-08-30 08:01:59 +0000111#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113#include <errno.h>
114#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossuma9672091994-09-14 13:31:22 +0000116static type_lock interpreter_lock = 0;
117static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118
119void
120init_save_thread()
121{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000123 return;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 interpreter_lock = allocate_lock();
125 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000126 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000128
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129#endif
130
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131/* Functions save_thread and restore_thread are always defined so
132 dynamically loaded modules needn't be compiled separately for use
133 with and without threads: */
134
Guido van Rossum04691fc1992-08-12 15:35:34 +0000135object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000136save_thread()
137{
Guido van Rossume59214e1994-08-30 08:01:59 +0000138#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139 if (interpreter_lock) {
Guido van Rossum04691fc1992-08-12 15:35:34 +0000140 object *res;
141 res = (object *)current_frame;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142 current_frame = NULL;
143 release_lock(interpreter_lock);
144 return res;
145 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000147 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148}
149
150void
151restore_thread(x)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000152 object *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000153{
Guido van Rossume59214e1994-08-30 08:01:59 +0000154#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000155 if (interpreter_lock) {
156 int err;
157 err = errno;
158 acquire_lock(interpreter_lock, 1);
159 errno = err;
160 current_frame = (frameobject *)x;
161 }
162#endif
163}
164
165
Guido van Rossuma9672091994-09-14 13:31:22 +0000166/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
167 signal handlers or Mac I/O completion routines) can schedule calls
168 to a function to be called synchronously.
169 The synchronous function is called with one void* argument.
170 It should return 0 for success or -1 for failure -- failure should
171 be accompanied by an exception.
172
173 If registry succeeds, the registry function returns 0; if it fails
174 (e.g. due to too many pending calls) it returns -1 (without setting
175 an exception condition).
176
177 Note that because registry may occur from within signal handlers,
178 or other asynchronous events, calling malloc() is unsafe!
179
180#ifdef WITH_THREAD
181 Any thread can schedule pending calls, but only the main thread
182 will execute them.
183#endif
184
185 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
186 There are two possible race conditions:
187 (1) nested asynchronous registry calls;
188 (2) registry calls made while pending calls are being processed.
189 While (1) is very unlikely, (2) is a real possibility.
190 The current code is safe against (2), but not against (1).
191 The safety against (2) is derived from the fact that only one
192 thread (the main thread) ever takes things out of the queue.
193*/
194
Guido van Rossum8861b741996-07-30 16:49:37 +0000195static int ticker = 0; /* main loop counter to do periodic things */
196
Guido van Rossuma9672091994-09-14 13:31:22 +0000197#define NPENDINGCALLS 32
198static struct {
199 int (*func) PROTO((ANY *));
200 ANY *arg;
201} pendingcalls[NPENDINGCALLS];
202static volatile int pendingfirst = 0;
203static volatile int pendinglast = 0;
204
205int
206Py_AddPendingCall(func, arg)
207 int (*func) PROTO((ANY *));
208 ANY *arg;
209{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000210 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000211 int i, j;
212 /* XXX Begin critical section */
213 /* XXX If you want this to be safe against nested
214 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000215 if (busy)
216 return -1;
217 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000218 i = pendinglast;
219 j = (i + 1) % NPENDINGCALLS;
220 if (j == pendingfirst)
221 return -1; /* Queue full */
222 pendingcalls[i].func = func;
223 pendingcalls[i].arg = arg;
224 pendinglast = j;
Guido van Rossum8861b741996-07-30 16:49:37 +0000225 ticker = 0; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000226 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000227 /* XXX End critical section */
228 return 0;
229}
230
Guido van Rossum180d7b41994-09-29 09:45:57 +0000231int
232Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000233{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000234 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000235#ifdef WITH_THREAD
Guido van Rossum1aa14831997-01-21 05:34:20 +0000236 if (main_thread && get_thread_ident() != main_thread) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000237 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000238 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000239 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000240#endif
Guido van Rossum8861b741996-07-30 16:49:37 +0000241 if (busy) {
242 ticker = 0; /* We're not done yet */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000243 return 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000244 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000246 for (;;) {
247 int i;
248 int (*func) PROTO((ANY *));
249 ANY *arg;
250 i = pendingfirst;
251 if (i == pendinglast)
252 break; /* Queue empty */
253 func = pendingcalls[i].func;
254 arg = pendingcalls[i].arg;
255 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 if (func(arg) < 0) {
257 busy = 0;
Guido van Rossum8861b741996-07-30 16:49:37 +0000258 ticker = 0; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000260 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000261 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000263 return 0;
264}
265
266
Guido van Rossum374a9221991-04-04 10:40:29 +0000267/* Status code for main loop (reason for stack unwind) */
268
269enum why_code {
270 WHY_NOT, /* No error */
271 WHY_EXCEPTION, /* Exception occurred */
272 WHY_RERAISE, /* Exception re-raised by 'finally' */
273 WHY_RETURN, /* 'return' statement */
274 WHY_BREAK /* 'break' statement */
275};
276
Guido van Rossum1aa14831997-01-21 05:34:20 +0000277static enum why_code do_raise PROTO((object *, object *, object *));
278
Guido van Rossum374a9221991-04-04 10:40:29 +0000279
Guido van Rossum681d79a1995-07-18 14:51:37 +0000280/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000281
282object *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000283eval_code(co, globals, locals)
Guido van Rossum374a9221991-04-04 10:40:29 +0000284 codeobject *co;
285 object *globals;
286 object *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000287{
288 return eval_code2(co,
289 globals, locals,
290 (object **)NULL, 0,
291 (object **)NULL, 0,
292 (object **)NULL, 0,
293 (object *)NULL);
294}
295
296
297/* Interpreter main loop */
298
Guido van Rossum8861b741996-07-30 16:49:37 +0000299#ifndef MAX_RECURSION_DEPTH
300#define MAX_RECURSION_DEPTH 10000
301#endif
302
303static int recursion_depth = 0;
304
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305static object *
306eval_code2(co, globals, locals,
307 args, argcount, kws, kwcount, defs, defcount, owner)
308 codeobject *co;
309 object *globals;
310 object *locals;
311 object **args;
312 int argcount;
313 object **kws; /* length: 2*kwcount */
314 int kwcount;
315 object **defs;
316 int defcount;
Guido van Rossumeb6b33a1993-05-25 09:38:27 +0000317 object *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000318{
319 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000320 register int opcode = 0; /* Current opcode */
321 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000322 register object **stack_pointer;
323 register enum why_code why; /* Reason for block stack unwind */
324 register int err; /* Error status -- nonzero if error */
325 register object *x; /* Result object -- NULL if error */
326 register object *v; /* Temporary objects popped off stack */
327 register object *w;
328 register object *u;
329 register object *t;
330 register frameobject *f; /* Current frame */
Guido van Rossum150b2df1996-12-05 23:17:11 +0000331 register object **fastlocals = NULL;
332 object *retval = NULL; /* Return value */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000333#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000334 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000335#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000336#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000337 /* Make it easier to find out where we are with a debugger */
Guido van Rossum99bec951992-09-03 20:29:45 +0000338 char *filename = getstringvalue(co->co_filename);
339#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000340
341/* Code access macros */
342
343#define GETCONST(i) Getconst(f, i)
344#define GETNAME(i) Getname(f, i)
345#define GETNAMEV(i) Getnamev(f, i)
346#define FIRST_INSTR() (GETUSTRINGVALUE(f->f_code->co_code))
347#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
348#define NEXTOP() (*next_instr++)
349#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
350#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
351#define JUMPBY(x) (next_instr += (x))
352
353/* Stack manipulation macros */
354
355#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
356#define EMPTY() (STACK_LEVEL() == 0)
357#define TOP() (stack_pointer[-1])
358#define BASIC_PUSH(v) (*stack_pointer++ = (v))
359#define BASIC_POP() (*--stack_pointer)
360
Guido van Rossum96a42c81992-01-12 02:29:51 +0000361#ifdef LLTRACE
362#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
363#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000364#else
365#define PUSH(v) BASIC_PUSH(v)
366#define POP() BASIC_POP()
367#endif
368
Guido van Rossum681d79a1995-07-18 14:51:37 +0000369/* Local variable macros */
370
371#define GETLOCAL(i) (fastlocals[i])
372#define SETLOCAL(i, value) do { XDECREF(GETLOCAL(i)); \
373 GETLOCAL(i) = value; } while (0)
374
Guido van Rossum8861b741996-07-30 16:49:37 +0000375#ifdef USE_STACKCHECK
376 if (recursion_depth%10 == 0 && PyOS_CheckStack()) {
377 err_setstr(MemoryError, "Stack overflow");
378 return NULL;
379 }
380#endif
381
Guido van Rossum681d79a1995-07-18 14:51:37 +0000382 if (globals == NULL) {
383 err_setstr(SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000384 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000385 }
386
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000387#ifdef LLTRACE
388 lltrace = dictlookup(globals, "__lltrace__") != NULL;
389#endif
390
Guido van Rossum374a9221991-04-04 10:40:29 +0000391 f = newframeobject(
392 current_frame, /*back*/
393 co, /*code*/
394 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000395 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000396 if (f == NULL)
397 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000398
Guido van Rossum374a9221991-04-04 10:40:29 +0000399 current_frame = f;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000400
Guido van Rossum681d79a1995-07-18 14:51:37 +0000401 if (co->co_nlocals > 0)
Guido van Rossum76836021997-01-20 04:26:20 +0000402 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000403
404 if (co->co_argcount > 0 ||
405 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
406 int i;
407 int n = argcount;
408 object *kwdict = NULL;
409 if (co->co_flags & CO_VARKEYWORDS) {
410 kwdict = newmappingobject();
411 if (kwdict == NULL)
412 goto fail;
413 }
414 if (argcount > co->co_argcount) {
415 if (!(co->co_flags & CO_VARARGS)) {
416 err_setstr(TypeError, "too many arguments");
417 goto fail;
418 }
419 n = co->co_argcount;
420 }
421 for (i = 0; i < n; i++) {
422 x = args[i];
423 INCREF(x);
424 SETLOCAL(i, x);
425 }
426 if (co->co_flags & CO_VARARGS) {
427 u = newtupleobject(argcount - n);
428 for (i = n; i < argcount; i++) {
429 x = args[i];
430 INCREF(x);
431 SETTUPLEITEM(u, i-n, x);
432 }
433 SETLOCAL(co->co_argcount, u);
434 }
435 for (i = 0; i < kwcount; i++) {
436 object *keyword = kws[2*i];
437 object *value = kws[2*i + 1];
438 int j;
439 /* XXX slow -- speed up using dictionary? */
440 for (j = 0; j < co->co_argcount; j++) {
441 object *nm = GETTUPLEITEM(co->co_varnames, j);
442 if (cmpobject(keyword, nm) == 0)
443 break;
444 }
445 if (j >= co->co_argcount) {
446 if (kwdict == NULL) {
Guido van Rossum6d43c5d1996-08-19 22:09:16 +0000447 err_setval(TypeError, keyword);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 goto fail;
449 }
450 mappinginsert(kwdict, keyword, value);
451 }
452 else {
453 if (GETLOCAL(j) != NULL) {
454 err_setstr(TypeError,
455 "keyword parameter redefined");
456 goto fail;
457 }
458 INCREF(value);
459 SETLOCAL(j, value);
460 }
461 }
462 if (argcount < co->co_argcount) {
463 int m = co->co_argcount - defcount;
464 for (i = argcount; i < m; i++) {
465 if (GETLOCAL(i) == NULL) {
466 err_setstr(TypeError,
467 "not enough arguments");
468 goto fail;
469 }
470 }
471 if (n > m)
472 i = n - m;
473 else
474 i = 0;
475 for (; i < defcount; i++) {
476 if (GETLOCAL(m+i) == NULL) {
477 object *def = defs[i];
478 INCREF(def);
479 SETLOCAL(m+i, def);
480 }
481 }
482 }
483 if (kwdict != NULL) {
484 i = co->co_argcount;
485 if (co->co_flags & CO_VARARGS)
486 i++;
487 SETLOCAL(i, kwdict);
488 }
489 if (0) {
490 fail:
491 XDECREF(kwdict);
492 goto fail2;
493 }
494 }
495 else {
496 if (argcount > 0 || kwcount > 0) {
497 err_setstr(TypeError, "no arguments expected");
498 fail2:
499 current_frame = f->f_back;
500 DECREF(f);
501 return NULL;
502 }
503 }
504
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000505 if (sys_trace != NULL) {
506 /* sys_trace, if defined, is a function that will
Guido van Rossum96a42c81992-01-12 02:29:51 +0000507 be called on *every* entry to a code block.
508 Its return value, if not None, is a function that
509 will be called at the start of each executed line
510 of code. (Actually, the function must return
511 itself in order to continue tracing.)
512 The trace functions are called with three arguments:
513 a pointer to the current frame, a string indicating
514 why the function is called, and an argument which
515 depends on the situation. The global trace function
516 (sys.trace) is also called whenever an exception
517 is detected. */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000518 if (call_trace(&sys_trace, &f->f_trace, f, "call",
519 None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000520 /* Trace function raised an error */
Guido van Rossum96a42c81992-01-12 02:29:51 +0000521 current_frame = f->f_back;
522 DECREF(f);
523 return NULL;
524 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000525 }
526
527 if (sys_profile != NULL) {
528 /* Similar for sys_profile, except it needn't return
529 itself and isn't called for "line" events */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 if (call_trace(&sys_profile, (object**)0, f, "call",
531 None/*XXX*/)) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000532 current_frame = f->f_back;
533 DECREF(f);
534 return NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000535 }
536 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000537
Guido van Rossum8861b741996-07-30 16:49:37 +0000538 if (++recursion_depth > MAX_RECURSION_DEPTH) {
539 --recursion_depth;
540 err_setstr(RuntimeError, "Maximum recursion depth exceeded");
541 current_frame = f->f_back;
542 DECREF(f);
543 return NULL;
544 }
545
Guido van Rossum374a9221991-04-04 10:40:29 +0000546 next_instr = GETUSTRINGVALUE(f->f_code->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000547 stack_pointer = f->f_valuestack;
548
Guido van Rossum374a9221991-04-04 10:40:29 +0000549 why = WHY_NOT;
550 err = 0;
551 x = None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000552
553 for (;;) {
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000554 /* Do periodic things.
555 Doing this every time through the loop would add
556 too much overhead (a function call per instruction).
Guido van Rossum8861b741996-07-30 16:49:37 +0000557 So we do it only every Nth instruction.
558
559 The ticker is reset to zero if there are pending
560 calls (see Py_AddPendingCalls() and
561 Py_MakePendingCalls() above). */
Guido van Rossuma9672091994-09-14 13:31:22 +0000562
Guido van Rossum374a9221991-04-04 10:40:29 +0000563 if (--ticker < 0) {
Guido van Rossum6135a871995-01-09 17:53:26 +0000564 ticker = sys_checkinterval;
Guido van Rossum8861b741996-07-30 16:49:37 +0000565 if (pendingfirst != pendinglast) {
566 if (Py_MakePendingCalls() < 0) {
567 why = WHY_EXCEPTION;
568 goto on_error;
569 }
570 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000571 if (sigcheck()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000572 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000573 goto on_error;
574 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000575
Guido van Rossume59214e1994-08-30 08:01:59 +0000576#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000577 if (interpreter_lock) {
578 /* Give another thread a chance */
579
580 current_frame = NULL;
581 release_lock(interpreter_lock);
582
583 /* Other threads may run now */
584
585 acquire_lock(interpreter_lock, 1);
586 current_frame = f;
587 }
588#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000589 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000590
Guido van Rossum374a9221991-04-04 10:40:29 +0000591 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000592
Guido van Rossum408027e1996-12-30 16:17:54 +0000593#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000594 f->f_lasti = INSTR_OFFSET();
595#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000596
597 opcode = NEXTOP();
598 if (HAS_ARG(opcode))
599 oparg = NEXTARG();
600
Guido van Rossum96a42c81992-01-12 02:29:51 +0000601#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000602 /* Instruction tracing */
603
Guido van Rossum96a42c81992-01-12 02:29:51 +0000604 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000605 if (HAS_ARG(opcode)) {
606 printf("%d: %d, %d\n",
607 (int) (INSTR_OFFSET() - 3),
608 opcode, oparg);
609 }
610 else {
611 printf("%d: %d\n",
612 (int) (INSTR_OFFSET() - 1), opcode);
613 }
614 }
615#endif
616
617 /* Main switch on opcode */
618
619 switch (opcode) {
620
621 /* BEWARE!
622 It is essential that any operation that fails sets either
623 x to NULL, err to nonzero, or why to anything but WHY_NOT,
624 and that no operation that succeeds does this! */
625
626 /* case STOP_CODE: this is an error! */
627
628 case POP_TOP:
629 v = POP();
630 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000631 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000632
633 case ROT_TWO:
634 v = POP();
635 w = POP();
636 PUSH(v);
637 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000638 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000639
640 case ROT_THREE:
641 v = POP();
642 w = POP();
643 x = POP();
644 PUSH(v);
645 PUSH(x);
646 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000647 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000648
649 case DUP_TOP:
650 v = TOP();
651 INCREF(v);
652 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000653 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000654
655 case UNARY_POSITIVE:
656 v = POP();
657 x = pos(v);
658 DECREF(v);
659 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000660 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 break;
662
663 case UNARY_NEGATIVE:
664 v = POP();
665 x = neg(v);
666 DECREF(v);
667 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000668 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 break;
670
671 case UNARY_NOT:
672 v = POP();
673 x = not(v);
674 DECREF(v);
675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000676 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 break;
678
679 case UNARY_CONVERT:
680 v = POP();
681 x = reprobject(v);
682 DECREF(v);
683 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000684 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000686
687 case UNARY_INVERT:
688 v = POP();
689 x = invert(v);
690 DECREF(v);
691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000692 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000693 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000694
Guido van Rossum50564e81996-01-12 01:13:16 +0000695 case BINARY_POWER:
696 w = POP();
697 v = POP();
Guido van Rossum3b4da591996-06-19 21:49:17 +0000698 x = powerop(v, w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000699 DECREF(v);
700 DECREF(w);
701 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000702 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000703 break;
704
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 case BINARY_MULTIPLY:
706 w = POP();
707 v = POP();
708 x = mul(v, w);
709 DECREF(v);
710 DECREF(w);
711 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000712 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 break;
714
715 case BINARY_DIVIDE:
716 w = POP();
717 v = POP();
718 x = divide(v, w);
719 DECREF(v);
720 DECREF(w);
721 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000722 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 break;
724
725 case BINARY_MODULO:
726 w = POP();
727 v = POP();
Guido van Rossum06186511995-01-07 12:40:10 +0000728 x = mod(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 DECREF(v);
730 DECREF(w);
731 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000732 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000733 break;
734
735 case BINARY_ADD:
736 w = POP();
737 v = POP();
738 x = add(v, w);
739 DECREF(v);
740 DECREF(w);
741 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000742 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 break;
744
745 case BINARY_SUBTRACT:
746 w = POP();
747 v = POP();
748 x = sub(v, w);
749 DECREF(v);
750 DECREF(w);
751 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000752 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000753 break;
754
755 case BINARY_SUBSCR:
756 w = POP();
757 v = POP();
758 x = apply_subscript(v, w);
759 DECREF(v);
760 DECREF(w);
761 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000762 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000763 break;
764
Guido van Rossum7928cd71991-10-24 14:59:31 +0000765 case BINARY_LSHIFT:
766 w = POP();
767 v = POP();
768 x = lshift(v, w);
769 DECREF(v);
770 DECREF(w);
771 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000772 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000773 break;
774
775 case BINARY_RSHIFT:
776 w = POP();
777 v = POP();
778 x = rshift(v, w);
779 DECREF(v);
780 DECREF(w);
781 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000782 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000783 break;
784
785 case BINARY_AND:
786 w = POP();
787 v = POP();
788 x = and(v, w);
789 DECREF(v);
790 DECREF(w);
791 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000792 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000793 break;
794
795 case BINARY_XOR:
796 w = POP();
797 v = POP();
798 x = xor(v, w);
799 DECREF(v);
800 DECREF(w);
801 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000802 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000803 break;
804
805 case BINARY_OR:
806 w = POP();
807 v = POP();
808 x = or(v, w);
809 DECREF(v);
810 DECREF(w);
811 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000812 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000813 break;
814
Guido van Rossum374a9221991-04-04 10:40:29 +0000815 case SLICE+0:
816 case SLICE+1:
817 case SLICE+2:
818 case SLICE+3:
819 if ((opcode-SLICE) & 2)
820 w = POP();
821 else
822 w = NULL;
823 if ((opcode-SLICE) & 1)
824 v = POP();
825 else
826 v = NULL;
827 u = POP();
828 x = apply_slice(u, v, w);
829 DECREF(u);
830 XDECREF(v);
831 XDECREF(w);
832 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000833 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 break;
835
836 case STORE_SLICE+0:
837 case STORE_SLICE+1:
838 case STORE_SLICE+2:
839 case STORE_SLICE+3:
840 if ((opcode-STORE_SLICE) & 2)
841 w = POP();
842 else
843 w = NULL;
844 if ((opcode-STORE_SLICE) & 1)
845 v = POP();
846 else
847 v = NULL;
848 u = POP();
849 t = POP();
850 err = assign_slice(u, v, w, t); /* u[v:w] = t */
851 DECREF(t);
852 DECREF(u);
853 XDECREF(v);
854 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000855 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000856 break;
857
858 case DELETE_SLICE+0:
859 case DELETE_SLICE+1:
860 case DELETE_SLICE+2:
861 case DELETE_SLICE+3:
862 if ((opcode-DELETE_SLICE) & 2)
863 w = POP();
864 else
865 w = NULL;
866 if ((opcode-DELETE_SLICE) & 1)
867 v = POP();
868 else
869 v = NULL;
870 u = POP();
871 err = assign_slice(u, v, w, (object *)NULL);
872 /* del u[v:w] */
873 DECREF(u);
874 XDECREF(v);
875 XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000876 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 break;
878
879 case STORE_SUBSCR:
880 w = POP();
881 v = POP();
882 u = POP();
883 /* v[w] = u */
884 err = assign_subscript(v, w, u);
885 DECREF(u);
886 DECREF(v);
887 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000888 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 break;
890
891 case DELETE_SUBSCR:
892 w = POP();
893 v = POP();
894 /* del v[w] */
895 err = assign_subscript(v, w, (object *)NULL);
896 DECREF(v);
897 DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000898 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 break;
900
901 case PRINT_EXPR:
902 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000904 /* Before printing, also assign to '_' */
905 if (v != None &&
Guido van Rossum6135a871995-01-09 17:53:26 +0000906 (err = dictinsert(f->f_builtins, "_", v)) == 0 &&
Guido van Rossume59214e1994-08-30 08:01:59 +0000907 !suppress_print) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 flushline();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000909 x = sysget("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000910 err = writeobject(v, x, 0);
Guido van Rossumb4e7e251995-01-17 16:27:25 +0000911 softspace(x, 1);
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 flushline();
913 }
914 DECREF(v);
915 break;
916
917 case PRINT_ITEM:
918 v = POP();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000919 w = sysget("stdout");
920 if (softspace(w, 1))
921 writestring(" ", w);
Guido van Rossumc6004111993-11-05 10:22:19 +0000922 err = writeobject(v, w, PRINT_RAW);
923 if (err == 0 && is_stringobject(v)) {
924 /* XXX move into writeobject() ? */
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 char *s = getstringvalue(v);
926 int len = getstringsize(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000927 if (len > 0 &&
928 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000929 s[len-1] != ' ')
Guido van Rossum3165fe61992-09-25 21:59:05 +0000930 softspace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000932 DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000933 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000934 break;
935
936 case PRINT_NEWLINE:
Guido van Rossum3165fe61992-09-25 21:59:05 +0000937 x = sysget("stdout");
938 if (x == NULL)
939 err_setstr(RuntimeError, "lost sys.stdout");
940 else {
941 writestring("\n", x);
942 softspace(x, 0);
943 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 break;
945
946 case BREAK_LOOP:
947 why = WHY_BREAK;
948 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000949
Guido van Rossumf10570b1995-07-07 22:53:21 +0000950 case RAISE_VARARGS:
951 u = v = w = NULL;
952 switch (oparg) {
953 case 3:
954 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000955 /* Fallthrough */
956 case 2:
957 v = POP(); /* value */
958 /* Fallthrough */
959 case 1:
960 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000961 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000962 break;
963 default:
964 err_setstr(SystemError,
965 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000966 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000967 break;
968 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
970
971 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000972 if ((x = f->f_locals) == NULL) {
973 err_setstr(SystemError, "no locals");
974 break;
975 }
976 INCREF(x);
977 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +0000978 break;
979
980 case RETURN_VALUE:
981 retval = POP();
982 why = WHY_RETURN;
983 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000984
Guido van Rossumdb3165e1993-10-18 17:06:59 +0000985 case EXEC_STMT:
986 w = POP();
987 v = POP();
988 u = POP();
989 err = exec_statement(u, v, w);
990 DECREF(u);
991 DECREF(v);
992 DECREF(w);
993 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000994
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 case POP_BLOCK:
996 {
997 block *b = pop_block(f);
998 while (STACK_LEVEL() > b->b_level) {
999 v = POP();
1000 DECREF(v);
1001 }
1002 }
1003 break;
1004
1005 case END_FINALLY:
1006 v = POP();
1007 if (is_intobject(v)) {
1008 why = (enum why_code) getintvalue(v);
1009 if (why == WHY_RETURN)
1010 retval = POP();
1011 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00001012 else if (is_stringobject(v) || is_classobject(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001014 u = POP();
1015 err_restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001016 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001017 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001018 }
1019 else if (v != None) {
1020 err_setstr(SystemError,
1021 "'finally' pops bad exception");
1022 why = WHY_EXCEPTION;
1023 }
1024 DECREF(v);
1025 break;
1026
1027 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001028 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001030 w = POP();
1031 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001032 PUSH(x);
Guido van Rossum25831651993-05-19 14:50:45 +00001033 DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 DECREF(v);
1035 DECREF(w);
1036 break;
1037
1038 case STORE_NAME:
1039 w = GETNAMEV(oparg);
1040 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001041 if ((x = f->f_locals) == NULL) {
1042 err_setstr(SystemError, "no locals");
1043 break;
1044 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001045 err = dict2insert(x, w, v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 DECREF(v);
1047 break;
1048
1049 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001050 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001051 if ((x = f->f_locals) == NULL) {
1052 err_setstr(SystemError, "no locals");
1053 break;
1054 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001055 if ((err = dict2remove(x, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001056 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001057 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001058
1059#ifdef CASE_TOO_BIG
1060 default: switch (opcode) {
1061#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001062
1063 case UNPACK_TUPLE:
1064 v = POP();
1065 if (!is_tupleobject(v)) {
1066 err_setstr(TypeError, "unpack non-tuple");
1067 why = WHY_EXCEPTION;
1068 }
1069 else if (gettuplesize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001070 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 "unpack tuple of wrong size");
1072 why = WHY_EXCEPTION;
1073 }
1074 else {
1075 for (; --oparg >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00001076 w = GETTUPLEITEM(v, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001077 INCREF(w);
1078 PUSH(w);
1079 }
1080 }
1081 DECREF(v);
1082 break;
1083
1084 case UNPACK_LIST:
1085 v = POP();
1086 if (!is_listobject(v)) {
1087 err_setstr(TypeError, "unpack non-list");
1088 why = WHY_EXCEPTION;
1089 }
1090 else if (getlistsize(v) != oparg) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001091 err_setstr(ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001092 "unpack list of wrong size");
1093 why = WHY_EXCEPTION;
1094 }
1095 else {
1096 for (; --oparg >= 0; ) {
1097 w = getlistitem(v, oparg);
1098 INCREF(w);
1099 PUSH(w);
1100 }
1101 }
1102 DECREF(v);
1103 break;
1104
1105 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001106 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001107 v = POP();
1108 u = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001109 err = setattro(v, w, u); /* v.w = u */
Guido van Rossum374a9221991-04-04 10:40:29 +00001110 DECREF(v);
1111 DECREF(u);
1112 break;
1113
1114 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001115 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001116 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001117 err = setattro(v, w, (object *)NULL); /* del v.w */
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 DECREF(v);
1119 break;
1120
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001121 case STORE_GLOBAL:
1122 w = GETNAMEV(oparg);
1123 v = POP();
1124 err = dict2insert(f->f_globals, w, v);
1125 DECREF(v);
1126 break;
1127
1128 case DELETE_GLOBAL:
1129 w = GETNAMEV(oparg);
1130 if ((err = dict2remove(f->f_globals, w)) != 0)
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001131 err_setval(NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001132 break;
1133
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 case LOAD_CONST:
1135 x = GETCONST(oparg);
1136 INCREF(x);
1137 PUSH(x);
1138 break;
1139
1140 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001141 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001142 if ((x = f->f_locals) == NULL) {
1143 err_setstr(SystemError, "no locals");
1144 break;
1145 }
1146 x = dict2lookup(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001148 err_clear();
1149 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001151 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001152 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001153 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001154 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 break;
1156 }
1157 }
1158 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001159 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001160 PUSH(x);
1161 break;
1162
1163 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001164 w = GETNAMEV(oparg);
1165 x = dict2lookup(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 if (x == NULL) {
Guido van Rossumdf62e441991-08-16 08:56:04 +00001167 err_clear();
Guido van Rossum6135a871995-01-09 17:53:26 +00001168 x = dict2lookup(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 if (x == NULL) {
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +00001170 err_setval(NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 break;
1172 }
1173 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001174 INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001175 PUSH(x);
1176 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001177
Guido van Rossum9bfef441993-03-29 10:43:31 +00001178 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001179 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001180 if (x == NULL) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001181 err_setval(NameError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001182 gettupleitem(co->co_varnames,
1183 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001184 break;
1185 }
Guido van Rossum1aa14831997-01-21 05:34:20 +00001186 INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001187 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001188 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001189 break;
1190
1191 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001192 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001193 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001194 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001195
1196 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001197 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001198 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001199
1200 case BUILD_TUPLE:
1201 x = newtupleobject(oparg);
1202 if (x != NULL) {
1203 for (; --oparg >= 0;) {
1204 w = POP();
Guido van Rossum8d617a61995-03-09 12:12:11 +00001205 SETTUPLEITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 }
1207 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001208 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 }
1210 break;
1211
1212 case BUILD_LIST:
1213 x = newlistobject(oparg);
1214 if (x != NULL) {
1215 for (; --oparg >= 0;) {
1216 w = POP();
1217 err = setlistitem(x, oparg, w);
1218 if (err != 0)
1219 break;
1220 }
1221 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 }
1224 break;
1225
1226 case BUILD_MAP:
1227 x = newdictobject();
1228 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001229 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 break;
1231
1232 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001233 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 v = POP();
Guido van Rossum9bfef441993-03-29 10:43:31 +00001235 x = getattro(v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 DECREF(v);
1237 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001238 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 break;
1240
1241 case COMPARE_OP:
1242 w = POP();
1243 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001244 x = cmp_outcome(oparg, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001245 DECREF(v);
1246 DECREF(w);
1247 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001248 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 break;
1250
1251 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001252 w = GETNAMEV(oparg);
Guido van Rossum6135a871995-01-09 17:53:26 +00001253 x = dictlookup(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254 if (x == NULL) {
1255 err_setstr(ImportError,
1256 "__import__ not found");
1257 break;
1258 }
Guido van Rossum24c13741995-02-14 09:42:43 +00001259 if (is_methodobject(x)) {
1260 u = None;
1261 INCREF(u);
1262 }
1263 else {
1264 u = find_from_args(f, INSTR_OFFSET());
1265 if (u == NULL) {
1266 x = u;
1267 break;
1268 }
1269 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001270 w = mkvalue("(OOOO)",
1271 w,
1272 f->f_globals,
1273 f->f_locals == NULL ? None : f->f_locals,
1274 u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001275 DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001276 if (w == NULL) {
1277 x = NULL;
1278 break;
1279 }
1280 x = call_object(x, w);
1281 DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001282 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001283 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 break;
1285
1286 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001287 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 v = TOP();
Guido van Rossum24c13741995-02-14 09:42:43 +00001289 fast_2_locals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001290 if ((x = f->f_locals) == NULL) {
1291 err_setstr(SystemError, "no locals");
1292 break;
1293 }
1294 err = import_from(x, v, w);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001295 locals_2_fast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001296 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001298
Guido van Rossum374a9221991-04-04 10:40:29 +00001299 case JUMP_FORWARD:
1300 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001301 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001302
1303 case JUMP_IF_FALSE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001304 err = testbool(TOP());
1305 if (err > 0)
1306 err = 0;
1307 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001309 else
1310 break;
1311 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001312
1313 case JUMP_IF_TRUE:
Guido van Rossum04691fc1992-08-12 15:35:34 +00001314 err = testbool(TOP());
1315 if (err > 0) {
1316 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001318 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001319 else if (err == 0)
1320 ;
1321 else
1322 break;
1323 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324
1325 case JUMP_ABSOLUTE:
1326 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001327 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328
1329 case FOR_LOOP:
1330 /* for v in s: ...
1331 On entry: stack contains s, i.
1332 On exit: stack contains s, i+1, s[i];
1333 but if loop exhausted:
1334 s, i are popped, and we jump */
1335 w = POP(); /* Loop index */
1336 v = POP(); /* Sequence object */
1337 u = loop_subscript(v, w);
1338 if (u != NULL) {
1339 PUSH(v);
1340 x = newintobject(getintvalue(w)+1);
1341 PUSH(x);
1342 DECREF(w);
1343 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001344 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 }
1346 else {
1347 DECREF(v);
1348 DECREF(w);
1349 /* A NULL can mean "s exhausted"
1350 but also an error: */
1351 if (err_occurred())
1352 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001353 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001355 continue;
1356 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 }
1358 break;
1359
1360 case SETUP_LOOP:
1361 case SETUP_EXCEPT:
1362 case SETUP_FINALLY:
1363 setup_block(f, opcode, INSTR_OFFSET() + oparg,
1364 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001365 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001366
1367 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001368#ifdef LLTRACE
1369 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001371#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001372 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 if (f->f_trace == NULL)
1374 continue;
1375 /* Trace each line of code reached */
1376 f->f_lasti = INSTR_OFFSET();
1377 err = call_trace(&f->f_trace, &f->f_trace,
1378 f, "line", None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001380
1381 case CALL_FUNCTION:
1382 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001383 int na = oparg & 0xff;
1384 int nk = (oparg>>8) & 0xff;
1385 int n = na + 2*nk;
1386 object **pfunc = stack_pointer - n - 1;
1387 object *func = *pfunc;
1388 object *self = NULL;
1389 object *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001390 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001391 if (is_instancemethodobject(func)) {
1392 self = instancemethodgetself(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001393 class = instancemethodgetclass(func);
1394 func = instancemethodgetfunc(func);
1395 INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001396 if (self != NULL) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001397 INCREF(self);
1398 DECREF(*pfunc);
1399 *pfunc = self;
1400 na++;
1401 n++;
1402 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001403 else {
1404 /* Unbound methods must be
1405 called with an instance of
1406 the class (or a derived
1407 class) as first argument */
1408 if (na > 0 &&
1409 (self = stack_pointer[-n])
1410 != NULL &&
1411 is_instanceobject(self) &&
1412 issubclass(
1413 (object *)
1414 (((instanceobject *)self)
1415 ->in_class),
1416 class))
1417 /* Handy-dandy */ ;
1418 else {
1419 err_setstr(TypeError,
1420 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001421 x = NULL;
1422 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001423 }
1424 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001425 }
1426 else
1427 INCREF(func);
1428 if (is_funcobject(func)) {
1429 object *co = getfunccode(func);
1430 object *globals = getfuncglobals(func);
1431 object *argdefs = PyFunction_GetDefaults(func);
1432 object **d;
1433 int nd;
1434 if (argdefs != NULL) {
1435 d = &GETTUPLEITEM(argdefs, 0);
1436 nd = ((tupleobject *)argdefs)->ob_size;
1437 }
1438 else {
1439 d = NULL;
1440 nd = 0;
1441 }
1442 x = eval_code2(
1443 (codeobject *)co,
1444 globals, (object *)NULL,
1445 stack_pointer-n, na,
1446 stack_pointer-2*nk, nk,
1447 d, nd,
1448 class);
1449 }
1450 else {
1451 object *args = newtupleobject(na);
1452 object *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001453 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001455 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001456 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001457 if (nk > 0) {
1458 kwdict = newdictobject();
1459 if (kwdict == NULL) {
1460 x = NULL;
1461 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001462 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001463 err = 0;
1464 while (--nk >= 0) {
1465 object *value = POP();
1466 object *key = POP();
1467 err = mappinginsert(
1468 kwdict, key, value);
1469 if (err) {
1470 DECREF(key);
1471 DECREF(value);
1472 break;
1473 }
1474 }
1475 if (err) {
1476 DECREF(args);
1477 DECREF(kwdict);
1478 break;
1479 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001480 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001481 while (--na >= 0) {
1482 w = POP();
1483 SETTUPLEITEM(args, na, w);
1484 }
1485 x = PyEval_CallObjectWithKeywords(
1486 func, args, kwdict);
1487 DECREF(args);
1488 XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001489 }
1490 DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001491 while (stack_pointer > pfunc) {
1492 w = POP();
1493 DECREF(w);
1494 }
1495 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001496 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001497 break;
1498 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001499
Guido van Rossum681d79a1995-07-18 14:51:37 +00001500 case MAKE_FUNCTION:
1501 v = POP(); /* code object */
1502 x = newfuncobject(v, f->f_globals);
1503 DECREF(v);
1504 /* XXX Maybe this should be a separate opcode? */
1505 if (x != NULL && oparg > 0) {
1506 v = newtupleobject(oparg);
1507 if (v == NULL) {
1508 DECREF(x);
1509 x = NULL;
1510 break;
1511 }
1512 while (--oparg >= 0) {
1513 w = POP();
1514 SETTUPLEITEM(v, oparg, w);
1515 }
1516 err = PyFunction_SetDefaults(x, v);
1517 DECREF(v);
1518 }
1519 PUSH(x);
1520 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001521
1522 case BUILD_SLICE:
1523 if (oparg == 3)
1524 w = POP();
1525 else
1526 w = NULL;
1527 v = POP();
1528 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001529 x = PySlice_New(u, v, w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001530 DECREF(u);
1531 DECREF(v);
1532 XDECREF(w);
1533 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001534 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001535 break;
1536
1537
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 default:
1539 fprintf(stderr,
1540 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001541 f->f_lineno, opcode);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001542 err_setstr(SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 why = WHY_EXCEPTION;
1544 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001545
1546#ifdef CASE_TOO_BIG
1547 }
1548#endif
1549
Guido van Rossum374a9221991-04-04 10:40:29 +00001550 } /* switch */
1551
1552 on_error:
1553
1554 /* Quickly continue if no error occurred */
1555
1556 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557 if (err == 0 && x != NULL) {
1558#ifdef CHECKEXC
1559 if (err_occurred())
1560 fprintf(stderr,
1561 "XXX undetected error\n");
1562 else
1563#endif
1564 continue; /* Normal, fast path */
1565 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 why = WHY_EXCEPTION;
1567 x = None;
1568 err = 0;
1569 }
1570
Guido van Rossum801dcae1992-04-08 11:32:32 +00001571#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001572 /* Double-check exception status */
1573
1574 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
1575 if (!err_occurred()) {
1576 fprintf(stderr, "XXX ghost error\n");
1577 err_setstr(SystemError, "ghost error");
1578 why = WHY_EXCEPTION;
1579 }
1580 }
1581 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001582 if (err_occurred()) {
1583 fprintf(stderr,
1584 "XXX undetected error (why=%d)\n",
1585 why);
1586 why = WHY_EXCEPTION;
1587 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 }
1589#endif
1590
1591 /* Log traceback info if this is a real exception */
1592
1593 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001594 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001595 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001596 f->f_lasti -= 2;
1597 tb_here(f);
1598
Guido van Rossume59214e1994-08-30 08:01:59 +00001599 if (f->f_trace)
1600 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001601 if (sys_profile)
1602 call_exc_trace(&sys_profile, (object**)0, f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 }
1604
1605 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1606
1607 if (why == WHY_RERAISE)
1608 why = WHY_EXCEPTION;
1609
1610 /* Unwind stacks if a (pseudo) exception occurred */
1611
1612 while (why != WHY_NOT && f->f_iblock > 0) {
1613 block *b = pop_block(f);
1614 while (STACK_LEVEL() > b->b_level) {
1615 v = POP();
1616 XDECREF(v);
1617 }
1618 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1619 why = WHY_NOT;
1620 JUMPTO(b->b_handler);
1621 break;
1622 }
1623 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001624 (b->b_type == SETUP_EXCEPT &&
1625 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001626 if (why == WHY_EXCEPTION) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001627 object *exc, *val, *tb;
1628 err_fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 if (val == NULL) {
1630 val = None;
1631 INCREF(val);
1632 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 /* Make the raw exception data
1634 available to the handler,
1635 so a program can emulate the
1636 Python main loop. Don't do
1637 this for 'finally'. */
1638 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001639 sysset("exc_traceback", tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 sysset("exc_value", val);
1641 sysset("exc_type", exc);
Guido van Rossum374a9221991-04-04 10:40:29 +00001642 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 PUSH(val);
1645 PUSH(exc);
1646 }
1647 else {
1648 if (why == WHY_RETURN)
1649 PUSH(retval);
1650 v = newintobject((long)why);
1651 PUSH(v);
1652 }
1653 why = WHY_NOT;
1654 JUMPTO(b->b_handler);
1655 break;
1656 }
1657 } /* unwind stack */
1658
1659 /* End the loop if we still have an error (or return) */
1660
1661 if (why != WHY_NOT)
1662 break;
1663
1664 } /* main loop */
1665
1666 /* Pop remaining stack entries */
1667
1668 while (!EMPTY()) {
1669 v = POP();
1670 XDECREF(v);
1671 }
1672
Guido van Rossum96a42c81992-01-12 02:29:51 +00001673 if (why != WHY_RETURN)
1674 retval = NULL;
1675
Guido van Rossume59214e1994-08-30 08:01:59 +00001676 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001677 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001678 if (call_trace(&f->f_trace, &f->f_trace, f,
1679 "return", retval)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001680 XDECREF(retval);
1681 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001682 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001683 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001684 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001685 }
1686
1687 if (sys_profile && why == WHY_RETURN) {
1688 if (call_trace(&sys_profile, (object**)0,
1689 f, "return", retval)) {
1690 XDECREF(retval);
1691 retval = NULL;
1692 why = WHY_EXCEPTION;
1693 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001694 }
1695
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001697
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 current_frame = f->f_back;
1699 DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +00001700 --recursion_depth;
Guido van Rossum374a9221991-04-04 10:40:29 +00001701
Guido van Rossum96a42c81992-01-12 02:29:51 +00001702 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001703}
1704
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001705/* Logic for the raise statement (too complicated for inlining).
1706 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001707static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001708do_raise(type, value, tb)
1709 object *type, *value, *tb;
1710{
1711 /* We support the following forms of raise:
1712 raise <class>, <classinstance>
1713 raise <class>, <argument tuple>
1714 raise <class>, None
1715 raise <class>, <argument>
1716 raise <classinstance>, None
1717 raise <string>, <object>
1718 raise <string>, None
1719
1720 An omitted second argument is the same as None.
1721
1722 In addition, raise <tuple>, <anything> is the same as
1723 raising the tuple's first item (and it better have one!);
1724 this rule is applied recursively.
1725
1726 Finally, an optional third argument can be supplied, which
1727 gives the traceback to be substituted (useful when
1728 re-raising an exception after examining it). */
1729
1730 /* First, check the traceback argument, replacing None with
1731 NULL. */
1732 if (tb == None) {
1733 DECREF(tb);
1734 tb = NULL;
1735 }
1736 else if (tb != NULL && !PyTraceBack_Check(tb)) {
1737 err_setstr(TypeError,
1738 "raise 3rd arg must be traceback or None");
1739 goto raise_error;
1740 }
1741
1742 /* Next, replace a missing value with None */
1743 if (value == NULL) {
1744 value = None;
1745 INCREF(value);
1746 }
1747
1748 /* Next, repeatedly, replace a tuple exception with its first item */
1749 while (is_tupleobject(type) && gettuplesize(type) > 0) {
1750 object *tmp = type;
1751 type = GETTUPLEITEM(type, 0);
1752 INCREF(type);
1753 DECREF(tmp);
1754 }
1755
1756 /* Now switch on the exception's type */
1757 if (is_stringobject(type)) {
1758 ;
1759 }
1760 else if (is_classobject(type)) {
1761 /* Raising a class. If the value is an instance, it
1762 better be an instance of the class. If it is not,
1763 it will be used to create an instance. */
1764 if (is_instanceobject(value)) {
1765 object *inclass = (object*)
1766 (((instanceobject*)value)->in_class);
1767 if (!issubclass(inclass, type)) {
1768 err_setstr(TypeError,
1769 "raise <class>, <instance> requires that <instance> is a member of <class>");
1770 goto raise_error;
1771 }
1772 }
1773 else {
1774 /* Go instantiate the class */
1775 object *args, *res;
1776 if (value == None)
1777 args = mkvalue("()");
1778 else if (is_tupleobject(value)) {
1779 INCREF(value);
1780 args = value;
1781 }
1782 else
1783 args = mkvalue("(O)", value);
1784 if (args == NULL)
1785 goto raise_error;
1786 res = call_object(type, args);
1787 DECREF(args);
1788 if (res == NULL)
1789 goto raise_error;
1790 DECREF(value);
1791 value = res;
1792 }
1793 }
1794 else if (is_instanceobject(type)) {
1795 /* Raising an instance. The value should be a dummy. */
1796 if (value != None) {
1797 err_setstr(TypeError,
1798 "instance exception may not have a separate value");
1799 goto raise_error;
1800 }
1801 else {
1802 /* Normalize to raise <class>, <instance> */
1803 DECREF(value);
1804 value = type;
1805 type = (object*) ((instanceobject*)type)->in_class;
1806 INCREF(type);
1807 }
1808 }
1809 else {
1810 /* Not something you can raise. You get an exception
1811 anyway, just not what you specified :-) */
1812 err_setstr(TypeError,
1813 "exceptions must be strings, classes, or instances");
1814 goto raise_error;
1815 }
1816 err_restore(type, value, tb);
1817 if (tb == NULL)
1818 return WHY_EXCEPTION;
1819 else
1820 return WHY_RERAISE;
1821 raise_error:
1822 XDECREF(value);
1823 XDECREF(type);
1824 XDECREF(tb);
1825 return WHY_EXCEPTION;
1826}
1827
Guido van Rossum96a42c81992-01-12 02:29:51 +00001828#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001829static int
1830prtrace(v, str)
1831 object *v;
1832 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001834 printf("%s ", str);
Guido van Rossum90933611991-06-07 16:10:43 +00001835 if (printobject(v, stdout, 0) != 0)
1836 err_clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001837 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001839#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001840
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001841static void
1842call_exc_trace(p_trace, p_newtrace, f)
1843 object **p_trace, **p_newtrace;
1844 frameobject *f;
1845{
1846 object *type, *value, *traceback, *arg;
1847 int err;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001848 err_fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001849 if (value == NULL) {
1850 value = None;
1851 INCREF(value);
1852 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001853 arg = mkvalue("(OOO)", type, value, traceback);
1854 if (arg == NULL) {
1855 err_restore(type, value, traceback);
1856 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001857 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001858 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
1859 DECREF(arg);
1860 if (err == 0)
1861 err_restore(type, value, traceback);
1862 else {
1863 XDECREF(type);
1864 XDECREF(value);
1865 XDECREF(traceback);
1866 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001867}
1868
1869static int
1870call_trace(p_trace, p_newtrace, f, msg, arg)
1871 object **p_trace; /* in/out; may not be NULL;
1872 may not point to NULL variable initially */
1873 object **p_newtrace; /* in/out; may be NULL;
1874 may point to NULL variable;
1875 may be same variable as p_newtrace */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001876 frameobject *f;
1877 char *msg;
1878 object *arg;
1879{
Guido van Rossumf10570b1995-07-07 22:53:21 +00001880 object *args, *what;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001881 object *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001882 static int tracing = 0;
1883
1884 if (tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001885 /* Don't do recursive traces */
1886 if (p_newtrace) {
1887 XDECREF(*p_newtrace);
1888 *p_newtrace = NULL;
1889 }
1890 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001891 }
1892
Guido van Rossumf10570b1995-07-07 22:53:21 +00001893 args = newtupleobject(3);
1894 if (args == NULL)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001895 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001896 what = newstringobject(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001897 if (what == NULL)
1898 goto cleanup;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001899 INCREF(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001900 SETTUPLEITEM(args, 0, (object *)f);
1901 SETTUPLEITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001902 if (arg == NULL)
1903 arg = None;
1904 INCREF(arg);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001905 SETTUPLEITEM(args, 2, arg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001906 tracing++;
Guido van Rossum5b722181993-03-30 17:46:03 +00001907 fast_2_locals(f);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001908 res = call_object(*p_trace, args); /* May clear *p_trace! */
Guido van Rossum5b722181993-03-30 17:46:03 +00001909 locals_2_fast(f, 1);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001910 tracing--;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001911 cleanup:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001912 XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001913 if (res == NULL) {
1914 /* The trace proc raised an exception */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001915 tb_here(f);
Guido van Rossume59214e1994-08-30 08:01:59 +00001916 XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001917 *p_trace = NULL;
1918 if (p_newtrace) {
1919 XDECREF(*p_newtrace);
1920 *p_newtrace = NULL;
1921 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001922 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001923 }
1924 else {
1925 if (p_newtrace) {
1926 XDECREF(*p_newtrace);
1927 if (res == None)
1928 *p_newtrace = NULL;
1929 else {
1930 INCREF(res);
1931 *p_newtrace = res;
1932 }
1933 }
1934 DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001935 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00001936 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001937}
1938
Guido van Rossum3f5da241990-12-20 15:06:42 +00001939object *
Guido van Rossum6135a871995-01-09 17:53:26 +00001940getbuiltins()
1941{
1942 if (current_frame == NULL)
Guido van Rossumb4e7e251995-01-17 16:27:25 +00001943 return getbuiltinmod();
Guido van Rossum6135a871995-01-09 17:53:26 +00001944 else
1945 return current_frame->f_builtins;
1946}
1947
1948object *
Guido van Rossum5b722181993-03-30 17:46:03 +00001949getlocals()
1950{
1951 if (current_frame == NULL)
1952 return NULL;
1953 fast_2_locals(current_frame);
1954 return current_frame->f_locals;
1955}
1956
1957object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001958getglobals()
1959{
1960 if (current_frame == NULL)
1961 return NULL;
1962 else
1963 return current_frame->f_globals;
1964}
1965
Guido van Rossum81daa321993-05-20 14:24:46 +00001966object *
Guido van Rossume59214e1994-08-30 08:01:59 +00001967getframe()
1968{
1969 return (object *)current_frame;
1970}
1971
Guido van Rossum6135a871995-01-09 17:53:26 +00001972int
1973getrestricted()
1974{
1975 return current_frame == NULL ? 0 : current_frame->f_restricted;
1976}
1977
Guido van Rossum3f5da241990-12-20 15:06:42 +00001978void
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979flushline()
1980{
Guido van Rossum3165fe61992-09-25 21:59:05 +00001981 object *f = sysget("stdout");
1982 if (softspace(f, 0))
1983 writestring("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984}
1985
Guido van Rossum3f5da241990-12-20 15:06:42 +00001986
Guido van Rossum06186511995-01-07 12:40:10 +00001987#define BINOP(opname, ropname, thisfunc) \
1988 if (!is_instanceobject(v) && !is_instanceobject(w)) \
1989 ; \
1990 else \
1991 return instancebinop(v, w, opname, ropname, thisfunc)
Guido van Rossum180d7b41994-09-29 09:45:57 +00001992
1993
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00001995or(v, w)
1996 object *v, *w;
1997{
Guido van Rossum06186511995-01-07 12:40:10 +00001998 BINOP("__or__", "__ror__", or);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001999 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002000 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002001 object * (*f) FPROTO((object *, object *));
2002 if (coerce(&v, &w) != 0)
2003 return NULL;
2004 if ((f = v->ob_type->tp_as_number->nb_or) != NULL)
2005 x = (*f)(v, w);
2006 DECREF(v);
2007 DECREF(w);
2008 if (f != NULL)
2009 return x;
2010 }
2011 err_setstr(TypeError, "bad operand type(s) for |");
2012 return NULL;
2013}
2014
2015static object *
2016xor(v, w)
2017 object *v, *w;
2018{
Guido van Rossum06186511995-01-07 12:40:10 +00002019 BINOP("__xor__", "__rxor__", xor);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002020 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002021 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002022 object * (*f) FPROTO((object *, object *));
2023 if (coerce(&v, &w) != 0)
2024 return NULL;
2025 if ((f = v->ob_type->tp_as_number->nb_xor) != NULL)
2026 x = (*f)(v, w);
2027 DECREF(v);
2028 DECREF(w);
2029 if (f != NULL)
2030 return x;
2031 }
2032 err_setstr(TypeError, "bad operand type(s) for ^");
2033 return NULL;
2034}
2035
2036static object *
2037and(v, w)
2038 object *v, *w;
2039{
Guido van Rossum06186511995-01-07 12:40:10 +00002040 BINOP("__and__", "__rand__", and);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002041 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002042 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002043 object * (*f) FPROTO((object *, object *));
2044 if (coerce(&v, &w) != 0)
2045 return NULL;
2046 if ((f = v->ob_type->tp_as_number->nb_and) != NULL)
2047 x = (*f)(v, w);
2048 DECREF(v);
2049 DECREF(w);
2050 if (f != NULL)
2051 return x;
2052 }
2053 err_setstr(TypeError, "bad operand type(s) for &");
2054 return NULL;
2055}
2056
2057static object *
2058lshift(v, w)
2059 object *v, *w;
2060{
Guido van Rossum06186511995-01-07 12:40:10 +00002061 BINOP("__lshift__", "__rlshift__", lshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002062 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002063 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002064 object * (*f) FPROTO((object *, object *));
2065 if (coerce(&v, &w) != 0)
2066 return NULL;
2067 if ((f = v->ob_type->tp_as_number->nb_lshift) != NULL)
2068 x = (*f)(v, w);
2069 DECREF(v);
2070 DECREF(w);
2071 if (f != NULL)
2072 return x;
2073 }
2074 err_setstr(TypeError, "bad operand type(s) for <<");
2075 return NULL;
2076}
2077
2078static object *
2079rshift(v, w)
2080 object *v, *w;
2081{
Guido van Rossum06186511995-01-07 12:40:10 +00002082 BINOP("__rshift__", "__rrshift__", rshift);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002083 if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002084 object *x = NULL;
Guido van Rossum7928cd71991-10-24 14:59:31 +00002085 object * (*f) FPROTO((object *, object *));
2086 if (coerce(&v, &w) != 0)
2087 return NULL;
2088 if ((f = v->ob_type->tp_as_number->nb_rshift) != NULL)
2089 x = (*f)(v, w);
2090 DECREF(v);
2091 DECREF(w);
2092 if (f != NULL)
2093 return x;
2094 }
2095 err_setstr(TypeError, "bad operand type(s) for >>");
2096 return NULL;
2097}
2098
2099static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002100add(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 object *v, *w;
2102{
Guido van Rossum06186511995-01-07 12:40:10 +00002103 BINOP("__add__", "__radd__", add);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002104 if (v->ob_type->tp_as_sequence != NULL)
2105 return (*v->ob_type->tp_as_sequence->sq_concat)(v, w);
2106 else if (v->ob_type->tp_as_number != NULL) {
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002107 object *x;
2108 if (coerce(&v, &w) != 0)
2109 return NULL;
2110 x = (*v->ob_type->tp_as_number->nb_add)(v, w);
2111 DECREF(v);
2112 DECREF(w);
2113 return x;
2114 }
Guido van Rossum34679b71993-01-26 13:33:44 +00002115 err_setstr(TypeError, "bad operand type(s) for +");
2116 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117}
2118
2119static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002120sub(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 object *v, *w;
2122{
Guido van Rossum06186511995-01-07 12:40:10 +00002123 BINOP("__sub__", "__rsub__", sub);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002124 if (v->ob_type->tp_as_number != NULL) {
2125 object *x;
2126 if (coerce(&v, &w) != 0)
2127 return NULL;
2128 x = (*v->ob_type->tp_as_number->nb_subtract)(v, w);
2129 DECREF(v);
2130 DECREF(w);
2131 return x;
2132 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002133 err_setstr(TypeError, "bad operand type(s) for -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002134 return NULL;
2135}
2136
2137static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002138mul(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 object *v, *w;
2140{
2141 typeobject *tp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002142 tp = v->ob_type;
Guido van Rossum06186511995-01-07 12:40:10 +00002143 BINOP("__mul__", "__rmul__", mul);
Guido van Rossume6eefc21992-08-14 12:06:52 +00002144 if (tp->tp_as_number != NULL &&
2145 w->ob_type->tp_as_sequence != NULL &&
2146 !is_instanceobject(v)) {
2147 /* number*sequence -- swap v and w */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002148 object *tmp = v;
2149 v = w;
2150 w = tmp;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002151 tp = v->ob_type;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 }
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002153 if (tp->tp_as_number != NULL) {
2154 object *x;
Guido van Rossume6eefc21992-08-14 12:06:52 +00002155 if (is_instanceobject(v)) {
2156 /* Instances of user-defined classes get their
2157 other argument uncoerced, so they may
2158 implement sequence*number as well as
2159 number*number. */
2160 INCREF(v);
2161 INCREF(w);
2162 }
2163 else if (coerce(&v, &w) != 0)
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002164 return NULL;
2165 x = (*v->ob_type->tp_as_number->nb_multiply)(v, w);
2166 DECREF(v);
2167 DECREF(w);
2168 return x;
2169 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 if (tp->tp_as_sequence != NULL) {
2171 if (!is_intobject(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002172 err_setstr(TypeError,
2173 "can't multiply sequence with non-int");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 return NULL;
2175 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002176 return (*tp->tp_as_sequence->sq_repeat)
2177 (v, (int)getintvalue(w));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002179 err_setstr(TypeError, "bad operand type(s) for *");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 return NULL;
2181}
2182
2183static object *
Guido van Rossum40d0b7e1990-12-20 23:03:11 +00002184divide(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 object *v, *w;
2186{
Guido van Rossum06186511995-01-07 12:40:10 +00002187 BINOP("__div__", "__rdiv__", divide);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002188 if (v->ob_type->tp_as_number != NULL) {
2189 object *x;
2190 if (coerce(&v, &w) != 0)
2191 return NULL;
2192 x = (*v->ob_type->tp_as_number->nb_divide)(v, w);
2193 DECREF(v);
2194 DECREF(w);
2195 return x;
2196 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002197 err_setstr(TypeError, "bad operand type(s) for /");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 return NULL;
2199}
2200
2201static object *
Guido van Rossum06186511995-01-07 12:40:10 +00002202mod(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203 object *v, *w;
2204{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002205 if (is_stringobject(v)) {
2206 return formatstring(v, w);
2207 }
Guido van Rossum06186511995-01-07 12:40:10 +00002208 BINOP("__mod__", "__rmod__", mod);
Guido van Rossum89d55ca1991-07-01 18:43:13 +00002209 if (v->ob_type->tp_as_number != NULL) {
2210 object *x;
2211 if (coerce(&v, &w) != 0)
2212 return NULL;
2213 x = (*v->ob_type->tp_as_number->nb_remainder)(v, w);
2214 DECREF(v);
2215 DECREF(w);
2216 return x;
2217 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002218 err_setstr(TypeError, "bad operand type(s) for %");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 return NULL;
2220}
2221
2222static object *
Guido van Rossum3b4da591996-06-19 21:49:17 +00002223powerop(v, w)
Guido van Rossum50564e81996-01-12 01:13:16 +00002224 object *v, *w;
2225{
2226 object *res;
Guido van Rossum3b4da591996-06-19 21:49:17 +00002227 BINOP("__pow__", "__rpow__", powerop);
Guido van Rossum50564e81996-01-12 01:13:16 +00002228 if (v->ob_type->tp_as_number == NULL ||
2229 w->ob_type->tp_as_number == NULL) {
2230 err_setstr(TypeError, "pow() requires numeric arguments");
2231 return NULL;
2232 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002233 if (coerce(&v, &w) != 0)
2234 return NULL;
2235 res = (*v->ob_type->tp_as_number->nb_power)(v, w, None);
2236 DECREF(v);
2237 DECREF(w);
2238 return res;
2239}
2240
2241static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242neg(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 object *v;
2244{
2245 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002246 return (*v->ob_type->tp_as_number->nb_negative)(v);
2247 err_setstr(TypeError, "bad operand type(s) for unary -");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002248 return NULL;
2249}
2250
2251static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252pos(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 object *v;
2254{
2255 if (v->ob_type->tp_as_number != NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002256 return (*v->ob_type->tp_as_number->nb_positive)(v);
2257 err_setstr(TypeError, "bad operand type(s) for unary +");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002258 return NULL;
2259}
2260
2261static object *
Guido van Rossum7928cd71991-10-24 14:59:31 +00002262invert(v)
2263 object *v;
2264{
Guido van Rossum9b1d33b1992-02-11 15:56:02 +00002265 object * (*f) FPROTO((object *));
Guido van Rossum7928cd71991-10-24 14:59:31 +00002266 if (v->ob_type->tp_as_number != NULL &&
2267 (f = v->ob_type->tp_as_number->nb_invert) != NULL)
2268 return (*f)(v);
2269 err_setstr(TypeError, "bad operand type(s) for unary ~");
2270 return NULL;
2271}
2272
2273static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002274not(v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275 object *v;
2276{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002277 int outcome = testbool(v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002278 object *w;
2279 if (outcome < 0)
2280 return NULL;
2281 if (outcome == 0)
2282 w = True;
2283 else
2284 w = False;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002285 INCREF(w);
2286 return w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287}
Guido van Rossum234f9421993-06-17 12:35:49 +00002288
2289
Guido van Rossum681d79a1995-07-18 14:51:37 +00002290/* External interface to call any callable object.
2291 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002292
2293object *
2294call_object(func, arg)
2295 object *func;
2296 object *arg;
2297{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002298 return PyEval_CallObjectWithKeywords(func, arg, (object *)NULL);
2299}
Guido van Rossume59214e1994-08-30 08:01:59 +00002300
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301object *
2302PyEval_CallObjectWithKeywords(func, arg, kw)
2303 object *func;
2304 object *arg;
2305 object *kw;
2306{
2307 ternaryfunc call;
2308 object *result;
2309
2310 if (arg == NULL)
2311 arg = newtupleobject(0);
2312 else if (!is_tupleobject(arg)) {
2313 err_setstr(TypeError, "argument list must be a tuple");
2314 return NULL;
2315 }
2316 else
2317 INCREF(arg);
2318
Guido van Rossume3e61c11995-08-04 04:14:47 +00002319 if (kw != NULL && !is_dictobject(kw)) {
2320 err_setstr(TypeError, "keyword list must be a dictionary");
2321 return NULL;
2322 }
2323
Guido van Rossum150b2df1996-12-05 23:17:11 +00002324 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002325 result = (*call)(func, arg, kw);
2326 else if (is_instancemethodobject(func) || is_funcobject(func))
2327 result = call_function(func, arg, kw);
2328 else
2329 result = call_builtin(func, arg, kw);
2330
2331 DECREF(arg);
2332
Guido van Rossum69d9eb91994-11-10 22:41:15 +00002333 if (result == NULL && !err_occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334 err_setstr(SystemError,
2335 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002336
2337 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002338}
2339
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341call_builtin(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002343 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002344 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 if (is_methodobject(func)) {
2347 method meth = getmethod(func);
2348 object *self = getself(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002349 int flags = getflags(func);
2350 if (!(flags & METH_VARARGS)) {
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002351 int size = gettuplesize(arg);
2352 if (size == 1)
Guido van Rossum8d617a61995-03-09 12:12:11 +00002353 arg = GETTUPLEITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002354 else if (size == 0)
2355 arg = NULL;
2356 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002357 if (flags & METH_KEYWORDS)
2358 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002359 if (kw != NULL && getmappingsize(kw) != 0) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002360 err_setstr(TypeError,
2361 "this function takes no keyword arguments");
2362 return NULL;
2363 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002364 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 }
2366 if (is_classobject(func)) {
Guido van Rossumff8b4941995-07-26 18:16:42 +00002367 return newinstanceobject(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002369 if (is_instanceobject(func)) {
2370 object *res, *call = getattr(func,"__call__");
2371 if (call == NULL) {
2372 err_clear();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002373 err_setstr(AttributeError,
2374 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002375 return NULL;
2376 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002377 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossume59214e1994-08-30 08:01:59 +00002378 DECREF(call);
2379 return res;
2380 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002381 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 return NULL;
2383}
2384
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385static object *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002386call_function(func, arg, kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 object *func;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002388 object *arg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002389 object *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390{
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 object *class = NULL; /* == owner */
Guido van Rossume59214e1994-08-30 08:01:59 +00002392 object *argdefs;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002393 object **d, **k;
2394 int nk, nd;
2395 object *result;
2396
2397 if (kw != NULL && !is_dictobject(kw)) {
2398 err_badcall();
2399 return NULL;
2400 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401
Guido van Rossume8122f11991-05-05 20:03:07 +00002402 if (is_instancemethodobject(func)) {
2403 object *self = instancemethodgetself(func);
Guido van Rossum81daa321993-05-20 14:24:46 +00002404 class = instancemethodgetclass(func);
Guido van Rossume8122f11991-05-05 20:03:07 +00002405 func = instancemethodgetfunc(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002406 if (self == NULL) {
2407 /* Unbound methods must be called with an instance of
2408 the class (or a derived class) as first argument */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002409 if (gettuplesize(arg) >= 1) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002410 self = GETTUPLEITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002411 if (self != NULL &&
2412 is_instanceobject(self) &&
2413 issubclass((object *)
2414 (((instanceobject *)self)->in_class),
2415 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002417 else
2418 self = NULL;
2419 }
2420 if (self == NULL) {
2421 err_setstr(TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002422 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002423 return NULL;
2424 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002425 INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002426 }
2427 else {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 int argcount = gettuplesize(arg);
2429 object *newarg = newtupleobject(argcount + 1);
2430 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002431 if (newarg == NULL)
2432 return NULL;
2433 INCREF(self);
Guido van Rossum8d617a61995-03-09 12:12:11 +00002434 SETTUPLEITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 for (i = 0; i < argcount; i++) {
2436 object *v = GETTUPLEITEM(arg, i);
2437 XINCREF(v);
2438 SETTUPLEITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002439 }
2440 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 }
2442 }
2443 else {
2444 if (!is_funcobject(func)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002445 err_setstr(TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 return NULL;
2447 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002450
2451 argdefs = PyFunction_GetDefaults(func);
2452 if (argdefs != NULL && is_tupleobject(argdefs)) {
2453 d = &GETTUPLEITEM((tupleobject *)argdefs, 0);
2454 nd = gettuplesize(argdefs);
2455 }
2456 else {
2457 d = NULL;
2458 nd = 0;
2459 }
2460
2461 if (kw != NULL) {
2462 int pos, i;
2463 nk = getmappingsize(kw);
2464 k = NEW(object *, 2*nk);
2465 if (k == NULL) {
2466 err_nomem();
Guido van Rossume59214e1994-08-30 08:01:59 +00002467 DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002468 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002469 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002470 pos = i = 0;
2471 while (mappinggetnext(kw, &pos, &k[i], &k[i+1]))
2472 i += 2;
2473 nk = i/2;
2474 /* XXX This is broken if the caller deletes dict items! */
2475 }
2476 else {
2477 k = NULL;
2478 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002479 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480
Guido van Rossum681d79a1995-07-18 14:51:37 +00002481 result = eval_code2(
2482 (codeobject *)getfunccode(func),
2483 getfuncglobals(func), (object *)NULL,
2484 &GETTUPLEITEM(arg, 0), gettuplesize(arg),
2485 k, nk,
2486 d, nd,
2487 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488
Guido van Rossum681d79a1995-07-18 14:51:37 +00002489 DECREF(arg);
2490 XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491
Guido van Rossum681d79a1995-07-18 14:51:37 +00002492 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493}
2494
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002495#define SLICE_ERROR_MSG \
2496 "standard sequence type does not support step size other than one"
2497
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002499apply_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500 object *v, *w;
2501{
2502 typeobject *tp = v->ob_type;
2503 if (tp->tp_as_sequence == NULL && tp->tp_as_mapping == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002504 err_setstr(TypeError, "unsubscriptable object");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002505 return NULL;
2506 }
Guido van Rossum04691fc1992-08-12 15:35:34 +00002507 if (tp->tp_as_mapping != NULL) {
2508 return (*tp->tp_as_mapping->mp_subscript)(v, w);
2509 }
2510 else {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511 int i;
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002512 if (!is_intobject(w)) {
2513 if (PySlice_Check(w)) {
2514 err_setstr(ValueError, SLICE_ERROR_MSG);
2515 } else {
2516 err_setstr(TypeError,
2517 "sequence subscript not int");
2518 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 return NULL;
2520 }
2521 i = getintvalue(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002522 if (i < 0) {
2523 int len = (*tp->tp_as_sequence->sq_length)(v);
2524 if (len < 0)
2525 return NULL;
2526 i += len;
2527 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002528 return (*tp->tp_as_sequence->sq_item)(v, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530}
2531
2532static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002533loop_subscript(v, w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 object *v, *w;
2535{
2536 sequence_methods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002537 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 if (sq == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002539 err_setstr(TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 return NULL;
2541 }
2542 i = getintvalue(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002543 v = (*sq->sq_item)(v, i);
2544 if (v)
2545 return v;
2546 if (err_occurred() == IndexError)
2547 err_clear();
2548 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549}
2550
2551static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552slice_index(v, isize, pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553 object *v;
2554 int isize;
2555 int *pi;
2556{
2557 if (v != NULL) {
2558 if (!is_intobject(v)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 err_setstr(TypeError, "slice index must be int");
2560 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002561 }
2562 *pi = getintvalue(v);
2563 if (*pi < 0)
2564 *pi += isize;
2565 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002566 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567}
2568
2569static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 object *u, *v, *w;
2572{
2573 typeobject *tp = u->ob_type;
2574 int ilow, ihigh, isize;
2575 if (tp->tp_as_sequence == NULL) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002576 err_setstr(TypeError, "only sequences can be sliced");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 return NULL;
2578 }
2579 ilow = 0;
2580 isize = ihigh = (*tp->tp_as_sequence->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002581 if (isize < 0)
2582 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002583 if (slice_index(v, isize, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002585 if (slice_index(w, isize, &ihigh) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 return (*tp->tp_as_sequence->sq_slice)(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589
2590static int
2591assign_subscript(w, key, v) /* w[key] = v */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002592 object *w;
2593 object *key;
2594 object *v;
2595{
2596 typeobject *tp = w->ob_type;
2597 sequence_methods *sq;
2598 mapping_methods *mp;
Guido van Rossum1d339e81995-02-17 15:04:21 +00002599 int (*func1)();
2600 int (*func2)();
Guido van Rossum04691fc1992-08-12 15:35:34 +00002601 if ((mp = tp->tp_as_mapping) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002602 (func1 = mp->mp_ass_subscript) != NULL) {
2603 return (*func1)(w, key, v);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002604 }
2605 else if ((sq = tp->tp_as_sequence) != NULL &&
Guido van Rossum1d339e81995-02-17 15:04:21 +00002606 (func2 = sq->sq_ass_item) != NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 if (!is_intobject(key)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002608 err_setstr(TypeError,
Guido van Rossum98256aa1991-12-24 13:25:19 +00002609 "sequence subscript must be integer (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002610 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 }
Guido van Rossum98256aa1991-12-24 13:25:19 +00002612 else {
2613 int i = getintvalue(key);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002614 if (i < 0) {
2615 int len = (*sq->sq_length)(w);
2616 if (len < 0)
2617 return -1;
2618 i += len;
2619 }
Guido van Rossum1d339e81995-02-17 15:04:21 +00002620 return (*func2)(w, i, v);
Guido van Rossum98256aa1991-12-24 13:25:19 +00002621 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 else {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002624 err_setstr(TypeError,
2625 "can't assign to this subscripted object");
2626 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628}
2629
Guido van Rossum3f5da241990-12-20 15:06:42 +00002630static int
2631assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632 object *u, *v, *w, *x;
2633{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 sequence_methods *sq = u->ob_type->tp_as_sequence;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002635 int ilow, ihigh, isize;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 if (sq == NULL) {
2637 err_setstr(TypeError, "assign to slice of non-sequence");
2638 return -1;
2639 }
2640 if (sq == NULL || sq->sq_ass_slice == NULL) {
2641 err_setstr(TypeError, "unassignable slice");
2642 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 }
2644 ilow = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002645 isize = ihigh = (*sq->sq_length)(u);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002646 if (isize < 0)
2647 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002648 if (slice_index(v, isize, &ilow) != 0)
2649 return -1;
2650 if (slice_index(w, isize, &ihigh) != 0)
2651 return -1;
2652 return (*sq->sq_ass_slice)(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653}
2654
2655static int
2656cmp_exception(err, v)
2657 object *err, *v;
2658{
2659 if (is_tupleobject(v)) {
2660 int i, n;
2661 n = gettuplesize(v);
2662 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002663 /* Test recursively */
Guido van Rossum8d617a61995-03-09 12:12:11 +00002664 if (cmp_exception(err, GETTUPLEITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 return 1;
2666 }
2667 return 0;
2668 }
Guido van Rossum8bf7c481995-01-26 00:41:04 +00002669 if (is_classobject(v) && is_classobject(err))
2670 return issubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 return err == v;
2672}
2673
Guido van Rossum3f5da241990-12-20 15:06:42 +00002674static int
2675cmp_member(v, w)
2676 object *v, *w;
2677{
Guido van Rossume59214e1994-08-30 08:01:59 +00002678 int i, cmp;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002679 object *x;
2680 sequence_methods *sq;
2681 /* Special case for char in string */
2682 if (is_stringobject(w)) {
2683 register char *s, *end;
2684 register char c;
2685 if (!is_stringobject(v) || getstringsize(v) != 1) {
2686 err_setstr(TypeError,
2687 "string member test needs char left operand");
2688 return -1;
2689 }
2690 c = getstringvalue(v)[0];
2691 s = getstringvalue(w);
2692 end = s + getstringsize(w);
2693 while (s < end) {
2694 if (c == *s++)
2695 return 1;
2696 }
2697 return 0;
2698 }
2699 sq = w->ob_type->tp_as_sequence;
2700 if (sq == NULL) {
2701 err_setstr(TypeError,
2702 "'in' or 'not in' needs sequence right argument");
2703 return -1;
2704 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002705 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002706 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002707 if (x == NULL) {
2708 if (err_occurred() == IndexError) {
2709 err_clear();
2710 break;
2711 }
2712 return -1;
2713 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002714 cmp = cmpobject(v, x);
2715 XDECREF(x);
2716 if (cmp == 0)
2717 return 1;
2718 }
2719 return 0;
2720}
2721
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722static object *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002723cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002724 int op;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 register object *v;
2726 register object *w;
2727{
2728 register int cmp;
2729 register int res = 0;
2730 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002731 case IS:
2732 case IS_NOT:
2733 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002734 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002735 res = !res;
2736 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002737 case IN:
2738 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002739 res = cmp_member(v, w);
2740 if (res < 0)
2741 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002742 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002743 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744 break;
2745 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002746 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 break;
2748 default:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002749 cmp = cmpobject(v, w);
2750 switch (op) {
2751 case LT: res = cmp < 0; break;
2752 case LE: res = cmp <= 0; break;
2753 case EQ: res = cmp == 0; break;
2754 case NE: res = cmp != 0; break;
2755 case GT: res = cmp > 0; break;
2756 case GE: res = cmp >= 0; break;
2757 /* XXX no default? (res is initialized to 0 though) */
2758 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759 }
2760 v = res ? True : False;
2761 INCREF(v);
2762 return v;
2763}
2764
Guido van Rossum3f5da241990-12-20 15:06:42 +00002765static int
2766import_from(locals, v, name)
2767 object *locals;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002768 object *v;
Guido van Rossumdf62e441991-08-16 08:56:04 +00002769 object *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002770{
2771 object *w, *x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002772 if (!is_moduleobject(v)) {
Guido van Rossum1919ca71995-01-20 16:55:14 +00002773 err_setstr(TypeError, "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002774 return -1;
2775 }
Guido van Rossume9736fc1990-11-18 17:33:06 +00002776 w = getmoduledict(v);
Guido van Rossumdf62e441991-08-16 08:56:04 +00002777 if (getstringvalue(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002778 int pos, err;
Guido van Rossum25831651993-05-19 14:50:45 +00002779 object *name, *value;
2780 pos = 0;
2781 while (mappinggetnext(w, &pos, &name, &value)) {
2782 if (!is_stringobject(name) ||
2783 getstringvalue(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002784 continue;
Guido van Rossum1aa14831997-01-21 05:34:20 +00002785 INCREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002786 err = dict2insert(locals, name, value);
2787 DECREF(value);
2788 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002789 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002790 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002791 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002792 }
2793 else {
Guido van Rossumdf62e441991-08-16 08:56:04 +00002794 x = dict2lookup(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002795 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002796 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002797 sprintf(buf, "cannot import name %.230s",
Guido van Rossum98256aa1991-12-24 13:25:19 +00002798 getstringvalue(name));
2799 err_setstr(ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002800 return -1;
2801 }
2802 else
Guido van Rossumdf62e441991-08-16 08:56:04 +00002803 return dict2insert(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002804 }
2805}
2806
2807static object *
Guido van Rossum25831651993-05-19 14:50:45 +00002808build_class(methods, bases, name)
2809 object *methods; /* dictionary */
2810 object *bases; /* tuple containing classes */
2811 object *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002812{
Guido van Rossum25831651993-05-19 14:50:45 +00002813 int i;
2814 if (!is_tupleobject(bases)) {
2815 err_setstr(SystemError, "build_class with non-tuple bases");
2816 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002817 }
Guido van Rossum25831651993-05-19 14:50:45 +00002818 if (!is_dictobject(methods)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002819 err_setstr(SystemError, "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002820 return NULL;
2821 }
Guido van Rossum25831651993-05-19 14:50:45 +00002822 if (!is_stringobject(name)) {
2823 err_setstr(SystemError, "build_class witn non-string name");
2824 return NULL;
2825 }
2826 for (i = gettuplesize(bases); --i >= 0; ) {
Guido van Rossum8d617a61995-03-09 12:12:11 +00002827 object *base = GETTUPLEITEM(bases, i);
Guido van Rossum25831651993-05-19 14:50:45 +00002828 if (!is_classobject(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002829 /* Call the base's *type*, if it is callable.
2830 This code is a hook for Donald Beaudry's
2831 and Jim Fulton's type extensions. In
2832 unexended Python it will never be triggered
2833 since its types are not callable. */
2834 if (base->ob_type->ob_type->tp_call) {
2835 object *args;
2836 object *class;
2837 args = mkvalue("(OOO)", name, bases, methods);
2838 class = call_object((object *)base->ob_type,
2839 args);
2840 DECREF(args);
2841 return class;
2842 }
Guido van Rossum25831651993-05-19 14:50:45 +00002843 err_setstr(TypeError,
2844 "base is not a class object");
2845 return NULL;
2846 }
2847 }
2848 return newclassobject(bases, methods, name);
2849}
2850
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002851static int
2852exec_statement(prog, globals, locals)
2853 object *prog;
2854 object *globals;
2855 object *locals;
2856{
2857 char *s;
2858 int n;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002859 object *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002860 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002861
2862 if (is_tupleobject(prog) && globals == None && locals == None &&
2863 ((n = gettuplesize(prog)) == 2 || n == 3)) {
2864 /* Backward compatibility hack */
2865 globals = gettupleitem(prog, 1);
2866 if (n == 3)
2867 locals = gettupleitem(prog, 2);
2868 prog = gettupleitem(prog, 0);
2869 }
2870 if (globals == None) {
2871 globals = getglobals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002872 if (locals == None) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002873 locals = getlocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002874 plain = 1;
2875 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002876 }
2877 else if (locals == None)
2878 locals = globals;
2879 if (!is_stringobject(prog) &&
2880 !is_codeobject(prog) &&
2881 !is_fileobject(prog)) {
2882 err_setstr(TypeError,
2883 "exec 1st arg must be string, code or file object");
2884 return -1;
2885 }
2886 if (!is_dictobject(globals) || !is_dictobject(locals)) {
2887 err_setstr(TypeError,
2888 "exec 2nd/3rd args must be dict or None");
2889 return -1;
2890 }
Guido van Rossum6135a871995-01-09 17:53:26 +00002891 if (dictlookup(globals, "__builtins__") == NULL)
2892 dictinsert(globals, "__builtins__", current_frame->f_builtins);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002893 if (is_codeobject(prog)) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002894 if (eval_code((codeobject *) prog, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002895 return -1;
2896 return 0;
2897 }
2898 if (is_fileobject(prog)) {
2899 FILE *fp = getfilefile(prog);
2900 char *name = getstringvalue(getfilename(prog));
2901 if (run_file(fp, name, file_input, globals, locals) == NULL)
2902 return -1;
2903 return 0;
2904 }
2905 s = getstringvalue(prog);
2906 if (strlen(s) != getstringsize(prog)) {
2907 err_setstr(ValueError, "embedded '\\0' in exec string");
2908 return -1;
2909 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002910 v = run_string(s, file_input, globals, locals);
2911 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002912 return -1;
Guido van Rossum6b6e0aa1995-02-07 15:36:56 +00002913 DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002914 if (plain)
2915 locals_2_fast(current_frame, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002916 return 0;
2917}
Guido van Rossum24c13741995-02-14 09:42:43 +00002918
Guido van Rossum1aa14831997-01-21 05:34:20 +00002919/* Hack for ni.py */
Guido van Rossum24c13741995-02-14 09:42:43 +00002920static object *
2921find_from_args(f, nexti)
2922 frameobject *f;
2923 int nexti;
2924{
2925 int opcode;
2926 int oparg;
2927 object *list, *name;
2928 unsigned char *next_instr;
2929
2930 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2931 opcode = (*next_instr++);
2932 if (opcode != IMPORT_FROM) {
Guido van Rossum24c13741995-02-14 09:42:43 +00002933 INCREF(None);
2934 return None;
2935 }
2936
2937 list = newlistobject(0);
2938 if (list == NULL)
2939 return NULL;
2940
2941 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002942 oparg = (next_instr[1]<<8) + next_instr[0];
2943 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002944 name = Getnamev(f, oparg);
2945 if (addlistitem(list, name) < 0) {
2946 DECREF(list);
2947 break;
2948 }
2949 opcode = (*next_instr++);
2950 } while (opcode == IMPORT_FROM);
2951
2952 return list;
2953}