blob: bd312b2f2fd1c68bf5df749832ea8bf1f171a49f [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"
46
Guido van Rossumc6004111993-11-05 10:22:19 +000047#include <ctype.h>
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049#ifdef HAVE_LIMITS_H
50#include <limits.h>
51#else
52#define INT_MAX 2147483647
53#endif
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossum408027e1996-12-30 16:17:54 +000058#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000059/* For debugging the interpreter: */
60#define LLTRACE 1 /* Low-level trace feature */
61#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062#endif
63
Guido van Rossum5b722181993-03-30 17:46:03 +000064
Guido van Rossum374a9221991-04-04 10:40:29 +000065/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
68 PyObject *, PyObject *,
69 PyObject **, int,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000073#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000074static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000076static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
77 PyFrameObject *));
78static int call_trace Py_PROTO((PyObject **, PyObject **,
79 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000080static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
81static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000082static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000083static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000084static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000085static int assign_slice Py_PROTO((PyObject *, PyObject *,
86 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000087static int cmp_exception Py_PROTO((PyObject *, PyObject *));
88static int cmp_member Py_PROTO((PyObject *, PyObject *));
89static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
90static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
91static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000092static int exec_statement Py_PROTO((PyFrameObject *,
93 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000094static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000095static void set_exc_info Py_PROTO((PyThreadState *,
96 PyObject *, PyObject *, PyObject *));
97static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000098
99
Guido van Rossum950361c1997-01-24 13:49:28 +0000100/* Dynamic execution profile */
101#ifdef DYNAMIC_EXECUTION_PROFILE
102#ifdef DXPAIRS
103static long dxpairs[257][256];
104#define dxp dxpairs[256]
105#else
106static long dxp[256];
107#endif
108#endif
109
110
Guido van Rossume59214e1994-08-30 08:01:59 +0000111#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113#include <errno.h>
114#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116extern int _PyThread_Started; /* Flag for Py_Exit */
117
Guido van Rossuma9672091994-09-14 13:31:22 +0000118static type_lock interpreter_lock = 0;
119static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120
121void
Guido van Rossumb209a111997-04-29 18:18:01 +0000122PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000125 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126 _PyThread_Started = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127 interpreter_lock = allocate_lock();
128 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000129 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000132#endif
133
Guido van Rossumff4949e1992-08-05 19:58:53 +0000134/* Functions save_thread and restore_thread are always defined so
135 dynamically loaded modules needn't be compiled separately for use
136 with and without threads: */
137
Guido van Rossumb209a111997-04-29 18:18:01 +0000138PyObject *
139PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000140{
Guido van Rossume59214e1994-08-30 08:01:59 +0000141#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142 if (interpreter_lock) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143 PyThreadState *tstate = PyThreadState_Swap(NULL);
144 PyObject *res = tstate ? (PyObject *) (tstate->frame) : NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000145 release_lock(interpreter_lock);
146 return res;
147 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000149 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000150}
151
152void
Guido van Rossumb209a111997-04-29 18:18:01 +0000153PyEval_RestoreThread(x)
154 PyObject *x;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000155{
Guido van Rossume59214e1994-08-30 08:01:59 +0000156#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000157 if (interpreter_lock) {
158 int err;
159 err = errno;
160 acquire_lock(interpreter_lock, 1);
161 errno = err;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000162 PyThreadState_Swap(x ? ((PyFrameObject *)x)->f_tstate : NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163 }
164#endif
165}
166
167
Guido van Rossuma9672091994-09-14 13:31:22 +0000168/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
169 signal handlers or Mac I/O completion routines) can schedule calls
170 to a function to be called synchronously.
171 The synchronous function is called with one void* argument.
172 It should return 0 for success or -1 for failure -- failure should
173 be accompanied by an exception.
174
175 If registry succeeds, the registry function returns 0; if it fails
176 (e.g. due to too many pending calls) it returns -1 (without setting
177 an exception condition).
178
179 Note that because registry may occur from within signal handlers,
180 or other asynchronous events, calling malloc() is unsafe!
181
182#ifdef WITH_THREAD
183 Any thread can schedule pending calls, but only the main thread
184 will execute them.
185#endif
186
187 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
188 There are two possible race conditions:
189 (1) nested asynchronous registry calls;
190 (2) registry calls made while pending calls are being processed.
191 While (1) is very unlikely, (2) is a real possibility.
192 The current code is safe against (2), but not against (1).
193 The safety against (2) is derived from the fact that only one
194 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000195
Guido van Rossuma027efa1997-05-05 20:56:21 +0000196 XXX Darn! With the advent of thread state, we should have an array
197 of pending calls per thread in the thread state! Later...
198*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000199
Guido van Rossuma9672091994-09-14 13:31:22 +0000200#define NPENDINGCALLS 32
201static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000202 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000203 ANY *arg;
204} pendingcalls[NPENDINGCALLS];
205static volatile int pendingfirst = 0;
206static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000207static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000208
209int
210Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000211 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000212 ANY *arg;
213{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000214 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000215 int i, j;
216 /* XXX Begin critical section */
217 /* XXX If you want this to be safe against nested
218 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000219 if (busy)
220 return -1;
221 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000222 i = pendinglast;
223 j = (i + 1) % NPENDINGCALLS;
224 if (j == pendingfirst)
225 return -1; /* Queue full */
226 pendingcalls[i].func = func;
227 pendingcalls[i].arg = arg;
228 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000230 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000231 /* XXX End critical section */
232 return 0;
233}
234
Guido van Rossum180d7b41994-09-29 09:45:57 +0000235int
236Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000237{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000238 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000239#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000240 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000241 return 0;
242#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 return 0;
245 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000247 for (;;) {
248 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000249 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000250 ANY *arg;
251 i = pendingfirst;
252 if (i == pendinglast)
253 break; /* Queue empty */
254 func = pendingcalls[i].func;
255 arg = pendingcalls[i].arg;
256 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000257 if (func(arg) < 0) {
258 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000259 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000260 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000261 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000262 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264 return 0;
265}
266
267
Guido van Rossum374a9221991-04-04 10:40:29 +0000268/* Status code for main loop (reason for stack unwind) */
269
270enum why_code {
271 WHY_NOT, /* No error */
272 WHY_EXCEPTION, /* Exception occurred */
273 WHY_RERAISE, /* Exception re-raised by 'finally' */
274 WHY_RETURN, /* 'return' statement */
275 WHY_BREAK /* 'break' statement */
276};
277
Guido van Rossumb209a111997-04-29 18:18:01 +0000278static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000279
Guido van Rossum374a9221991-04-04 10:40:29 +0000280
Guido van Rossum681d79a1995-07-18 14:51:37 +0000281/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000282
Guido van Rossumb209a111997-04-29 18:18:01 +0000283PyObject *
284PyEval_EvalCode(co, globals, locals)
285 PyCodeObject *co;
286 PyObject *globals;
287 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000288{
289 return eval_code2(co,
290 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000291 (PyObject **)NULL, 0,
292 (PyObject **)NULL, 0,
293 (PyObject **)NULL, 0,
294 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000295}
296
297
298/* Interpreter main loop */
299
Guido van Rossum8861b741996-07-30 16:49:37 +0000300#ifndef MAX_RECURSION_DEPTH
301#define MAX_RECURSION_DEPTH 10000
302#endif
303
Guido van Rossumb209a111997-04-29 18:18:01 +0000304static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305eval_code2(co, globals, locals,
306 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000307 PyCodeObject *co;
308 PyObject *globals;
309 PyObject *locals;
310 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000311 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000312 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000313 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000314 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000315 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000316 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000317{
Guido van Rossum950361c1997-01-24 13:49:28 +0000318#ifdef DXPAIRS
319 int lastopcode = 0;
320#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000321 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000322 register int opcode = 0; /* Current opcode */
323 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000325 register enum why_code why; /* Reason for block stack unwind */
326 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000327 register PyObject *x; /* Result object -- NULL if error */
328 register PyObject *v; /* Temporary objects popped off stack */
329 register PyObject *w;
330 register PyObject *u;
331 register PyObject *t;
332 register PyFrameObject *f; /* Current frame */
333 register PyObject **fastlocals = NULL;
334 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000335 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000336#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000337 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000338#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000339#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000340 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000342#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000343
344/* Code access macros */
345
346#define GETCONST(i) Getconst(f, i)
347#define GETNAME(i) Getname(f, i)
348#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000349#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000350#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
351#define NEXTOP() (*next_instr++)
352#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
353#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
354#define JUMPBY(x) (next_instr += (x))
355
356/* Stack manipulation macros */
357
358#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
359#define EMPTY() (STACK_LEVEL() == 0)
360#define TOP() (stack_pointer[-1])
361#define BASIC_PUSH(v) (*stack_pointer++ = (v))
362#define BASIC_POP() (*--stack_pointer)
363
Guido van Rossum96a42c81992-01-12 02:29:51 +0000364#ifdef LLTRACE
365#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
366#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000367#else
368#define PUSH(v) BASIC_PUSH(v)
369#define POP() BASIC_POP()
370#endif
371
Guido van Rossum681d79a1995-07-18 14:51:37 +0000372/* Local variable macros */
373
374#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000375#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 GETLOCAL(i) = value; } while (0)
377
Guido van Rossuma027efa1997-05-05 20:56:21 +0000378/* Start of code */
379
380 if (tstate == NULL)
381 Py_FatalError("eval_code2 called without a current thread");
382
Guido van Rossum8861b741996-07-30 16:49:37 +0000383#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000384 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000385 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000386 return NULL;
387 }
388#endif
389
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000391 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000392 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000393 }
394
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000395#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000396 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000397#endif
398
Guido van Rossumb209a111997-04-29 18:18:01 +0000399 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000401 co, /*code*/
402 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000403 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000404 if (f == NULL)
405 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000406
Guido van Rossuma027efa1997-05-05 20:56:21 +0000407 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000408 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409
410 if (co->co_argcount > 0 ||
411 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
412 int i;
413 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000414 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000415 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000416 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000417 if (kwdict == NULL)
418 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000419 i = co->co_argcount;
420 if (co->co_flags & CO_VARARGS)
421 i++;
422 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 }
424 if (argcount > co->co_argcount) {
425 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000426 PyErr_SetString(PyExc_TypeError,
427 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000428 goto fail;
429 }
430 n = co->co_argcount;
431 }
432 for (i = 0; i < n; i++) {
433 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000434 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000435 SETLOCAL(i, x);
436 }
437 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000438 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000439 if (u == NULL)
440 goto fail;
441 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 for (i = n; i < argcount; i++) {
443 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 Py_INCREF(x);
445 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 }
448 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000449 PyObject *keyword = kws[2*i];
450 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 int j;
452 /* XXX slow -- speed up using dictionary? */
453 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000454 PyObject *nm = PyTuple_GET_ITEM(
455 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000456 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 break;
458 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000459 /* Check errors from Compare */
460 if (PyErr_Occurred())
461 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 if (j >= co->co_argcount) {
463 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000464 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000465 "unexpected keyword argument: %.400s",
466 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 goto fail;
468 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000470 }
471 else {
472 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000473 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474 "keyword parameter redefined");
475 goto fail;
476 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 SETLOCAL(j, value);
479 }
480 }
481 if (argcount < co->co_argcount) {
482 int m = co->co_argcount - defcount;
483 for (i = argcount; i < m; i++) {
484 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000485 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000486 "not enough arguments");
487 goto fail;
488 }
489 }
490 if (n > m)
491 i = n - m;
492 else
493 i = 0;
494 for (; i < defcount; i++) {
495 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000496 PyObject *def = defs[i];
497 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 SETLOCAL(m+i, def);
499 }
500 }
501 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000502 }
503 else {
504 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000505 PyErr_SetString(PyExc_TypeError,
506 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000507 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 }
509 }
510
Guido van Rossuma027efa1997-05-05 20:56:21 +0000511 if (tstate->sys_tracefunc != NULL) {
512 /* tstate->sys_tracefunc, if defined, is a function that
513 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000514 Its return value, if not None, is a function that
515 will be called at the start of each executed line
516 of code. (Actually, the function must return
517 itself in order to continue tracing.)
518 The trace functions are called with three arguments:
519 a pointer to the current frame, a string indicating
520 why the function is called, and an argument which
521 depends on the situation. The global trace function
522 (sys.trace) is also called whenever an exception
523 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000524 if (call_trace(&tstate->sys_tracefunc,
525 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000526 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000527 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000528 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000529 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000530 }
531
Guido van Rossuma027efa1997-05-05 20:56:21 +0000532 if (tstate->sys_profilefunc != NULL) {
533 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000534 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000535 if (call_trace(&tstate->sys_profilefunc,
536 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000537 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000538 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000539 }
540 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000541
Guido van Rossuma027efa1997-05-05 20:56:21 +0000542 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
543 --tstate->recursion_depth;
544 PyErr_SetString(PyExc_RuntimeError,
545 "Maximum recursion depth exceeded");
546 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000547 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000548 return NULL;
549 }
550
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000551 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000552 stack_pointer = f->f_valuestack;
553
Guido van Rossum374a9221991-04-04 10:40:29 +0000554 why = WHY_NOT;
555 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000556 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000557
558 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000559 /* Do periodic things. Doing this every time through
560 the loop would add too much overhead, so we do it
561 only every Nth instruction. We also do it if
562 ``things_to_do'' is set, i.e. when an asynchronous
563 event needs attention (e.g. a signal handler or
564 async I/O handler); see Py_AddPendingCall() and
565 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000566
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 if (things_to_do || --tstate->ticker < 0) {
568 tstate->ticker = tstate->sys_checkinterval;
569 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000570 if (Py_MakePendingCalls() < 0) {
571 why = WHY_EXCEPTION;
572 goto on_error;
573 }
574 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000575#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 /* If we have true signals, the signal handler
577 will call Py_AddPendingCall() so we don't
578 have to call sigcheck(). On the Mac and
579 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000580 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000581 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000582 goto on_error;
583 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000584#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000585
Guido van Rossume59214e1994-08-30 08:01:59 +0000586#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587 if (interpreter_lock) {
588 /* Give another thread a chance */
589
Guido van Rossuma027efa1997-05-05 20:56:21 +0000590 PyThreadState *tstate =
591 PyThreadState_Swap(NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000592 release_lock(interpreter_lock);
593
594 /* Other threads may run now */
595
596 acquire_lock(interpreter_lock, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000597 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000598 }
599#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000600 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000601
Guido van Rossum374a9221991-04-04 10:40:29 +0000602 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000603
Guido van Rossum408027e1996-12-30 16:17:54 +0000604#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000605 f->f_lasti = INSTR_OFFSET();
606#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000607
608 opcode = NEXTOP();
609 if (HAS_ARG(opcode))
610 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000611#ifdef DYNAMIC_EXECUTION_PROFILE
612#ifdef DXPAIRS
613 dxpairs[lastopcode][opcode]++;
614 lastopcode = opcode;
615#endif
616 dxp[opcode]++;
617#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000618
Guido van Rossum96a42c81992-01-12 02:29:51 +0000619#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000620 /* Instruction tracing */
621
Guido van Rossum96a42c81992-01-12 02:29:51 +0000622 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000623 if (HAS_ARG(opcode)) {
624 printf("%d: %d, %d\n",
625 (int) (INSTR_OFFSET() - 3),
626 opcode, oparg);
627 }
628 else {
629 printf("%d: %d\n",
630 (int) (INSTR_OFFSET() - 1), opcode);
631 }
632 }
633#endif
634
635 /* Main switch on opcode */
636
637 switch (opcode) {
638
639 /* BEWARE!
640 It is essential that any operation that fails sets either
641 x to NULL, err to nonzero, or why to anything but WHY_NOT,
642 and that no operation that succeeds does this! */
643
644 /* case STOP_CODE: this is an error! */
645
646 case POP_TOP:
647 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000648 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000649 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000650
651 case ROT_TWO:
652 v = POP();
653 w = POP();
654 PUSH(v);
655 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000656 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000657
658 case ROT_THREE:
659 v = POP();
660 w = POP();
661 x = POP();
662 PUSH(v);
663 PUSH(x);
664 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000665 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000666
667 case DUP_TOP:
668 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000669 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000670 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000671 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000672
673 case UNARY_POSITIVE:
674 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000675 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000676 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000678 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 break;
680
681 case UNARY_NEGATIVE:
682 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000683 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000684 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000686 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 break;
688
689 case UNARY_NOT:
690 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000691 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000692 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000693 if (err == 0) {
694 Py_INCREF(Py_True);
695 PUSH(Py_True);
696 continue;
697 }
698 else if (err > 0) {
699 Py_INCREF(Py_False);
700 PUSH(Py_False);
701 err = 0;
702 continue;
703 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 break;
705
706 case UNARY_CONVERT:
707 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000708 x = PyObject_Repr(v);
709 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000711 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000713
714 case UNARY_INVERT:
715 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000716 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000718 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000719 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000720 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000721
Guido van Rossum50564e81996-01-12 01:13:16 +0000722 case BINARY_POWER:
723 w = POP();
724 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000725 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_DECREF(v);
727 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000728 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000730 break;
731
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 case BINARY_MULTIPLY:
733 w = POP();
734 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000735 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000736 Py_DECREF(v);
737 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000739 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000740 break;
741
742 case BINARY_DIVIDE:
743 w = POP();
744 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000745 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000746 Py_DECREF(v);
747 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000748 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000749 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000750 break;
751
752 case BINARY_MODULO:
753 w = POP();
754 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000755 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000756 Py_DECREF(v);
757 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000759 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 break;
761
762 case BINARY_ADD:
763 w = POP();
764 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000765 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000766 Py_DECREF(v);
767 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000768 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000769 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 break;
771
772 case BINARY_SUBTRACT:
773 w = POP();
774 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000775 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000776 Py_DECREF(v);
777 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000778 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000779 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000780 break;
781
782 case BINARY_SUBSCR:
783 w = POP();
784 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000785 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000786 Py_DECREF(v);
787 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000788 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000789 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000790 break;
791
Guido van Rossum7928cd71991-10-24 14:59:31 +0000792 case BINARY_LSHIFT:
793 w = POP();
794 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000795 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000796 Py_DECREF(v);
797 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000798 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000799 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000800 break;
801
802 case BINARY_RSHIFT:
803 w = POP();
804 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000805 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000806 Py_DECREF(v);
807 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000808 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000809 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000810 break;
811
812 case BINARY_AND:
813 w = POP();
814 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000815 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000816 Py_DECREF(v);
817 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000818 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000819 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000820 break;
821
822 case BINARY_XOR:
823 w = POP();
824 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000825 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000826 Py_DECREF(v);
827 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000828 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000829 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000830 break;
831
832 case BINARY_OR:
833 w = POP();
834 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000835 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000836 Py_DECREF(v);
837 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000840 break;
841
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 case SLICE+0:
843 case SLICE+1:
844 case SLICE+2:
845 case SLICE+3:
846 if ((opcode-SLICE) & 2)
847 w = POP();
848 else
849 w = NULL;
850 if ((opcode-SLICE) & 1)
851 v = POP();
852 else
853 v = NULL;
854 u = POP();
855 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(u);
857 Py_XDECREF(v);
858 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000860 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 break;
862
863 case STORE_SLICE+0:
864 case STORE_SLICE+1:
865 case STORE_SLICE+2:
866 case STORE_SLICE+3:
867 if ((opcode-STORE_SLICE) & 2)
868 w = POP();
869 else
870 w = NULL;
871 if ((opcode-STORE_SLICE) & 1)
872 v = POP();
873 else
874 v = NULL;
875 u = POP();
876 t = POP();
877 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(t);
879 Py_DECREF(u);
880 Py_XDECREF(v);
881 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000882 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 break;
884
885 case DELETE_SLICE+0:
886 case DELETE_SLICE+1:
887 case DELETE_SLICE+2:
888 case DELETE_SLICE+3:
889 if ((opcode-DELETE_SLICE) & 2)
890 w = POP();
891 else
892 w = NULL;
893 if ((opcode-DELETE_SLICE) & 1)
894 v = POP();
895 else
896 v = NULL;
897 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(u);
901 Py_XDECREF(v);
902 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000903 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 break;
905
906 case STORE_SUBSCR:
907 w = POP();
908 v = POP();
909 u = POP();
910 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000911 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000912 Py_DECREF(u);
913 Py_DECREF(v);
914 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000915 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 break;
917
918 case DELETE_SUBSCR:
919 w = POP();
920 v = POP();
921 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000922 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000923 Py_DECREF(v);
924 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000925 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 break;
927
928 case PRINT_EXPR:
929 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000931 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +0000932 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000933 (err = PyDict_SetItemString(
934 f->f_builtins, "_", v)) == 0 &&
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 !Py_SuppressPrintingFlag) {
Guido van Rossumbe270261997-05-22 22:26:18 +0000936 err = Py_FlushLine();
937 if (err == NULL) {
938 x = PySys_GetObject("stdout");
939 if (x == NULL)
940 err = -1;
941 }
942 if (err == 0)
943 err = PyFile_WriteObject(v, x, 0);
944 if (err == 0) {
945 PyFile_SoftSpace(x, 1);
946 err = Py_FlushLine();
947 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000949 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000950 break;
951
952 case PRINT_ITEM:
953 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000954 w = PySys_GetObject("stdout");
955 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +0000956 err = PyFile_WriteString(" ", w);
957 if (err == 0)
958 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +0000960 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +0000961 char *s = PyString_AsString(v);
962 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000963 if (len > 0 &&
964 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000965 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +0000966 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000968 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000969 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 break;
971
972 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +0000973 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000974 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000975 PyErr_SetString(PyExc_RuntimeError,
976 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000977 else {
Guido van Rossumbe270261997-05-22 22:26:18 +0000978 err = PyFile_WriteString("\n", x);
979 if (err == 0)
980 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000981 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000982 break;
983
984 case BREAK_LOOP:
985 why = WHY_BREAK;
986 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000987
Guido van Rossumf10570b1995-07-07 22:53:21 +0000988 case RAISE_VARARGS:
989 u = v = w = NULL;
990 switch (oparg) {
991 case 3:
992 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000993 /* Fallthrough */
994 case 2:
995 v = POP(); /* value */
996 /* Fallthrough */
997 case 1:
998 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000999 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001000 break;
1001 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001002 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001003 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001004 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001005 break;
1006 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 break;
1008
1009 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001010 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001011 PyErr_SetString(PyExc_SystemError,
1012 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001013 break;
1014 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001015 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001016 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 break;
1018
1019 case RETURN_VALUE:
1020 retval = POP();
1021 why = WHY_RETURN;
1022 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001023
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001024 case EXEC_STMT:
1025 w = POP();
1026 v = POP();
1027 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001028 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 Py_DECREF(u);
1030 Py_DECREF(v);
1031 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001032 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001033
Guido van Rossum374a9221991-04-04 10:40:29 +00001034 case POP_BLOCK:
1035 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001036 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001037 while (STACK_LEVEL() > b->b_level) {
1038 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 }
1041 }
1042 break;
1043
1044 case END_FINALLY:
1045 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001046 if (PyInt_Check(v)) {
1047 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 if (why == WHY_RETURN)
1049 retval = POP();
1050 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001051 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001053 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001054 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001055 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001056 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001057 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001058 else if (v != Py_None) {
1059 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 "'finally' pops bad exception");
1061 why = WHY_EXCEPTION;
1062 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001063 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001064 break;
1065
1066 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001067 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001068 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001069 w = POP();
1070 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001071 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001072 Py_DECREF(u);
1073 Py_DECREF(v);
1074 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 break;
1076
1077 case STORE_NAME:
1078 w = GETNAMEV(oparg);
1079 v = POP();
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 err = PyDict_SetItem(x, w, v);
1086 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 break;
1088
1089 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001090 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001091 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001092 PyErr_SetString(PyExc_SystemError,
1093 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001094 break;
1095 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001096 if ((err = PyDict_DelItem(x, w)) != 0)
1097 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001099
1100#ifdef CASE_TOO_BIG
1101 default: switch (opcode) {
1102#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001103
1104 case UNPACK_TUPLE:
1105 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001106 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001107 PyErr_SetString(PyExc_TypeError,
1108 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 why = WHY_EXCEPTION;
1110 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001111 else if (PyTuple_Size(v) != oparg) {
1112 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001113 "unpack tuple of wrong size");
1114 why = WHY_EXCEPTION;
1115 }
1116 else {
1117 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001118 w = PyTuple_GET_ITEM(v, oparg);
1119 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 PUSH(w);
1121 }
1122 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001123 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 break;
1125
1126 case UNPACK_LIST:
1127 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001129 PyErr_SetString(PyExc_TypeError,
1130 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 why = WHY_EXCEPTION;
1132 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 else if (PyList_Size(v) != oparg) {
1134 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 "unpack list of wrong size");
1136 why = WHY_EXCEPTION;
1137 }
1138 else {
1139 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001140 w = PyList_GetItem(v, oparg);
1141 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 PUSH(w);
1143 }
1144 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001145 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 break;
1147
1148 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001149 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 v = POP();
1151 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1153 Py_DECREF(v);
1154 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 break;
1156
1157 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001158 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001159 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001160 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1161 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001162 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001163 break;
1164
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001165 case STORE_GLOBAL:
1166 w = GETNAMEV(oparg);
1167 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001168 err = PyDict_SetItem(f->f_globals, w, v);
1169 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001170 break;
1171
1172 case DELETE_GLOBAL:
1173 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001174 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1175 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001176 break;
1177
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 case LOAD_CONST:
1179 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001180 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 PUSH(x);
1182 break;
1183
1184 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001185 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001186 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001187 PyErr_SetString(PyExc_SystemError,
1188 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001189 break;
1190 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001191 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001193 PyErr_Clear();
1194 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001196 PyErr_Clear();
1197 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001198 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001199 PyErr_SetObject(
1200 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 break;
1202 }
1203 }
1204 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001205 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 PUSH(x);
1207 break;
1208
1209 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001210 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001211 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001213 PyErr_Clear();
1214 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001217 break;
1218 }
1219 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001220 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 PUSH(x);
1222 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001223
Guido van Rossum9bfef441993-03-29 10:43:31 +00001224 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001225 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001226 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001227 PyErr_SetObject(PyExc_NameError,
1228 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001229 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001230 break;
1231 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001232 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001233 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001234 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001235 break;
1236
1237 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001238 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001239 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001240 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001241
1242 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001243 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001244 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001245
1246 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 if (x != NULL) {
1249 for (; --oparg >= 0;) {
1250 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 }
1253 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001254 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 }
1256 break;
1257
1258 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001259 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001260 if (x != NULL) {
1261 for (; --oparg >= 0;) {
1262 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 if (err != 0)
1265 break;
1266 }
1267 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001268 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 }
1270 break;
1271
1272 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001273 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001275 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 break;
1277
1278 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001279 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001280 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001281 x = PyObject_GetAttr(v, w);
1282 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001284 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001285 break;
1286
1287 case COMPARE_OP:
1288 w = POP();
1289 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001290 x = cmp_outcome(oparg, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 Py_DECREF(v);
1292 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001294 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 break;
1296
1297 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001300 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001302 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001303 break;
1304 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 if (PyCFunction_Check(x)) {
1306 u = Py_None;
1307 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001308 }
1309 else {
1310 u = find_from_args(f, INSTR_OFFSET());
1311 if (u == NULL) {
1312 x = u;
1313 break;
1314 }
1315 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001317 w,
1318 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001319 f->f_locals == NULL ?
1320 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001321 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001322 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001323 if (w == NULL) {
1324 x = NULL;
1325 break;
1326 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 x = PyEval_CallObject(x, w);
1328 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001329 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001330 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 break;
1332
1333 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001334 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001336 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001337 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001338 PyErr_SetString(PyExc_SystemError,
1339 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001340 break;
1341 }
1342 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001344 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001346
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 case JUMP_FORWARD:
1348 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001349 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350
1351 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001352 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001353 if (err > 0)
1354 err = 0;
1355 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001357 else
1358 break;
1359 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001360
1361 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001363 if (err > 0) {
1364 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001366 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001367 else if (err == 0)
1368 ;
1369 else
1370 break;
1371 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001372
1373 case JUMP_ABSOLUTE:
1374 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001375 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001376
1377 case FOR_LOOP:
1378 /* for v in s: ...
1379 On entry: stack contains s, i.
1380 On exit: stack contains s, i+1, s[i];
1381 but if loop exhausted:
1382 s, i are popped, and we jump */
1383 w = POP(); /* Loop index */
1384 v = POP(); /* Sequence object */
1385 u = loop_subscript(v, w);
1386 if (u != NULL) {
1387 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001388 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001390 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001391 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001392 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 }
1394 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_DECREF(v);
1396 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 /* A NULL can mean "s exhausted"
1398 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001401 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001403 continue;
1404 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 }
1406 break;
1407
1408 case SETUP_LOOP:
1409 case SETUP_EXCEPT:
1410 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001411 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001412 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001413 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001414
1415 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001416#ifdef LLTRACE
1417 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001418 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001419#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001420 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001421 if (f->f_trace == NULL)
1422 continue;
1423 /* Trace each line of code reached */
1424 f->f_lasti = INSTR_OFFSET();
1425 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001427 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001428
1429 case CALL_FUNCTION:
1430 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001431 int na = oparg & 0xff;
1432 int nk = (oparg>>8) & 0xff;
1433 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001434 PyObject **pfunc = stack_pointer - n - 1;
1435 PyObject *func = *pfunc;
1436 PyObject *self = NULL;
1437 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001438 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 if (PyMethod_Check(func)) {
1440 self = PyMethod_Self(func);
1441 class = PyMethod_Class(func);
1442 func = PyMethod_Function(func);
1443 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001444 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001445 Py_INCREF(self);
1446 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001447 *pfunc = self;
1448 na++;
1449 n++;
1450 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001451 else {
1452 /* Unbound methods must be
1453 called with an instance of
1454 the class (or a derived
1455 class) as first argument */
1456 if (na > 0 &&
1457 (self = stack_pointer[-n])
1458 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001459 PyInstance_Check(self) &&
1460 PyClass_IsSubclass(
1461 (PyObject *)
1462 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001463 ->in_class),
1464 class))
1465 /* Handy-dandy */ ;
1466 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001467 PyErr_SetString(
1468 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001469 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001470 x = NULL;
1471 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001472 }
1473 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001474 }
1475 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 Py_INCREF(func);
1477 if (PyFunction_Check(func)) {
1478 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001479 PyObject *globals =
1480 PyFunction_GetGlobals(func);
1481 PyObject *argdefs =
1482 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001484 int nd;
1485 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001486 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001487 nd = ((PyTupleObject *)argdefs) ->
1488 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001489 }
1490 else {
1491 d = NULL;
1492 nd = 0;
1493 }
1494 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 (PyCodeObject *)co,
1496 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001497 stack_pointer-n, na,
1498 stack_pointer-2*nk, nk,
1499 d, nd,
1500 class);
1501 }
1502 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 PyObject *args = PyTuple_New(na);
1504 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001505 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001506 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001507 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001508 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001509 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001511 if (kwdict == NULL) {
1512 x = NULL;
1513 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001514 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001515 err = 0;
1516 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001517 PyObject *value = POP();
1518 PyObject *key = POP();
1519 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001520 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001521 Py_DECREF(key);
1522 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001523 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001524 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001525 }
1526 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001527 Py_DECREF(args);
1528 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001529 break;
1530 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001531 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001532 while (--na >= 0) {
1533 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001535 }
1536 x = PyEval_CallObjectWithKeywords(
1537 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 Py_DECREF(args);
1539 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001540 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001542 while (stack_pointer > pfunc) {
1543 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001544 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001545 }
1546 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001547 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001548 break;
1549 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001550
Guido van Rossum681d79a1995-07-18 14:51:37 +00001551 case MAKE_FUNCTION:
1552 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 x = PyFunction_New(v, f->f_globals);
1554 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 /* XXX Maybe this should be a separate opcode? */
1556 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001557 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001558 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001560 x = NULL;
1561 break;
1562 }
1563 while (--oparg >= 0) {
1564 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 }
1567 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001569 }
1570 PUSH(x);
1571 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001572
1573 case BUILD_SLICE:
1574 if (oparg == 3)
1575 w = POP();
1576 else
1577 w = NULL;
1578 v = POP();
1579 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001580 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 Py_DECREF(u);
1582 Py_DECREF(v);
1583 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001584 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001585 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001586 break;
1587
1588
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 default:
1590 fprintf(stderr,
1591 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001592 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 why = WHY_EXCEPTION;
1595 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001596
1597#ifdef CASE_TOO_BIG
1598 }
1599#endif
1600
Guido van Rossum374a9221991-04-04 10:40:29 +00001601 } /* switch */
1602
1603 on_error:
1604
1605 /* Quickly continue if no error occurred */
1606
1607 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 if (err == 0 && x != NULL) {
1609#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001610 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001611 fprintf(stderr,
1612 "XXX undetected error\n");
1613 else
1614#endif
1615 continue; /* Normal, fast path */
1616 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001617 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001618 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 err = 0;
1620 }
1621
Guido van Rossum801dcae1992-04-08 11:32:32 +00001622#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 /* Double-check exception status */
1624
1625 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001628 PyErr_SetString(PyExc_SystemError,
1629 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001630 why = WHY_EXCEPTION;
1631 }
1632 }
1633 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001635 fprintf(stderr,
1636 "XXX undetected error (why=%d)\n",
1637 why);
1638 why = WHY_EXCEPTION;
1639 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 }
1641#endif
1642
1643 /* Log traceback info if this is a real exception */
1644
1645 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001646 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001647 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001648 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001650
Guido van Rossume59214e1994-08-30 08:01:59 +00001651 if (f->f_trace)
1652 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001653 if (tstate->sys_profilefunc)
1654 call_exc_trace(&tstate->sys_profilefunc,
1655 (PyObject**)0, f);
1656}
Guido van Rossum374a9221991-04-04 10:40:29 +00001657
1658 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1659
1660 if (why == WHY_RERAISE)
1661 why = WHY_EXCEPTION;
1662
1663 /* Unwind stacks if a (pseudo) exception occurred */
1664
1665 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001666 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 while (STACK_LEVEL() > b->b_level) {
1668 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 }
1671 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1672 why = WHY_NOT;
1673 JUMPTO(b->b_handler);
1674 break;
1675 }
1676 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001677 (b->b_type == SETUP_EXCEPT &&
1678 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001679 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 PyObject *exc, *val, *tb;
1681 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 val = Py_None;
1684 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 /* Make the raw exception data
1687 available to the handler,
1688 so a program can emulate the
1689 Python main loop. Don't do
1690 this for 'finally'. */
1691 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001692 set_exc_info(tstate,
1693 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001695 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 PUSH(val);
1697 PUSH(exc);
1698 }
1699 else {
1700 if (why == WHY_RETURN)
1701 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 PUSH(v);
1704 }
1705 why = WHY_NOT;
1706 JUMPTO(b->b_handler);
1707 break;
1708 }
1709 } /* unwind stack */
1710
1711 /* End the loop if we still have an error (or return) */
1712
1713 if (why != WHY_NOT)
1714 break;
1715
1716 } /* main loop */
1717
1718 /* Pop remaining stack entries */
1719
1720 while (!EMPTY()) {
1721 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 }
1724
Guido van Rossum96a42c81992-01-12 02:29:51 +00001725 if (why != WHY_RETURN)
1726 retval = NULL;
1727
Guido van Rossume59214e1994-08-30 08:01:59 +00001728 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001729 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001730 if (call_trace(&f->f_trace, &f->f_trace, f,
1731 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001733 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001734 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001735 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001736 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001737 }
1738
Guido van Rossuma027efa1997-05-05 20:56:21 +00001739 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1740 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001741 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001743 retval = NULL;
1744 why = WHY_EXCEPTION;
1745 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001746 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001747
Guido van Rossuma027efa1997-05-05 20:56:21 +00001748 reset_exc_info(tstate);
1749
1750 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001751
1752 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001753
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001755
Guido van Rossuma027efa1997-05-05 20:56:21 +00001756 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001757 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001758
Guido van Rossum96a42c81992-01-12 02:29:51 +00001759 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001760}
1761
Guido van Rossuma027efa1997-05-05 20:56:21 +00001762static void
1763set_exc_info(tstate, type, value, tb)
1764 PyThreadState *tstate;
1765 PyObject *type;
1766 PyObject *value;
1767 PyObject *tb;
1768{
1769 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001770 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001771 frame = tstate->frame;
1772 if (frame->f_exc_type == NULL) {
1773 /* This frame didn't catch an exception before */
1774 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001775 if (tstate->exc_type == NULL) {
1776 Py_INCREF(Py_None);
1777 tstate->exc_type = Py_None;
1778 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001779 tmp_type = frame->f_exc_type;
1780 tmp_value = frame->f_exc_value;
1781 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001782 Py_XINCREF(tstate->exc_type);
1783 Py_XINCREF(tstate->exc_value);
1784 Py_XINCREF(tstate->exc_traceback);
1785 frame->f_exc_type = tstate->exc_type;
1786 frame->f_exc_value = tstate->exc_value;
1787 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001788 Py_XDECREF(tmp_type);
1789 Py_XDECREF(tmp_value);
1790 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001791 }
1792 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001793 tmp_type = tstate->exc_type;
1794 tmp_value = tstate->exc_value;
1795 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001796 Py_XINCREF(type);
1797 Py_XINCREF(value);
1798 Py_XINCREF(tb);
1799 tstate->exc_type = type;
1800 tstate->exc_value = value;
1801 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001802 Py_XDECREF(tmp_type);
1803 Py_XDECREF(tmp_value);
1804 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001805 /* For b/w compatibility */
1806 PySys_SetObject("exc_type", type);
1807 PySys_SetObject("exc_value", value);
1808 PySys_SetObject("exc_traceback", tb);
1809}
1810
1811static void
1812reset_exc_info(tstate)
1813 PyThreadState *tstate;
1814{
1815 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001816 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001817 frame = tstate->frame;
1818 if (frame->f_exc_type != NULL) {
1819 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001820 tmp_type = tstate->exc_type;
1821 tmp_value = tstate->exc_value;
1822 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001823 Py_XINCREF(frame->f_exc_type);
1824 Py_XINCREF(frame->f_exc_value);
1825 Py_XINCREF(frame->f_exc_traceback);
1826 tstate->exc_type = frame->f_exc_type;
1827 tstate->exc_value = frame->f_exc_value;
1828 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001829 Py_XDECREF(tmp_type);
1830 Py_XDECREF(tmp_value);
1831 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001832 /* For b/w compatibility */
1833 PySys_SetObject("exc_type", frame->f_exc_type);
1834 PySys_SetObject("exc_value", frame->f_exc_value);
1835 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1836 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001837 tmp_type = frame->f_exc_type;
1838 tmp_value = frame->f_exc_value;
1839 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001840 frame->f_exc_type = NULL;
1841 frame->f_exc_value = NULL;
1842 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001843 Py_XDECREF(tmp_type);
1844 Py_XDECREF(tmp_value);
1845 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001846}
1847
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001848/* Logic for the raise statement (too complicated for inlining).
1849 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001850static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001851do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001853{
1854 /* We support the following forms of raise:
1855 raise <class>, <classinstance>
1856 raise <class>, <argument tuple>
1857 raise <class>, None
1858 raise <class>, <argument>
1859 raise <classinstance>, None
1860 raise <string>, <object>
1861 raise <string>, None
1862
1863 An omitted second argument is the same as None.
1864
1865 In addition, raise <tuple>, <anything> is the same as
1866 raising the tuple's first item (and it better have one!);
1867 this rule is applied recursively.
1868
1869 Finally, an optional third argument can be supplied, which
1870 gives the traceback to be substituted (useful when
1871 re-raising an exception after examining it). */
1872
1873 /* First, check the traceback argument, replacing None with
1874 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001875 if (tb == Py_None) {
1876 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001877 tb = NULL;
1878 }
1879 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001880 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001881 "raise 3rd arg must be traceback or None");
1882 goto raise_error;
1883 }
1884
1885 /* Next, replace a missing value with None */
1886 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001887 value = Py_None;
1888 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001889 }
1890
1891 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001892 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1893 PyObject *tmp = type;
1894 type = PyTuple_GET_ITEM(type, 0);
1895 Py_INCREF(type);
1896 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001897 }
1898
1899 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001900 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001901 ;
1902 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001903 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001904 /* Raising a class. If the value is an instance, it
1905 better be an instance of the class. If it is not,
1906 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001907 if (PyInstance_Check(value)) {
1908 PyObject *inclass = (PyObject*)
1909 (((PyInstanceObject*)value)->in_class);
1910 if (!PyClass_IsSubclass(inclass, type)) {
1911 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001912 "raise <class>, <instance> requires that <instance> is a member of <class>");
1913 goto raise_error;
1914 }
1915 }
1916 else {
1917 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00001918 PyObject *args, *res;
1919 if (value == Py_None)
1920 args = Py_BuildValue("()");
1921 else if (PyTuple_Check(value)) {
1922 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001923 args = value;
1924 }
1925 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001926 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001927 if (args == NULL)
1928 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001929 res = PyEval_CallObject(type, args);
1930 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001931 if (res == NULL)
1932 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001933 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001934 value = res;
1935 }
1936 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001937 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001938 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001939 if (value != Py_None) {
1940 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001941 "instance exception may not have a separate value");
1942 goto raise_error;
1943 }
1944 else {
1945 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00001946 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001947 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00001948 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
1949 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001950 }
1951 }
1952 else {
1953 /* Not something you can raise. You get an exception
1954 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00001955 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001956 "exceptions must be strings, classes, or instances");
1957 goto raise_error;
1958 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001959 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001960 if (tb == NULL)
1961 return WHY_EXCEPTION;
1962 else
1963 return WHY_RERAISE;
1964 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00001965 Py_XDECREF(value);
1966 Py_XDECREF(type);
1967 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001968 return WHY_EXCEPTION;
1969}
1970
Guido van Rossum96a42c81992-01-12 02:29:51 +00001971#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001972static int
1973prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00001974 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001975 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001977 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00001978 if (PyObject_Print(v, stdout, 0) != 0)
1979 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001980 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001982#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001984static void
1985call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 PyObject **p_trace, **p_newtrace;
1987 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001988{
Guido van Rossumb209a111997-04-29 18:18:01 +00001989 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001990 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001992 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001993 value = Py_None;
1994 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001995 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001998 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001999 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002000 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002001 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002002 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002003 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002004 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002005 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 Py_XDECREF(type);
2007 Py_XDECREF(value);
2008 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002009 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002010}
2011
2012static int
2013call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002014 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002015 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002016 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002017 may point to NULL variable;
2018 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002020 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002022{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002023 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002024 PyObject *args, *what;
2025 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002026
Guido van Rossuma027efa1997-05-05 20:56:21 +00002027 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002028 /* Don't do recursive traces */
2029 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002031 *p_newtrace = NULL;
2032 }
2033 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002034 }
2035
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002037 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 goto Py_Cleanup;
2039 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002040 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002041 goto Py_Cleanup;
2042 Py_INCREF(f);
2043 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2044 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002045 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002046 arg = Py_None;
2047 Py_INCREF(arg);
2048 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002049 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 PyFrame_FastToLocals(f);
2051 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2052 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002053 tstate->tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 Py_Cleanup:
2055 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002056 if (res == NULL) {
2057 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 PyTraceBack_Here(f);
2059 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002060 *p_trace = NULL;
2061 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002063 *p_newtrace = NULL;
2064 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002065 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002066 }
2067 else {
2068 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002069 Py_XDECREF(*p_newtrace);
2070 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002071 *p_newtrace = NULL;
2072 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002073 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002074 *p_newtrace = res;
2075 }
2076 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002078 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002079 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002080}
2081
Guido van Rossumb209a111997-04-29 18:18:01 +00002082PyObject *
2083PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002084{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002085 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002086 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00002088 else
2089 return current_frame->f_builtins;
2090}
2091
Guido van Rossumb209a111997-04-29 18:18:01 +00002092PyObject *
2093PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002094{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002095 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002096 if (current_frame == NULL)
2097 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002099 return current_frame->f_locals;
2100}
2101
Guido van Rossumb209a111997-04-29 18:18:01 +00002102PyObject *
2103PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002104{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002105 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002106 if (current_frame == NULL)
2107 return NULL;
2108 else
2109 return current_frame->f_globals;
2110}
2111
Guido van Rossumb209a111997-04-29 18:18:01 +00002112PyObject *
2113PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002114{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002115 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002117}
2118
Guido van Rossum6135a871995-01-09 17:53:26 +00002119int
Guido van Rossumb209a111997-04-29 18:18:01 +00002120PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002121{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002122 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002123 return current_frame == NULL ? 0 : current_frame->f_restricted;
2124}
2125
Guido van Rossumbe270261997-05-22 22:26:18 +00002126int
Guido van Rossumb209a111997-04-29 18:18:01 +00002127Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002128{
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002130 if (f == NULL)
2131 return 0;
2132 if (!PyFile_SoftSpace(f, 0))
2133 return 0;
2134 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135}
2136
Guido van Rossum3f5da241990-12-20 15:06:42 +00002137
Guido van Rossum681d79a1995-07-18 14:51:37 +00002138/* External interface to call any callable object.
2139 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002140
Guido van Rossumb209a111997-04-29 18:18:01 +00002141PyObject *
2142PyEval_CallObject(func, arg)
2143 PyObject *func;
2144 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002145{
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002147}
Guido van Rossume59214e1994-08-30 08:01:59 +00002148
Guido van Rossumb209a111997-04-29 18:18:01 +00002149PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002150PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 PyObject *func;
2152 PyObject *arg;
2153 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002154{
2155 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002157
2158 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 arg = PyTuple_New(0);
2160 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002161 PyErr_SetString(PyExc_TypeError,
2162 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002163 return NULL;
2164 }
2165 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002167
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002169 PyErr_SetString(PyExc_TypeError,
2170 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002171 return NULL;
2172 }
2173
Guido van Rossum150b2df1996-12-05 23:17:11 +00002174 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002175 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002177 result = call_function(func, arg, kw);
2178 else
2179 result = call_builtin(func, arg, kw);
2180
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002182
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 if (result == NULL && !PyErr_Occurred())
2184 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002185 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002186
2187 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002188}
2189
Guido van Rossumb209a111997-04-29 18:18:01 +00002190static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002191call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 PyObject *func;
2193 PyObject *arg;
2194 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195{
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 if (PyCFunction_Check(func)) {
2197 PyCFunction meth = PyCFunction_GetFunction(func);
2198 PyObject *self = PyCFunction_GetSelf(func);
2199 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002200 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002201 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002202 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002204 else if (size == 0)
2205 arg = NULL;
2206 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002207 if (flags & METH_KEYWORDS)
2208 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 if (kw != NULL && PyDict_Size(kw) != 0) {
2210 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002211 "this function takes no keyword arguments");
2212 return NULL;
2213 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 if (PyClass_Check(func)) {
2217 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 if (PyInstance_Check(func)) {
2220 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002221 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 PyErr_Clear();
2223 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002224 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002225 return NULL;
2226 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002227 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002228 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002229 return res;
2230 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002231 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 return NULL;
2233}
2234
Guido van Rossumb209a111997-04-29 18:18:01 +00002235static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002236call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002237 PyObject *func;
2238 PyObject *arg;
2239 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240{
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 PyObject *class = NULL; /* == owner */
2242 PyObject *argdefs;
2243 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002244 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002245 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002246
Guido van Rossumb209a111997-04-29 18:18:01 +00002247 if (kw != NULL && !PyDict_Check(kw)) {
2248 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002249 return NULL;
2250 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002251
Guido van Rossumb209a111997-04-29 18:18:01 +00002252 if (PyMethod_Check(func)) {
2253 PyObject *self = PyMethod_Self(func);
2254 class = PyMethod_Class(func);
2255 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002256 if (self == NULL) {
2257 /* Unbound methods must be called with an instance of
2258 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 if (PyTuple_Size(arg) >= 1) {
2260 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002261 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 PyInstance_Check(self) &&
2263 PyClass_IsSubclass((PyObject *)
2264 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002265 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002266 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002267 else
2268 self = NULL;
2269 }
2270 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002272 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002273 return NULL;
2274 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002275 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002276 }
2277 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002278 int argcount = PyTuple_Size(arg);
2279 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002280 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002281 if (newarg == NULL)
2282 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002283 Py_INCREF(self);
2284 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002285 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002286 PyObject *v = PyTuple_GET_ITEM(arg, i);
2287 Py_XINCREF(v);
2288 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002289 }
2290 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 }
2292 }
2293 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002295 PyErr_SetString(PyExc_TypeError,
2296 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 return NULL;
2298 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002299 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301
2302 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002303 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2304 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2305 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306 }
2307 else {
2308 d = NULL;
2309 nd = 0;
2310 }
2311
2312 if (kw != NULL) {
2313 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002314 nk = PyDict_Size(kw);
2315 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002316 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 PyErr_NoMemory();
2318 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002320 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002321 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002323 i += 2;
2324 nk = i/2;
2325 /* XXX This is broken if the caller deletes dict items! */
2326 }
2327 else {
2328 k = NULL;
2329 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002330 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331
Guido van Rossum681d79a1995-07-18 14:51:37 +00002332 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 (PyCodeObject *)PyFunction_GetCode(func),
2334 PyFunction_GetGlobals(func), (PyObject *)NULL,
2335 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336 k, nk,
2337 d, nd,
2338 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339
Guido van Rossumb209a111997-04-29 18:18:01 +00002340 Py_DECREF(arg);
2341 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342
Guido van Rossum681d79a1995-07-18 14:51:37 +00002343 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344}
2345
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002346#define SLICE_ERROR_MSG \
2347 "standard sequence type does not support step size other than one"
2348
Guido van Rossumb209a111997-04-29 18:18:01 +00002349static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002350loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002351 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352{
Guido van Rossumb209a111997-04-29 18:18:01 +00002353 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002354 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 return NULL;
2358 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002360 v = (*sq->sq_item)(v, i);
2361 if (v)
2362 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 if (PyErr_Occurred() == PyExc_IndexError)
2364 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002365 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366}
2367
2368static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002369slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 int *pi;
2372{
2373 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002374 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002376 PyErr_SetString(PyExc_TypeError,
2377 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002378 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002380 x = PyInt_AsLong(v);
2381 /* Truncate -- very long indices are truncated anyway */
2382 if (x > INT_MAX)
2383 x = INT_MAX;
2384 else if (x < -INT_MAX)
2385 x = 0;
2386 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002388 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389}
2390
Guido van Rossumb209a111997-04-29 18:18:01 +00002391static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002392apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002395 int ilow = 0, ihigh = INT_MAX;
2396 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002398 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002399 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002400 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002402
2403static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002404assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002407 int ilow = 0, ihigh = INT_MAX;
2408 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002409 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002410 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002411 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002412 if (x == NULL)
2413 return PySequence_DelSlice(u, ilow, ihigh);
2414 else
2415 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416}
2417
2418static int
2419cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421{
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002424 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002426 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428 return 1;
2429 }
2430 return 0;
2431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 if (PyClass_Check(v) && PyClass_Check(err))
2433 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 return err == v;
2435}
2436
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437static int
2438cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002439 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002440{
Guido van Rossume59214e1994-08-30 08:01:59 +00002441 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002442 PyObject *x;
2443 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002444 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002446 register char *s, *end;
2447 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002448 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2449 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002450 "string member test needs char left operand");
2451 return -1;
2452 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 c = PyString_AsString(v)[0];
2454 s = PyString_AsString(w);
2455 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002456 while (s < end) {
2457 if (c == *s++)
2458 return 1;
2459 }
2460 return 0;
2461 }
2462 sq = w->ob_type->tp_as_sequence;
2463 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002465 "'in' or 'not in' needs sequence right argument");
2466 return -1;
2467 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002468 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002470 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 if (PyErr_Occurred() == PyExc_IndexError) {
2472 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002473 break;
2474 }
2475 return -1;
2476 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 cmp = PyObject_Compare(v, x);
2478 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479 if (cmp == 0)
2480 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002481 if (PyErr_Occurred())
2482 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002483 }
2484 return 0;
2485}
2486
Guido van Rossumb209a111997-04-29 18:18:01 +00002487static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002488cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002489 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 register PyObject *v;
2491 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492{
2493 register int cmp;
2494 register int res = 0;
2495 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496 case IS:
2497 case IS_NOT:
2498 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002499 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 res = !res;
2501 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 case IN:
2503 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002504 res = cmp_member(v, w);
2505 if (res < 0)
2506 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002507 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002508 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509 break;
2510 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002511 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512 break;
2513 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002515 if (cmp && PyErr_Occurred())
2516 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517 switch (op) {
2518 case LT: res = cmp < 0; break;
2519 case LE: res = cmp <= 0; break;
2520 case EQ: res = cmp == 0; break;
2521 case NE: res = cmp != 0; break;
2522 case GT: res = cmp > 0; break;
2523 case GE: res = cmp >= 0; break;
2524 /* XXX no default? (res is initialized to 0 though) */
2525 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002527 v = res ? Py_True : Py_False;
2528 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 return v;
2530}
2531
Guido van Rossum3f5da241990-12-20 15:06:42 +00002532static int
2533import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 PyObject *locals;
2535 PyObject *v;
2536 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002537{
Guido van Rossumb209a111997-04-29 18:18:01 +00002538 PyObject *w, *x;
2539 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002540 PyErr_SetString(PyExc_TypeError,
2541 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002542 return -1;
2543 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002544 w = PyModule_GetDict(v);
2545 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002546 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002547 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002548 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002549 while (PyDict_Next(w, &pos, &name, &value)) {
2550 if (!PyString_Check(name) ||
2551 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002552 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 Py_INCREF(value);
2554 err = PyDict_SetItem(locals, name, value);
2555 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002556 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002558 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002560 }
2561 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002562 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002563 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002564 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002565 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002566 PyString_AsString(name));
2567 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002568 return -1;
2569 }
2570 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002572 }
2573}
2574
Guido van Rossumb209a111997-04-29 18:18:01 +00002575static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002576build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002577 PyObject *methods; /* dictionary */
2578 PyObject *bases; /* tuple containing classes */
2579 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002580{
Guido van Rossum25831651993-05-19 14:50:45 +00002581 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002582 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002583 PyErr_SetString(PyExc_SystemError,
2584 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002585 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002586 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002587 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002588 PyErr_SetString(PyExc_SystemError,
2589 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002590 return NULL;
2591 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002592 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593 PyErr_SetString(PyExc_SystemError,
2594 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002595 return NULL;
2596 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 for (i = PyTuple_Size(bases); --i >= 0; ) {
2598 PyObject *base = PyTuple_GET_ITEM(bases, i);
2599 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002600 /* Call the base's *type*, if it is callable.
2601 This code is a hook for Donald Beaudry's
2602 and Jim Fulton's type extensions. In
2603 unexended Python it will never be triggered
2604 since its types are not callable. */
2605 if (base->ob_type->ob_type->tp_call) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002606 PyObject *args;
2607 PyObject *class;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002608 args = Py_BuildValue("(OOO)",
2609 name, bases, methods);
2610 class = PyEval_CallObject(
2611 (PyObject *)base->ob_type, args);
Guido van Rossumb209a111997-04-29 18:18:01 +00002612 Py_DECREF(args);
Guido van Rossum150b2df1996-12-05 23:17:11 +00002613 return class;
2614 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002616 "base is not a class object");
2617 return NULL;
2618 }
2619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002620 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002621}
2622
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002623static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002624exec_statement(f, prog, globals, locals)
2625 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002626 PyObject *prog;
2627 PyObject *globals;
2628 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002629{
2630 char *s;
2631 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002633 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002634
Guido van Rossumb209a111997-04-29 18:18:01 +00002635 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2636 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002637 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002639 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 locals = PyTuple_GetItem(prog, 2);
2641 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002642 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 if (globals == Py_None) {
2644 globals = PyEval_GetGlobals();
2645 if (locals == Py_None) {
2646 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002647 plain = 1;
2648 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002649 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002650 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002651 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 if (!PyString_Check(prog) &&
2653 !PyCode_Check(prog) &&
2654 !PyFile_Check(prog)) {
2655 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002656 "exec 1st arg must be string, code or file object");
2657 return -1;
2658 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002659 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2660 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002661 "exec 2nd/3rd args must be dict or None");
2662 return -1;
2663 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002665 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002667 if (PyEval_EvalCode((PyCodeObject *) prog,
2668 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002669 return -1;
2670 return 0;
2671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002672 if (PyFile_Check(prog)) {
2673 FILE *fp = PyFile_AsFile(prog);
2674 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002675 if (PyRun_File(fp, name, Py_file_input,
2676 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002677 return -1;
2678 return 0;
2679 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002681 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002682 PyErr_SetString(PyExc_ValueError,
2683 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002684 return -1;
2685 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002686 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002687 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002688 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002689 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002690 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002691 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002692 return 0;
2693}
Guido van Rossum24c13741995-02-14 09:42:43 +00002694
Guido van Rossum1aa14831997-01-21 05:34:20 +00002695/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002696static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002697find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002699 int nexti;
2700{
2701 int opcode;
2702 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002703 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002704 unsigned char *next_instr;
2705
2706 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2707 opcode = (*next_instr++);
2708 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 Py_INCREF(Py_None);
2710 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002711 }
2712
Guido van Rossumb209a111997-04-29 18:18:01 +00002713 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002714 if (list == NULL)
2715 return NULL;
2716
2717 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002718 oparg = (next_instr[1]<<8) + next_instr[0];
2719 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002720 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002721 if (PyList_Append(list, name) < 0) {
2722 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002723 break;
2724 }
2725 opcode = (*next_instr++);
2726 } while (opcode == IMPORT_FROM);
2727
2728 return list;
2729}
Guido van Rossum950361c1997-01-24 13:49:28 +00002730
2731
2732#ifdef DYNAMIC_EXECUTION_PROFILE
2733
2734PyObject *
2735getarray(a)
2736 long a[256];
2737{
2738 int i;
2739 PyObject *l = PyList_New(256);
2740 if (l == NULL) return NULL;
2741 for (i = 0; i < 256; i++) {
2742 PyObject *x = PyInt_FromLong(a[i]);
2743 if (x == NULL) {
2744 Py_DECREF(l);
2745 return NULL;
2746 }
2747 PyList_SetItem(l, i, x);
2748 }
2749 for (i = 0; i < 256; i++)
2750 a[i] = 0;
2751 return l;
2752}
2753
2754PyObject *
2755_Py_GetDXProfile(self, args)
2756 PyObject *self, *args;
2757{
2758#ifndef DXPAIRS
2759 return getarray(dxp);
2760#else
2761 int i;
2762 PyObject *l = PyList_New(257);
2763 if (l == NULL) return NULL;
2764 for (i = 0; i < 257; i++) {
2765 PyObject *x = getarray(dxpairs[i]);
2766 if (x == NULL) {
2767 Py_DECREF(l);
2768 return NULL;
2769 }
2770 PyList_SetItem(l, i, x);
2771 }
2772 return l;
2773#endif
2774}
2775
2776#endif