blob: 58f0a8c326e221473194e044f45021292a23a9d3 [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 Rossumb209a111997-04-29 18:18:01 +000040#include "Python.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 Rossuma027efa1997-05-05 20:56:21 +000050#ifdef HAVE_LIMITS_H
51#include <limits.h>
52#else
53#define INT_MAX 2147483647
54#endif
55
Guido van Rossum04691fc1992-08-12 15:35:34 +000056/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000058
Guido van Rossum408027e1996-12-30 16:17:54 +000059#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000060/* For debugging the interpreter: */
61#define LLTRACE 1 /* Low-level trace feature */
62#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000063#endif
64
Guido van Rossum5b722181993-03-30 17:46:03 +000065
Guido van Rossum374a9221991-04-04 10:40:29 +000066/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000067
Guido van Rossumb209a111997-04-29 18:18:01 +000068static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
69 PyObject *, PyObject *,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject **, int,
73 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000074#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000075static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000076#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000077static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
78 PyFrameObject *));
79static int call_trace Py_PROTO((PyObject **, PyObject **,
80 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000081static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
82static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000083static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000084static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000085static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000086static int assign_slice Py_PROTO((PyObject *, PyObject *,
87 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000088static int cmp_exception Py_PROTO((PyObject *, PyObject *));
89static int cmp_member Py_PROTO((PyObject *, PyObject *));
90static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
91static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
92static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000093static int exec_statement Py_PROTO((PyFrameObject *,
94 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000095static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000096static void set_exc_info Py_PROTO((PyThreadState *,
97 PyObject *, PyObject *, PyObject *));
98static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000099
100
Guido van Rossum950361c1997-01-24 13:49:28 +0000101/* Dynamic execution profile */
102#ifdef DYNAMIC_EXECUTION_PROFILE
103#ifdef DXPAIRS
104static long dxpairs[257][256];
105#define dxp dxpairs[256]
106#else
107static long dxp[256];
108#endif
109#endif
110
111
Guido van Rossume59214e1994-08-30 08:01:59 +0000112#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000113
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000114#include <errno.h>
115#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000116
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117extern int _PyThread_Started; /* Flag for Py_Exit */
118
Guido van Rossuma9672091994-09-14 13:31:22 +0000119static type_lock interpreter_lock = 0;
120static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121
122void
Guido van Rossumb209a111997-04-29 18:18:01 +0000123PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000126 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000127 _PyThread_Started = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128 interpreter_lock = allocate_lock();
129 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000130 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000131}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000132
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000133#endif
134
Guido van Rossumff4949e1992-08-05 19:58:53 +0000135/* Functions save_thread and restore_thread are always defined so
136 dynamically loaded modules needn't be compiled separately for use
137 with and without threads: */
138
Guido van Rossumb209a111997-04-29 18:18:01 +0000139PyObject *
140PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000141{
Guido van Rossume59214e1994-08-30 08:01:59 +0000142#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000143 if (interpreter_lock) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000144 PyThreadState *tstate = PyThreadState_Swap(NULL);
145 PyObject *res = tstate ? (PyObject *) (tstate->frame) : NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 release_lock(interpreter_lock);
147 return res;
148 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000150 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000151}
152
153void
Guido van Rossumb209a111997-04-29 18:18:01 +0000154PyEval_RestoreThread(x)
155 PyObject *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156{
Guido van Rossume59214e1994-08-30 08:01:59 +0000157#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158 if (interpreter_lock) {
159 int err;
160 err = errno;
161 acquire_lock(interpreter_lock, 1);
162 errno = err;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000163 PyThreadState_Swap(x ? ((PyFrameObject *)x)->f_tstate : NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164 }
165#endif
166}
167
168
Guido van Rossuma9672091994-09-14 13:31:22 +0000169/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
170 signal handlers or Mac I/O completion routines) can schedule calls
171 to a function to be called synchronously.
172 The synchronous function is called with one void* argument.
173 It should return 0 for success or -1 for failure -- failure should
174 be accompanied by an exception.
175
176 If registry succeeds, the registry function returns 0; if it fails
177 (e.g. due to too many pending calls) it returns -1 (without setting
178 an exception condition).
179
180 Note that because registry may occur from within signal handlers,
181 or other asynchronous events, calling malloc() is unsafe!
182
183#ifdef WITH_THREAD
184 Any thread can schedule pending calls, but only the main thread
185 will execute them.
186#endif
187
188 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
189 There are two possible race conditions:
190 (1) nested asynchronous registry calls;
191 (2) registry calls made while pending calls are being processed.
192 While (1) is very unlikely, (2) is a real possibility.
193 The current code is safe against (2), but not against (1).
194 The safety against (2) is derived from the fact that only one
195 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000196
Guido van Rossuma027efa1997-05-05 20:56:21 +0000197 XXX Darn! With the advent of thread state, we should have an array
198 of pending calls per thread in the thread state! Later...
199*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000200
Guido van Rossuma9672091994-09-14 13:31:22 +0000201#define NPENDINGCALLS 32
202static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000203 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000204 ANY *arg;
205} pendingcalls[NPENDINGCALLS];
206static volatile int pendingfirst = 0;
207static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000208static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000209
210int
211Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000212 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000213 ANY *arg;
214{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000215 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000216 int i, j;
217 /* XXX Begin critical section */
218 /* XXX If you want this to be safe against nested
219 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000220 if (busy)
221 return -1;
222 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000223 i = pendinglast;
224 j = (i + 1) % NPENDINGCALLS;
225 if (j == pendingfirst)
226 return -1; /* Queue full */
227 pendingcalls[i].func = func;
228 pendingcalls[i].arg = arg;
229 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000230 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000231 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000232 /* XXX End critical section */
233 return 0;
234}
235
Guido van Rossum180d7b41994-09-29 09:45:57 +0000236int
237Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000238{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000239 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000241 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000242 return 0;
243#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000244 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000245 return 0;
246 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000247 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 for (;;) {
249 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000250 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000251 ANY *arg;
252 i = pendingfirst;
253 if (i == pendinglast)
254 break; /* Queue empty */
255 func = pendingcalls[i].func;
256 arg = pendingcalls[i].arg;
257 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000258 if (func(arg) < 0) {
259 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000260 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000261 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000263 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000264 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000265 return 0;
266}
267
268
Guido van Rossum374a9221991-04-04 10:40:29 +0000269/* Status code for main loop (reason for stack unwind) */
270
271enum why_code {
272 WHY_NOT, /* No error */
273 WHY_EXCEPTION, /* Exception occurred */
274 WHY_RERAISE, /* Exception re-raised by 'finally' */
275 WHY_RETURN, /* 'return' statement */
276 WHY_BREAK /* 'break' statement */
277};
278
Guido van Rossumb209a111997-04-29 18:18:01 +0000279static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000280
Guido van Rossum374a9221991-04-04 10:40:29 +0000281
Guido van Rossum681d79a1995-07-18 14:51:37 +0000282/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000283
Guido van Rossumb209a111997-04-29 18:18:01 +0000284PyObject *
285PyEval_EvalCode(co, globals, locals)
286 PyCodeObject *co;
287 PyObject *globals;
288 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000289{
290 return eval_code2(co,
291 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000292 (PyObject **)NULL, 0,
293 (PyObject **)NULL, 0,
294 (PyObject **)NULL, 0,
295 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296}
297
298
299/* Interpreter main loop */
300
Guido van Rossum8861b741996-07-30 16:49:37 +0000301#ifndef MAX_RECURSION_DEPTH
302#define MAX_RECURSION_DEPTH 10000
303#endif
304
Guido van Rossumb209a111997-04-29 18:18:01 +0000305static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306eval_code2(co, globals, locals,
307 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000308 PyCodeObject *co;
309 PyObject *globals;
310 PyObject *locals;
311 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000312 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000313 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000314 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000315 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000317 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000318{
Guido van Rossum950361c1997-01-24 13:49:28 +0000319#ifdef DXPAIRS
320 int lastopcode = 0;
321#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000322 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000323 register int opcode = 0; /* Current opcode */
324 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000325 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000326 register enum why_code why; /* Reason for block stack unwind */
327 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000328 register PyObject *x; /* Result object -- NULL if error */
329 register PyObject *v; /* Temporary objects popped off stack */
330 register PyObject *w;
331 register PyObject *u;
332 register PyObject *t;
333 register PyFrameObject *f; /* Current frame */
334 register PyObject **fastlocals = NULL;
335 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000336 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000337#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000338 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000339#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000340#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000341 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000342 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000343#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000344
345/* Code access macros */
346
347#define GETCONST(i) Getconst(f, i)
348#define GETNAME(i) Getname(f, i)
349#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000350#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000351#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
352#define NEXTOP() (*next_instr++)
353#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
354#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
355#define JUMPBY(x) (next_instr += (x))
356
357/* Stack manipulation macros */
358
359#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
360#define EMPTY() (STACK_LEVEL() == 0)
361#define TOP() (stack_pointer[-1])
362#define BASIC_PUSH(v) (*stack_pointer++ = (v))
363#define BASIC_POP() (*--stack_pointer)
364
Guido van Rossum96a42c81992-01-12 02:29:51 +0000365#ifdef LLTRACE
366#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
367#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000368#else
369#define PUSH(v) BASIC_PUSH(v)
370#define POP() BASIC_POP()
371#endif
372
Guido van Rossum681d79a1995-07-18 14:51:37 +0000373/* Local variable macros */
374
375#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000376#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000377 GETLOCAL(i) = value; } while (0)
378
Guido van Rossuma027efa1997-05-05 20:56:21 +0000379/* Start of code */
380
381 if (tstate == NULL)
382 Py_FatalError("eval_code2 called without a current thread");
383
Guido van Rossum8861b741996-07-30 16:49:37 +0000384#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000385 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000386 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000387 return NULL;
388 }
389#endif
390
Guido van Rossum681d79a1995-07-18 14:51:37 +0000391 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000392 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000393 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000394 }
395
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000396#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000397 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000398#endif
399
Guido van Rossumb209a111997-04-29 18:18:01 +0000400 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000401 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000402 co, /*code*/
403 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000404 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000405 if (f == NULL)
406 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407
Guido van Rossuma027efa1997-05-05 20:56:21 +0000408 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000409 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000410
411 if (co->co_argcount > 0 ||
412 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
413 int i;
414 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000415 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000416 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000417 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000418 if (kwdict == NULL)
419 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000420 i = co->co_argcount;
421 if (co->co_flags & CO_VARARGS)
422 i++;
423 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424 }
425 if (argcount > co->co_argcount) {
426 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000427 PyErr_SetString(PyExc_TypeError,
428 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000429 goto fail;
430 }
431 n = co->co_argcount;
432 }
433 for (i = 0; i < n; i++) {
434 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000435 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 SETLOCAL(i, x);
437 }
438 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000439 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000440 if (u == NULL)
441 goto fail;
442 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443 for (i = n; i < argcount; i++) {
444 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 Py_INCREF(x);
446 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 }
449 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000450 PyObject *keyword = kws[2*i];
451 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000452 int j;
453 /* XXX slow -- speed up using dictionary? */
454 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000455 PyObject *nm = PyTuple_GET_ITEM(
456 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000457 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000458 break;
459 }
460 if (j >= co->co_argcount) {
461 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000462 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000463 "unexpected keyword argument: %.400s",
464 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000465 goto fail;
466 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000467 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 }
469 else {
470 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000471 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000472 "keyword parameter redefined");
473 goto fail;
474 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 SETLOCAL(j, value);
477 }
478 }
479 if (argcount < co->co_argcount) {
480 int m = co->co_argcount - defcount;
481 for (i = argcount; i < m; i++) {
482 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 "not enough arguments");
485 goto fail;
486 }
487 }
488 if (n > m)
489 i = n - m;
490 else
491 i = 0;
492 for (; i < defcount; i++) {
493 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000494 PyObject *def = defs[i];
495 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 SETLOCAL(m+i, def);
497 }
498 }
499 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 }
501 else {
502 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000503 PyErr_SetString(PyExc_TypeError,
504 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000505 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 }
507 }
508
Guido van Rossuma027efa1997-05-05 20:56:21 +0000509 if (tstate->sys_tracefunc != NULL) {
510 /* tstate->sys_tracefunc, if defined, is a function that
511 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000512 Its return value, if not None, is a function that
513 will be called at the start of each executed line
514 of code. (Actually, the function must return
515 itself in order to continue tracing.)
516 The trace functions are called with three arguments:
517 a pointer to the current frame, a string indicating
518 why the function is called, and an argument which
519 depends on the situation. The global trace function
520 (sys.trace) is also called whenever an exception
521 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000522 if (call_trace(&tstate->sys_tracefunc,
523 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000524 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000525 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000526 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000528 }
529
Guido van Rossuma027efa1997-05-05 20:56:21 +0000530 if (tstate->sys_profilefunc != NULL) {
531 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000532 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000533 if (call_trace(&tstate->sys_profilefunc,
534 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000535 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000536 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000537 }
538 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000539
Guido van Rossuma027efa1997-05-05 20:56:21 +0000540 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
541 --tstate->recursion_depth;
542 PyErr_SetString(PyExc_RuntimeError,
543 "Maximum recursion depth exceeded");
544 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000545 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000546 return NULL;
547 }
548
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000549 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000550 stack_pointer = f->f_valuestack;
551
Guido van Rossum374a9221991-04-04 10:40:29 +0000552 why = WHY_NOT;
553 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000554 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000555
556 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557 /* Do periodic things. Doing this every time through
558 the loop would add too much overhead, so we do it
559 only every Nth instruction. We also do it if
560 ``things_to_do'' is set, i.e. when an asynchronous
561 event needs attention (e.g. a signal handler or
562 async I/O handler); see Py_AddPendingCall() and
563 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000564
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565 if (things_to_do || --tstate->ticker < 0) {
566 tstate->ticker = tstate->sys_checkinterval;
567 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 if (Py_MakePendingCalls() < 0) {
569 why = WHY_EXCEPTION;
570 goto on_error;
571 }
572 }
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573#if !defined(HAVE_SIGNAL_H) && !defined(macintosh)
574 /* If we have true signals, the signal handler
575 will call Py_AddPendingCall() so we don't
576 have to call sigcheck(). On the Mac and
577 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000578 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000579 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000580 goto on_error;
581 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000582#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000583
Guido van Rossume59214e1994-08-30 08:01:59 +0000584#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585 if (interpreter_lock) {
586 /* Give another thread a chance */
587
Guido van Rossuma027efa1997-05-05 20:56:21 +0000588 PyThreadState *tstate =
589 PyThreadState_Swap(NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000590 release_lock(interpreter_lock);
591
592 /* Other threads may run now */
593
594 acquire_lock(interpreter_lock, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000595 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000596 }
597#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000598 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000599
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000601
Guido van Rossum408027e1996-12-30 16:17:54 +0000602#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000603 f->f_lasti = INSTR_OFFSET();
604#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000605
606 opcode = NEXTOP();
607 if (HAS_ARG(opcode))
608 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000609#ifdef DYNAMIC_EXECUTION_PROFILE
610#ifdef DXPAIRS
611 dxpairs[lastopcode][opcode]++;
612 lastopcode = opcode;
613#endif
614 dxp[opcode]++;
615#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000616
Guido van Rossum96a42c81992-01-12 02:29:51 +0000617#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 /* Instruction tracing */
619
Guido van Rossum96a42c81992-01-12 02:29:51 +0000620 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000621 if (HAS_ARG(opcode)) {
622 printf("%d: %d, %d\n",
623 (int) (INSTR_OFFSET() - 3),
624 opcode, oparg);
625 }
626 else {
627 printf("%d: %d\n",
628 (int) (INSTR_OFFSET() - 1), opcode);
629 }
630 }
631#endif
632
633 /* Main switch on opcode */
634
635 switch (opcode) {
636
637 /* BEWARE!
638 It is essential that any operation that fails sets either
639 x to NULL, err to nonzero, or why to anything but WHY_NOT,
640 and that no operation that succeeds does this! */
641
642 /* case STOP_CODE: this is an error! */
643
644 case POP_TOP:
645 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000646 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000647 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000648
649 case ROT_TWO:
650 v = POP();
651 w = POP();
652 PUSH(v);
653 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000654 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000655
656 case ROT_THREE:
657 v = POP();
658 w = POP();
659 x = POP();
660 PUSH(v);
661 PUSH(x);
662 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000663 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000664
665 case DUP_TOP:
666 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000667 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000668 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000669 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000670
671 case UNARY_POSITIVE:
672 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000673 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000674 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000675 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_NEGATIVE:
680 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000681 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000682 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 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;
686
687 case UNARY_NOT:
688 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000689 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000690 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000691 if (err == 0) {
692 Py_INCREF(Py_True);
693 PUSH(Py_True);
694 continue;
695 }
696 else if (err > 0) {
697 Py_INCREF(Py_False);
698 PUSH(Py_False);
699 err = 0;
700 continue;
701 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 break;
703
704 case UNARY_CONVERT:
705 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000706 x = PyObject_Repr(v);
707 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000708 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000709 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000711
712 case UNARY_INVERT:
713 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000714 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000715 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000716 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000717 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000718 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000719
Guido van Rossum50564e81996-01-12 01:13:16 +0000720 case BINARY_POWER:
721 w = POP();
722 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000723 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000724 Py_DECREF(v);
725 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000726 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000728 break;
729
Guido van Rossum374a9221991-04-04 10:40:29 +0000730 case BINARY_MULTIPLY:
731 w = POP();
732 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000733 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000734 Py_DECREF(v);
735 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000736 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000737 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 break;
739
740 case BINARY_DIVIDE:
741 w = POP();
742 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000743 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000744 Py_DECREF(v);
745 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000747 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000748 break;
749
750 case BINARY_MODULO:
751 w = POP();
752 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000753 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000754 Py_DECREF(v);
755 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000757 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 break;
759
760 case BINARY_ADD:
761 w = POP();
762 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000763 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000764 Py_DECREF(v);
765 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000767 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 break;
769
770 case BINARY_SUBTRACT:
771 w = POP();
772 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000773 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000774 Py_DECREF(v);
775 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000776 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000777 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 break;
779
780 case BINARY_SUBSCR:
781 w = POP();
782 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000783 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000784 Py_DECREF(v);
785 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000786 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000787 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 break;
789
Guido van Rossum7928cd71991-10-24 14:59:31 +0000790 case BINARY_LSHIFT:
791 w = POP();
792 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000793 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000794 Py_DECREF(v);
795 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000796 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000797 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000798 break;
799
800 case BINARY_RSHIFT:
801 w = POP();
802 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000803 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000804 Py_DECREF(v);
805 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000806 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000807 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000808 break;
809
810 case BINARY_AND:
811 w = POP();
812 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000813 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000814 Py_DECREF(v);
815 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000816 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000817 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000818 break;
819
820 case BINARY_XOR:
821 w = POP();
822 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000823 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000824 Py_DECREF(v);
825 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000826 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000827 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000828 break;
829
830 case BINARY_OR:
831 w = POP();
832 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000833 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000834 Py_DECREF(v);
835 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000836 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000837 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000838 break;
839
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 case SLICE+0:
841 case SLICE+1:
842 case SLICE+2:
843 case SLICE+3:
844 if ((opcode-SLICE) & 2)
845 w = POP();
846 else
847 w = NULL;
848 if ((opcode-SLICE) & 1)
849 v = POP();
850 else
851 v = NULL;
852 u = POP();
853 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000854 Py_DECREF(u);
855 Py_XDECREF(v);
856 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000858 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 break;
860
861 case STORE_SLICE+0:
862 case STORE_SLICE+1:
863 case STORE_SLICE+2:
864 case STORE_SLICE+3:
865 if ((opcode-STORE_SLICE) & 2)
866 w = POP();
867 else
868 w = NULL;
869 if ((opcode-STORE_SLICE) & 1)
870 v = POP();
871 else
872 v = NULL;
873 u = POP();
874 t = POP();
875 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000876 Py_DECREF(t);
877 Py_DECREF(u);
878 Py_XDECREF(v);
879 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 break;
882
883 case DELETE_SLICE+0:
884 case DELETE_SLICE+1:
885 case DELETE_SLICE+2:
886 case DELETE_SLICE+3:
887 if ((opcode-DELETE_SLICE) & 2)
888 w = POP();
889 else
890 w = NULL;
891 if ((opcode-DELETE_SLICE) & 1)
892 v = POP();
893 else
894 v = NULL;
895 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000896 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000897 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(u);
899 Py_XDECREF(v);
900 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 break;
903
904 case STORE_SUBSCR:
905 w = POP();
906 v = POP();
907 u = POP();
908 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000909 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000910 Py_DECREF(u);
911 Py_DECREF(v);
912 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000913 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
915
916 case DELETE_SUBSCR:
917 w = POP();
918 v = POP();
919 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000920 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000921 Py_DECREF(v);
922 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000923 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 break;
925
926 case PRINT_EXPR:
927 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000929 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +0000930 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000931 (err = PyDict_SetItemString(
932 f->f_builtins, "_", v)) == 0 &&
Guido van Rossumb209a111997-04-29 18:18:01 +0000933 !Py_SuppressPrintingFlag) {
934 Py_FlushLine();
935 x = PySys_GetObject("stdout");
936 err = PyFile_WriteObject(v, x, 0);
937 PyFile_SoftSpace(x, 1);
938 Py_FlushLine();
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000940 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 break;
942
943 case PRINT_ITEM:
944 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 w = PySys_GetObject("stdout");
946 if (PyFile_SoftSpace(w, 1))
947 PyFile_WriteString(" ", w);
948 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
949 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +0000950 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +0000951 char *s = PyString_AsString(v);
952 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000953 if (len > 0 &&
954 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000955 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +0000956 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000958 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000959 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000960 break;
961
962 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +0000963 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000964 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000965 PyErr_SetString(PyExc_RuntimeError,
966 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000967 else {
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 PyFile_WriteString("\n", x);
969 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000970 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 break;
972
973 case BREAK_LOOP:
974 why = WHY_BREAK;
975 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000976
Guido van Rossumf10570b1995-07-07 22:53:21 +0000977 case RAISE_VARARGS:
978 u = v = w = NULL;
979 switch (oparg) {
980 case 3:
981 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000982 /* Fallthrough */
983 case 2:
984 v = POP(); /* value */
985 /* Fallthrough */
986 case 1:
987 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000988 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000989 break;
990 default:
Guido van Rossumb209a111997-04-29 18:18:01 +0000991 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000992 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000993 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000994 break;
995 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 break;
997
998 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000999 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001000 PyErr_SetString(PyExc_SystemError,
1001 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001002 break;
1003 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001005 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 break;
1007
1008 case RETURN_VALUE:
1009 retval = POP();
1010 why = WHY_RETURN;
1011 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001012
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001013 case EXEC_STMT:
1014 w = POP();
1015 v = POP();
1016 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001017 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001018 Py_DECREF(u);
1019 Py_DECREF(v);
1020 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001021 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001022
Guido van Rossum374a9221991-04-04 10:40:29 +00001023 case POP_BLOCK:
1024 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001026 while (STACK_LEVEL() > b->b_level) {
1027 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001028 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 }
1030 }
1031 break;
1032
1033 case END_FINALLY:
1034 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 if (PyInt_Check(v)) {
1036 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 if (why == WHY_RETURN)
1038 retval = POP();
1039 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001040 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001042 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001043 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001044 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001045 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001046 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 else if (v != Py_None) {
1048 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001049 "'finally' pops bad exception");
1050 why = WHY_EXCEPTION;
1051 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001052 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 break;
1054
1055 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001056 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001057 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001058 w = POP();
1059 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001061 Py_DECREF(u);
1062 Py_DECREF(v);
1063 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 break;
1065
1066 case STORE_NAME:
1067 w = GETNAMEV(oparg);
1068 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001069 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001070 PyErr_SetString(PyExc_SystemError,
1071 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001072 break;
1073 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001074 err = PyDict_SetItem(x, w, v);
1075 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 break;
1077
1078 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001079 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001080 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001081 PyErr_SetString(PyExc_SystemError,
1082 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001083 break;
1084 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001085 if ((err = PyDict_DelItem(x, w)) != 0)
1086 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001088
1089#ifdef CASE_TOO_BIG
1090 default: switch (opcode) {
1091#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001092
1093 case UNPACK_TUPLE:
1094 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001095 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001096 PyErr_SetString(PyExc_TypeError,
1097 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 why = WHY_EXCEPTION;
1099 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001100 else if (PyTuple_Size(v) != oparg) {
1101 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001102 "unpack tuple of wrong size");
1103 why = WHY_EXCEPTION;
1104 }
1105 else {
1106 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001107 w = PyTuple_GET_ITEM(v, oparg);
1108 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 PUSH(w);
1110 }
1111 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001112 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 break;
1114
1115 case UNPACK_LIST:
1116 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001117 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001118 PyErr_SetString(PyExc_TypeError,
1119 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 why = WHY_EXCEPTION;
1121 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001122 else if (PyList_Size(v) != oparg) {
1123 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 "unpack list of wrong size");
1125 why = WHY_EXCEPTION;
1126 }
1127 else {
1128 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001129 w = PyList_GetItem(v, oparg);
1130 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 PUSH(w);
1132 }
1133 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001134 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 break;
1136
1137 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001138 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 v = POP();
1140 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001141 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1142 Py_DECREF(v);
1143 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 break;
1145
1146 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001147 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001149 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1150 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001151 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 break;
1153
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001154 case STORE_GLOBAL:
1155 w = GETNAMEV(oparg);
1156 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001157 err = PyDict_SetItem(f->f_globals, w, v);
1158 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001159 break;
1160
1161 case DELETE_GLOBAL:
1162 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001163 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1164 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001165 break;
1166
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 case LOAD_CONST:
1168 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001169 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001170 PUSH(x);
1171 break;
1172
1173 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001174 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001175 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001176 PyErr_SetString(PyExc_SystemError,
1177 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001178 break;
1179 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001180 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001182 PyErr_Clear();
1183 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001185 PyErr_Clear();
1186 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001187 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001188 PyErr_SetObject(
1189 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 break;
1191 }
1192 }
1193 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001194 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 PUSH(x);
1196 break;
1197
1198 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001199 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001200 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001202 PyErr_Clear();
1203 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001205 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 break;
1207 }
1208 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001209 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 PUSH(x);
1211 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001212
Guido van Rossum9bfef441993-03-29 10:43:31 +00001213 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001214 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001215 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 PyErr_SetObject(PyExc_NameError,
1217 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001218 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001219 break;
1220 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001221 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001222 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001223 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001224 break;
1225
1226 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001227 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001228 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001229 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001230
1231 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001232 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001233 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001234
1235 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001236 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001237 if (x != NULL) {
1238 for (; --oparg >= 0;) {
1239 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001240 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001241 }
1242 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001243 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 }
1245 break;
1246
1247 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 if (x != NULL) {
1250 for (; --oparg >= 0;) {
1251 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001252 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 if (err != 0)
1254 break;
1255 }
1256 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001257 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 }
1259 break;
1260
1261 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001264 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 break;
1266
1267 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001268 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001270 x = PyObject_GetAttr(v, w);
1271 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001273 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 break;
1275
1276 case COMPARE_OP:
1277 w = POP();
1278 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001279 x = cmp_outcome(oparg, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 Py_DECREF(v);
1281 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +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_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001287 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001289 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001291 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292 break;
1293 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 if (PyCFunction_Check(x)) {
1295 u = Py_None;
1296 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001297 }
1298 else {
1299 u = find_from_args(f, INSTR_OFFSET());
1300 if (u == NULL) {
1301 x = u;
1302 break;
1303 }
1304 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 w,
1307 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001308 f->f_locals == NULL ?
1309 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001310 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001311 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312 if (w == NULL) {
1313 x = NULL;
1314 break;
1315 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 x = PyEval_CallObject(x, w);
1317 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001318 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001319 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 break;
1321
1322 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001323 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001325 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001326 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001327 PyErr_SetString(PyExc_SystemError,
1328 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001329 break;
1330 }
1331 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001333 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001335
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 case JUMP_FORWARD:
1337 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001338 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001339
1340 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001341 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001342 if (err > 0)
1343 err = 0;
1344 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001346 else
1347 break;
1348 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349
1350 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001351 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001352 if (err > 0) {
1353 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001355 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001356 else if (err == 0)
1357 ;
1358 else
1359 break;
1360 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001361
1362 case JUMP_ABSOLUTE:
1363 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001364 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365
1366 case FOR_LOOP:
1367 /* for v in s: ...
1368 On entry: stack contains s, i.
1369 On exit: stack contains s, i+1, s[i];
1370 but if loop exhausted:
1371 s, i are popped, and we jump */
1372 w = POP(); /* Loop index */
1373 v = POP(); /* Sequence object */
1374 u = loop_subscript(v, w);
1375 if (u != NULL) {
1376 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001381 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 }
1383 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001384 Py_DECREF(v);
1385 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001386 /* A NULL can mean "s exhausted"
1387 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001388 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001390 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001392 continue;
1393 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001394 }
1395 break;
1396
1397 case SETUP_LOOP:
1398 case SETUP_EXCEPT:
1399 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001400 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001402 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001403
1404 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001405#ifdef LLTRACE
1406 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001408#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001409 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001410 if (f->f_trace == NULL)
1411 continue;
1412 /* Trace each line of code reached */
1413 f->f_lasti = INSTR_OFFSET();
1414 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001415 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001417
1418 case CALL_FUNCTION:
1419 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001420 int na = oparg & 0xff;
1421 int nk = (oparg>>8) & 0xff;
1422 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001423 PyObject **pfunc = stack_pointer - n - 1;
1424 PyObject *func = *pfunc;
1425 PyObject *self = NULL;
1426 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 if (PyMethod_Check(func)) {
1429 self = PyMethod_Self(func);
1430 class = PyMethod_Class(func);
1431 func = PyMethod_Function(func);
1432 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001433 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001434 Py_INCREF(self);
1435 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001436 *pfunc = self;
1437 na++;
1438 n++;
1439 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 else {
1441 /* Unbound methods must be
1442 called with an instance of
1443 the class (or a derived
1444 class) as first argument */
1445 if (na > 0 &&
1446 (self = stack_pointer[-n])
1447 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001448 PyInstance_Check(self) &&
1449 PyClass_IsSubclass(
1450 (PyObject *)
1451 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001452 ->in_class),
1453 class))
1454 /* Handy-dandy */ ;
1455 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001456 PyErr_SetString(
1457 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001458 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001459 x = NULL;
1460 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001461 }
1462 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001463 }
1464 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 Py_INCREF(func);
1466 if (PyFunction_Check(func)) {
1467 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001468 PyObject *globals =
1469 PyFunction_GetGlobals(func);
1470 PyObject *argdefs =
1471 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001472 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001473 int nd;
1474 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001475 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001476 nd = ((PyTupleObject *)argdefs) ->
1477 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001478 }
1479 else {
1480 d = NULL;
1481 nd = 0;
1482 }
1483 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001484 (PyCodeObject *)co,
1485 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001486 stack_pointer-n, na,
1487 stack_pointer-2*nk, nk,
1488 d, nd,
1489 class);
1490 }
1491 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 PyObject *args = PyTuple_New(na);
1493 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001494 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001495 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001496 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001497 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001498 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001500 if (kwdict == NULL) {
1501 x = NULL;
1502 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001503 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001504 err = 0;
1505 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001506 PyObject *value = POP();
1507 PyObject *key = POP();
1508 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001509 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 Py_DECREF(key);
1511 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001512 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001513 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001514 }
1515 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001516 Py_DECREF(args);
1517 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001518 break;
1519 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001520 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001521 while (--na >= 0) {
1522 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001524 }
1525 x = PyEval_CallObjectWithKeywords(
1526 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 Py_DECREF(args);
1528 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001529 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001531 while (stack_pointer > pfunc) {
1532 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001534 }
1535 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001536 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001537 break;
1538 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001539
Guido van Rossum681d79a1995-07-18 14:51:37 +00001540 case MAKE_FUNCTION:
1541 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 x = PyFunction_New(v, f->f_globals);
1543 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001544 /* XXX Maybe this should be a separate opcode? */
1545 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001547 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001549 x = NULL;
1550 break;
1551 }
1552 while (--oparg >= 0) {
1553 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 }
1556 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001558 }
1559 PUSH(x);
1560 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001561
1562 case BUILD_SLICE:
1563 if (oparg == 3)
1564 w = POP();
1565 else
1566 w = NULL;
1567 v = POP();
1568 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001569 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 Py_DECREF(u);
1571 Py_DECREF(v);
1572 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001573 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001574 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001575 break;
1576
1577
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 default:
1579 fprintf(stderr,
1580 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001581 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001582 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 why = WHY_EXCEPTION;
1584 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001585
1586#ifdef CASE_TOO_BIG
1587 }
1588#endif
1589
Guido van Rossum374a9221991-04-04 10:40:29 +00001590 } /* switch */
1591
1592 on_error:
1593
1594 /* Quickly continue if no error occurred */
1595
1596 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001597 if (err == 0 && x != NULL) {
1598#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 fprintf(stderr,
1601 "XXX undetected error\n");
1602 else
1603#endif
1604 continue; /* Normal, fast path */
1605 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001606 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001608 err = 0;
1609 }
1610
Guido van Rossum801dcae1992-04-08 11:32:32 +00001611#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001612 /* Double-check exception status */
1613
1614 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001615 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001616 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001617 PyErr_SetString(PyExc_SystemError,
1618 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 why = WHY_EXCEPTION;
1620 }
1621 }
1622 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001623 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001624 fprintf(stderr,
1625 "XXX undetected error (why=%d)\n",
1626 why);
1627 why = WHY_EXCEPTION;
1628 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001629 }
1630#endif
1631
1632 /* Log traceback info if this is a real exception */
1633
1634 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001635 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001636 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001637 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001639
Guido van Rossume59214e1994-08-30 08:01:59 +00001640 if (f->f_trace)
1641 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001642 if (tstate->sys_profilefunc)
1643 call_exc_trace(&tstate->sys_profilefunc,
1644 (PyObject**)0, f);
1645}
Guido van Rossum374a9221991-04-04 10:40:29 +00001646
1647 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1648
1649 if (why == WHY_RERAISE)
1650 why = WHY_EXCEPTION;
1651
1652 /* Unwind stacks if a (pseudo) exception occurred */
1653
1654 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 while (STACK_LEVEL() > b->b_level) {
1657 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 }
1660 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1661 why = WHY_NOT;
1662 JUMPTO(b->b_handler);
1663 break;
1664 }
1665 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001666 (b->b_type == SETUP_EXCEPT &&
1667 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 PyObject *exc, *val, *tb;
1670 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001671 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 val = Py_None;
1673 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 /* Make the raw exception data
1676 available to the handler,
1677 so a program can emulate the
1678 Python main loop. Don't do
1679 this for 'finally'. */
1680 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001681 set_exc_info(tstate,
1682 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001684 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 PUSH(val);
1686 PUSH(exc);
1687 }
1688 else {
1689 if (why == WHY_RETURN)
1690 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 PUSH(v);
1693 }
1694 why = WHY_NOT;
1695 JUMPTO(b->b_handler);
1696 break;
1697 }
1698 } /* unwind stack */
1699
1700 /* End the loop if we still have an error (or return) */
1701
1702 if (why != WHY_NOT)
1703 break;
1704
1705 } /* main loop */
1706
1707 /* Pop remaining stack entries */
1708
1709 while (!EMPTY()) {
1710 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001711 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 }
1713
Guido van Rossum96a42c81992-01-12 02:29:51 +00001714 if (why != WHY_RETURN)
1715 retval = NULL;
1716
Guido van Rossume59214e1994-08-30 08:01:59 +00001717 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001718 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001719 if (call_trace(&f->f_trace, &f->f_trace, f,
1720 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001722 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001723 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001724 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001725 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001726 }
1727
Guido van Rossuma027efa1997-05-05 20:56:21 +00001728 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1729 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001730 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001731 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001732 retval = NULL;
1733 why = WHY_EXCEPTION;
1734 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001735 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001736
Guido van Rossuma027efa1997-05-05 20:56:21 +00001737 reset_exc_info(tstate);
1738
1739 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001740
1741 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001742
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001744
Guido van Rossuma027efa1997-05-05 20:56:21 +00001745 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001747
Guido van Rossum96a42c81992-01-12 02:29:51 +00001748 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001749}
1750
Guido van Rossuma027efa1997-05-05 20:56:21 +00001751static void
1752set_exc_info(tstate, type, value, tb)
1753 PyThreadState *tstate;
1754 PyObject *type;
1755 PyObject *value;
1756 PyObject *tb;
1757{
1758 PyFrameObject *frame;
1759 frame = tstate->frame;
1760 if (frame->f_exc_type == NULL) {
1761 /* This frame didn't catch an exception before */
1762 /* Save previous exception of this thread in this frame */
1763 Py_XDECREF(frame->f_exc_type);
1764 Py_XDECREF(frame->f_exc_value);
1765 Py_XDECREF(frame->f_exc_traceback);
1766 if (tstate->exc_type == NULL) {
1767 Py_INCREF(Py_None);
1768 tstate->exc_type = Py_None;
1769 }
1770 Py_XINCREF(tstate->exc_type);
1771 Py_XINCREF(tstate->exc_value);
1772 Py_XINCREF(tstate->exc_traceback);
1773 frame->f_exc_type = tstate->exc_type;
1774 frame->f_exc_value = tstate->exc_value;
1775 frame->f_exc_traceback = tstate->exc_traceback;
1776 }
1777 /* Set new exception for this thread */
1778 Py_XINCREF(type);
1779 Py_XINCREF(value);
1780 Py_XINCREF(tb);
1781 tstate->exc_type = type;
1782 tstate->exc_value = value;
1783 tstate->exc_traceback = tb;
1784 /* For b/w compatibility */
1785 PySys_SetObject("exc_type", type);
1786 PySys_SetObject("exc_value", value);
1787 PySys_SetObject("exc_traceback", tb);
1788}
1789
1790static void
1791reset_exc_info(tstate)
1792 PyThreadState *tstate;
1793{
1794 PyFrameObject *frame;
1795 frame = tstate->frame;
1796 if (frame->f_exc_type != NULL) {
1797 /* This frame caught an exception */
1798 Py_XDECREF(tstate->exc_type);
1799 Py_XDECREF(tstate->exc_value);
1800 Py_XDECREF(tstate->exc_traceback);
1801 Py_XINCREF(frame->f_exc_type);
1802 Py_XINCREF(frame->f_exc_value);
1803 Py_XINCREF(frame->f_exc_traceback);
1804 tstate->exc_type = frame->f_exc_type;
1805 tstate->exc_value = frame->f_exc_value;
1806 tstate->exc_traceback = frame->f_exc_traceback;
1807 /* For b/w compatibility */
1808 PySys_SetObject("exc_type", frame->f_exc_type);
1809 PySys_SetObject("exc_value", frame->f_exc_value);
1810 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1811 }
1812 Py_XDECREF(frame->f_exc_type);
1813 Py_XDECREF(frame->f_exc_value);
1814 Py_XDECREF(frame->f_exc_traceback);
1815 frame->f_exc_type = NULL;
1816 frame->f_exc_value = NULL;
1817 frame->f_exc_traceback = NULL;
1818}
1819
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001820/* Logic for the raise statement (too complicated for inlining).
1821 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001822static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001823do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001825{
1826 /* We support the following forms of raise:
1827 raise <class>, <classinstance>
1828 raise <class>, <argument tuple>
1829 raise <class>, None
1830 raise <class>, <argument>
1831 raise <classinstance>, None
1832 raise <string>, <object>
1833 raise <string>, None
1834
1835 An omitted second argument is the same as None.
1836
1837 In addition, raise <tuple>, <anything> is the same as
1838 raising the tuple's first item (and it better have one!);
1839 this rule is applied recursively.
1840
1841 Finally, an optional third argument can be supplied, which
1842 gives the traceback to be substituted (useful when
1843 re-raising an exception after examining it). */
1844
1845 /* First, check the traceback argument, replacing None with
1846 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 if (tb == Py_None) {
1848 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001849 tb = NULL;
1850 }
1851 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001853 "raise 3rd arg must be traceback or None");
1854 goto raise_error;
1855 }
1856
1857 /* Next, replace a missing value with None */
1858 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 value = Py_None;
1860 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001861 }
1862
1863 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001864 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1865 PyObject *tmp = type;
1866 type = PyTuple_GET_ITEM(type, 0);
1867 Py_INCREF(type);
1868 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001869 }
1870
1871 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001872 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001873 ;
1874 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001875 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001876 /* Raising a class. If the value is an instance, it
1877 better be an instance of the class. If it is not,
1878 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001879 if (PyInstance_Check(value)) {
1880 PyObject *inclass = (PyObject*)
1881 (((PyInstanceObject*)value)->in_class);
1882 if (!PyClass_IsSubclass(inclass, type)) {
1883 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001884 "raise <class>, <instance> requires that <instance> is a member of <class>");
1885 goto raise_error;
1886 }
1887 }
1888 else {
1889 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00001890 PyObject *args, *res;
1891 if (value == Py_None)
1892 args = Py_BuildValue("()");
1893 else if (PyTuple_Check(value)) {
1894 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001895 args = value;
1896 }
1897 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001898 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001899 if (args == NULL)
1900 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001901 res = PyEval_CallObject(type, args);
1902 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001903 if (res == NULL)
1904 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001905 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001906 value = res;
1907 }
1908 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001909 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001910 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001911 if (value != Py_None) {
1912 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001913 "instance exception may not have a separate value");
1914 goto raise_error;
1915 }
1916 else {
1917 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00001918 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001919 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00001920 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
1921 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001922 }
1923 }
1924 else {
1925 /* Not something you can raise. You get an exception
1926 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00001927 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001928 "exceptions must be strings, classes, or instances");
1929 goto raise_error;
1930 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001931 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001932 if (tb == NULL)
1933 return WHY_EXCEPTION;
1934 else
1935 return WHY_RERAISE;
1936 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00001937 Py_XDECREF(value);
1938 Py_XDECREF(type);
1939 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001940 return WHY_EXCEPTION;
1941}
1942
Guido van Rossum96a42c81992-01-12 02:29:51 +00001943#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001944static int
1945prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00001946 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001947 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001948{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001949 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00001950 if (PyObject_Print(v, stdout, 0) != 0)
1951 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001954#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001956static void
1957call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00001958 PyObject **p_trace, **p_newtrace;
1959 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001960{
Guido van Rossumb209a111997-04-29 18:18:01 +00001961 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001962 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00001963 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001964 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001965 value = Py_None;
1966 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001967 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001968 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001970 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001971 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001972 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001973 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001974 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00001976 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001977 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001978 Py_XDECREF(type);
1979 Py_XDECREF(value);
1980 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001981 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001982}
1983
1984static int
1985call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001987 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001989 may point to NULL variable;
1990 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001992 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00001993 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001994{
Guido van Rossuma027efa1997-05-05 20:56:21 +00001995 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 PyObject *args, *what;
1997 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001998
Guido van Rossuma027efa1997-05-05 20:56:21 +00001999 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002000 /* Don't do recursive traces */
2001 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002002 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002003 *p_newtrace = NULL;
2004 }
2005 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002006 }
2007
Guido van Rossumb209a111997-04-29 18:18:01 +00002008 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002009 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002010 goto Py_Cleanup;
2011 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002012 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 goto Py_Cleanup;
2014 Py_INCREF(f);
2015 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2016 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002017 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 arg = Py_None;
2019 Py_INCREF(arg);
2020 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002021 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 PyFrame_FastToLocals(f);
2023 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2024 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002025 tstate->tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00002026 Py_Cleanup:
2027 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002028 if (res == NULL) {
2029 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 PyTraceBack_Here(f);
2031 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002032 *p_trace = NULL;
2033 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002035 *p_newtrace = NULL;
2036 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002037 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002038 }
2039 else {
2040 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002041 Py_XDECREF(*p_newtrace);
2042 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002043 *p_newtrace = NULL;
2044 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002046 *p_newtrace = res;
2047 }
2048 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002050 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002051 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002052}
2053
Guido van Rossumb209a111997-04-29 18:18:01 +00002054PyObject *
2055PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002056{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002057 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002058 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00002060 else
2061 return current_frame->f_builtins;
2062}
2063
Guido van Rossumb209a111997-04-29 18:18:01 +00002064PyObject *
2065PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002066{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002067 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002068 if (current_frame == NULL)
2069 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002071 return current_frame->f_locals;
2072}
2073
Guido van Rossumb209a111997-04-29 18:18:01 +00002074PyObject *
2075PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002077 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002078 if (current_frame == NULL)
2079 return NULL;
2080 else
2081 return current_frame->f_globals;
2082}
2083
Guido van Rossumb209a111997-04-29 18:18:01 +00002084PyObject *
2085PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002086{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002087 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002088 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002089}
2090
Guido van Rossum6135a871995-01-09 17:53:26 +00002091int
Guido van Rossumb209a111997-04-29 18:18:01 +00002092PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002093{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002094 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002095 return current_frame == NULL ? 0 : current_frame->f_restricted;
2096}
2097
Guido van Rossum3f5da241990-12-20 15:06:42 +00002098void
Guido van Rossumb209a111997-04-29 18:18:01 +00002099Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100{
Guido van Rossumb209a111997-04-29 18:18:01 +00002101 PyObject *f = PySys_GetObject("stdout");
2102 if (PyFile_SoftSpace(f, 0))
2103 PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104}
2105
Guido van Rossum3f5da241990-12-20 15:06:42 +00002106
Guido van Rossum681d79a1995-07-18 14:51:37 +00002107/* External interface to call any callable object.
2108 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002109
Guido van Rossumb209a111997-04-29 18:18:01 +00002110PyObject *
2111PyEval_CallObject(func, arg)
2112 PyObject *func;
2113 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002114{
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002116}
Guido van Rossume59214e1994-08-30 08:01:59 +00002117
Guido van Rossumb209a111997-04-29 18:18:01 +00002118PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002119PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 PyObject *func;
2121 PyObject *arg;
2122 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002123{
2124 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002126
2127 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 arg = PyTuple_New(0);
2129 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002130 PyErr_SetString(PyExc_TypeError,
2131 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002132 return NULL;
2133 }
2134 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002136
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002138 PyErr_SetString(PyExc_TypeError,
2139 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002140 return NULL;
2141 }
2142
Guido van Rossum150b2df1996-12-05 23:17:11 +00002143 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002144 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002146 result = call_function(func, arg, kw);
2147 else
2148 result = call_builtin(func, arg, kw);
2149
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002151
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 if (result == NULL && !PyErr_Occurred())
2153 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002154 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002155
2156 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002157}
2158
Guido van Rossumb209a111997-04-29 18:18:01 +00002159static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyObject *func;
2162 PyObject *arg;
2163 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164{
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 if (PyCFunction_Check(func)) {
2166 PyCFunction meth = PyCFunction_GetFunction(func);
2167 PyObject *self = PyCFunction_GetSelf(func);
2168 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002169 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002171 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002172 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002173 else if (size == 0)
2174 arg = NULL;
2175 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002176 if (flags & METH_KEYWORDS)
2177 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 if (kw != NULL && PyDict_Size(kw) != 0) {
2179 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002180 "this function takes no keyword arguments");
2181 return NULL;
2182 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002183 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002184 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 if (PyClass_Check(func)) {
2186 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002188 if (PyInstance_Check(func)) {
2189 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002190 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 PyErr_Clear();
2192 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002193 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002194 return NULL;
2195 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002196 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002198 return res;
2199 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 return NULL;
2202}
2203
Guido van Rossumb209a111997-04-29 18:18:01 +00002204static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002205call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 PyObject *func;
2207 PyObject *arg;
2208 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209{
Guido van Rossumb209a111997-04-29 18:18:01 +00002210 PyObject *class = NULL; /* == owner */
2211 PyObject *argdefs;
2212 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002213 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002214 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002215
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 if (kw != NULL && !PyDict_Check(kw)) {
2217 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002218 return NULL;
2219 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 if (PyMethod_Check(func)) {
2222 PyObject *self = PyMethod_Self(func);
2223 class = PyMethod_Class(func);
2224 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002225 if (self == NULL) {
2226 /* Unbound methods must be called with an instance of
2227 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 if (PyTuple_Size(arg) >= 1) {
2229 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002230 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002231 PyInstance_Check(self) &&
2232 PyClass_IsSubclass((PyObject *)
2233 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002234 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002235 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002236 else
2237 self = NULL;
2238 }
2239 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002240 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002241 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002242 return NULL;
2243 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002245 }
2246 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002247 int argcount = PyTuple_Size(arg);
2248 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002249 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002250 if (newarg == NULL)
2251 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002252 Py_INCREF(self);
2253 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002254 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002255 PyObject *v = PyTuple_GET_ITEM(arg, i);
2256 Py_XINCREF(v);
2257 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002258 }
2259 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 }
2261 }
2262 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002263 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002264 PyErr_SetString(PyExc_TypeError,
2265 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 return NULL;
2267 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002268 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002270
2271 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002272 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2273 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2274 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002275 }
2276 else {
2277 d = NULL;
2278 nd = 0;
2279 }
2280
2281 if (kw != NULL) {
2282 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002283 nk = PyDict_Size(kw);
2284 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002285 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002286 PyErr_NoMemory();
2287 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002288 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002289 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002290 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002292 i += 2;
2293 nk = i/2;
2294 /* XXX This is broken if the caller deletes dict items! */
2295 }
2296 else {
2297 k = NULL;
2298 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002299 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 (PyCodeObject *)PyFunction_GetCode(func),
2303 PyFunction_GetGlobals(func), (PyObject *)NULL,
2304 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002305 k, nk,
2306 d, nd,
2307 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 Py_DECREF(arg);
2310 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311
Guido van Rossum681d79a1995-07-18 14:51:37 +00002312 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002313}
2314
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002315#define SLICE_ERROR_MSG \
2316 "standard sequence type does not support step size other than one"
2317
Guido van Rossumb209a111997-04-29 18:18:01 +00002318static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002319loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321{
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002323 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002325 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 return NULL;
2327 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002328 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002329 v = (*sq->sq_item)(v, i);
2330 if (v)
2331 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002332 if (PyErr_Occurred() == PyExc_IndexError)
2333 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002334 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335}
2336
2337static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002338slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 int *pi;
2341{
2342 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002343 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002345 PyErr_SetString(PyExc_TypeError,
2346 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002347 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002349 x = PyInt_AsLong(v);
2350 /* Truncate -- very long indices are truncated anyway */
2351 if (x > INT_MAX)
2352 x = INT_MAX;
2353 else if (x < -INT_MAX)
2354 x = 0;
2355 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358}
2359
Guido van Rossumb209a111997-04-29 18:18:01 +00002360static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002361apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002364 int ilow = 0, ihigh = INT_MAX;
2365 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002367 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002368 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002369 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002371
2372static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002373assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002376 int ilow = 0, ihigh = INT_MAX;
2377 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002378 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002379 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002380 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002381 if (x == NULL)
2382 return PySequence_DelSlice(u, ilow, ihigh);
2383 else
2384 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385}
2386
2387static int
2388cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390{
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002395 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 return 1;
2398 }
2399 return 0;
2400 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002401 if (PyClass_Check(v) && PyClass_Check(err))
2402 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403 return err == v;
2404}
2405
Guido van Rossum3f5da241990-12-20 15:06:42 +00002406static int
2407cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002409{
Guido van Rossume59214e1994-08-30 08:01:59 +00002410 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 PyObject *x;
2412 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002413 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002415 register char *s, *end;
2416 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2418 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002419 "string member test needs char left operand");
2420 return -1;
2421 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 c = PyString_AsString(v)[0];
2423 s = PyString_AsString(w);
2424 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425 while (s < end) {
2426 if (c == *s++)
2427 return 1;
2428 }
2429 return 0;
2430 }
2431 sq = w->ob_type->tp_as_sequence;
2432 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002434 "'in' or 'not in' needs sequence right argument");
2435 return -1;
2436 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002437 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002438 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002439 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 if (PyErr_Occurred() == PyExc_IndexError) {
2441 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002442 break;
2443 }
2444 return -1;
2445 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 cmp = PyObject_Compare(v, x);
2447 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002448 if (cmp == 0)
2449 return 1;
2450 }
2451 return 0;
2452}
2453
Guido van Rossumb209a111997-04-29 18:18:01 +00002454static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002456 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 register PyObject *v;
2458 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459{
2460 register int cmp;
2461 register int res = 0;
2462 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002463 case IS:
2464 case IS_NOT:
2465 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002466 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002467 res = !res;
2468 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469 case IN:
2470 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002471 res = cmp_member(v, w);
2472 if (res < 0)
2473 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002474 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002475 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 break;
2477 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002478 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 break;
2480 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 cmp = PyObject_Compare(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002482 switch (op) {
2483 case LT: res = cmp < 0; break;
2484 case LE: res = cmp <= 0; break;
2485 case EQ: res = cmp == 0; break;
2486 case NE: res = cmp != 0; break;
2487 case GT: res = cmp > 0; break;
2488 case GE: res = cmp >= 0; break;
2489 /* XXX no default? (res is initialized to 0 though) */
2490 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 v = res ? Py_True : Py_False;
2493 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 return v;
2495}
2496
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497static int
2498import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002499 PyObject *locals;
2500 PyObject *v;
2501 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002502{
Guido van Rossumb209a111997-04-29 18:18:01 +00002503 PyObject *w, *x;
2504 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002505 PyErr_SetString(PyExc_TypeError,
2506 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002507 return -1;
2508 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002509 w = PyModule_GetDict(v);
2510 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002511 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002512 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002513 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 while (PyDict_Next(w, &pos, &name, &value)) {
2515 if (!PyString_Check(name) ||
2516 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002517 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 Py_INCREF(value);
2519 err = PyDict_SetItem(locals, name, value);
2520 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002521 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002522 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002523 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002525 }
2526 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002527 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002528 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002529 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002530 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002531 PyString_AsString(name));
2532 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002533 return -1;
2534 }
2535 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002536 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002537 }
2538}
2539
Guido van Rossumb209a111997-04-29 18:18:01 +00002540static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002541build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002542 PyObject *methods; /* dictionary */
2543 PyObject *bases; /* tuple containing classes */
2544 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002545{
Guido van Rossum25831651993-05-19 14:50:45 +00002546 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002547 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002548 PyErr_SetString(PyExc_SystemError,
2549 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002550 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002551 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002552 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 PyErr_SetString(PyExc_SystemError,
2554 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002555 return NULL;
2556 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002557 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002558 PyErr_SetString(PyExc_SystemError,
2559 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002560 return NULL;
2561 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002562 for (i = PyTuple_Size(bases); --i >= 0; ) {
2563 PyObject *base = PyTuple_GET_ITEM(bases, i);
2564 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002565 /* Call the base's *type*, if it is callable.
2566 This code is a hook for Donald Beaudry's
2567 and Jim Fulton's type extensions. In
2568 unexended Python it will never be triggered
2569 since its types are not callable. */
2570 if (base->ob_type->ob_type->tp_call) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 PyObject *args;
2572 PyObject *class;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002573 args = Py_BuildValue("(OOO)",
2574 name, bases, methods);
2575 class = PyEval_CallObject(
2576 (PyObject *)base->ob_type, args);
Guido van Rossumb209a111997-04-29 18:18:01 +00002577 Py_DECREF(args);
Guido van Rossum150b2df1996-12-05 23:17:11 +00002578 return class;
2579 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002580 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002581 "base is not a class object");
2582 return NULL;
2583 }
2584 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002585 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002586}
2587
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002588static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002589exec_statement(f, prog, globals, locals)
2590 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002591 PyObject *prog;
2592 PyObject *globals;
2593 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002594{
2595 char *s;
2596 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002598 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002599
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2601 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002602 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002603 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002604 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002605 locals = PyTuple_GetItem(prog, 2);
2606 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002607 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002608 if (globals == Py_None) {
2609 globals = PyEval_GetGlobals();
2610 if (locals == Py_None) {
2611 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002612 plain = 1;
2613 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002614 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002616 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002617 if (!PyString_Check(prog) &&
2618 !PyCode_Check(prog) &&
2619 !PyFile_Check(prog)) {
2620 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002621 "exec 1st arg must be string, code or file object");
2622 return -1;
2623 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002624 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2625 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002626 "exec 2nd/3rd args must be dict or None");
2627 return -1;
2628 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002629 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002630 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002632 if (PyEval_EvalCode((PyCodeObject *) prog,
2633 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002634 return -1;
2635 return 0;
2636 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002637 if (PyFile_Check(prog)) {
2638 FILE *fp = PyFile_AsFile(prog);
2639 char *name = PyString_AsString(PyFile_Name(prog));
2640 if (PyRun_File(fp, name, file_input, globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002641 return -1;
2642 return 0;
2643 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 s = PyString_AsString(prog);
2645 if (strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002646 PyErr_SetString(PyExc_ValueError,
2647 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002648 return -1;
2649 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002650 v = PyRun_String(s, file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002651 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002652 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002654 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002655 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002656 return 0;
2657}
Guido van Rossum24c13741995-02-14 09:42:43 +00002658
Guido van Rossum1aa14831997-01-21 05:34:20 +00002659/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002660static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002661find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002663 int nexti;
2664{
2665 int opcode;
2666 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002668 unsigned char *next_instr;
2669
2670 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2671 opcode = (*next_instr++);
2672 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 Py_INCREF(Py_None);
2674 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002675 }
2676
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002678 if (list == NULL)
2679 return NULL;
2680
2681 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002682 oparg = (next_instr[1]<<8) + next_instr[0];
2683 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002684 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 if (PyList_Append(list, name) < 0) {
2686 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002687 break;
2688 }
2689 opcode = (*next_instr++);
2690 } while (opcode == IMPORT_FROM);
2691
2692 return list;
2693}
Guido van Rossum950361c1997-01-24 13:49:28 +00002694
2695
2696#ifdef DYNAMIC_EXECUTION_PROFILE
2697
2698PyObject *
2699getarray(a)
2700 long a[256];
2701{
2702 int i;
2703 PyObject *l = PyList_New(256);
2704 if (l == NULL) return NULL;
2705 for (i = 0; i < 256; i++) {
2706 PyObject *x = PyInt_FromLong(a[i]);
2707 if (x == NULL) {
2708 Py_DECREF(l);
2709 return NULL;
2710 }
2711 PyList_SetItem(l, i, x);
2712 }
2713 for (i = 0; i < 256; i++)
2714 a[i] = 0;
2715 return l;
2716}
2717
2718PyObject *
2719_Py_GetDXProfile(self, args)
2720 PyObject *self, *args;
2721{
2722#ifndef DXPAIRS
2723 return getarray(dxp);
2724#else
2725 int i;
2726 PyObject *l = PyList_New(257);
2727 if (l == NULL) return NULL;
2728 for (i = 0; i < 257; i++) {
2729 PyObject *x = getarray(dxpairs[i]);
2730 if (x == NULL) {
2731 Py_DECREF(l);
2732 return NULL;
2733 }
2734 PyList_SetItem(l, i, x);
2735 }
2736 return l;
2737#endif
2738}
2739
2740#endif