blob: e8ba965c31766a688027821b9eda052c93b89d1c [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 Rossumdf0d00e1997-05-20 15:57:49 +0000572#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000573 /* 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;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001758 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001759 frame = tstate->frame;
1760 if (frame->f_exc_type == NULL) {
1761 /* This frame didn't catch an exception before */
1762 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001763 if (tstate->exc_type == NULL) {
1764 Py_INCREF(Py_None);
1765 tstate->exc_type = Py_None;
1766 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001767 tmp_type = frame->f_exc_type;
1768 tmp_value = frame->f_exc_value;
1769 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001770 Py_XINCREF(tstate->exc_type);
1771 Py_XINCREF(tstate->exc_value);
1772 Py_XINCREF(tstate->exc_traceback);
1773 frame->f_exc_type = tstate->exc_type;
1774 frame->f_exc_value = tstate->exc_value;
1775 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001776 Py_XDECREF(tmp_type);
1777 Py_XDECREF(tmp_value);
1778 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001779 }
1780 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001781 tmp_type = tstate->exc_type;
1782 tmp_value = tstate->exc_value;
1783 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001784 Py_XINCREF(type);
1785 Py_XINCREF(value);
1786 Py_XINCREF(tb);
1787 tstate->exc_type = type;
1788 tstate->exc_value = value;
1789 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001790 Py_XDECREF(tmp_type);
1791 Py_XDECREF(tmp_value);
1792 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001793 /* For b/w compatibility */
1794 PySys_SetObject("exc_type", type);
1795 PySys_SetObject("exc_value", value);
1796 PySys_SetObject("exc_traceback", tb);
1797}
1798
1799static void
1800reset_exc_info(tstate)
1801 PyThreadState *tstate;
1802{
1803 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001804 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001805 frame = tstate->frame;
1806 if (frame->f_exc_type != NULL) {
1807 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001808 tmp_type = tstate->exc_type;
1809 tmp_value = tstate->exc_value;
1810 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001811 Py_XINCREF(frame->f_exc_type);
1812 Py_XINCREF(frame->f_exc_value);
1813 Py_XINCREF(frame->f_exc_traceback);
1814 tstate->exc_type = frame->f_exc_type;
1815 tstate->exc_value = frame->f_exc_value;
1816 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001817 Py_XDECREF(tmp_type);
1818 Py_XDECREF(tmp_value);
1819 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001820 /* For b/w compatibility */
1821 PySys_SetObject("exc_type", frame->f_exc_type);
1822 PySys_SetObject("exc_value", frame->f_exc_value);
1823 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1824 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001825 tmp_type = frame->f_exc_type;
1826 tmp_value = frame->f_exc_value;
1827 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001828 frame->f_exc_type = NULL;
1829 frame->f_exc_value = NULL;
1830 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001831 Py_XDECREF(tmp_type);
1832 Py_XDECREF(tmp_value);
1833 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001834}
1835
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001836/* Logic for the raise statement (too complicated for inlining).
1837 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001838static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001839do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001840 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001841{
1842 /* We support the following forms of raise:
1843 raise <class>, <classinstance>
1844 raise <class>, <argument tuple>
1845 raise <class>, None
1846 raise <class>, <argument>
1847 raise <classinstance>, None
1848 raise <string>, <object>
1849 raise <string>, None
1850
1851 An omitted second argument is the same as None.
1852
1853 In addition, raise <tuple>, <anything> is the same as
1854 raising the tuple's first item (and it better have one!);
1855 this rule is applied recursively.
1856
1857 Finally, an optional third argument can be supplied, which
1858 gives the traceback to be substituted (useful when
1859 re-raising an exception after examining it). */
1860
1861 /* First, check the traceback argument, replacing None with
1862 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001863 if (tb == Py_None) {
1864 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001865 tb = NULL;
1866 }
1867 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001869 "raise 3rd arg must be traceback or None");
1870 goto raise_error;
1871 }
1872
1873 /* Next, replace a missing value with None */
1874 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001875 value = Py_None;
1876 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001877 }
1878
1879 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001880 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1881 PyObject *tmp = type;
1882 type = PyTuple_GET_ITEM(type, 0);
1883 Py_INCREF(type);
1884 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001885 }
1886
1887 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001888 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001889 ;
1890 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001891 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001892 /* Raising a class. If the value is an instance, it
1893 better be an instance of the class. If it is not,
1894 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001895 if (PyInstance_Check(value)) {
1896 PyObject *inclass = (PyObject*)
1897 (((PyInstanceObject*)value)->in_class);
1898 if (!PyClass_IsSubclass(inclass, type)) {
1899 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001900 "raise <class>, <instance> requires that <instance> is a member of <class>");
1901 goto raise_error;
1902 }
1903 }
1904 else {
1905 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00001906 PyObject *args, *res;
1907 if (value == Py_None)
1908 args = Py_BuildValue("()");
1909 else if (PyTuple_Check(value)) {
1910 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001911 args = value;
1912 }
1913 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001914 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001915 if (args == NULL)
1916 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001917 res = PyEval_CallObject(type, args);
1918 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001919 if (res == NULL)
1920 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00001921 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001922 value = res;
1923 }
1924 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001925 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001926 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001927 if (value != Py_None) {
1928 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001929 "instance exception may not have a separate value");
1930 goto raise_error;
1931 }
1932 else {
1933 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00001934 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001935 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00001936 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
1937 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001938 }
1939 }
1940 else {
1941 /* Not something you can raise. You get an exception
1942 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00001943 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001944 "exceptions must be strings, classes, or instances");
1945 goto raise_error;
1946 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001947 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001948 if (tb == NULL)
1949 return WHY_EXCEPTION;
1950 else
1951 return WHY_RERAISE;
1952 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00001953 Py_XDECREF(value);
1954 Py_XDECREF(type);
1955 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001956 return WHY_EXCEPTION;
1957}
1958
Guido van Rossum96a42c81992-01-12 02:29:51 +00001959#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00001960static int
1961prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00001962 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001963 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001964{
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00001966 if (PyObject_Print(v, stdout, 0) != 0)
1967 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969}
Guido van Rossum3f5da241990-12-20 15:06:42 +00001970#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001972static void
1973call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00001974 PyObject **p_trace, **p_newtrace;
1975 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001976{
Guido van Rossumb209a111997-04-29 18:18:01 +00001977 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001978 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001980 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001981 value = Py_None;
1982 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00001983 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001984 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001985 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001987 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001988 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001989 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001990 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001991 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00001992 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001993 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 Py_XDECREF(type);
1995 Py_XDECREF(value);
1996 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001997 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001998}
1999
2000static int
2001call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002002 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002003 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002004 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002005 may point to NULL variable;
2006 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002008 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002010{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002011 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002012 PyObject *args, *what;
2013 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002014
Guido van Rossuma027efa1997-05-05 20:56:21 +00002015 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002016 /* Don't do recursive traces */
2017 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002019 *p_newtrace = NULL;
2020 }
2021 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002022 }
2023
Guido van Rossumb209a111997-04-29 18:18:01 +00002024 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002025 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002026 goto Py_Cleanup;
2027 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002028 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 goto Py_Cleanup;
2030 Py_INCREF(f);
2031 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2032 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002033 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 arg = Py_None;
2035 Py_INCREF(arg);
2036 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002037 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 PyFrame_FastToLocals(f);
2039 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2040 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002041 tstate->tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00002042 Py_Cleanup:
2043 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002044 if (res == NULL) {
2045 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002046 PyTraceBack_Here(f);
2047 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002048 *p_trace = NULL;
2049 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002051 *p_newtrace = NULL;
2052 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002053 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002054 }
2055 else {
2056 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002057 Py_XDECREF(*p_newtrace);
2058 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002059 *p_newtrace = NULL;
2060 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002062 *p_newtrace = res;
2063 }
2064 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002065 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002066 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002067 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002068}
2069
Guido van Rossumb209a111997-04-29 18:18:01 +00002070PyObject *
2071PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002072{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002073 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002074 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00002076 else
2077 return current_frame->f_builtins;
2078}
2079
Guido van Rossumb209a111997-04-29 18:18:01 +00002080PyObject *
2081PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002082{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002083 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002084 if (current_frame == NULL)
2085 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002086 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002087 return current_frame->f_locals;
2088}
2089
Guido van Rossumb209a111997-04-29 18:18:01 +00002090PyObject *
2091PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002092{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002093 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002094 if (current_frame == NULL)
2095 return NULL;
2096 else
2097 return current_frame->f_globals;
2098}
2099
Guido van Rossumb209a111997-04-29 18:18:01 +00002100PyObject *
2101PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002102{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002103 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002105}
2106
Guido van Rossum6135a871995-01-09 17:53:26 +00002107int
Guido van Rossumb209a111997-04-29 18:18:01 +00002108PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002109{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002110 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002111 return current_frame == NULL ? 0 : current_frame->f_restricted;
2112}
2113
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114void
Guido van Rossumb209a111997-04-29 18:18:01 +00002115Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116{
Guido van Rossumb209a111997-04-29 18:18:01 +00002117 PyObject *f = PySys_GetObject("stdout");
2118 if (PyFile_SoftSpace(f, 0))
2119 PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120}
2121
Guido van Rossum3f5da241990-12-20 15:06:42 +00002122
Guido van Rossum681d79a1995-07-18 14:51:37 +00002123/* External interface to call any callable object.
2124 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002125
Guido van Rossumb209a111997-04-29 18:18:01 +00002126PyObject *
2127PyEval_CallObject(func, arg)
2128 PyObject *func;
2129 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002130{
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002132}
Guido van Rossume59214e1994-08-30 08:01:59 +00002133
Guido van Rossumb209a111997-04-29 18:18:01 +00002134PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002135PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 PyObject *func;
2137 PyObject *arg;
2138 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002139{
2140 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002142
2143 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 arg = PyTuple_New(0);
2145 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002146 PyErr_SetString(PyExc_TypeError,
2147 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002148 return NULL;
2149 }
2150 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002152
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002154 PyErr_SetString(PyExc_TypeError,
2155 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002156 return NULL;
2157 }
2158
Guido van Rossum150b2df1996-12-05 23:17:11 +00002159 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002160 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002162 result = call_function(func, arg, kw);
2163 else
2164 result = call_builtin(func, arg, kw);
2165
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002167
Guido van Rossumb209a111997-04-29 18:18:01 +00002168 if (result == NULL && !PyErr_Occurred())
2169 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002170 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002171
2172 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002173}
2174
Guido van Rossumb209a111997-04-29 18:18:01 +00002175static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002176call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 PyObject *func;
2178 PyObject *arg;
2179 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180{
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 if (PyCFunction_Check(func)) {
2182 PyCFunction meth = PyCFunction_GetFunction(func);
2183 PyObject *self = PyCFunction_GetSelf(func);
2184 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002185 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002187 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002188 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002189 else if (size == 0)
2190 arg = NULL;
2191 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002192 if (flags & METH_KEYWORDS)
2193 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002194 if (kw != NULL && PyDict_Size(kw) != 0) {
2195 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002196 "this function takes no keyword arguments");
2197 return NULL;
2198 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002199 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002201 if (PyClass_Check(func)) {
2202 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002204 if (PyInstance_Check(func)) {
2205 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002206 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002207 PyErr_Clear();
2208 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002209 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002210 return NULL;
2211 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002212 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002213 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002214 return res;
2215 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217 return NULL;
2218}
2219
Guido van Rossumb209a111997-04-29 18:18:01 +00002220static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002221call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 PyObject *func;
2223 PyObject *arg;
2224 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225{
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 PyObject *class = NULL; /* == owner */
2227 PyObject *argdefs;
2228 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002229 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002231
Guido van Rossumb209a111997-04-29 18:18:01 +00002232 if (kw != NULL && !PyDict_Check(kw)) {
2233 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002234 return NULL;
2235 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236
Guido van Rossumb209a111997-04-29 18:18:01 +00002237 if (PyMethod_Check(func)) {
2238 PyObject *self = PyMethod_Self(func);
2239 class = PyMethod_Class(func);
2240 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002241 if (self == NULL) {
2242 /* Unbound methods must be called with an instance of
2243 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 if (PyTuple_Size(arg) >= 1) {
2245 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002246 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002247 PyInstance_Check(self) &&
2248 PyClass_IsSubclass((PyObject *)
2249 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002250 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002251 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002252 else
2253 self = NULL;
2254 }
2255 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002257 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002258 return NULL;
2259 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002260 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002261 }
2262 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002263 int argcount = PyTuple_Size(arg);
2264 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002265 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002266 if (newarg == NULL)
2267 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002268 Py_INCREF(self);
2269 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002270 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 PyObject *v = PyTuple_GET_ITEM(arg, i);
2272 Py_XINCREF(v);
2273 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002274 }
2275 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 }
2277 }
2278 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002279 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002280 PyErr_SetString(PyExc_TypeError,
2281 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282 return NULL;
2283 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002285 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002286
2287 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2289 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2290 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291 }
2292 else {
2293 d = NULL;
2294 nd = 0;
2295 }
2296
2297 if (kw != NULL) {
2298 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002299 nk = PyDict_Size(kw);
2300 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002301 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 PyErr_NoMemory();
2303 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002304 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002305 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308 i += 2;
2309 nk = i/2;
2310 /* XXX This is broken if the caller deletes dict items! */
2311 }
2312 else {
2313 k = NULL;
2314 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002315 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316
Guido van Rossum681d79a1995-07-18 14:51:37 +00002317 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002318 (PyCodeObject *)PyFunction_GetCode(func),
2319 PyFunction_GetGlobals(func), (PyObject *)NULL,
2320 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002321 k, nk,
2322 d, nd,
2323 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324
Guido van Rossumb209a111997-04-29 18:18:01 +00002325 Py_DECREF(arg);
2326 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329}
2330
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002331#define SLICE_ERROR_MSG \
2332 "standard sequence type does not support step size other than one"
2333
Guido van Rossumb209a111997-04-29 18:18:01 +00002334static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002335loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002336 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337{
Guido van Rossumb209a111997-04-29 18:18:01 +00002338 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002339 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 return NULL;
2343 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002345 v = (*sq->sq_item)(v, i);
2346 if (v)
2347 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002348 if (PyErr_Occurred() == PyExc_IndexError)
2349 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002350 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351}
2352
2353static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002354slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002355 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 int *pi;
2357{
2358 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002359 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002361 PyErr_SetString(PyExc_TypeError,
2362 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002363 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002365 x = PyInt_AsLong(v);
2366 /* Truncate -- very long indices are truncated anyway */
2367 if (x > INT_MAX)
2368 x = INT_MAX;
2369 else if (x < -INT_MAX)
2370 x = 0;
2371 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002373 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374}
2375
Guido van Rossumb209a111997-04-29 18:18:01 +00002376static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002377apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002378 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002380 int ilow = 0, ihigh = INT_MAX;
2381 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002383 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002384 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002385 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002387
2388static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002389assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002392 int ilow = 0, ihigh = INT_MAX;
2393 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002394 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002395 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002396 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002397 if (x == NULL)
2398 return PySequence_DelSlice(u, ilow, ihigh);
2399 else
2400 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401}
2402
2403static int
2404cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406{
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002409 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002410 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002411 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002412 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 return 1;
2414 }
2415 return 0;
2416 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 if (PyClass_Check(v) && PyClass_Check(err))
2418 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 return err == v;
2420}
2421
Guido van Rossum3f5da241990-12-20 15:06:42 +00002422static int
2423cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002424 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425{
Guido van Rossume59214e1994-08-30 08:01:59 +00002426 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 PyObject *x;
2428 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002429 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002430 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002431 register char *s, *end;
2432 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002433 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2434 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002435 "string member test needs char left operand");
2436 return -1;
2437 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 c = PyString_AsString(v)[0];
2439 s = PyString_AsString(w);
2440 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002441 while (s < end) {
2442 if (c == *s++)
2443 return 1;
2444 }
2445 return 0;
2446 }
2447 sq = w->ob_type->tp_as_sequence;
2448 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002449 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002450 "'in' or 'not in' needs sequence right argument");
2451 return -1;
2452 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002453 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002454 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002455 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 if (PyErr_Occurred() == PyExc_IndexError) {
2457 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002458 break;
2459 }
2460 return -1;
2461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 cmp = PyObject_Compare(v, x);
2463 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002464 if (cmp == 0)
2465 return 1;
2466 }
2467 return 0;
2468}
2469
Guido van Rossumb209a111997-04-29 18:18:01 +00002470static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002471cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002472 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002473 register PyObject *v;
2474 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475{
2476 register int cmp;
2477 register int res = 0;
2478 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479 case IS:
2480 case IS_NOT:
2481 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002482 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002483 res = !res;
2484 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 case IN:
2486 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002487 res = cmp_member(v, w);
2488 if (res < 0)
2489 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002490 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002491 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492 break;
2493 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002494 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495 break;
2496 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 cmp = PyObject_Compare(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002498 switch (op) {
2499 case LT: res = cmp < 0; break;
2500 case LE: res = cmp <= 0; break;
2501 case EQ: res = cmp == 0; break;
2502 case NE: res = cmp != 0; break;
2503 case GT: res = cmp > 0; break;
2504 case GE: res = cmp >= 0; break;
2505 /* XXX no default? (res is initialized to 0 though) */
2506 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 v = res ? Py_True : Py_False;
2509 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510 return v;
2511}
2512
Guido van Rossum3f5da241990-12-20 15:06:42 +00002513static int
2514import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002515 PyObject *locals;
2516 PyObject *v;
2517 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002518{
Guido van Rossumb209a111997-04-29 18:18:01 +00002519 PyObject *w, *x;
2520 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002521 PyErr_SetString(PyExc_TypeError,
2522 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002523 return -1;
2524 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002525 w = PyModule_GetDict(v);
2526 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002527 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002528 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002529 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002530 while (PyDict_Next(w, &pos, &name, &value)) {
2531 if (!PyString_Check(name) ||
2532 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002533 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 Py_INCREF(value);
2535 err = PyDict_SetItem(locals, name, value);
2536 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002537 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002539 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002540 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002541 }
2542 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002545 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002546 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002547 PyString_AsString(name));
2548 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549 return -1;
2550 }
2551 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002552 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002553 }
2554}
2555
Guido van Rossumb209a111997-04-29 18:18:01 +00002556static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002557build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002558 PyObject *methods; /* dictionary */
2559 PyObject *bases; /* tuple containing classes */
2560 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002561{
Guido van Rossum25831651993-05-19 14:50:45 +00002562 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002563 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002564 PyErr_SetString(PyExc_SystemError,
2565 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002566 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002567 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002568 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002569 PyErr_SetString(PyExc_SystemError,
2570 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002571 return NULL;
2572 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002573 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002574 PyErr_SetString(PyExc_SystemError,
2575 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002576 return NULL;
2577 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002578 for (i = PyTuple_Size(bases); --i >= 0; ) {
2579 PyObject *base = PyTuple_GET_ITEM(bases, i);
2580 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002581 /* Call the base's *type*, if it is callable.
2582 This code is a hook for Donald Beaudry's
2583 and Jim Fulton's type extensions. In
2584 unexended Python it will never be triggered
2585 since its types are not callable. */
2586 if (base->ob_type->ob_type->tp_call) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002587 PyObject *args;
2588 PyObject *class;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002589 args = Py_BuildValue("(OOO)",
2590 name, bases, methods);
2591 class = PyEval_CallObject(
2592 (PyObject *)base->ob_type, args);
Guido van Rossumb209a111997-04-29 18:18:01 +00002593 Py_DECREF(args);
Guido van Rossum150b2df1996-12-05 23:17:11 +00002594 return class;
2595 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002596 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002597 "base is not a class object");
2598 return NULL;
2599 }
2600 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002601 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002602}
2603
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002604static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605exec_statement(f, prog, globals, locals)
2606 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002607 PyObject *prog;
2608 PyObject *globals;
2609 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002610{
2611 char *s;
2612 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002613 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002614 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002615
Guido van Rossumb209a111997-04-29 18:18:01 +00002616 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2617 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002618 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002620 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 locals = PyTuple_GetItem(prog, 2);
2622 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002623 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002624 if (globals == Py_None) {
2625 globals = PyEval_GetGlobals();
2626 if (locals == Py_None) {
2627 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002628 plain = 1;
2629 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002630 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002632 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002633 if (!PyString_Check(prog) &&
2634 !PyCode_Check(prog) &&
2635 !PyFile_Check(prog)) {
2636 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002637 "exec 1st arg must be string, code or file object");
2638 return -1;
2639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2641 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002642 "exec 2nd/3rd args must be dict or None");
2643 return -1;
2644 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002646 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002648 if (PyEval_EvalCode((PyCodeObject *) prog,
2649 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002650 return -1;
2651 return 0;
2652 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002653 if (PyFile_Check(prog)) {
2654 FILE *fp = PyFile_AsFile(prog);
2655 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002656 if (PyRun_File(fp, name, Py_file_input,
2657 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002658 return -1;
2659 return 0;
2660 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002662 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002663 PyErr_SetString(PyExc_ValueError,
2664 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002665 return -1;
2666 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002667 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002668 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002669 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002670 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002671 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002672 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002673 return 0;
2674}
Guido van Rossum24c13741995-02-14 09:42:43 +00002675
Guido van Rossum1aa14831997-01-21 05:34:20 +00002676/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002677static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002678find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002680 int nexti;
2681{
2682 int opcode;
2683 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002685 unsigned char *next_instr;
2686
2687 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2688 opcode = (*next_instr++);
2689 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002690 Py_INCREF(Py_None);
2691 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002692 }
2693
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002695 if (list == NULL)
2696 return NULL;
2697
2698 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002699 oparg = (next_instr[1]<<8) + next_instr[0];
2700 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002701 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002702 if (PyList_Append(list, name) < 0) {
2703 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002704 break;
2705 }
2706 opcode = (*next_instr++);
2707 } while (opcode == IMPORT_FROM);
2708
2709 return list;
2710}
Guido van Rossum950361c1997-01-24 13:49:28 +00002711
2712
2713#ifdef DYNAMIC_EXECUTION_PROFILE
2714
2715PyObject *
2716getarray(a)
2717 long a[256];
2718{
2719 int i;
2720 PyObject *l = PyList_New(256);
2721 if (l == NULL) return NULL;
2722 for (i = 0; i < 256; i++) {
2723 PyObject *x = PyInt_FromLong(a[i]);
2724 if (x == NULL) {
2725 Py_DECREF(l);
2726 return NULL;
2727 }
2728 PyList_SetItem(l, i, x);
2729 }
2730 for (i = 0; i < 256; i++)
2731 a[i] = 0;
2732 return l;
2733}
2734
2735PyObject *
2736_Py_GetDXProfile(self, args)
2737 PyObject *self, *args;
2738{
2739#ifndef DXPAIRS
2740 return getarray(dxp);
2741#else
2742 int i;
2743 PyObject *l = PyList_New(257);
2744 if (l == NULL) return NULL;
2745 for (i = 0; i < 257; i++) {
2746 PyObject *x = getarray(dxpairs[i]);
2747 if (x == NULL) {
2748 Py_DECREF(l);
2749 return NULL;
2750 }
2751 PyList_SetItem(l, i, x);
2752 }
2753 return l;
2754#endif
2755}
2756
2757#endif