blob: 032b14da96580fb1702597f84259ef840d328b6a [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 }
459 if (j >= co->co_argcount) {
460 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000461 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000462 "unexpected keyword argument: %.400s",
463 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 goto fail;
465 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000466 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 }
468 else {
469 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000470 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 "keyword parameter redefined");
472 goto fail;
473 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000474 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 SETLOCAL(j, value);
476 }
477 }
478 if (argcount < co->co_argcount) {
479 int m = co->co_argcount - defcount;
480 for (i = argcount; i < m; i++) {
481 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000482 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000483 "not enough arguments");
484 goto fail;
485 }
486 }
487 if (n > m)
488 i = n - m;
489 else
490 i = 0;
491 for (; i < defcount; i++) {
492 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000493 PyObject *def = defs[i];
494 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000495 SETLOCAL(m+i, def);
496 }
497 }
498 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 }
500 else {
501 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000502 PyErr_SetString(PyExc_TypeError,
503 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000504 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 }
506 }
507
Guido van Rossuma027efa1997-05-05 20:56:21 +0000508 if (tstate->sys_tracefunc != NULL) {
509 /* tstate->sys_tracefunc, if defined, is a function that
510 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000511 Its return value, if not None, is a function that
512 will be called at the start of each executed line
513 of code. (Actually, the function must return
514 itself in order to continue tracing.)
515 The trace functions are called with three arguments:
516 a pointer to the current frame, a string indicating
517 why the function is called, and an argument which
518 depends on the situation. The global trace function
519 (sys.trace) is also called whenever an exception
520 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000521 if (call_trace(&tstate->sys_tracefunc,
522 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000523 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000524 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000525 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000526 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000527 }
528
Guido van Rossuma027efa1997-05-05 20:56:21 +0000529 if (tstate->sys_profilefunc != NULL) {
530 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000531 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000532 if (call_trace(&tstate->sys_profilefunc,
533 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000534 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000535 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536 }
537 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000538
Guido van Rossuma027efa1997-05-05 20:56:21 +0000539 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
540 --tstate->recursion_depth;
541 PyErr_SetString(PyExc_RuntimeError,
542 "Maximum recursion depth exceeded");
543 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000544 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000545 return NULL;
546 }
547
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000548 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000549 stack_pointer = f->f_valuestack;
550
Guido van Rossum374a9221991-04-04 10:40:29 +0000551 why = WHY_NOT;
552 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000553 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000554
555 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000556 /* Do periodic things. Doing this every time through
557 the loop would add too much overhead, so we do it
558 only every Nth instruction. We also do it if
559 ``things_to_do'' is set, i.e. when an asynchronous
560 event needs attention (e.g. a signal handler or
561 async I/O handler); see Py_AddPendingCall() and
562 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000563
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 if (things_to_do || --tstate->ticker < 0) {
565 tstate->ticker = tstate->sys_checkinterval;
566 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000567 if (Py_MakePendingCalls() < 0) {
568 why = WHY_EXCEPTION;
569 goto on_error;
570 }
571 }
Guido van Rossuma027efa1997-05-05 20:56:21 +0000572#if !defined(HAVE_SIGNAL_H) && !defined(macintosh)
573 /* If we have true signals, the signal handler
574 will call Py_AddPendingCall() so we don't
575 have to call sigcheck(). On the Mac and
576 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000577 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000578 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000579 goto on_error;
580 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000581#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000582
Guido van Rossume59214e1994-08-30 08:01:59 +0000583#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000584 if (interpreter_lock) {
585 /* Give another thread a chance */
586
Guido van Rossuma027efa1997-05-05 20:56:21 +0000587 PyThreadState *tstate =
588 PyThreadState_Swap(NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000589 release_lock(interpreter_lock);
590
591 /* Other threads may run now */
592
593 acquire_lock(interpreter_lock, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000594 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000595 }
596#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000597 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000598
Guido van Rossum374a9221991-04-04 10:40:29 +0000599 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000600
Guido van Rossum408027e1996-12-30 16:17:54 +0000601#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000602 f->f_lasti = INSTR_OFFSET();
603#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000604
605 opcode = NEXTOP();
606 if (HAS_ARG(opcode))
607 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000608#ifdef DYNAMIC_EXECUTION_PROFILE
609#ifdef DXPAIRS
610 dxpairs[lastopcode][opcode]++;
611 lastopcode = opcode;
612#endif
613 dxp[opcode]++;
614#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000615
Guido van Rossum96a42c81992-01-12 02:29:51 +0000616#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000617 /* Instruction tracing */
618
Guido van Rossum96a42c81992-01-12 02:29:51 +0000619 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000620 if (HAS_ARG(opcode)) {
621 printf("%d: %d, %d\n",
622 (int) (INSTR_OFFSET() - 3),
623 opcode, oparg);
624 }
625 else {
626 printf("%d: %d\n",
627 (int) (INSTR_OFFSET() - 1), opcode);
628 }
629 }
630#endif
631
632 /* Main switch on opcode */
633
634 switch (opcode) {
635
636 /* BEWARE!
637 It is essential that any operation that fails sets either
638 x to NULL, err to nonzero, or why to anything but WHY_NOT,
639 and that no operation that succeeds does this! */
640
641 /* case STOP_CODE: this is an error! */
642
643 case POP_TOP:
644 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000645 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000646 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000647
648 case ROT_TWO:
649 v = POP();
650 w = POP();
651 PUSH(v);
652 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000653 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000654
655 case ROT_THREE:
656 v = POP();
657 w = POP();
658 x = POP();
659 PUSH(v);
660 PUSH(x);
661 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000662 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000663
664 case DUP_TOP:
665 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000666 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000667 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000668 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000669
670 case UNARY_POSITIVE:
671 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000672 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000673 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000674 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000675 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000676 break;
677
678 case UNARY_NEGATIVE:
679 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000680 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000681 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000683 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 break;
685
686 case UNARY_NOT:
687 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000688 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000689 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000690 if (err == 0) {
691 Py_INCREF(Py_True);
692 PUSH(Py_True);
693 continue;
694 }
695 else if (err > 0) {
696 Py_INCREF(Py_False);
697 PUSH(Py_False);
698 err = 0;
699 continue;
700 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 break;
702
703 case UNARY_CONVERT:
704 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000705 x = PyObject_Repr(v);
706 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000707 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000708 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000709 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000710
711 case UNARY_INVERT:
712 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000713 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000714 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000715 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000716 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000717 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000718
Guido van Rossum50564e81996-01-12 01:13:16 +0000719 case BINARY_POWER:
720 w = POP();
721 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000722 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000723 Py_DECREF(v);
724 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000725 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000726 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000727 break;
728
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 case BINARY_MULTIPLY:
730 w = POP();
731 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000732 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000733 Py_DECREF(v);
734 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 break;
738
739 case BINARY_DIVIDE:
740 w = POP();
741 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000742 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000743 Py_DECREF(v);
744 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 break;
748
749 case BINARY_MODULO:
750 w = POP();
751 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000752 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000753 Py_DECREF(v);
754 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000756 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 break;
758
759 case BINARY_ADD:
760 w = POP();
761 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000762 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000763 Py_DECREF(v);
764 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000766 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 break;
768
769 case BINARY_SUBTRACT:
770 w = POP();
771 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000772 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000773 Py_DECREF(v);
774 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000775 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000776 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000777 break;
778
779 case BINARY_SUBSCR:
780 w = POP();
781 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000782 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000783 Py_DECREF(v);
784 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000786 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000787 break;
788
Guido van Rossum7928cd71991-10-24 14:59:31 +0000789 case BINARY_LSHIFT:
790 w = POP();
791 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000792 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000793 Py_DECREF(v);
794 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000795 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000796 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000797 break;
798
799 case BINARY_RSHIFT:
800 w = POP();
801 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000802 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000803 Py_DECREF(v);
804 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000805 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000806 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000807 break;
808
809 case BINARY_AND:
810 w = POP();
811 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000812 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000813 Py_DECREF(v);
814 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000815 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000816 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000817 break;
818
819 case BINARY_XOR:
820 w = POP();
821 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000822 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000823 Py_DECREF(v);
824 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000825 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000826 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000827 break;
828
829 case BINARY_OR:
830 w = POP();
831 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000832 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000833 Py_DECREF(v);
834 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000835 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000836 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000837 break;
838
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 case SLICE+0:
840 case SLICE+1:
841 case SLICE+2:
842 case SLICE+3:
843 if ((opcode-SLICE) & 2)
844 w = POP();
845 else
846 w = NULL;
847 if ((opcode-SLICE) & 1)
848 v = POP();
849 else
850 v = NULL;
851 u = POP();
852 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_DECREF(u);
854 Py_XDECREF(v);
855 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000856 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000857 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000858 break;
859
860 case STORE_SLICE+0:
861 case STORE_SLICE+1:
862 case STORE_SLICE+2:
863 case STORE_SLICE+3:
864 if ((opcode-STORE_SLICE) & 2)
865 w = POP();
866 else
867 w = NULL;
868 if ((opcode-STORE_SLICE) & 1)
869 v = POP();
870 else
871 v = NULL;
872 u = POP();
873 t = POP();
874 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000875 Py_DECREF(t);
876 Py_DECREF(u);
877 Py_XDECREF(v);
878 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000879 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000880 break;
881
882 case DELETE_SLICE+0:
883 case DELETE_SLICE+1:
884 case DELETE_SLICE+2:
885 case DELETE_SLICE+3:
886 if ((opcode-DELETE_SLICE) & 2)
887 w = POP();
888 else
889 w = NULL;
890 if ((opcode-DELETE_SLICE) & 1)
891 v = POP();
892 else
893 v = NULL;
894 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000895 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(u);
898 Py_XDECREF(v);
899 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000900 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 break;
902
903 case STORE_SUBSCR:
904 w = POP();
905 v = POP();
906 u = POP();
907 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000908 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000909 Py_DECREF(u);
910 Py_DECREF(v);
911 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000912 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 break;
914
915 case DELETE_SUBSCR:
916 w = POP();
917 v = POP();
918 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000919 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000920 Py_DECREF(v);
921 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000922 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 break;
924
925 case PRINT_EXPR:
926 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000927 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +0000928 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +0000929 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +0000930 (err = PyDict_SetItemString(
931 f->f_builtins, "_", v)) == 0 &&
Guido van Rossumb209a111997-04-29 18:18:01 +0000932 !Py_SuppressPrintingFlag) {
933 Py_FlushLine();
934 x = PySys_GetObject("stdout");
935 err = PyFile_WriteObject(v, x, 0);
936 PyFile_SoftSpace(x, 1);
937 Py_FlushLine();
Guido van Rossum374a9221991-04-04 10:40:29 +0000938 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000939 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 break;
941
942 case PRINT_ITEM:
943 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000944 w = PySys_GetObject("stdout");
945 if (PyFile_SoftSpace(w, 1))
946 PyFile_WriteString(" ", w);
947 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
948 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +0000949 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 char *s = PyString_AsString(v);
951 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +0000952 if (len > 0 &&
953 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +0000954 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +0000955 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000957 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000958 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 break;
960
961 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000963 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000964 PyErr_SetString(PyExc_RuntimeError,
965 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000966 else {
Guido van Rossumb209a111997-04-29 18:18:01 +0000967 PyFile_WriteString("\n", x);
968 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000969 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000970 break;
971
972 case BREAK_LOOP:
973 why = WHY_BREAK;
974 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +0000975
Guido van Rossumf10570b1995-07-07 22:53:21 +0000976 case RAISE_VARARGS:
977 u = v = w = NULL;
978 switch (oparg) {
979 case 3:
980 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +0000981 /* Fallthrough */
982 case 2:
983 v = POP(); /* value */
984 /* Fallthrough */
985 case 1:
986 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000987 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +0000988 break;
989 default:
Guido van Rossumb209a111997-04-29 18:18:01 +0000990 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +0000991 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +0000992 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +0000993 break;
994 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 break;
996
997 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +0000998 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000999 PyErr_SetString(PyExc_SystemError,
1000 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001001 break;
1002 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001003 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001004 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001005 break;
1006
1007 case RETURN_VALUE:
1008 retval = POP();
1009 why = WHY_RETURN;
1010 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001011
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001012 case EXEC_STMT:
1013 w = POP();
1014 v = POP();
1015 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001016 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001017 Py_DECREF(u);
1018 Py_DECREF(v);
1019 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001020 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001021
Guido van Rossum374a9221991-04-04 10:40:29 +00001022 case POP_BLOCK:
1023 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001025 while (STACK_LEVEL() > b->b_level) {
1026 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 }
1029 }
1030 break;
1031
1032 case END_FINALLY:
1033 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 if (PyInt_Check(v)) {
1035 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 if (why == WHY_RETURN)
1037 retval = POP();
1038 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001041 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001043 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001044 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001045 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001046 else if (v != Py_None) {
1047 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 "'finally' pops bad exception");
1049 why = WHY_EXCEPTION;
1050 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001051 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001052 break;
1053
1054 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001055 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001057 w = POP();
1058 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001059 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001060 Py_DECREF(u);
1061 Py_DECREF(v);
1062 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
1064
1065 case STORE_NAME:
1066 w = GETNAMEV(oparg);
1067 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001068 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001069 PyErr_SetString(PyExc_SystemError,
1070 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001071 break;
1072 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001073 err = PyDict_SetItem(x, w, v);
1074 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 break;
1076
1077 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001078 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001079 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001080 PyErr_SetString(PyExc_SystemError,
1081 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001082 break;
1083 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001084 if ((err = PyDict_DelItem(x, w)) != 0)
1085 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001086 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001087
1088#ifdef CASE_TOO_BIG
1089 default: switch (opcode) {
1090#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001091
1092 case UNPACK_TUPLE:
1093 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001094 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001095 PyErr_SetString(PyExc_TypeError,
1096 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 why = WHY_EXCEPTION;
1098 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001099 else if (PyTuple_Size(v) != oparg) {
1100 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 "unpack tuple of wrong size");
1102 why = WHY_EXCEPTION;
1103 }
1104 else {
1105 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001106 w = PyTuple_GET_ITEM(v, oparg);
1107 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001108 PUSH(w);
1109 }
1110 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001111 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001112 break;
1113
1114 case UNPACK_LIST:
1115 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001116 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001117 PyErr_SetString(PyExc_TypeError,
1118 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 why = WHY_EXCEPTION;
1120 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001121 else if (PyList_Size(v) != oparg) {
1122 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 "unpack list of wrong size");
1124 why = WHY_EXCEPTION;
1125 }
1126 else {
1127 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001128 w = PyList_GetItem(v, oparg);
1129 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001130 PUSH(w);
1131 }
1132 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 break;
1135
1136 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001137 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 v = POP();
1139 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001140 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1141 Py_DECREF(v);
1142 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001143 break;
1144
1145 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001146 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001147 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001148 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1149 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001150 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 break;
1152
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001153 case STORE_GLOBAL:
1154 w = GETNAMEV(oparg);
1155 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001156 err = PyDict_SetItem(f->f_globals, w, v);
1157 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001158 break;
1159
1160 case DELETE_GLOBAL:
1161 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001162 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1163 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001164 break;
1165
Guido van Rossum374a9221991-04-04 10:40:29 +00001166 case LOAD_CONST:
1167 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001168 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 PUSH(x);
1170 break;
1171
1172 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001173 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001175 PyErr_SetString(PyExc_SystemError,
1176 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001177 break;
1178 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001179 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001181 PyErr_Clear();
1182 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001183 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001184 PyErr_Clear();
1185 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001187 PyErr_SetObject(
1188 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 break;
1190 }
1191 }
1192 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001193 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 PUSH(x);
1195 break;
1196
1197 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001198 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001199 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001201 PyErr_Clear();
1202 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001203 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001204 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 break;
1206 }
1207 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001208 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 PUSH(x);
1210 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001211
Guido van Rossum9bfef441993-03-29 10:43:31 +00001212 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001213 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001214 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001215 PyErr_SetObject(PyExc_NameError,
1216 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001217 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001218 break;
1219 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001220 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001221 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001222 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001223 break;
1224
1225 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001226 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001227 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001228 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001229
1230 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001231 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001232 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001233
1234 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001235 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 if (x != NULL) {
1237 for (; --oparg >= 0;) {
1238 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 }
1241 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001242 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 }
1244 break;
1245
1246 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001247 x = PyList_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 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 if (err != 0)
1253 break;
1254 }
1255 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001256 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001257 }
1258 break;
1259
1260 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001263 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
1265
1266 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001267 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001268 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001269 x = PyObject_GetAttr(v, w);
1270 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001271 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001272 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 break;
1274
1275 case COMPARE_OP:
1276 w = POP();
1277 v = POP();
Guido van Rossum5b7313a1992-04-06 13:24:57 +00001278 x = cmp_outcome(oparg, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001279 Py_DECREF(v);
1280 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001282 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 break;
1284
1285 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001286 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001289 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001290 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001291 break;
1292 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 if (PyCFunction_Check(x)) {
1294 u = Py_None;
1295 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001296 }
1297 else {
1298 u = find_from_args(f, INSTR_OFFSET());
1299 if (u == NULL) {
1300 x = u;
1301 break;
1302 }
1303 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001305 w,
1306 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001307 f->f_locals == NULL ?
1308 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001309 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311 if (w == NULL) {
1312 x = NULL;
1313 break;
1314 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001315 x = PyEval_CallObject(x, w);
1316 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001317 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001318 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 break;
1320
1321 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001322 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001323 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001324 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001325 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001326 PyErr_SetString(PyExc_SystemError,
1327 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001328 break;
1329 }
1330 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001332 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001334
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 case JUMP_FORWARD:
1336 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001337 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338
1339 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001340 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001341 if (err > 0)
1342 err = 0;
1343 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001345 else
1346 break;
1347 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001348
1349 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001351 if (err > 0) {
1352 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001354 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001355 else if (err == 0)
1356 ;
1357 else
1358 break;
1359 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001360
1361 case JUMP_ABSOLUTE:
1362 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001363 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001364
1365 case FOR_LOOP:
1366 /* for v in s: ...
1367 On entry: stack contains s, i.
1368 On exit: stack contains s, i+1, s[i];
1369 but if loop exhausted:
1370 s, i are popped, and we jump */
1371 w = POP(); /* Loop index */
1372 v = POP(); /* Sequence object */
1373 u = loop_subscript(v, w);
1374 if (u != NULL) {
1375 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001376 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001377 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001378 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001379 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001380 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 }
1382 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001383 Py_DECREF(v);
1384 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 /* A NULL can mean "s exhausted"
1386 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001389 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001391 continue;
1392 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 }
1394 break;
1395
1396 case SETUP_LOOP:
1397 case SETUP_EXCEPT:
1398 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001401 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001402
1403 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001404#ifdef LLTRACE
1405 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001407#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001408 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001409 if (f->f_trace == NULL)
1410 continue;
1411 /* Trace each line of code reached */
1412 f->f_lasti = INSTR_OFFSET();
1413 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001414 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001416
1417 case CALL_FUNCTION:
1418 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001419 int na = oparg & 0xff;
1420 int nk = (oparg>>8) & 0xff;
1421 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 PyObject **pfunc = stack_pointer - n - 1;
1423 PyObject *func = *pfunc;
1424 PyObject *self = NULL;
1425 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001426 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 if (PyMethod_Check(func)) {
1428 self = PyMethod_Self(func);
1429 class = PyMethod_Class(func);
1430 func = PyMethod_Function(func);
1431 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001432 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 Py_INCREF(self);
1434 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001435 *pfunc = self;
1436 na++;
1437 n++;
1438 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001439 else {
1440 /* Unbound methods must be
1441 called with an instance of
1442 the class (or a derived
1443 class) as first argument */
1444 if (na > 0 &&
1445 (self = stack_pointer[-n])
1446 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001447 PyInstance_Check(self) &&
1448 PyClass_IsSubclass(
1449 (PyObject *)
1450 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001451 ->in_class),
1452 class))
1453 /* Handy-dandy */ ;
1454 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001455 PyErr_SetString(
1456 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001457 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001458 x = NULL;
1459 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001460 }
1461 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001462 }
1463 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001464 Py_INCREF(func);
1465 if (PyFunction_Check(func)) {
1466 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001467 PyObject *globals =
1468 PyFunction_GetGlobals(func);
1469 PyObject *argdefs =
1470 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001471 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001472 int nd;
1473 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001475 nd = ((PyTupleObject *)argdefs) ->
1476 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001477 }
1478 else {
1479 d = NULL;
1480 nd = 0;
1481 }
1482 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 (PyCodeObject *)co,
1484 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001485 stack_pointer-n, na,
1486 stack_pointer-2*nk, nk,
1487 d, nd,
1488 class);
1489 }
1490 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 PyObject *args = PyTuple_New(na);
1492 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001493 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001494 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001495 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001496 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001497 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001499 if (kwdict == NULL) {
1500 x = NULL;
1501 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001502 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001503 err = 0;
1504 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 PyObject *value = POP();
1506 PyObject *key = POP();
1507 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001508 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001509 Py_DECREF(key);
1510 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001511 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001512 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001513 }
1514 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 Py_DECREF(args);
1516 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001517 break;
1518 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001520 while (--na >= 0) {
1521 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001522 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001523 }
1524 x = PyEval_CallObjectWithKeywords(
1525 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 Py_DECREF(args);
1527 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001528 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001530 while (stack_pointer > pfunc) {
1531 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001533 }
1534 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001535 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001536 break;
1537 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001538
Guido van Rossum681d79a1995-07-18 14:51:37 +00001539 case MAKE_FUNCTION:
1540 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 x = PyFunction_New(v, f->f_globals);
1542 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001543 /* XXX Maybe this should be a separate opcode? */
1544 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001545 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001546 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001548 x = NULL;
1549 break;
1550 }
1551 while (--oparg >= 0) {
1552 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001554 }
1555 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557 }
1558 PUSH(x);
1559 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001560
1561 case BUILD_SLICE:
1562 if (oparg == 3)
1563 w = POP();
1564 else
1565 w = NULL;
1566 v = POP();
1567 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001568 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001569 Py_DECREF(u);
1570 Py_DECREF(v);
1571 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001572 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001573 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001574 break;
1575
1576
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 default:
1578 fprintf(stderr,
1579 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001580 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 why = WHY_EXCEPTION;
1583 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001584
1585#ifdef CASE_TOO_BIG
1586 }
1587#endif
1588
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 } /* switch */
1590
1591 on_error:
1592
1593 /* Quickly continue if no error occurred */
1594
1595 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001596 if (err == 0 && x != NULL) {
1597#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001599 fprintf(stderr,
1600 "XXX undetected error\n");
1601 else
1602#endif
1603 continue; /* Normal, fast path */
1604 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001605 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 err = 0;
1608 }
1609
Guido van Rossum801dcae1992-04-08 11:32:32 +00001610#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001611 /* Double-check exception status */
1612
1613 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001615 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001616 PyErr_SetString(PyExc_SystemError,
1617 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 why = WHY_EXCEPTION;
1619 }
1620 }
1621 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001622 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001623 fprintf(stderr,
1624 "XXX undetected error (why=%d)\n",
1625 why);
1626 why = WHY_EXCEPTION;
1627 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001628 }
1629#endif
1630
1631 /* Log traceback info if this is a real exception */
1632
1633 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001634 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001636 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001638
Guido van Rossume59214e1994-08-30 08:01:59 +00001639 if (f->f_trace)
1640 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001641 if (tstate->sys_profilefunc)
1642 call_exc_trace(&tstate->sys_profilefunc,
1643 (PyObject**)0, f);
1644}
Guido van Rossum374a9221991-04-04 10:40:29 +00001645
1646 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1647
1648 if (why == WHY_RERAISE)
1649 why = WHY_EXCEPTION;
1650
1651 /* Unwind stacks if a (pseudo) exception occurred */
1652
1653 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001654 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001655 while (STACK_LEVEL() > b->b_level) {
1656 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 }
1659 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1660 why = WHY_NOT;
1661 JUMPTO(b->b_handler);
1662 break;
1663 }
1664 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001665 (b->b_type == SETUP_EXCEPT &&
1666 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001667 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 PyObject *exc, *val, *tb;
1669 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001671 val = Py_None;
1672 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 /* Make the raw exception data
1675 available to the handler,
1676 so a program can emulate the
1677 Python main loop. Don't do
1678 this for 'finally'. */
1679 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001680 set_exc_info(tstate,
1681 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001683 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 PUSH(val);
1685 PUSH(exc);
1686 }
1687 else {
1688 if (why == WHY_RETURN)
1689 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001690 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 PUSH(v);
1692 }
1693 why = WHY_NOT;
1694 JUMPTO(b->b_handler);
1695 break;
1696 }
1697 } /* unwind stack */
1698
1699 /* End the loop if we still have an error (or return) */
1700
1701 if (why != WHY_NOT)
1702 break;
1703
1704 } /* main loop */
1705
1706 /* Pop remaining stack entries */
1707
1708 while (!EMPTY()) {
1709 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 }
1712
Guido van Rossum96a42c81992-01-12 02:29:51 +00001713 if (why != WHY_RETURN)
1714 retval = NULL;
1715
Guido van Rossume59214e1994-08-30 08:01:59 +00001716 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001717 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001718 if (call_trace(&f->f_trace, &f->f_trace, f,
1719 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001721 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001722 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001723 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001724 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001725 }
1726
Guido van Rossuma027efa1997-05-05 20:56:21 +00001727 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1728 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001729 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001731 retval = NULL;
1732 why = WHY_EXCEPTION;
1733 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001734 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001735
Guido van Rossuma027efa1997-05-05 20:56:21 +00001736 reset_exc_info(tstate);
1737
1738 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001739
1740 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001741
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001743
Guido van Rossuma027efa1997-05-05 20:56:21 +00001744 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001745 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746
Guido van Rossum96a42c81992-01-12 02:29:51 +00001747 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001748}
1749
Guido van Rossuma027efa1997-05-05 20:56:21 +00001750static void
1751set_exc_info(tstate, type, value, tb)
1752 PyThreadState *tstate;
1753 PyObject *type;
1754 PyObject *value;
1755 PyObject *tb;
1756{
1757 PyFrameObject *frame;
1758 frame = tstate->frame;
1759 if (frame->f_exc_type == NULL) {
1760 /* This frame didn't catch an exception before */
1761 /* Save previous exception of this thread in this frame */
1762 Py_XDECREF(frame->f_exc_type);
1763 Py_XDECREF(frame->f_exc_value);
1764 Py_XDECREF(frame->f_exc_traceback);
1765 if (tstate->exc_type == NULL) {
1766 Py_INCREF(Py_None);
1767 tstate->exc_type = Py_None;
1768 }
1769 Py_XINCREF(tstate->exc_type);
1770 Py_XINCREF(tstate->exc_value);
1771 Py_XINCREF(tstate->exc_traceback);
1772 frame->f_exc_type = tstate->exc_type;
1773 frame->f_exc_value = tstate->exc_value;
1774 frame->f_exc_traceback = tstate->exc_traceback;
1775 }
1776 /* Set new exception for this thread */
1777 Py_XINCREF(type);
1778 Py_XINCREF(value);
1779 Py_XINCREF(tb);
1780 tstate->exc_type = type;
1781 tstate->exc_value = value;
1782 tstate->exc_traceback = tb;
1783 /* For b/w compatibility */
1784 PySys_SetObject("exc_type", type);
1785 PySys_SetObject("exc_value", value);
1786 PySys_SetObject("exc_traceback", tb);
1787}
1788
1789static void
1790reset_exc_info(tstate)
1791 PyThreadState *tstate;
1792{
1793 PyFrameObject *frame;
1794 frame = tstate->frame;
1795 if (frame->f_exc_type != NULL) {
1796 /* This frame caught an exception */
1797 Py_XDECREF(tstate->exc_type);
1798 Py_XDECREF(tstate->exc_value);
1799 Py_XDECREF(tstate->exc_traceback);
1800 Py_XINCREF(frame->f_exc_type);
1801 Py_XINCREF(frame->f_exc_value);
1802 Py_XINCREF(frame->f_exc_traceback);
1803 tstate->exc_type = frame->f_exc_type;
1804 tstate->exc_value = frame->f_exc_value;
1805 tstate->exc_traceback = frame->f_exc_traceback;
1806 /* For b/w compatibility */
1807 PySys_SetObject("exc_type", frame->f_exc_type);
1808 PySys_SetObject("exc_value", frame->f_exc_value);
1809 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1810 }
1811 Py_XDECREF(frame->f_exc_type);
1812 Py_XDECREF(frame->f_exc_value);
1813 Py_XDECREF(frame->f_exc_traceback);
1814 frame->f_exc_type = NULL;
1815 frame->f_exc_value = NULL;
1816 frame->f_exc_traceback = NULL;
1817}
1818
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001819/* Logic for the raise statement (too complicated for inlining).
1820 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001821static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001822do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001823 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001824{
1825 /* We support the following forms of raise:
1826 raise <class>, <classinstance>
1827 raise <class>, <argument tuple>
1828 raise <class>, None
1829 raise <class>, <argument>
1830 raise <classinstance>, None
1831 raise <string>, <object>
1832 raise <string>, None
1833
1834 An omitted second argument is the same as None.
1835
1836 In addition, raise <tuple>, <anything> is the same as
1837 raising the tuple's first item (and it better have one!);
1838 this rule is applied recursively.
1839
1840 Finally, an optional third argument can be supplied, which
1841 gives the traceback to be substituted (useful when
1842 re-raising an exception after examining it). */
1843
1844 /* First, check the traceback argument, replacing None with
1845 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 if (tb == Py_None) {
1847 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001848 tb = NULL;
1849 }
1850 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001852 "raise 3rd arg must be traceback or None");
1853 goto raise_error;
1854 }
1855
1856 /* Next, replace a missing value with None */
1857 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001858 value = Py_None;
1859 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001860 }
1861
1862 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1864 PyObject *tmp = type;
1865 type = PyTuple_GET_ITEM(type, 0);
1866 Py_INCREF(type);
1867 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001868 }
1869
1870 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001871 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001872 ;
1873 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001875 /* Raising a class. If the value is an instance, it
1876 better be an instance of the class. If it is not,
1877 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001878 if (PyInstance_Check(value)) {
1879 PyObject *inclass = (PyObject*)
1880 (((PyInstanceObject*)value)->in_class);
1881 if (!PyClass_IsSubclass(inclass, type)) {
1882 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001883 "raise <class>, <instance> requires that <instance> is a member of <class>");
1884 goto raise_error;
1885 }
1886 }
1887 else {
1888 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00001889 PyObject *args, *res;
1890 if (value == Py_None)
1891 args = Py_BuildValue("()");
1892 else if (PyTuple_Check(value)) {
1893 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001894 args = value;
1895 }
1896 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001897 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001898 if (args == NULL)
1899 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001900 res = PyEval_CallObject(type, args);
1901 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001902 if (res == NULL)
1903 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001904 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001905 value = res;
1906 }
1907 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001908 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001909 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001910 if (value != Py_None) {
1911 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001912 "instance exception may not have a separate value");
1913 goto raise_error;
1914 }
1915 else {
1916 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00001917 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001918 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00001919 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
1920 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001921 }
1922 }
1923 else {
1924 /* Not something you can raise. You get an exception
1925 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00001926 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001927 "exceptions must be strings, classes, or instances");
1928 goto raise_error;
1929 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001930 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001931 if (tb == NULL)
1932 return WHY_EXCEPTION;
1933 else
1934 return WHY_RERAISE;
1935 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00001936 Py_XDECREF(value);
1937 Py_XDECREF(type);
1938 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001939 return WHY_EXCEPTION;
1940}
1941
Guido van Rossum96a42c81992-01-12 02:29:51 +00001942#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001943static int
1944prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00001945 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001946 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001947{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001948 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00001949 if (PyObject_Print(v, stdout, 0) != 0)
1950 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001951 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001952}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001955static void
1956call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00001957 PyObject **p_trace, **p_newtrace;
1958 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001959{
Guido van Rossumb209a111997-04-29 18:18:01 +00001960 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001961 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00001962 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001963 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001964 value = Py_None;
1965 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001966 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001967 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001968 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001970 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001971 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001973 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001974 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00001975 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001976 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001977 Py_XDECREF(type);
1978 Py_XDECREF(value);
1979 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001981}
1982
1983static int
1984call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00001985 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001986 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00001987 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001988 may point to NULL variable;
1989 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00001990 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001991 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00001992 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001993{
Guido van Rossuma027efa1997-05-05 20:56:21 +00001994 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00001995 PyObject *args, *what;
1996 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001997
Guido van Rossuma027efa1997-05-05 20:56:21 +00001998 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001999 /* Don't do recursive traces */
2000 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002001 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002002 *p_newtrace = NULL;
2003 }
2004 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002005 }
2006
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002008 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 goto Py_Cleanup;
2010 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002011 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002012 goto Py_Cleanup;
2013 Py_INCREF(f);
2014 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2015 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002016 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 arg = Py_None;
2018 Py_INCREF(arg);
2019 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002020 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 PyFrame_FastToLocals(f);
2022 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2023 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002024 tstate->tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 Py_Cleanup:
2026 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002027 if (res == NULL) {
2028 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 PyTraceBack_Here(f);
2030 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002031 *p_trace = NULL;
2032 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002033 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002034 *p_newtrace = NULL;
2035 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002036 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002037 }
2038 else {
2039 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 Py_XDECREF(*p_newtrace);
2041 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002042 *p_newtrace = NULL;
2043 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002045 *p_newtrace = res;
2046 }
2047 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002049 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002050 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002051}
2052
Guido van Rossumb209a111997-04-29 18:18:01 +00002053PyObject *
2054PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002055{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002056 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002057 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00002059 else
2060 return current_frame->f_builtins;
2061}
2062
Guido van Rossumb209a111997-04-29 18:18:01 +00002063PyObject *
2064PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002065{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002066 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002067 if (current_frame == NULL)
2068 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002069 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002070 return current_frame->f_locals;
2071}
2072
Guido van Rossumb209a111997-04-29 18:18:01 +00002073PyObject *
2074PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002075{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002076 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002077 if (current_frame == NULL)
2078 return NULL;
2079 else
2080 return current_frame->f_globals;
2081}
2082
Guido van Rossumb209a111997-04-29 18:18:01 +00002083PyObject *
2084PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002085{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002086 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002088}
2089
Guido van Rossum6135a871995-01-09 17:53:26 +00002090int
Guido van Rossumb209a111997-04-29 18:18:01 +00002091PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002092{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002093 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002094 return current_frame == NULL ? 0 : current_frame->f_restricted;
2095}
2096
Guido van Rossum3f5da241990-12-20 15:06:42 +00002097void
Guido van Rossumb209a111997-04-29 18:18:01 +00002098Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099{
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 PyObject *f = PySys_GetObject("stdout");
2101 if (PyFile_SoftSpace(f, 0))
2102 PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103}
2104
Guido van Rossum3f5da241990-12-20 15:06:42 +00002105
Guido van Rossum681d79a1995-07-18 14:51:37 +00002106/* External interface to call any callable object.
2107 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002108
Guido van Rossumb209a111997-04-29 18:18:01 +00002109PyObject *
2110PyEval_CallObject(func, arg)
2111 PyObject *func;
2112 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002113{
Guido van Rossumb209a111997-04-29 18:18:01 +00002114 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002115}
Guido van Rossume59214e1994-08-30 08:01:59 +00002116
Guido van Rossumb209a111997-04-29 18:18:01 +00002117PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002118PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 PyObject *func;
2120 PyObject *arg;
2121 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002122{
2123 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002125
2126 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002127 arg = PyTuple_New(0);
2128 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002129 PyErr_SetString(PyExc_TypeError,
2130 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002131 return NULL;
2132 }
2133 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002134 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002135
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002137 PyErr_SetString(PyExc_TypeError,
2138 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002139 return NULL;
2140 }
2141
Guido van Rossum150b2df1996-12-05 23:17:11 +00002142 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002143 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002145 result = call_function(func, arg, kw);
2146 else
2147 result = call_builtin(func, arg, kw);
2148
Guido van Rossumb209a111997-04-29 18:18:01 +00002149 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002150
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 if (result == NULL && !PyErr_Occurred())
2152 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002153 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002154
2155 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002156}
2157
Guido van Rossumb209a111997-04-29 18:18:01 +00002158static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002159call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002160 PyObject *func;
2161 PyObject *arg;
2162 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163{
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 if (PyCFunction_Check(func)) {
2165 PyCFunction meth = PyCFunction_GetFunction(func);
2166 PyObject *self = PyCFunction_GetSelf(func);
2167 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002168 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002170 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002172 else if (size == 0)
2173 arg = NULL;
2174 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002175 if (flags & METH_KEYWORDS)
2176 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 if (kw != NULL && PyDict_Size(kw) != 0) {
2178 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002179 "this function takes no keyword arguments");
2180 return NULL;
2181 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002182 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002184 if (PyClass_Check(func)) {
2185 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002187 if (PyInstance_Check(func)) {
2188 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002189 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 PyErr_Clear();
2191 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002192 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002193 return NULL;
2194 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002195 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002196 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002197 return res;
2198 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200 return NULL;
2201}
2202
Guido van Rossumb209a111997-04-29 18:18:01 +00002203static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002204call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 PyObject *func;
2206 PyObject *arg;
2207 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208{
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 PyObject *class = NULL; /* == owner */
2210 PyObject *argdefs;
2211 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002212 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002213 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002214
Guido van Rossumb209a111997-04-29 18:18:01 +00002215 if (kw != NULL && !PyDict_Check(kw)) {
2216 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002217 return NULL;
2218 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219
Guido van Rossumb209a111997-04-29 18:18:01 +00002220 if (PyMethod_Check(func)) {
2221 PyObject *self = PyMethod_Self(func);
2222 class = PyMethod_Class(func);
2223 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002224 if (self == NULL) {
2225 /* Unbound methods must be called with an instance of
2226 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002227 if (PyTuple_Size(arg) >= 1) {
2228 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002229 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 PyInstance_Check(self) &&
2231 PyClass_IsSubclass((PyObject *)
2232 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002233 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002234 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002235 else
2236 self = NULL;
2237 }
2238 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002239 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002240 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002241 return NULL;
2242 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002244 }
2245 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002246 int argcount = PyTuple_Size(arg);
2247 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002248 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002249 if (newarg == NULL)
2250 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 Py_INCREF(self);
2252 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002253 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 PyObject *v = PyTuple_GET_ITEM(arg, i);
2255 Py_XINCREF(v);
2256 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002257 }
2258 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002259 }
2260 }
2261 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002263 PyErr_SetString(PyExc_TypeError,
2264 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265 return NULL;
2266 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002267 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002269
2270 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2272 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2273 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002274 }
2275 else {
2276 d = NULL;
2277 nd = 0;
2278 }
2279
2280 if (kw != NULL) {
2281 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002282 nk = PyDict_Size(kw);
2283 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002284 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002285 PyErr_NoMemory();
2286 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002287 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002288 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002289 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002290 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291 i += 2;
2292 nk = i/2;
2293 /* XXX This is broken if the caller deletes dict items! */
2294 }
2295 else {
2296 k = NULL;
2297 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002298 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299
Guido van Rossum681d79a1995-07-18 14:51:37 +00002300 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002301 (PyCodeObject *)PyFunction_GetCode(func),
2302 PyFunction_GetGlobals(func), (PyObject *)NULL,
2303 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002304 k, nk,
2305 d, nd,
2306 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 Py_DECREF(arg);
2309 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310
Guido van Rossum681d79a1995-07-18 14:51:37 +00002311 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312}
2313
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002314#define SLICE_ERROR_MSG \
2315 "standard sequence type does not support step size other than one"
2316
Guido van Rossumb209a111997-04-29 18:18:01 +00002317static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002318loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002319 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320{
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002322 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 return NULL;
2326 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002327 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002328 v = (*sq->sq_item)(v, i);
2329 if (v)
2330 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 if (PyErr_Occurred() == PyExc_IndexError)
2332 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002333 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334}
2335
2336static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002337slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 int *pi;
2340{
2341 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002342 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002343 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002344 PyErr_SetString(PyExc_TypeError,
2345 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002346 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002348 x = PyInt_AsLong(v);
2349 /* Truncate -- very long indices are truncated anyway */
2350 if (x > INT_MAX)
2351 x = INT_MAX;
2352 else if (x < -INT_MAX)
2353 x = 0;
2354 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002356 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357}
2358
Guido van Rossumb209a111997-04-29 18:18:01 +00002359static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002360apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002361 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002363 int ilow = 0, ihigh = INT_MAX;
2364 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002366 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002367 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002368 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002370
2371static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002372assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002373 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002375 int ilow = 0, ihigh = INT_MAX;
2376 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002378 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002379 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002380 if (x == NULL)
2381 return PySequence_DelSlice(u, ilow, ihigh);
2382 else
2383 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384}
2385
2386static int
2387cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002388 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389{
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002392 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002394 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 return 1;
2397 }
2398 return 0;
2399 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002400 if (PyClass_Check(v) && PyClass_Check(err))
2401 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 return err == v;
2403}
2404
Guido van Rossum3f5da241990-12-20 15:06:42 +00002405static int
2406cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002408{
Guido van Rossume59214e1994-08-30 08:01:59 +00002409 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002410 PyObject *x;
2411 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002412 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002414 register char *s, *end;
2415 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002416 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2417 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002418 "string member test needs char left operand");
2419 return -1;
2420 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 c = PyString_AsString(v)[0];
2422 s = PyString_AsString(w);
2423 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002424 while (s < end) {
2425 if (c == *s++)
2426 return 1;
2427 }
2428 return 0;
2429 }
2430 sq = w->ob_type->tp_as_sequence;
2431 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002433 "'in' or 'not in' needs sequence right argument");
2434 return -1;
2435 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002436 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002437 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002438 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002439 if (PyErr_Occurred() == PyExc_IndexError) {
2440 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002441 break;
2442 }
2443 return -1;
2444 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 cmp = PyObject_Compare(v, x);
2446 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002447 if (cmp == 0)
2448 return 1;
2449 }
2450 return 0;
2451}
2452
Guido van Rossumb209a111997-04-29 18:18:01 +00002453static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002454cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002455 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 register PyObject *v;
2457 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458{
2459 register int cmp;
2460 register int res = 0;
2461 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002462 case IS:
2463 case IS_NOT:
2464 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002465 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466 res = !res;
2467 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468 case IN:
2469 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002470 res = cmp_member(v, w);
2471 if (res < 0)
2472 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002473 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002474 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 break;
2476 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002477 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 break;
2479 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 cmp = PyObject_Compare(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002481 switch (op) {
2482 case LT: res = cmp < 0; break;
2483 case LE: res = cmp <= 0; break;
2484 case EQ: res = cmp == 0; break;
2485 case NE: res = cmp != 0; break;
2486 case GT: res = cmp > 0; break;
2487 case GE: res = cmp >= 0; break;
2488 /* XXX no default? (res is initialized to 0 though) */
2489 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002491 v = res ? Py_True : Py_False;
2492 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 return v;
2494}
2495
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496static int
2497import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 PyObject *locals;
2499 PyObject *v;
2500 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002501{
Guido van Rossumb209a111997-04-29 18:18:01 +00002502 PyObject *w, *x;
2503 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002504 PyErr_SetString(PyExc_TypeError,
2505 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002506 return -1;
2507 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 w = PyModule_GetDict(v);
2509 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002510 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002511 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002512 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 while (PyDict_Next(w, &pos, &name, &value)) {
2514 if (!PyString_Check(name) ||
2515 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002516 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002517 Py_INCREF(value);
2518 err = PyDict_SetItem(locals, name, value);
2519 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002520 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002522 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002523 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002524 }
2525 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002527 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002528 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002529 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002530 PyString_AsString(name));
2531 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002532 return -1;
2533 }
2534 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002536 }
2537}
2538
Guido van Rossumb209a111997-04-29 18:18:01 +00002539static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002540build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 PyObject *methods; /* dictionary */
2542 PyObject *bases; /* tuple containing classes */
2543 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002544{
Guido van Rossum25831651993-05-19 14:50:45 +00002545 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002546 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002547 PyErr_SetString(PyExc_SystemError,
2548 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002549 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002550 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002551 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002552 PyErr_SetString(PyExc_SystemError,
2553 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002554 return NULL;
2555 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002556 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 PyErr_SetString(PyExc_SystemError,
2558 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002559 return NULL;
2560 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002561 for (i = PyTuple_Size(bases); --i >= 0; ) {
2562 PyObject *base = PyTuple_GET_ITEM(bases, i);
2563 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002564 /* Call the base's *type*, if it is callable.
2565 This code is a hook for Donald Beaudry's
2566 and Jim Fulton's type extensions. In
2567 unexended Python it will never be triggered
2568 since its types are not callable. */
2569 if (base->ob_type->ob_type->tp_call) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 PyObject *args;
2571 PyObject *class;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002572 args = Py_BuildValue("(OOO)",
2573 name, bases, methods);
2574 class = PyEval_CallObject(
2575 (PyObject *)base->ob_type, args);
Guido van Rossumb209a111997-04-29 18:18:01 +00002576 Py_DECREF(args);
Guido van Rossum150b2df1996-12-05 23:17:11 +00002577 return class;
2578 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002579 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002580 "base is not a class object");
2581 return NULL;
2582 }
2583 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002585}
2586
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002587static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002588exec_statement(f, prog, globals, locals)
2589 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002590 PyObject *prog;
2591 PyObject *globals;
2592 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002593{
2594 char *s;
2595 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002596 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002597 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002598
Guido van Rossumb209a111997-04-29 18:18:01 +00002599 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2600 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002601 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002602 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002603 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002604 locals = PyTuple_GetItem(prog, 2);
2605 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002606 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 if (globals == Py_None) {
2608 globals = PyEval_GetGlobals();
2609 if (locals == Py_None) {
2610 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002611 plain = 1;
2612 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002613 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002614 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002615 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002616 if (!PyString_Check(prog) &&
2617 !PyCode_Check(prog) &&
2618 !PyFile_Check(prog)) {
2619 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002620 "exec 1st arg must be string, code or file object");
2621 return -1;
2622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2624 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002625 "exec 2nd/3rd args must be dict or None");
2626 return -1;
2627 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002629 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002631 if (PyEval_EvalCode((PyCodeObject *) prog,
2632 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002633 return -1;
2634 return 0;
2635 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 if (PyFile_Check(prog)) {
2637 FILE *fp = PyFile_AsFile(prog);
2638 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002639 if (PyRun_File(fp, name, Py_file_input,
2640 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002641 return -1;
2642 return 0;
2643 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002645 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002646 PyErr_SetString(PyExc_ValueError,
2647 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002648 return -1;
2649 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002650 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002651 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002652 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002654 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002655 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002656 return 0;
2657}
Guido van Rossum24c13741995-02-14 09:42:43 +00002658
Guido van Rossum1aa14831997-01-21 05:34:20 +00002659/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002660static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002661find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002663 int nexti;
2664{
2665 int opcode;
2666 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002668 unsigned char *next_instr;
2669
2670 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2671 opcode = (*next_instr++);
2672 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 Py_INCREF(Py_None);
2674 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002675 }
2676
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002678 if (list == NULL)
2679 return NULL;
2680
2681 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002682 oparg = (next_instr[1]<<8) + next_instr[0];
2683 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002684 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 if (PyList_Append(list, name) < 0) {
2686 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002687 break;
2688 }
2689 opcode = (*next_instr++);
2690 } while (opcode == IMPORT_FROM);
2691
2692 return list;
2693}
Guido van Rossum950361c1997-01-24 13:49:28 +00002694
2695
2696#ifdef DYNAMIC_EXECUTION_PROFILE
2697
2698PyObject *
2699getarray(a)
2700 long a[256];
2701{
2702 int i;
2703 PyObject *l = PyList_New(256);
2704 if (l == NULL) return NULL;
2705 for (i = 0; i < 256; i++) {
2706 PyObject *x = PyInt_FromLong(a[i]);
2707 if (x == NULL) {
2708 Py_DECREF(l);
2709 return NULL;
2710 }
2711 PyList_SetItem(l, i, x);
2712 }
2713 for (i = 0; i < 256; i++)
2714 a[i] = 0;
2715 return l;
2716}
2717
2718PyObject *
2719_Py_GetDXProfile(self, args)
2720 PyObject *self, *args;
2721{
2722#ifndef DXPAIRS
2723 return getarray(dxp);
2724#else
2725 int i;
2726 PyObject *l = PyList_New(257);
2727 if (l == NULL) return NULL;
2728 for (i = 0; i < 257; i++) {
2729 PyObject *x = getarray(dxpairs[i]);
2730 if (x == NULL) {
2731 Py_DECREF(l);
2732 return NULL;
2733 }
2734 PyList_SetItem(l, i, x);
2735 }
2736 return l;
2737#endif
2738}
2739
2740#endif