blob: be4ffec65476c9c02e6d0af4eafbbad9f24ada98 [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 Rossum2fca21f71997-07-18 23:56:58 +0000138PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000139PyEval_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);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000144 if (tstate == NULL)
145 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000146 release_lock(interpreter_lock);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000147 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000148 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000149#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000150 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000151}
152
153void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000154PyEval_RestoreThread(tstate)
155 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000156{
Guido van Rossume59214e1994-08-30 08:01:59 +0000157#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000158 if (interpreter_lock) {
159 int err;
160 err = errno;
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000161 if (tstate == NULL)
162 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000163 acquire_lock(interpreter_lock, 1);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000164 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166 }
167#endif
168}
169
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000170#ifdef WITH_THREAD
171void
172PyEval_AcquireThread(tstate)
173 PyThreadState *tstate;
174{
175 acquire_lock(interpreter_lock, 1);
176 if (PyThreadState_Swap(tstate) != NULL)
177 Py_FatalError("PyEval_AcquireThread: non-NULL old state");
178}
179
180void
181PyEval_ReleaseThread(tstate)
182 PyThreadState *tstate;
183{
184 if (PyThreadState_Swap(NULL) != tstate)
185 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
186 release_lock(interpreter_lock);
187}
188#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189
Guido van Rossuma9672091994-09-14 13:31:22 +0000190/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
191 signal handlers or Mac I/O completion routines) can schedule calls
192 to a function to be called synchronously.
193 The synchronous function is called with one void* argument.
194 It should return 0 for success or -1 for failure -- failure should
195 be accompanied by an exception.
196
197 If registry succeeds, the registry function returns 0; if it fails
198 (e.g. due to too many pending calls) it returns -1 (without setting
199 an exception condition).
200
201 Note that because registry may occur from within signal handlers,
202 or other asynchronous events, calling malloc() is unsafe!
203
204#ifdef WITH_THREAD
205 Any thread can schedule pending calls, but only the main thread
206 will execute them.
207#endif
208
209 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
210 There are two possible race conditions:
211 (1) nested asynchronous registry calls;
212 (2) registry calls made while pending calls are being processed.
213 While (1) is very unlikely, (2) is a real possibility.
214 The current code is safe against (2), but not against (1).
215 The safety against (2) is derived from the fact that only one
216 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000217
Guido van Rossuma027efa1997-05-05 20:56:21 +0000218 XXX Darn! With the advent of thread state, we should have an array
219 of pending calls per thread in the thread state! Later...
220*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000221
Guido van Rossuma9672091994-09-14 13:31:22 +0000222#define NPENDINGCALLS 32
223static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000224 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000225 ANY *arg;
226} pendingcalls[NPENDINGCALLS];
227static volatile int pendingfirst = 0;
228static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000229static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000230
231int
232Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000233 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000234 ANY *arg;
235{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000236 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000237 int i, j;
238 /* XXX Begin critical section */
239 /* XXX If you want this to be safe against nested
240 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000241 if (busy)
242 return -1;
243 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 i = pendinglast;
245 j = (i + 1) % NPENDINGCALLS;
246 if (j == pendingfirst)
247 return -1; /* Queue full */
248 pendingcalls[i].func = func;
249 pendingcalls[i].arg = arg;
250 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000251 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000252 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000253 /* XXX End critical section */
254 return 0;
255}
256
Guido van Rossum180d7b41994-09-29 09:45:57 +0000257int
258Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000259{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000260 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000261#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000262 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000263 return 0;
264#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000265 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 return 0;
267 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000268 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000269 for (;;) {
270 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000271 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000272 ANY *arg;
273 i = pendingfirst;
274 if (i == pendinglast)
275 break; /* Queue empty */
276 func = pendingcalls[i].func;
277 arg = pendingcalls[i].arg;
278 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000279 if (func(arg) < 0) {
280 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000281 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000282 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000283 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000284 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000285 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000286 return 0;
287}
288
289
Guido van Rossum374a9221991-04-04 10:40:29 +0000290/* Status code for main loop (reason for stack unwind) */
291
292enum why_code {
293 WHY_NOT, /* No error */
294 WHY_EXCEPTION, /* Exception occurred */
295 WHY_RERAISE, /* Exception re-raised by 'finally' */
296 WHY_RETURN, /* 'return' statement */
297 WHY_BREAK /* 'break' statement */
298};
299
Guido van Rossumb209a111997-04-29 18:18:01 +0000300static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000301
Guido van Rossum374a9221991-04-04 10:40:29 +0000302
Guido van Rossum681d79a1995-07-18 14:51:37 +0000303/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000304
Guido van Rossumb209a111997-04-29 18:18:01 +0000305PyObject *
306PyEval_EvalCode(co, globals, locals)
307 PyCodeObject *co;
308 PyObject *globals;
309 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000310{
311 return eval_code2(co,
312 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000313 (PyObject **)NULL, 0,
314 (PyObject **)NULL, 0,
315 (PyObject **)NULL, 0,
316 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000317}
318
319
320/* Interpreter main loop */
321
Guido van Rossum8861b741996-07-30 16:49:37 +0000322#ifndef MAX_RECURSION_DEPTH
323#define MAX_RECURSION_DEPTH 10000
324#endif
325
Guido van Rossumb209a111997-04-29 18:18:01 +0000326static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000327eval_code2(co, globals, locals,
328 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000329 PyCodeObject *co;
330 PyObject *globals;
331 PyObject *locals;
332 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000333 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000334 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000335 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000336 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000337 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000338 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000339{
Guido van Rossum950361c1997-01-24 13:49:28 +0000340#ifdef DXPAIRS
341 int lastopcode = 0;
342#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000343 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000344 register int opcode = 0; /* Current opcode */
345 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000346 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000347 register enum why_code why; /* Reason for block stack unwind */
348 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 register PyObject *x; /* Result object -- NULL if error */
350 register PyObject *v; /* Temporary objects popped off stack */
351 register PyObject *w;
352 register PyObject *u;
353 register PyObject *t;
354 register PyFrameObject *f; /* Current frame */
355 register PyObject **fastlocals = NULL;
356 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000357 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000358#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000359 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000360#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000361#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000362 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000363 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000364#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000365
366/* Code access macros */
367
368#define GETCONST(i) Getconst(f, i)
369#define GETNAME(i) Getname(f, i)
370#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000371#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000372#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
373#define NEXTOP() (*next_instr++)
374#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
375#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
376#define JUMPBY(x) (next_instr += (x))
377
378/* Stack manipulation macros */
379
380#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
381#define EMPTY() (STACK_LEVEL() == 0)
382#define TOP() (stack_pointer[-1])
383#define BASIC_PUSH(v) (*stack_pointer++ = (v))
384#define BASIC_POP() (*--stack_pointer)
385
Guido van Rossum96a42c81992-01-12 02:29:51 +0000386#ifdef LLTRACE
387#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
388#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000389#else
390#define PUSH(v) BASIC_PUSH(v)
391#define POP() BASIC_POP()
392#endif
393
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394/* Local variable macros */
395
396#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000397#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000398 GETLOCAL(i) = value; } while (0)
399
Guido van Rossuma027efa1997-05-05 20:56:21 +0000400/* Start of code */
401
402 if (tstate == NULL)
403 Py_FatalError("eval_code2 called without a current thread");
404
Guido van Rossum8861b741996-07-30 16:49:37 +0000405#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000406 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000407 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000408 return NULL;
409 }
410#endif
411
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000413 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000414 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000415 }
416
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000417#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000418 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000419#endif
420
Guido van Rossumb209a111997-04-29 18:18:01 +0000421 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000422 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000423 co, /*code*/
424 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000425 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000426 if (f == NULL)
427 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000428
Guido van Rossuma027efa1997-05-05 20:56:21 +0000429 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000430 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431
432 if (co->co_argcount > 0 ||
433 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
434 int i;
435 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000436 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000437 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000438 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439 if (kwdict == NULL)
440 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000441 i = co->co_argcount;
442 if (co->co_flags & CO_VARARGS)
443 i++;
444 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 }
446 if (argcount > co->co_argcount) {
447 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000448 PyErr_SetString(PyExc_TypeError,
449 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 goto fail;
451 }
452 n = co->co_argcount;
453 }
454 for (i = 0; i < n; i++) {
455 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000456 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 SETLOCAL(i, x);
458 }
459 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000460 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000461 if (u == NULL)
462 goto fail;
463 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000464 for (i = n; i < argcount; i++) {
465 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000466 Py_INCREF(x);
467 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 }
470 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000471 PyObject *keyword = kws[2*i];
472 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 int j;
474 /* XXX slow -- speed up using dictionary? */
475 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000476 PyObject *nm = PyTuple_GET_ITEM(
477 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 break;
480 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000481 /* Check errors from Compare */
482 if (PyErr_Occurred())
483 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 if (j >= co->co_argcount) {
485 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000486 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000487 "unexpected keyword argument: %.400s",
488 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 goto fail;
490 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000491 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 }
493 else {
494 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000495 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 "keyword parameter redefined");
497 goto fail;
498 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000499 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 SETLOCAL(j, value);
501 }
502 }
503 if (argcount < co->co_argcount) {
504 int m = co->co_argcount - defcount;
505 for (i = argcount; i < m; i++) {
506 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000507 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 "not enough arguments");
509 goto fail;
510 }
511 }
512 if (n > m)
513 i = n - m;
514 else
515 i = 0;
516 for (; i < defcount; i++) {
517 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000518 PyObject *def = defs[i];
519 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 SETLOCAL(m+i, def);
521 }
522 }
523 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 }
525 else {
526 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000527 PyErr_SetString(PyExc_TypeError,
528 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000529 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 }
531 }
532
Guido van Rossuma027efa1997-05-05 20:56:21 +0000533 if (tstate->sys_tracefunc != NULL) {
534 /* tstate->sys_tracefunc, if defined, is a function that
535 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536 Its return value, if not None, is a function that
537 will be called at the start of each executed line
538 of code. (Actually, the function must return
539 itself in order to continue tracing.)
540 The trace functions are called with three arguments:
541 a pointer to the current frame, a string indicating
542 why the function is called, and an argument which
543 depends on the situation. The global trace function
544 (sys.trace) is also called whenever an exception
545 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000546 if (call_trace(&tstate->sys_tracefunc,
547 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000548 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000549 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000550 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000551 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000552 }
553
Guido van Rossuma027efa1997-05-05 20:56:21 +0000554 if (tstate->sys_profilefunc != NULL) {
555 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000556 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557 if (call_trace(&tstate->sys_profilefunc,
558 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000560 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 }
562 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000563
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
565 --tstate->recursion_depth;
566 PyErr_SetString(PyExc_RuntimeError,
567 "Maximum recursion depth exceeded");
568 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000569 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000570 return NULL;
571 }
572
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000573 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000574 stack_pointer = f->f_valuestack;
575
Guido van Rossum374a9221991-04-04 10:40:29 +0000576 why = WHY_NOT;
577 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000578 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000579
580 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000581 /* Do periodic things. Doing this every time through
582 the loop would add too much overhead, so we do it
583 only every Nth instruction. We also do it if
584 ``things_to_do'' is set, i.e. when an asynchronous
585 event needs attention (e.g. a signal handler or
586 async I/O handler); see Py_AddPendingCall() and
587 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000588
Guido van Rossuma027efa1997-05-05 20:56:21 +0000589 if (things_to_do || --tstate->ticker < 0) {
590 tstate->ticker = tstate->sys_checkinterval;
591 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000592 if (Py_MakePendingCalls() < 0) {
593 why = WHY_EXCEPTION;
594 goto on_error;
595 }
596 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000597#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 /* If we have true signals, the signal handler
599 will call Py_AddPendingCall() so we don't
600 have to call sigcheck(). On the Mac and
601 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000602 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000603 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000604 goto on_error;
605 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000606#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607
Guido van Rossume59214e1994-08-30 08:01:59 +0000608#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000609 if (interpreter_lock) {
610 /* Give another thread a chance */
611
Guido van Rossuma027efa1997-05-05 20:56:21 +0000612 PyThreadState *tstate =
613 PyThreadState_Swap(NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000614 release_lock(interpreter_lock);
615
616 /* Other threads may run now */
617
618 acquire_lock(interpreter_lock, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000619 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620 }
621#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000622 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000623
Guido van Rossum374a9221991-04-04 10:40:29 +0000624 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000625
Guido van Rossum408027e1996-12-30 16:17:54 +0000626#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000627 f->f_lasti = INSTR_OFFSET();
628#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000629
630 opcode = NEXTOP();
631 if (HAS_ARG(opcode))
632 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000633#ifdef DYNAMIC_EXECUTION_PROFILE
634#ifdef DXPAIRS
635 dxpairs[lastopcode][opcode]++;
636 lastopcode = opcode;
637#endif
638 dxp[opcode]++;
639#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000640
Guido van Rossum96a42c81992-01-12 02:29:51 +0000641#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000642 /* Instruction tracing */
643
Guido van Rossum96a42c81992-01-12 02:29:51 +0000644 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 if (HAS_ARG(opcode)) {
646 printf("%d: %d, %d\n",
647 (int) (INSTR_OFFSET() - 3),
648 opcode, oparg);
649 }
650 else {
651 printf("%d: %d\n",
652 (int) (INSTR_OFFSET() - 1), opcode);
653 }
654 }
655#endif
656
657 /* Main switch on opcode */
658
659 switch (opcode) {
660
661 /* BEWARE!
662 It is essential that any operation that fails sets either
663 x to NULL, err to nonzero, or why to anything but WHY_NOT,
664 and that no operation that succeeds does this! */
665
666 /* case STOP_CODE: this is an error! */
667
668 case POP_TOP:
669 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000670 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000671 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000672
673 case ROT_TWO:
674 v = POP();
675 w = POP();
676 PUSH(v);
677 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000678 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000679
680 case ROT_THREE:
681 v = POP();
682 w = POP();
683 x = POP();
684 PUSH(v);
685 PUSH(x);
686 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000687 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000688
689 case DUP_TOP:
690 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000691 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000693 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000694
695 case UNARY_POSITIVE:
696 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000697 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000698 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000699 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000700 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 break;
702
703 case UNARY_NEGATIVE:
704 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000705 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000706 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;
710
711 case UNARY_NOT:
712 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000713 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000714 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000715 if (err == 0) {
716 Py_INCREF(Py_True);
717 PUSH(Py_True);
718 continue;
719 }
720 else if (err > 0) {
721 Py_INCREF(Py_False);
722 PUSH(Py_False);
723 err = 0;
724 continue;
725 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 break;
727
728 case UNARY_CONVERT:
729 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000730 x = PyObject_Repr(v);
731 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000732 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000734 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000735
736 case UNARY_INVERT:
737 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000738 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000739 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000740 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000741 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000742 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000743
Guido van Rossum50564e81996-01-12 01:13:16 +0000744 case BINARY_POWER:
745 w = POP();
746 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000747 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000748 Py_DECREF(v);
749 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000750 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000751 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000752 break;
753
Guido van Rossum374a9221991-04-04 10:40:29 +0000754 case BINARY_MULTIPLY:
755 w = POP();
756 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000757 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000758 Py_DECREF(v);
759 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000761 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000762 break;
763
764 case BINARY_DIVIDE:
765 w = POP();
766 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000767 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000768 Py_DECREF(v);
769 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000771 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 break;
773
774 case BINARY_MODULO:
775 w = POP();
776 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000777 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000778 Py_DECREF(v);
779 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000780 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000781 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 break;
783
784 case BINARY_ADD:
785 w = POP();
786 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000787 if (PyInt_Check(v) && PyInt_Check(w)) {
788 /* INLINE: int + int */
789 register long a, b, i;
790 a = ((PyIntObject*) v)->ob_ival;
791 b = ((PyIntObject*) w)->ob_ival;
792 i = a + b;
793 if ((i^a) < 0 && (i^b) < 0) {
794 PyErr_SetString(PyExc_OverflowError,
795 "integer addition");
796 x = NULL;
797 }
798 else
799 x = PyInt_FromLong(i);
800 }
801 else
802 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000803 Py_DECREF(v);
804 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000805 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000806 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000807 break;
808
809 case BINARY_SUBTRACT:
810 w = POP();
811 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000812 if (PyInt_Check(v) && PyInt_Check(w)) {
813 /* INLINE: int - int */
814 register long a, b, i;
815 a = ((PyIntObject*) v)->ob_ival;
816 b = ((PyIntObject*) w)->ob_ival;
817 i = a - b;
818 if ((i^a) < 0 && (i^~b) < 0) {
819 PyErr_SetString(PyExc_OverflowError,
820 "integer subtraction");
821 x = NULL;
822 }
823 else
824 x = PyInt_FromLong(i);
825 }
826 else
827 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000828 Py_DECREF(v);
829 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000830 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000831 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000832 break;
833
834 case BINARY_SUBSCR:
835 w = POP();
836 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000837 if (PyList_Check(v) && PyInt_Check(w)) {
838 /* INLINE: list[int] */
839 long i = PyInt_AsLong(w);
840 if (i < 0)
841 i += ((PyListObject*) v)->ob_size;
842 if (i < 0 ||
843 i >= ((PyListObject*) v)->ob_size) {
844 PyErr_SetString(PyExc_IndexError,
845 "list index out of range");
846 x = NULL;
847 }
848 else {
849 x = ((PyListObject*) v)->ob_item[i];
850 Py_INCREF(x);
851 }
852 }
853 else
854 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
856 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000858 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 break;
860
Guido van Rossum7928cd71991-10-24 14:59:31 +0000861 case BINARY_LSHIFT:
862 w = POP();
863 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000864 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000865 Py_DECREF(v);
866 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000867 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000868 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000869 break;
870
871 case BINARY_RSHIFT:
872 w = POP();
873 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000874 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000875 Py_DECREF(v);
876 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000877 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000878 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 break;
880
881 case BINARY_AND:
882 w = POP();
883 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000884 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000885 Py_DECREF(v);
886 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000887 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000888 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889 break;
890
891 case BINARY_XOR:
892 w = POP();
893 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000894 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000895 Py_DECREF(v);
896 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000897 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000898 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000899 break;
900
901 case BINARY_OR:
902 w = POP();
903 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000904 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000905 Py_DECREF(v);
906 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000907 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000908 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000909 break;
910
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 case SLICE+0:
912 case SLICE+1:
913 case SLICE+2:
914 case SLICE+3:
915 if ((opcode-SLICE) & 2)
916 w = POP();
917 else
918 w = NULL;
919 if ((opcode-SLICE) & 1)
920 v = POP();
921 else
922 v = NULL;
923 u = POP();
924 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000925 Py_DECREF(u);
926 Py_XDECREF(v);
927 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000928 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000929 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000930 break;
931
932 case STORE_SLICE+0:
933 case STORE_SLICE+1:
934 case STORE_SLICE+2:
935 case STORE_SLICE+3:
936 if ((opcode-STORE_SLICE) & 2)
937 w = POP();
938 else
939 w = NULL;
940 if ((opcode-STORE_SLICE) & 1)
941 v = POP();
942 else
943 v = NULL;
944 u = POP();
945 t = POP();
946 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000947 Py_DECREF(t);
948 Py_DECREF(u);
949 Py_XDECREF(v);
950 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000951 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000952 break;
953
954 case DELETE_SLICE+0:
955 case DELETE_SLICE+1:
956 case DELETE_SLICE+2:
957 case DELETE_SLICE+3:
958 if ((opcode-DELETE_SLICE) & 2)
959 w = POP();
960 else
961 w = NULL;
962 if ((opcode-DELETE_SLICE) & 1)
963 v = POP();
964 else
965 v = NULL;
966 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000967 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000968 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000969 Py_DECREF(u);
970 Py_XDECREF(v);
971 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000972 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 break;
974
975 case STORE_SUBSCR:
976 w = POP();
977 v = POP();
978 u = POP();
979 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000980 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000981 Py_DECREF(u);
982 Py_DECREF(v);
983 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000984 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
986
987 case DELETE_SUBSCR:
988 w = POP();
989 v = POP();
990 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000991 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_DECREF(v);
993 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000994 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000995 break;
996
997 case PRINT_EXPR:
998 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +00001000 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +00001001 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001002 (err = PyDict_SetItemString(
1003 f->f_builtins, "_", v)) == 0 &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 !Py_SuppressPrintingFlag) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001005 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001006 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001007 x = PySys_GetObject("stdout");
1008 if (x == NULL)
1009 err = -1;
1010 }
1011 if (err == 0)
1012 err = PyFile_WriteObject(v, x, 0);
1013 if (err == 0) {
1014 PyFile_SoftSpace(x, 1);
1015 err = Py_FlushLine();
1016 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001018 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 break;
1020
1021 case PRINT_ITEM:
1022 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001023 w = PySys_GetObject("stdout");
1024 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001025 err = PyFile_WriteString(" ", w);
1026 if (err == 0)
1027 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001028 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001029 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001030 char *s = PyString_AsString(v);
1031 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001032 if (len > 0 &&
1033 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001034 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001038 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001039 break;
1040
1041 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001043 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001044 PyErr_SetString(PyExc_RuntimeError,
1045 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001046 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001047 err = PyFile_WriteString("\n", x);
1048 if (err == 0)
1049 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001050 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 break;
1052
1053 case BREAK_LOOP:
1054 why = WHY_BREAK;
1055 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001056
Guido van Rossumf10570b1995-07-07 22:53:21 +00001057 case RAISE_VARARGS:
1058 u = v = w = NULL;
1059 switch (oparg) {
1060 case 3:
1061 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001062 /* Fallthrough */
1063 case 2:
1064 v = POP(); /* value */
1065 /* Fallthrough */
1066 case 1:
1067 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001068 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001069 break;
1070 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001071 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001072 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001074 break;
1075 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001076 break;
1077
1078 case LOAD_LOCALS:
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 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001085 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001086 break;
1087
1088 case RETURN_VALUE:
1089 retval = POP();
1090 why = WHY_RETURN;
1091 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001092
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001093 case EXEC_STMT:
1094 w = POP();
1095 v = POP();
1096 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001097 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001098 Py_DECREF(u);
1099 Py_DECREF(v);
1100 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001101 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001102
Guido van Rossum374a9221991-04-04 10:40:29 +00001103 case POP_BLOCK:
1104 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001105 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001106 while (STACK_LEVEL() > b->b_level) {
1107 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001108 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001109 }
1110 }
1111 break;
1112
1113 case END_FINALLY:
1114 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001115 if (PyInt_Check(v)) {
1116 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 if (why == WHY_RETURN)
1118 retval = POP();
1119 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001120 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001122 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001123 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001124 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001125 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001127 else if (v != Py_None) {
1128 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 "'finally' pops bad exception");
1130 why = WHY_EXCEPTION;
1131 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001132 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 break;
1134
1135 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001136 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001138 w = POP();
1139 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001141 Py_DECREF(u);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 break;
1145
1146 case STORE_NAME:
1147 w = GETNAMEV(oparg);
1148 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001149 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001150 PyErr_SetString(PyExc_SystemError,
1151 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001152 break;
1153 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001154 err = PyDict_SetItem(x, w, v);
1155 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 break;
1157
1158 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001159 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001160 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001161 PyErr_SetString(PyExc_SystemError,
1162 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001163 break;
1164 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001165 if ((err = PyDict_DelItem(x, w)) != 0)
1166 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001168
1169#ifdef CASE_TOO_BIG
1170 default: switch (opcode) {
1171#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001172
1173 case UNPACK_TUPLE:
1174 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001175 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001176 PyErr_SetString(PyExc_TypeError,
1177 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 why = WHY_EXCEPTION;
1179 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001180 else if (PyTuple_Size(v) != oparg) {
1181 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001182 "unpack tuple of wrong size");
1183 why = WHY_EXCEPTION;
1184 }
1185 else {
1186 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001187 w = PyTuple_GET_ITEM(v, oparg);
1188 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 PUSH(w);
1190 }
1191 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001192 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 break;
1194
1195 case UNPACK_LIST:
1196 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001197 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001198 PyErr_SetString(PyExc_TypeError,
1199 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 why = WHY_EXCEPTION;
1201 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001202 else if (PyList_Size(v) != oparg) {
1203 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 "unpack list of wrong size");
1205 why = WHY_EXCEPTION;
1206 }
1207 else {
1208 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001209 w = PyList_GetItem(v, oparg);
1210 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 PUSH(w);
1212 }
1213 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001214 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 break;
1216
1217 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001218 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001219 v = POP();
1220 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001221 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1222 Py_DECREF(v);
1223 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 break;
1225
1226 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001227 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001228 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001229 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1230 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001231 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 break;
1233
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001234 case STORE_GLOBAL:
1235 w = GETNAMEV(oparg);
1236 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001237 err = PyDict_SetItem(f->f_globals, w, v);
1238 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001239 break;
1240
1241 case DELETE_GLOBAL:
1242 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001243 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1244 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001245 break;
1246
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 case LOAD_CONST:
1248 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 PUSH(x);
1251 break;
1252
1253 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001254 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001255 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001256 PyErr_SetString(PyExc_SystemError,
1257 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001258 break;
1259 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 PyErr_Clear();
1263 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001265 PyErr_Clear();
1266 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001268 PyErr_SetObject(
1269 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001270 break;
1271 }
1272 }
1273 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 PUSH(x);
1276 break;
1277
1278 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001279 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 PyErr_Clear();
1283 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 break;
1287 }
1288 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001289 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 PUSH(x);
1291 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001292
Guido van Rossum9bfef441993-03-29 10:43:31 +00001293 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001294 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001295 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 PyErr_SetObject(PyExc_NameError,
1297 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001298 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001299 break;
1300 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001302 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001303 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001304 break;
1305
1306 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001307 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001308 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001309 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001310
1311 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001312 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001313 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001314
1315 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001316 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001317 if (x != NULL) {
1318 for (; --oparg >= 0;) {
1319 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001321 }
1322 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 }
1325 break;
1326
1327 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 if (x != NULL) {
1330 for (; --oparg >= 0;) {
1331 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 if (err != 0)
1334 break;
1335 }
1336 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001337 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 }
1339 break;
1340
1341 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001344 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 break;
1346
1347 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001348 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 x = PyObject_GetAttr(v, w);
1351 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001353 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 break;
1355
1356 case COMPARE_OP:
1357 w = POP();
1358 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001359 if (PyInt_Check(v) && PyInt_Check(w)) {
1360 /* INLINE: cmp(int, int) */
1361 register long a, b;
1362 register int res;
1363 a = ((PyIntObject*) v)->ob_ival;
1364 b = ((PyIntObject*) w)->ob_ival;
1365 switch (oparg) {
1366 case LT: res = a < b; break;
1367 case LE: res = a <= b; break;
1368 case EQ: res = a == b; break;
1369 case NE: res = a != b; break;
1370 case GT: res = a > b; break;
1371 case GE: res = a >= b; break;
1372 case IS: res = v == w; break;
1373 case IS_NOT: res = v != w; break;
1374 default: goto slow_compare;
1375 }
1376 x = res ? Py_True : Py_False;
1377 Py_INCREF(x);
1378 }
1379 else {
1380 slow_compare:
1381 x = cmp_outcome(oparg, v, w);
1382 }
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 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001386 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 break;
1388
1389 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001390 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001391 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001392 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001393 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001394 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001395 break;
1396 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001397 if (PyCFunction_Check(x)) {
1398 u = Py_None;
1399 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001400 }
1401 else {
1402 u = find_from_args(f, INSTR_OFFSET());
1403 if (u == NULL) {
1404 x = u;
1405 break;
1406 }
1407 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001409 w,
1410 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001411 f->f_locals == NULL ?
1412 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001413 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001414 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001415 if (w == NULL) {
1416 x = NULL;
1417 break;
1418 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 x = PyEval_CallObject(x, w);
1420 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001421 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001422 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 break;
1424
1425 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001426 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001427 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001428 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001429 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001430 PyErr_SetString(PyExc_SystemError,
1431 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001432 break;
1433 }
1434 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001436 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001437 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001438
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 case JUMP_FORWARD:
1440 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001441 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001442
1443 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001445 if (err > 0)
1446 err = 0;
1447 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001449 else
1450 break;
1451 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001452
1453 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001454 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001455 if (err > 0) {
1456 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001458 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001459 else if (err == 0)
1460 ;
1461 else
1462 break;
1463 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001464
1465 case JUMP_ABSOLUTE:
1466 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001467 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468
1469 case FOR_LOOP:
1470 /* for v in s: ...
1471 On entry: stack contains s, i.
1472 On exit: stack contains s, i+1, s[i];
1473 but if loop exhausted:
1474 s, i are popped, and we jump */
1475 w = POP(); /* Loop index */
1476 v = POP(); /* Sequence object */
1477 u = loop_subscript(v, w);
1478 if (u != NULL) {
1479 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001480 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001481 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001484 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 }
1486 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001487 Py_DECREF(v);
1488 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 /* A NULL can mean "s exhausted"
1490 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001493 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001495 continue;
1496 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 }
1498 break;
1499
1500 case SETUP_LOOP:
1501 case SETUP_EXCEPT:
1502 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001505 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001506
1507 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001508#ifdef LLTRACE
1509 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001511#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001512 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001513 if (f->f_trace == NULL)
1514 continue;
1515 /* Trace each line of code reached */
1516 f->f_lasti = INSTR_OFFSET();
1517 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001518 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001520
1521 case CALL_FUNCTION:
1522 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001523 int na = oparg & 0xff;
1524 int nk = (oparg>>8) & 0xff;
1525 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 PyObject **pfunc = stack_pointer - n - 1;
1527 PyObject *func = *pfunc;
1528 PyObject *self = NULL;
1529 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001530 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 if (PyMethod_Check(func)) {
1532 self = PyMethod_Self(func);
1533 class = PyMethod_Class(func);
1534 func = PyMethod_Function(func);
1535 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001536 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 Py_INCREF(self);
1538 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001539 *pfunc = self;
1540 na++;
1541 n++;
1542 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001543 else {
1544 /* Unbound methods must be
1545 called with an instance of
1546 the class (or a derived
1547 class) as first argument */
1548 if (na > 0 &&
1549 (self = stack_pointer[-n])
1550 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 PyInstance_Check(self) &&
1552 PyClass_IsSubclass(
1553 (PyObject *)
1554 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 ->in_class),
1556 class))
1557 /* Handy-dandy */ ;
1558 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001559 PyErr_SetString(
1560 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001561 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001562 x = NULL;
1563 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001564 }
1565 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 }
1567 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001568 Py_INCREF(func);
1569 if (PyFunction_Check(func)) {
1570 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001571 PyObject *globals =
1572 PyFunction_GetGlobals(func);
1573 PyObject *argdefs =
1574 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001575 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001576 int nd;
1577 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001579 nd = ((PyTupleObject *)argdefs) ->
1580 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001581 }
1582 else {
1583 d = NULL;
1584 nd = 0;
1585 }
1586 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 (PyCodeObject *)co,
1588 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 stack_pointer-n, na,
1590 stack_pointer-2*nk, nk,
1591 d, nd,
1592 class);
1593 }
1594 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 PyObject *args = PyTuple_New(na);
1596 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001597 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001598 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001599 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001601 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001602 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001603 if (kwdict == NULL) {
1604 x = NULL;
1605 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001607 err = 0;
1608 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001609 PyObject *value = POP();
1610 PyObject *key = POP();
1611 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001612 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001613 Py_DECREF(key);
1614 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001615 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001616 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001617 }
1618 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001619 Py_DECREF(args);
1620 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001621 break;
1622 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001623 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 while (--na >= 0) {
1625 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001626 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001627 }
1628 x = PyEval_CallObjectWithKeywords(
1629 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001630 Py_DECREF(args);
1631 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001632 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001633 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001634 while (stack_pointer > pfunc) {
1635 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001637 }
1638 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001639 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001640 break;
1641 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001642
Guido van Rossum681d79a1995-07-18 14:51:37 +00001643 case MAKE_FUNCTION:
1644 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 x = PyFunction_New(v, f->f_globals);
1646 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001647 /* XXX Maybe this should be a separate opcode? */
1648 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001650 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001652 x = NULL;
1653 break;
1654 }
1655 while (--oparg >= 0) {
1656 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 }
1659 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 }
1662 PUSH(x);
1663 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001664
1665 case BUILD_SLICE:
1666 if (oparg == 3)
1667 w = POP();
1668 else
1669 w = NULL;
1670 v = POP();
1671 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001672 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001673 Py_DECREF(u);
1674 Py_DECREF(v);
1675 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001676 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001677 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001678 break;
1679
1680
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 default:
1682 fprintf(stderr,
1683 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001684 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 why = WHY_EXCEPTION;
1687 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001688
1689#ifdef CASE_TOO_BIG
1690 }
1691#endif
1692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 } /* switch */
1694
1695 on_error:
1696
1697 /* Quickly continue if no error occurred */
1698
1699 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001700 if (err == 0 && x != NULL) {
1701#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001702 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001703 fprintf(stderr,
1704 "XXX undetected error\n");
1705 else
1706#endif
1707 continue; /* Normal, fast path */
1708 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 err = 0;
1712 }
1713
Guido van Rossum801dcae1992-04-08 11:32:32 +00001714#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 /* Double-check exception status */
1716
1717 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001720 PyErr_SetString(PyExc_SystemError,
1721 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 why = WHY_EXCEPTION;
1723 }
1724 }
1725 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001727 fprintf(stderr,
1728 "XXX undetected error (why=%d)\n",
1729 why);
1730 why = WHY_EXCEPTION;
1731 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 }
1733#endif
1734
1735 /* Log traceback info if this is a real exception */
1736
1737 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001738 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001740 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001742
Guido van Rossume59214e1994-08-30 08:01:59 +00001743 if (f->f_trace)
1744 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001745 if (tstate->sys_profilefunc)
1746 call_exc_trace(&tstate->sys_profilefunc,
1747 (PyObject**)0, f);
1748}
Guido van Rossum374a9221991-04-04 10:40:29 +00001749
1750 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1751
1752 if (why == WHY_RERAISE)
1753 why = WHY_EXCEPTION;
1754
1755 /* Unwind stacks if a (pseudo) exception occurred */
1756
1757 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001758 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001759 while (STACK_LEVEL() > b->b_level) {
1760 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001761 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 }
1763 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1764 why = WHY_NOT;
1765 JUMPTO(b->b_handler);
1766 break;
1767 }
1768 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001769 (b->b_type == SETUP_EXCEPT &&
1770 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 PyObject *exc, *val, *tb;
1773 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001775 val = Py_None;
1776 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001777 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001778 /* Make the raw exception data
1779 available to the handler,
1780 so a program can emulate the
1781 Python main loop. Don't do
1782 this for 'finally'. */
1783 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001784 set_exc_info(tstate,
1785 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001787 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 PUSH(val);
1789 PUSH(exc);
1790 }
1791 else {
1792 if (why == WHY_RETURN)
1793 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 PUSH(v);
1796 }
1797 why = WHY_NOT;
1798 JUMPTO(b->b_handler);
1799 break;
1800 }
1801 } /* unwind stack */
1802
1803 /* End the loop if we still have an error (or return) */
1804
1805 if (why != WHY_NOT)
1806 break;
1807
1808 } /* main loop */
1809
1810 /* Pop remaining stack entries */
1811
1812 while (!EMPTY()) {
1813 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001814 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 }
1816
Guido van Rossum96a42c81992-01-12 02:29:51 +00001817 if (why != WHY_RETURN)
1818 retval = NULL;
1819
Guido van Rossume59214e1994-08-30 08:01:59 +00001820 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001821 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001822 if (call_trace(&f->f_trace, &f->f_trace, f,
1823 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001825 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001826 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001827 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001828 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001829 }
1830
Guido van Rossuma027efa1997-05-05 20:56:21 +00001831 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1832 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001833 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001835 retval = NULL;
1836 why = WHY_EXCEPTION;
1837 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001838 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001839
Guido van Rossuma027efa1997-05-05 20:56:21 +00001840 reset_exc_info(tstate);
1841
1842 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001843
1844 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001845
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001847
Guido van Rossuma027efa1997-05-05 20:56:21 +00001848 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001850
Guido van Rossum96a42c81992-01-12 02:29:51 +00001851 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001852}
1853
Guido van Rossuma027efa1997-05-05 20:56:21 +00001854static void
1855set_exc_info(tstate, type, value, tb)
1856 PyThreadState *tstate;
1857 PyObject *type;
1858 PyObject *value;
1859 PyObject *tb;
1860{
1861 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001862 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001863 frame = tstate->frame;
1864 if (frame->f_exc_type == NULL) {
1865 /* This frame didn't catch an exception before */
1866 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001867 if (tstate->exc_type == NULL) {
1868 Py_INCREF(Py_None);
1869 tstate->exc_type = Py_None;
1870 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001871 tmp_type = frame->f_exc_type;
1872 tmp_value = frame->f_exc_value;
1873 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001874 Py_XINCREF(tstate->exc_type);
1875 Py_XINCREF(tstate->exc_value);
1876 Py_XINCREF(tstate->exc_traceback);
1877 frame->f_exc_type = tstate->exc_type;
1878 frame->f_exc_value = tstate->exc_value;
1879 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001880 Py_XDECREF(tmp_type);
1881 Py_XDECREF(tmp_value);
1882 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001883 }
1884 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001885 tmp_type = tstate->exc_type;
1886 tmp_value = tstate->exc_value;
1887 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001888 Py_XINCREF(type);
1889 Py_XINCREF(value);
1890 Py_XINCREF(tb);
1891 tstate->exc_type = type;
1892 tstate->exc_value = value;
1893 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001894 Py_XDECREF(tmp_type);
1895 Py_XDECREF(tmp_value);
1896 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001897 /* For b/w compatibility */
1898 PySys_SetObject("exc_type", type);
1899 PySys_SetObject("exc_value", value);
1900 PySys_SetObject("exc_traceback", tb);
1901}
1902
1903static void
1904reset_exc_info(tstate)
1905 PyThreadState *tstate;
1906{
1907 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001908 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001909 frame = tstate->frame;
1910 if (frame->f_exc_type != NULL) {
1911 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001912 tmp_type = tstate->exc_type;
1913 tmp_value = tstate->exc_value;
1914 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001915 Py_XINCREF(frame->f_exc_type);
1916 Py_XINCREF(frame->f_exc_value);
1917 Py_XINCREF(frame->f_exc_traceback);
1918 tstate->exc_type = frame->f_exc_type;
1919 tstate->exc_value = frame->f_exc_value;
1920 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001921 Py_XDECREF(tmp_type);
1922 Py_XDECREF(tmp_value);
1923 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001924 /* For b/w compatibility */
1925 PySys_SetObject("exc_type", frame->f_exc_type);
1926 PySys_SetObject("exc_value", frame->f_exc_value);
1927 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1928 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001929 tmp_type = frame->f_exc_type;
1930 tmp_value = frame->f_exc_value;
1931 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001932 frame->f_exc_type = NULL;
1933 frame->f_exc_value = NULL;
1934 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001935 Py_XDECREF(tmp_type);
1936 Py_XDECREF(tmp_value);
1937 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001938}
1939
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001940/* Logic for the raise statement (too complicated for inlining).
1941 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001942static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001943do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001944 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001945{
1946 /* We support the following forms of raise:
1947 raise <class>, <classinstance>
1948 raise <class>, <argument tuple>
1949 raise <class>, None
1950 raise <class>, <argument>
1951 raise <classinstance>, None
1952 raise <string>, <object>
1953 raise <string>, None
1954
1955 An omitted second argument is the same as None.
1956
1957 In addition, raise <tuple>, <anything> is the same as
1958 raising the tuple's first item (and it better have one!);
1959 this rule is applied recursively.
1960
1961 Finally, an optional third argument can be supplied, which
1962 gives the traceback to be substituted (useful when
1963 re-raising an exception after examining it). */
1964
1965 /* First, check the traceback argument, replacing None with
1966 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001967 if (tb == Py_None) {
1968 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001969 tb = NULL;
1970 }
1971 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001973 "raise 3rd arg must be traceback or None");
1974 goto raise_error;
1975 }
1976
1977 /* Next, replace a missing value with None */
1978 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 value = Py_None;
1980 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001981 }
1982
1983 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001984 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1985 PyObject *tmp = type;
1986 type = PyTuple_GET_ITEM(type, 0);
1987 Py_INCREF(type);
1988 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001989 }
1990
1991 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001992 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001993 ;
1994 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001995 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001996 /* Raising a class. If the value is an instance, it
1997 better be an instance of the class. If it is not,
1998 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001999 if (PyInstance_Check(value)) {
2000 PyObject *inclass = (PyObject*)
2001 (((PyInstanceObject*)value)->in_class);
2002 if (!PyClass_IsSubclass(inclass, type)) {
2003 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002004 "raise <class>, <instance> requires that <instance> is a member of <class>");
2005 goto raise_error;
2006 }
2007 }
2008 else {
2009 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00002010 PyObject *args, *res;
2011 if (value == Py_None)
2012 args = Py_BuildValue("()");
2013 else if (PyTuple_Check(value)) {
2014 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002015 args = value;
2016 }
2017 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002019 if (args == NULL)
2020 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 res = PyEval_CallObject(type, args);
2022 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002023 if (res == NULL)
2024 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00002025 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002026 value = res;
2027 }
2028 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002030 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002031 if (value != Py_None) {
2032 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002033 "instance exception may not have a separate value");
2034 goto raise_error;
2035 }
2036 else {
2037 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002039 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2041 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002042 }
2043 }
2044 else {
2045 /* Not something you can raise. You get an exception
2046 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002047 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002048 "exceptions must be strings, classes, or instances");
2049 goto raise_error;
2050 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002051 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002052 if (tb == NULL)
2053 return WHY_EXCEPTION;
2054 else
2055 return WHY_RERAISE;
2056 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002057 Py_XDECREF(value);
2058 Py_XDECREF(type);
2059 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002060 return WHY_EXCEPTION;
2061}
2062
Guido van Rossum96a42c81992-01-12 02:29:51 +00002063#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002064static int
2065prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002067 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 if (PyObject_Print(v, stdout, 0) != 0)
2071 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002072 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002074#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002076static void
2077call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 PyObject **p_trace, **p_newtrace;
2079 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002080{
Guido van Rossumb209a111997-04-29 18:18:01 +00002081 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002082 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002084 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002085 value = Py_None;
2086 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002087 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002088 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002089 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002092 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002096 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 Py_XDECREF(type);
2099 Py_XDECREF(value);
2100 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002101 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002102}
2103
2104static int
2105call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002106 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002107 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002109 may point to NULL variable;
2110 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002112 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002114{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002115 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 PyObject *args, *what;
2117 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002118
Guido van Rossuma027efa1997-05-05 20:56:21 +00002119 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002120 /* Don't do recursive traces */
2121 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002122 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002123 *p_newtrace = NULL;
2124 }
2125 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002126 }
2127
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002129 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 goto Py_Cleanup;
2131 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002132 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 goto Py_Cleanup;
2134 Py_INCREF(f);
2135 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2136 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002137 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 arg = Py_None;
2139 Py_INCREF(arg);
2140 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002141 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002142 PyFrame_FastToLocals(f);
2143 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2144 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002145 tstate->tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 Py_Cleanup:
2147 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002148 if (res == NULL) {
2149 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 PyTraceBack_Here(f);
2151 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152 *p_trace = NULL;
2153 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002155 *p_newtrace = NULL;
2156 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002157 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002158 }
2159 else {
2160 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 Py_XDECREF(*p_newtrace);
2162 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002163 *p_newtrace = NULL;
2164 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002166 *p_newtrace = res;
2167 }
2168 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002170 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002171 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002172}
2173
Guido van Rossumb209a111997-04-29 18:18:01 +00002174PyObject *
2175PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002176{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002177 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002178 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00002180 else
2181 return current_frame->f_builtins;
2182}
2183
Guido van Rossumb209a111997-04-29 18:18:01 +00002184PyObject *
2185PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002186{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002187 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002188 if (current_frame == NULL)
2189 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002191 return current_frame->f_locals;
2192}
2193
Guido van Rossumb209a111997-04-29 18:18:01 +00002194PyObject *
2195PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002196{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002197 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002198 if (current_frame == NULL)
2199 return NULL;
2200 else
2201 return current_frame->f_globals;
2202}
2203
Guido van Rossumb209a111997-04-29 18:18:01 +00002204PyObject *
2205PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002206{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002207 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002208 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002209}
2210
Guido van Rossum6135a871995-01-09 17:53:26 +00002211int
Guido van Rossumb209a111997-04-29 18:18:01 +00002212PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002213{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002214 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002215 return current_frame == NULL ? 0 : current_frame->f_restricted;
2216}
2217
Guido van Rossumbe270261997-05-22 22:26:18 +00002218int
Guido van Rossumb209a111997-04-29 18:18:01 +00002219Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002220{
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002222 if (f == NULL)
2223 return 0;
2224 if (!PyFile_SoftSpace(f, 0))
2225 return 0;
2226 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227}
2228
Guido van Rossum3f5da241990-12-20 15:06:42 +00002229
Guido van Rossum681d79a1995-07-18 14:51:37 +00002230/* External interface to call any callable object.
2231 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002232
Guido van Rossumb209a111997-04-29 18:18:01 +00002233PyObject *
2234PyEval_CallObject(func, arg)
2235 PyObject *func;
2236 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002237{
Guido van Rossumb209a111997-04-29 18:18:01 +00002238 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239}
Guido van Rossume59214e1994-08-30 08:01:59 +00002240
Guido van Rossumb209a111997-04-29 18:18:01 +00002241PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002242PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 PyObject *func;
2244 PyObject *arg;
2245 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002246{
2247 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002248 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002249
2250 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 arg = PyTuple_New(0);
2252 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253 PyErr_SetString(PyExc_TypeError,
2254 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002255 return NULL;
2256 }
2257 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002259
Guido van Rossumb209a111997-04-29 18:18:01 +00002260 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002261 PyErr_SetString(PyExc_TypeError,
2262 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002263 return NULL;
2264 }
2265
Guido van Rossum150b2df1996-12-05 23:17:11 +00002266 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002267 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002268 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002269 result = call_function(func, arg, kw);
2270 else
2271 result = call_builtin(func, arg, kw);
2272
Guido van Rossumb209a111997-04-29 18:18:01 +00002273 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002274
Guido van Rossumb209a111997-04-29 18:18:01 +00002275 if (result == NULL && !PyErr_Occurred())
2276 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002277 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002278
2279 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002280}
2281
Guido van Rossumb209a111997-04-29 18:18:01 +00002282static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002283call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 PyObject *func;
2285 PyObject *arg;
2286 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002287{
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 if (PyCFunction_Check(func)) {
2289 PyCFunction meth = PyCFunction_GetFunction(func);
2290 PyObject *self = PyCFunction_GetSelf(func);
2291 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002292 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002293 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002294 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002296 else if (size == 0)
2297 arg = NULL;
2298 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002299 if (flags & METH_KEYWORDS)
2300 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002301 if (kw != NULL && PyDict_Size(kw) != 0) {
2302 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002303 "this function takes no keyword arguments");
2304 return NULL;
2305 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002306 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 if (PyClass_Check(func)) {
2309 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 if (PyInstance_Check(func)) {
2312 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002313 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002314 PyErr_Clear();
2315 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002316 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002317 return NULL;
2318 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002319 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002321 return res;
2322 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002323 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324 return NULL;
2325}
2326
Guido van Rossumb209a111997-04-29 18:18:01 +00002327static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002329 PyObject *func;
2330 PyObject *arg;
2331 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332{
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 PyObject *class = NULL; /* == owner */
2334 PyObject *argdefs;
2335 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002336 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 if (kw != NULL && !PyDict_Check(kw)) {
2340 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341 return NULL;
2342 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 if (PyMethod_Check(func)) {
2345 PyObject *self = PyMethod_Self(func);
2346 class = PyMethod_Class(func);
2347 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002348 if (self == NULL) {
2349 /* Unbound methods must be called with an instance of
2350 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002351 if (PyTuple_Size(arg) >= 1) {
2352 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002353 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002354 PyInstance_Check(self) &&
2355 PyClass_IsSubclass((PyObject *)
2356 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002357 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002358 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002359 else
2360 self = NULL;
2361 }
2362 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002364 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002365 return NULL;
2366 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002367 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002368 }
2369 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002370 int argcount = PyTuple_Size(arg);
2371 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002372 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002373 if (newarg == NULL)
2374 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002375 Py_INCREF(self);
2376 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002377 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002378 PyObject *v = PyTuple_GET_ITEM(arg, i);
2379 Py_XINCREF(v);
2380 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002381 }
2382 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 }
2384 }
2385 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002386 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002387 PyErr_SetString(PyExc_TypeError,
2388 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002389 return NULL;
2390 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002393
2394 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2396 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2397 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002398 }
2399 else {
2400 d = NULL;
2401 nd = 0;
2402 }
2403
2404 if (kw != NULL) {
2405 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002406 nk = PyDict_Size(kw);
2407 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002408 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002409 PyErr_NoMemory();
2410 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002411 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002412 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415 i += 2;
2416 nk = i/2;
2417 /* XXX This is broken if the caller deletes dict items! */
2418 }
2419 else {
2420 k = NULL;
2421 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002422 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 (PyCodeObject *)PyFunction_GetCode(func),
2426 PyFunction_GetGlobals(func), (PyObject *)NULL,
2427 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 k, nk,
2429 d, nd,
2430 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 Py_DECREF(arg);
2433 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434
Guido van Rossum681d79a1995-07-18 14:51:37 +00002435 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436}
2437
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002438#define SLICE_ERROR_MSG \
2439 "standard sequence type does not support step size other than one"
2440
Guido van Rossumb209a111997-04-29 18:18:01 +00002441static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002442loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002443 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444{
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002446 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002448 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 return NULL;
2450 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002452 v = (*sq->sq_item)(v, i);
2453 if (v)
2454 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 if (PyErr_Occurred() == PyExc_IndexError)
2456 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002457 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458}
2459
2460static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002461slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 int *pi;
2464{
2465 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002466 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002467 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002468 PyErr_SetString(PyExc_TypeError,
2469 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002470 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002472 x = PyInt_AsLong(v);
2473 /* Truncate -- very long indices are truncated anyway */
2474 if (x > INT_MAX)
2475 x = INT_MAX;
2476 else if (x < -INT_MAX)
2477 x = 0;
2478 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002480 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481}
2482
Guido van Rossumb209a111997-04-29 18:18:01 +00002483static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002484apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002487 int ilow = 0, ihigh = INT_MAX;
2488 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002490 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002491 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002492 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002494
2495static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002499 int ilow = 0, ihigh = INT_MAX;
2500 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002501 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002502 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002503 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002504 if (x == NULL)
2505 return PySequence_DelSlice(u, ilow, ihigh);
2506 else
2507 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508}
2509
2510static int
2511cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002512 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513{
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002518 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002519 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 return 1;
2521 }
2522 return 0;
2523 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002524 if (PyClass_Check(v) && PyClass_Check(err))
2525 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 return err == v;
2527}
2528
Guido van Rossum3f5da241990-12-20 15:06:42 +00002529static int
2530cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002531 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002532{
Guido van Rossume59214e1994-08-30 08:01:59 +00002533 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002534 PyObject *x;
2535 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002536 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002537 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 register char *s, *end;
2539 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002540 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2541 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002542 "string member test needs char left operand");
2543 return -1;
2544 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002545 c = PyString_AsString(v)[0];
2546 s = PyString_AsString(w);
2547 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002548 while (s < end) {
2549 if (c == *s++)
2550 return 1;
2551 }
2552 return 0;
2553 }
2554 sq = w->ob_type->tp_as_sequence;
2555 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002556 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557 "'in' or 'not in' needs sequence right argument");
2558 return -1;
2559 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002560 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002562 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002563 if (PyErr_Occurred() == PyExc_IndexError) {
2564 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002565 break;
2566 }
2567 return -1;
2568 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002569 cmp = PyObject_Compare(v, x);
2570 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002571 if (cmp == 0)
2572 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002573 if (PyErr_Occurred())
2574 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 }
2576 return 0;
2577}
2578
Guido van Rossumb209a111997-04-29 18:18:01 +00002579static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002580cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002581 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002582 register PyObject *v;
2583 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584{
2585 register int cmp;
2586 register int res = 0;
2587 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588 case IS:
2589 case IS_NOT:
2590 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002591 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 res = !res;
2593 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002594 case IN:
2595 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 res = cmp_member(v, w);
2597 if (res < 0)
2598 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002599 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002600 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 break;
2602 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 break;
2605 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002606 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002607 if (cmp && PyErr_Occurred())
2608 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002609 switch (op) {
2610 case LT: res = cmp < 0; break;
2611 case LE: res = cmp <= 0; break;
2612 case EQ: res = cmp == 0; break;
2613 case NE: res = cmp != 0; break;
2614 case GT: res = cmp > 0; break;
2615 case GE: res = cmp >= 0; break;
2616 /* XXX no default? (res is initialized to 0 though) */
2617 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 v = res ? Py_True : Py_False;
2620 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 return v;
2622}
2623
Guido van Rossum3f5da241990-12-20 15:06:42 +00002624static int
2625import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002626 PyObject *locals;
2627 PyObject *v;
2628 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002629{
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 PyObject *w, *x;
2631 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002632 PyErr_SetString(PyExc_TypeError,
2633 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002634 return -1;
2635 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 w = PyModule_GetDict(v);
2637 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002638 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002639 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002640 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 while (PyDict_Next(w, &pos, &name, &value)) {
2642 if (!PyString_Check(name) ||
2643 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002644 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 Py_INCREF(value);
2646 err = PyDict_SetItem(locals, name, value);
2647 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002648 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002650 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002651 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002652 }
2653 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002655 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002656 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002657 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 PyString_AsString(name));
2659 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002660 return -1;
2661 }
2662 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002663 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002664 }
2665}
2666
Guido van Rossumb209a111997-04-29 18:18:01 +00002667static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002668build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002669 PyObject *methods; /* dictionary */
2670 PyObject *bases; /* tuple containing classes */
2671 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002672{
Guido van Rossum25831651993-05-19 14:50:45 +00002673 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002674 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002675 PyErr_SetString(PyExc_SystemError,
2676 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002677 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002678 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002679 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002680 PyErr_SetString(PyExc_SystemError,
2681 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002682 return NULL;
2683 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002685 PyErr_SetString(PyExc_SystemError,
2686 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002687 return NULL;
2688 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002689 for (i = PyTuple_Size(bases); --i >= 0; ) {
2690 PyObject *base = PyTuple_GET_ITEM(bases, i);
2691 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002692 /* Call the base's *type*, if it is callable.
2693 This code is a hook for Donald Beaudry's
2694 and Jim Fulton's type extensions. In
2695 unexended Python it will never be triggered
2696 since its types are not callable. */
2697 if (base->ob_type->ob_type->tp_call) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 PyObject *args;
2699 PyObject *class;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002700 args = Py_BuildValue("(OOO)",
2701 name, bases, methods);
2702 class = PyEval_CallObject(
2703 (PyObject *)base->ob_type, args);
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 Py_DECREF(args);
Guido van Rossum150b2df1996-12-05 23:17:11 +00002705 return class;
2706 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002707 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002708 "base is not a class object");
2709 return NULL;
2710 }
2711 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002713}
2714
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002715static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002716exec_statement(f, prog, globals, locals)
2717 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 PyObject *prog;
2719 PyObject *globals;
2720 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002721{
2722 char *s;
2723 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002725 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002726
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2728 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002729 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002730 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002731 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 locals = PyTuple_GetItem(prog, 2);
2733 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002734 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002735 if (globals == Py_None) {
2736 globals = PyEval_GetGlobals();
2737 if (locals == Py_None) {
2738 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002739 plain = 1;
2740 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002743 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 if (!PyString_Check(prog) &&
2745 !PyCode_Check(prog) &&
2746 !PyFile_Check(prog)) {
2747 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002748 "exec 1st arg must be string, code or file object");
2749 return -1;
2750 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2752 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002753 "exec 2nd/3rd args must be dict or None");
2754 return -1;
2755 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002756 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002757 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002758 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002759 if (PyEval_EvalCode((PyCodeObject *) prog,
2760 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002761 return -1;
2762 return 0;
2763 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 if (PyFile_Check(prog)) {
2765 FILE *fp = PyFile_AsFile(prog);
2766 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002767 if (PyRun_File(fp, name, Py_file_input,
2768 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002769 return -1;
2770 return 0;
2771 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002772 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002773 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002774 PyErr_SetString(PyExc_ValueError,
2775 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002776 return -1;
2777 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002778 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002779 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002780 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002782 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002783 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002784 return 0;
2785}
Guido van Rossum24c13741995-02-14 09:42:43 +00002786
Guido van Rossum1aa14831997-01-21 05:34:20 +00002787/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002788static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002789find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002791 int nexti;
2792{
2793 int opcode;
2794 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002795 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002796 unsigned char *next_instr;
2797
2798 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2799 opcode = (*next_instr++);
2800 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 Py_INCREF(Py_None);
2802 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002803 }
2804
Guido van Rossumb209a111997-04-29 18:18:01 +00002805 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002806 if (list == NULL)
2807 return NULL;
2808
2809 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002810 oparg = (next_instr[1]<<8) + next_instr[0];
2811 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002812 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002813 if (PyList_Append(list, name) < 0) {
2814 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002815 break;
2816 }
2817 opcode = (*next_instr++);
2818 } while (opcode == IMPORT_FROM);
2819
2820 return list;
2821}
Guido van Rossum950361c1997-01-24 13:49:28 +00002822
2823
2824#ifdef DYNAMIC_EXECUTION_PROFILE
2825
2826PyObject *
2827getarray(a)
2828 long a[256];
2829{
2830 int i;
2831 PyObject *l = PyList_New(256);
2832 if (l == NULL) return NULL;
2833 for (i = 0; i < 256; i++) {
2834 PyObject *x = PyInt_FromLong(a[i]);
2835 if (x == NULL) {
2836 Py_DECREF(l);
2837 return NULL;
2838 }
2839 PyList_SetItem(l, i, x);
2840 }
2841 for (i = 0; i < 256; i++)
2842 a[i] = 0;
2843 return l;
2844}
2845
2846PyObject *
2847_Py_GetDXProfile(self, args)
2848 PyObject *self, *args;
2849{
2850#ifndef DXPAIRS
2851 return getarray(dxp);
2852#else
2853 int i;
2854 PyObject *l = PyList_New(257);
2855 if (l == NULL) return NULL;
2856 for (i = 0; i < 257; i++) {
2857 PyObject *x = getarray(dxpairs[i]);
2858 if (x == NULL) {
2859 Py_DECREF(l);
2860 return NULL;
2861 }
2862 PyList_SetItem(l, i, x);
2863 }
2864 return l;
2865#endif
2866}
2867
2868#endif