blob: 5aed5ff8afee848a964b93479ae8d58c2953e795 [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 PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
88static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
89static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000090static int exec_statement Py_PROTO((PyFrameObject *,
91 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000092static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000093static void set_exc_info Py_PROTO((PyThreadState *,
94 PyObject *, PyObject *, PyObject *));
95static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000096
97
Guido van Rossum950361c1997-01-24 13:49:28 +000098/* Dynamic execution profile */
99#ifdef DYNAMIC_EXECUTION_PROFILE
100#ifdef DXPAIRS
101static long dxpairs[257][256];
102#define dxp dxpairs[256]
103#else
104static long dxp[256];
105#endif
106#endif
107
108
Guido van Rossume59214e1994-08-30 08:01:59 +0000109#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000110
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000111#include <errno.h>
112#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000113
Guido van Rossuma027efa1997-05-05 20:56:21 +0000114extern int _PyThread_Started; /* Flag for Py_Exit */
115
Guido van Rossuma9672091994-09-14 13:31:22 +0000116static type_lock interpreter_lock = 0;
117static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000118
119void
Guido van Rossumb209a111997-04-29 18:18:01 +0000120PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000121{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000123 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 _PyThread_Started = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000125 interpreter_lock = allocate_lock();
126 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000127 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000128}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000129
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000130void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000131PyEval_AcquireLock()
132{
133 acquire_lock(interpreter_lock, 1);
134}
135
136void
137PyEval_ReleaseLock()
138{
139 release_lock(interpreter_lock);
140}
141
142void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000143PyEval_AcquireThread(tstate)
144 PyThreadState *tstate;
145{
146 if (tstate == NULL)
147 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
148 acquire_lock(interpreter_lock, 1);
149 if (PyThreadState_Swap(tstate) != NULL)
150 Py_FatalError(
151 "PyEval_AcquireThread: non-NULL old thread state");
152}
153
154void
155PyEval_ReleaseThread(tstate)
156 PyThreadState *tstate;
157{
158 if (tstate == NULL)
159 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
160 if (PyThreadState_Swap(NULL) != tstate)
161 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
162 release_lock(interpreter_lock);
163}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164#endif
165
Guido van Rossumff4949e1992-08-05 19:58:53 +0000166/* Functions save_thread and restore_thread are always defined so
167 dynamically loaded modules needn't be compiled separately for use
168 with and without threads: */
169
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000170PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000171PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000172{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000173 PyThreadState *tstate = PyThreadState_Swap(NULL);
174 if (tstate == NULL)
175 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000176#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000177 if (interpreter_lock)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178 release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000180 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181}
182
183void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000184PyEval_RestoreThread(tstate)
185 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000187 if (tstate == NULL)
188 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000189#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000191 int err = errno;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192 acquire_lock(interpreter_lock, 1);
193 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194 }
195#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000196 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197}
198
199
Guido van Rossuma9672091994-09-14 13:31:22 +0000200/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
201 signal handlers or Mac I/O completion routines) can schedule calls
202 to a function to be called synchronously.
203 The synchronous function is called with one void* argument.
204 It should return 0 for success or -1 for failure -- failure should
205 be accompanied by an exception.
206
207 If registry succeeds, the registry function returns 0; if it fails
208 (e.g. due to too many pending calls) it returns -1 (without setting
209 an exception condition).
210
211 Note that because registry may occur from within signal handlers,
212 or other asynchronous events, calling malloc() is unsafe!
213
214#ifdef WITH_THREAD
215 Any thread can schedule pending calls, but only the main thread
216 will execute them.
217#endif
218
219 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
220 There are two possible race conditions:
221 (1) nested asynchronous registry calls;
222 (2) registry calls made while pending calls are being processed.
223 While (1) is very unlikely, (2) is a real possibility.
224 The current code is safe against (2), but not against (1).
225 The safety against (2) is derived from the fact that only one
226 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000227
Guido van Rossuma027efa1997-05-05 20:56:21 +0000228 XXX Darn! With the advent of thread state, we should have an array
229 of pending calls per thread in the thread state! Later...
230*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000231
Guido van Rossuma9672091994-09-14 13:31:22 +0000232#define NPENDINGCALLS 32
233static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000234 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000235 ANY *arg;
236} pendingcalls[NPENDINGCALLS];
237static volatile int pendingfirst = 0;
238static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000239static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240
241int
242Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000243 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000244 ANY *arg;
245{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000246 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000247 int i, j;
248 /* XXX Begin critical section */
249 /* XXX If you want this to be safe against nested
250 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000251 if (busy)
252 return -1;
253 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000254 i = pendinglast;
255 j = (i + 1) % NPENDINGCALLS;
256 if (j == pendingfirst)
257 return -1; /* Queue full */
258 pendingcalls[i].func = func;
259 pendingcalls[i].arg = arg;
260 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000261 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000263 /* XXX End critical section */
264 return 0;
265}
266
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267int
268Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000269{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000270 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000271#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000272 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000273 return 0;
274#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000275 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000276 return 0;
277 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000278 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000279 for (;;) {
280 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000281 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000282 ANY *arg;
283 i = pendingfirst;
284 if (i == pendinglast)
285 break; /* Queue empty */
286 func = pendingcalls[i].func;
287 arg = pendingcalls[i].arg;
288 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000289 if (func(arg) < 0) {
290 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000291 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000292 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000293 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000294 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000295 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000296 return 0;
297}
298
299
Guido van Rossum374a9221991-04-04 10:40:29 +0000300/* Status code for main loop (reason for stack unwind) */
301
302enum why_code {
303 WHY_NOT, /* No error */
304 WHY_EXCEPTION, /* Exception occurred */
305 WHY_RERAISE, /* Exception re-raised by 'finally' */
306 WHY_RETURN, /* 'return' statement */
307 WHY_BREAK /* 'break' statement */
308};
309
Guido van Rossumb209a111997-04-29 18:18:01 +0000310static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Barry Warsawe42b18f1997-08-25 22:13:04 +0000311static int unpack_sequence Py_PROTO((PyObject *, int, PyObject **));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000312
Guido van Rossum374a9221991-04-04 10:40:29 +0000313
Guido van Rossum681d79a1995-07-18 14:51:37 +0000314/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000315
Guido van Rossumb209a111997-04-29 18:18:01 +0000316PyObject *
317PyEval_EvalCode(co, globals, locals)
318 PyCodeObject *co;
319 PyObject *globals;
320 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000321{
322 return eval_code2(co,
323 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000324 (PyObject **)NULL, 0,
325 (PyObject **)NULL, 0,
326 (PyObject **)NULL, 0,
327 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000328}
329
330
331/* Interpreter main loop */
332
Guido van Rossum8861b741996-07-30 16:49:37 +0000333#ifndef MAX_RECURSION_DEPTH
334#define MAX_RECURSION_DEPTH 10000
335#endif
336
Guido van Rossumb209a111997-04-29 18:18:01 +0000337static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000338eval_code2(co, globals, locals,
339 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000340 PyCodeObject *co;
341 PyObject *globals;
342 PyObject *locals;
343 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000344 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000345 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000346 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000347 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000350{
Guido van Rossum950361c1997-01-24 13:49:28 +0000351#ifdef DXPAIRS
352 int lastopcode = 0;
353#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000354 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000355 register int opcode = 0; /* Current opcode */
356 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000357 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000358 register enum why_code why; /* Reason for block stack unwind */
359 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000360 register PyObject *x; /* Result object -- NULL if error */
361 register PyObject *v; /* Temporary objects popped off stack */
362 register PyObject *w;
363 register PyObject *u;
364 register PyObject *t;
365 register PyFrameObject *f; /* Current frame */
366 register PyObject **fastlocals = NULL;
367 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000368 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000369#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000370 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000371#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000372#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000373 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000374 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000375#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000376
377/* Code access macros */
378
379#define GETCONST(i) Getconst(f, i)
380#define GETNAME(i) Getname(f, i)
381#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000382#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000383#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
384#define NEXTOP() (*next_instr++)
385#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
386#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
387#define JUMPBY(x) (next_instr += (x))
388
389/* Stack manipulation macros */
390
391#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
392#define EMPTY() (STACK_LEVEL() == 0)
393#define TOP() (stack_pointer[-1])
394#define BASIC_PUSH(v) (*stack_pointer++ = (v))
395#define BASIC_POP() (*--stack_pointer)
396
Guido van Rossum96a42c81992-01-12 02:29:51 +0000397#ifdef LLTRACE
398#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
399#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000400#else
401#define PUSH(v) BASIC_PUSH(v)
402#define POP() BASIC_POP()
403#endif
404
Guido van Rossum681d79a1995-07-18 14:51:37 +0000405/* Local variable macros */
406
407#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000408#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409 GETLOCAL(i) = value; } while (0)
410
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411/* Start of code */
412
Guido van Rossum8861b741996-07-30 16:49:37 +0000413#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000415 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000416 return NULL;
417 }
418#endif
419
Guido van Rossum681d79a1995-07-18 14:51:37 +0000420 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000421 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000422 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000423 }
424
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000425#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000426 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000427#endif
428
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000431 co, /*code*/
432 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000433 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 if (f == NULL)
435 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000438 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439
440 if (co->co_argcount > 0 ||
441 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
442 int i;
443 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000444 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000445 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000446 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000447 if (kwdict == NULL)
448 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000449 i = co->co_argcount;
450 if (co->co_flags & CO_VARARGS)
451 i++;
452 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 }
454 if (argcount > co->co_argcount) {
455 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000456 PyErr_Format(PyExc_TypeError,
457 "too many arguments; expected %d, got %d",
458 co->co_argcount, argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000459 goto fail;
460 }
461 n = co->co_argcount;
462 }
463 for (i = 0; i < n; i++) {
464 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000465 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 SETLOCAL(i, x);
467 }
468 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000470 if (u == NULL)
471 goto fail;
472 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 for (i = n; i < argcount; i++) {
474 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000475 Py_INCREF(x);
476 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000477 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000478 }
479 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000480 PyObject *keyword = kws[2*i];
481 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 int j;
483 /* XXX slow -- speed up using dictionary? */
484 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000485 PyObject *nm = PyTuple_GET_ITEM(
486 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000488 break;
489 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000490 /* Check errors from Compare */
491 if (PyErr_Occurred())
492 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000493 if (j >= co->co_argcount) {
494 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000495 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000496 "unexpected keyword argument: %.400s",
497 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 goto fail;
499 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000500 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 }
502 else {
503 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000504 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000505 "keyword parameter redefined");
506 goto fail;
507 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000508 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000509 SETLOCAL(j, value);
510 }
511 }
512 if (argcount < co->co_argcount) {
513 int m = co->co_argcount - defcount;
514 for (i = argcount; i < m; i++) {
515 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000516 PyErr_Format(PyExc_TypeError,
517 "not enough arguments; expected %d, got %d",
518 m, i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 goto fail;
520 }
521 }
522 if (n > m)
523 i = n - m;
524 else
525 i = 0;
526 for (; i < defcount; i++) {
527 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000528 PyObject *def = defs[i];
529 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000530 SETLOCAL(m+i, def);
531 }
532 }
533 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 }
535 else {
536 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000537 PyErr_SetString(PyExc_TypeError,
538 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000539 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000540 }
541 }
542
Guido van Rossuma027efa1997-05-05 20:56:21 +0000543 if (tstate->sys_tracefunc != NULL) {
544 /* tstate->sys_tracefunc, if defined, is a function that
545 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000546 Its return value, if not None, is a function that
547 will be called at the start of each executed line
548 of code. (Actually, the function must return
549 itself in order to continue tracing.)
550 The trace functions are called with three arguments:
551 a pointer to the current frame, a string indicating
552 why the function is called, and an argument which
553 depends on the situation. The global trace function
554 (sys.trace) is also called whenever an exception
555 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000556 if (call_trace(&tstate->sys_tracefunc,
557 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000558 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000559 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000560 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000562 }
563
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 if (tstate->sys_profilefunc != NULL) {
565 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000566 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 if (call_trace(&tstate->sys_profilefunc,
568 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000569 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000571 }
572 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000573
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
575 --tstate->recursion_depth;
576 PyErr_SetString(PyExc_RuntimeError,
577 "Maximum recursion depth exceeded");
578 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000579 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000580 return NULL;
581 }
582
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000583 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000584 stack_pointer = f->f_valuestack;
585
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 why = WHY_NOT;
587 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000588 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000589
590 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000591 /* Do periodic things. Doing this every time through
592 the loop would add too much overhead, so we do it
593 only every Nth instruction. We also do it if
594 ``things_to_do'' is set, i.e. when an asynchronous
595 event needs attention (e.g. a signal handler or
596 async I/O handler); see Py_AddPendingCall() and
597 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000598
Guido van Rossuma027efa1997-05-05 20:56:21 +0000599 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000600 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000602 if (Py_MakePendingCalls() < 0) {
603 why = WHY_EXCEPTION;
604 goto on_error;
605 }
606 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000607#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000608 /* If we have true signals, the signal handler
609 will call Py_AddPendingCall() so we don't
610 have to call sigcheck(). On the Mac and
611 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000612 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000613 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 goto on_error;
615 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000616#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000617
Guido van Rossume59214e1994-08-30 08:01:59 +0000618#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619 if (interpreter_lock) {
620 /* Give another thread a chance */
621
Guido van Rossum25ce5661997-08-02 03:10:38 +0000622 if (PyThreadState_Swap(NULL) != tstate)
623 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000624 release_lock(interpreter_lock);
625
626 /* Other threads may run now */
627
628 acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000629 if (PyThreadState_Swap(tstate) != NULL)
630 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000631 }
632#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000633 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000634
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000636
Guido van Rossum408027e1996-12-30 16:17:54 +0000637#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000638 f->f_lasti = INSTR_OFFSET();
639#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000640
641 opcode = NEXTOP();
642 if (HAS_ARG(opcode))
643 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000644#ifdef DYNAMIC_EXECUTION_PROFILE
645#ifdef DXPAIRS
646 dxpairs[lastopcode][opcode]++;
647 lastopcode = opcode;
648#endif
649 dxp[opcode]++;
650#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000651
Guido van Rossum96a42c81992-01-12 02:29:51 +0000652#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 /* Instruction tracing */
654
Guido van Rossum96a42c81992-01-12 02:29:51 +0000655 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000656 if (HAS_ARG(opcode)) {
657 printf("%d: %d, %d\n",
658 (int) (INSTR_OFFSET() - 3),
659 opcode, oparg);
660 }
661 else {
662 printf("%d: %d\n",
663 (int) (INSTR_OFFSET() - 1), opcode);
664 }
665 }
666#endif
667
668 /* Main switch on opcode */
669
670 switch (opcode) {
671
672 /* BEWARE!
673 It is essential that any operation that fails sets either
674 x to NULL, err to nonzero, or why to anything but WHY_NOT,
675 and that no operation that succeeds does this! */
676
677 /* case STOP_CODE: this is an error! */
678
679 case POP_TOP:
680 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000681 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000682 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000683
684 case ROT_TWO:
685 v = POP();
686 w = POP();
687 PUSH(v);
688 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000689 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000690
691 case ROT_THREE:
692 v = POP();
693 w = POP();
694 x = POP();
695 PUSH(v);
696 PUSH(x);
697 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000698 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000699
700 case DUP_TOP:
701 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000702 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000704 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000705
706 case UNARY_POSITIVE:
707 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000708 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000709 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000711 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 break;
713
714 case UNARY_NEGATIVE:
715 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000716 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000719 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 break;
721
722 case UNARY_NOT:
723 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000724 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000725 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000726 if (err == 0) {
727 Py_INCREF(Py_True);
728 PUSH(Py_True);
729 continue;
730 }
731 else if (err > 0) {
732 Py_INCREF(Py_False);
733 PUSH(Py_False);
734 err = 0;
735 continue;
736 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 break;
738
739 case UNARY_CONVERT:
740 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000741 x = PyObject_Repr(v);
742 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000744 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000746
747 case UNARY_INVERT:
748 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000749 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000750 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000751 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000752 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000753 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000754
Guido van Rossum50564e81996-01-12 01:13:16 +0000755 case BINARY_POWER:
756 w = POP();
757 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000758 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000759 Py_DECREF(v);
760 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000761 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000762 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000763 break;
764
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 case BINARY_MULTIPLY:
766 w = POP();
767 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000768 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000769 Py_DECREF(v);
770 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000771 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000772 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 break;
774
775 case BINARY_DIVIDE:
776 w = POP();
777 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000778 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000779 Py_DECREF(v);
780 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000782 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 break;
784
785 case BINARY_MODULO:
786 w = POP();
787 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000788 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000789 Py_DECREF(v);
790 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000791 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000792 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000793 break;
794
795 case BINARY_ADD:
796 w = POP();
797 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000798 if (PyInt_Check(v) && PyInt_Check(w)) {
799 /* INLINE: int + int */
800 register long a, b, i;
801 a = ((PyIntObject*) v)->ob_ival;
802 b = ((PyIntObject*) w)->ob_ival;
803 i = a + b;
804 if ((i^a) < 0 && (i^b) < 0) {
805 PyErr_SetString(PyExc_OverflowError,
806 "integer addition");
807 x = NULL;
808 }
809 else
810 x = PyInt_FromLong(i);
811 }
812 else
813 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000814 Py_DECREF(v);
815 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000817 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 break;
819
820 case BINARY_SUBTRACT:
821 w = POP();
822 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000823 if (PyInt_Check(v) && PyInt_Check(w)) {
824 /* INLINE: int - int */
825 register long a, b, i;
826 a = ((PyIntObject*) v)->ob_ival;
827 b = ((PyIntObject*) w)->ob_ival;
828 i = a - b;
829 if ((i^a) < 0 && (i^~b) < 0) {
830 PyErr_SetString(PyExc_OverflowError,
831 "integer subtraction");
832 x = NULL;
833 }
834 else
835 x = PyInt_FromLong(i);
836 }
837 else
838 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000839 Py_DECREF(v);
840 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000842 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 break;
844
845 case BINARY_SUBSCR:
846 w = POP();
847 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000848 if (PyList_Check(v) && PyInt_Check(w)) {
849 /* INLINE: list[int] */
850 long i = PyInt_AsLong(w);
851 if (i < 0)
852 i += ((PyListObject*) v)->ob_size;
853 if (i < 0 ||
854 i >= ((PyListObject*) v)->ob_size) {
855 PyErr_SetString(PyExc_IndexError,
856 "list index out of range");
857 x = NULL;
858 }
859 else {
860 x = ((PyListObject*) v)->ob_item[i];
861 Py_INCREF(x);
862 }
863 }
864 else
865 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000866 Py_DECREF(v);
867 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000869 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 break;
871
Guido van Rossum7928cd71991-10-24 14:59:31 +0000872 case BINARY_LSHIFT:
873 w = POP();
874 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000875 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000876 Py_DECREF(v);
877 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000879 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 break;
881
882 case BINARY_RSHIFT:
883 w = POP();
884 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000885 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000886 Py_DECREF(v);
887 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000888 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000889 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 break;
891
892 case BINARY_AND:
893 w = POP();
894 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000895 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000896 Py_DECREF(v);
897 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000898 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000899 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000900 break;
901
902 case BINARY_XOR:
903 w = POP();
904 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000905 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000906 Py_DECREF(v);
907 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000908 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000909 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000910 break;
911
912 case BINARY_OR:
913 w = POP();
914 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000915 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000916 Py_DECREF(v);
917 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000918 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000919 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000920 break;
921
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 case SLICE+0:
923 case SLICE+1:
924 case SLICE+2:
925 case SLICE+3:
926 if ((opcode-SLICE) & 2)
927 w = POP();
928 else
929 w = NULL;
930 if ((opcode-SLICE) & 1)
931 v = POP();
932 else
933 v = NULL;
934 u = POP();
935 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000936 Py_DECREF(u);
937 Py_XDECREF(v);
938 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000940 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 break;
942
943 case STORE_SLICE+0:
944 case STORE_SLICE+1:
945 case STORE_SLICE+2:
946 case STORE_SLICE+3:
947 if ((opcode-STORE_SLICE) & 2)
948 w = POP();
949 else
950 w = NULL;
951 if ((opcode-STORE_SLICE) & 1)
952 v = POP();
953 else
954 v = NULL;
955 u = POP();
956 t = POP();
957 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000958 Py_DECREF(t);
959 Py_DECREF(u);
960 Py_XDECREF(v);
961 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000962 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 break;
964
965 case DELETE_SLICE+0:
966 case DELETE_SLICE+1:
967 case DELETE_SLICE+2:
968 case DELETE_SLICE+3:
969 if ((opcode-DELETE_SLICE) & 2)
970 w = POP();
971 else
972 w = NULL;
973 if ((opcode-DELETE_SLICE) & 1)
974 v = POP();
975 else
976 v = NULL;
977 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000978 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000980 Py_DECREF(u);
981 Py_XDECREF(v);
982 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000983 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000984 break;
985
986 case STORE_SUBSCR:
987 w = POP();
988 v = POP();
989 u = POP();
990 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000991 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_DECREF(u);
993 Py_DECREF(v);
994 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000995 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 break;
997
998 case DELETE_SUBSCR:
999 w = POP();
1000 v = POP();
1001 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001002 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001003 Py_DECREF(v);
1004 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001005 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 break;
1007
1008 case PRINT_EXPR:
1009 v = POP();
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001010 /* Print value except if None */
1011 /* After printing, also assign to '_' */
1012 /* Before, set '_' to None to avoid recursion */
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001014 (err = PyDict_SetItemString(
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001015 f->f_builtins, "_", Py_None)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001016 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001017 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001018 x = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001019 if (x == NULL) {
1020 PyErr_SetString(
1021 PyExc_RuntimeError,
1022 "lost sys.stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00001023 err = -1;
Guido van Rossum8f183201997-12-31 05:53:15 +00001024 }
Guido van Rossumbe270261997-05-22 22:26:18 +00001025 }
1026 if (err == 0)
1027 err = PyFile_WriteObject(v, x, 0);
1028 if (err == 0) {
1029 PyFile_SoftSpace(x, 1);
1030 err = Py_FlushLine();
1031 }
Guido van Rossumaa06b0e1997-12-26 22:15:57 +00001032 if (err == 0) {
1033 err = PyDict_SetItemString(
1034 f->f_builtins, "_", v);
1035 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001036 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 break;
1039
1040 case PRINT_ITEM:
1041 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 w = PySys_GetObject("stdout");
Guido van Rossum8f183201997-12-31 05:53:15 +00001043 if (w == NULL) {
1044 PyErr_SetString(PyExc_RuntimeError,
1045 "lost sys.stdout");
1046 err = -1;
1047 }
1048 else if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001049 err = PyFile_WriteString(" ", w);
1050 if (err == 0)
1051 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001052 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001053 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001054 char *s = PyString_AsString(v);
1055 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001056 if (len > 0 &&
1057 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001058 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001059 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001060 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001061 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001062 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
1064
1065 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001066 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001067 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001068 PyErr_SetString(PyExc_RuntimeError,
1069 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001070 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001071 err = PyFile_WriteString("\n", x);
1072 if (err == 0)
1073 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001074 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001075 break;
1076
1077 case BREAK_LOOP:
1078 why = WHY_BREAK;
1079 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001080
Guido van Rossumf10570b1995-07-07 22:53:21 +00001081 case RAISE_VARARGS:
1082 u = v = w = NULL;
1083 switch (oparg) {
1084 case 3:
1085 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001086 /* Fallthrough */
1087 case 2:
1088 v = POP(); /* value */
1089 /* Fallthrough */
1090 case 1:
1091 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001092 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001093 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001094 break;
1095 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001096 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001097 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001098 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001099 break;
1100 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001101 break;
1102
1103 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001104 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001105 PyErr_SetString(PyExc_SystemError,
1106 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001107 break;
1108 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001109 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001110 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 break;
1112
1113 case RETURN_VALUE:
1114 retval = POP();
1115 why = WHY_RETURN;
1116 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001117
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001118 case EXEC_STMT:
1119 w = POP();
1120 v = POP();
1121 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001122 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001123 Py_DECREF(u);
1124 Py_DECREF(v);
1125 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001126 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001127
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 case POP_BLOCK:
1129 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001130 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 while (STACK_LEVEL() > b->b_level) {
1132 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001133 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001134 }
1135 }
1136 break;
1137
1138 case END_FINALLY:
1139 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001140 if (PyInt_Check(v)) {
1141 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 if (why == WHY_RETURN)
1143 retval = POP();
1144 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001145 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001147 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001148 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001150 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 else if (v != Py_None) {
1153 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001154 "'finally' pops bad exception");
1155 why = WHY_EXCEPTION;
1156 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001157 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 break;
1159
1160 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001161 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001162 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001163 w = POP();
1164 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001165 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001166 Py_DECREF(u);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 break;
1170
1171 case STORE_NAME:
1172 w = GETNAMEV(oparg);
1173 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001175 PyErr_SetString(PyExc_SystemError,
1176 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001177 break;
1178 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001179 err = PyDict_SetItem(x, w, v);
1180 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001181 break;
1182
1183 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001184 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001185 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001186 PyErr_SetString(PyExc_SystemError,
1187 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001188 break;
1189 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001190 if ((err = PyDict_DelItem(x, w)) != 0)
1191 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001192 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001193
1194#ifdef CASE_TOO_BIG
1195 default: switch (opcode) {
1196#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001197
1198 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 case UNPACK_LIST:
1200 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001201 if (PyTuple_Check(v)) {
1202 if (PyTuple_Size(v) != oparg) {
1203 PyErr_SetString(PyExc_ValueError,
1204 "unpack tuple of wrong size");
1205 why = WHY_EXCEPTION;
1206 }
1207 else {
1208 for (; --oparg >= 0; ) {
1209 w = PyTuple_GET_ITEM(v, oparg);
1210 Py_INCREF(w);
1211 PUSH(w);
1212 }
1213 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001215 else if (PyList_Check(v)) {
1216 if (PyList_Size(v) != oparg) {
1217 PyErr_SetString(PyExc_ValueError,
1218 "unpack list of wrong size");
1219 why = WHY_EXCEPTION;
1220 }
1221 else {
1222 for (; --oparg >= 0; ) {
1223 w = PyList_GET_ITEM(v, oparg);
1224 Py_INCREF(w);
1225 PUSH(w);
1226 }
1227 }
1228 }
1229 else if (PySequence_Check(v)) {
1230 if (unpack_sequence(v, oparg,
1231 stack_pointer + oparg))
1232 stack_pointer += oparg;
1233 else
1234 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 }
1236 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001237 PyErr_SetString(PyExc_TypeError,
1238 "unpack non-sequence");
1239 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001241 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
1243
1244 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001245 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 v = POP();
1247 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1249 Py_DECREF(v);
1250 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001251 break;
1252
1253 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001254 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001256 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1257 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001258 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 break;
1260
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001261 case STORE_GLOBAL:
1262 w = GETNAMEV(oparg);
1263 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 err = PyDict_SetItem(f->f_globals, w, v);
1265 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001266 break;
1267
1268 case DELETE_GLOBAL:
1269 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001270 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1271 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001272 break;
1273
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 case LOAD_CONST:
1275 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 PUSH(x);
1278 break;
1279
1280 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001281 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001282 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001283 PyErr_SetString(PyExc_SystemError,
1284 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001285 break;
1286 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001289 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001290 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001293 PyErr_SetObject(
1294 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 break;
1296 }
1297 }
1298 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 PUSH(x);
1301 break;
1302
1303 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001304 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001305 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001309 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 break;
1311 }
1312 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001313 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001314 PUSH(x);
1315 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001316
Guido van Rossum9bfef441993-03-29 10:43:31 +00001317 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001318 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001319 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 PyErr_SetObject(PyExc_NameError,
1321 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001322 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001323 break;
1324 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001325 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001326 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001327 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001328 break;
1329
1330 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001331 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001332 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001333 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001334
1335 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001336 x = GETLOCAL(oparg);
1337 if (x == NULL) {
1338 PyErr_SetObject(PyExc_NameError,
1339 PyTuple_GetItem(co->co_varnames,
1340 oparg));
1341 break;
1342 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001343 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001344 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001345
1346 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001347 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 if (x != NULL) {
1349 for (; --oparg >= 0;) {
1350 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001351 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 }
1353 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001354 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 }
1356 break;
1357
1358 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001359 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 if (x != NULL) {
1361 for (; --oparg >= 0;) {
1362 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 if (err != 0)
1365 break;
1366 }
1367 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001368 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001369 }
1370 break;
1371
1372 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001373 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001375 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 break;
1377
1378 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001379 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001380 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001381 x = PyObject_GetAttr(v, w);
1382 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001384 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 break;
1386
1387 case COMPARE_OP:
1388 w = POP();
1389 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001390 if (PyInt_Check(v) && PyInt_Check(w)) {
1391 /* INLINE: cmp(int, int) */
1392 register long a, b;
1393 register int res;
1394 a = ((PyIntObject*) v)->ob_ival;
1395 b = ((PyIntObject*) w)->ob_ival;
1396 switch (oparg) {
1397 case LT: res = a < b; break;
1398 case LE: res = a <= b; break;
1399 case EQ: res = a == b; break;
1400 case NE: res = a != b; break;
1401 case GT: res = a > b; break;
1402 case GE: res = a >= b; break;
1403 case IS: res = v == w; break;
1404 case IS_NOT: res = v != w; break;
1405 default: goto slow_compare;
1406 }
1407 x = res ? Py_True : Py_False;
1408 Py_INCREF(x);
1409 }
1410 else {
1411 slow_compare:
1412 x = cmp_outcome(oparg, v, w);
1413 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001414 Py_DECREF(v);
1415 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001417 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 break;
1419
1420 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001424 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001425 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001426 break;
1427 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001428 u = find_from_args(f, INSTR_OFFSET());
1429 if (u == NULL) {
1430 x = u;
1431 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001432 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001433 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 w,
1435 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001436 f->f_locals == NULL ?
1437 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001438 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001440 if (w == NULL) {
1441 x = NULL;
1442 break;
1443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 x = PyEval_CallObject(x, w);
1445 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001446 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001447 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 break;
1449
1450 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001451 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001455 PyErr_SetString(PyExc_SystemError,
1456 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001457 break;
1458 }
1459 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001461 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001463
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 case JUMP_FORWARD:
1465 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001466 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001467
1468 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001469 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001470 if (err > 0)
1471 err = 0;
1472 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001473 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001474 else
1475 break;
1476 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001477
1478 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001480 if (err > 0) {
1481 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001483 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001484 else if (err == 0)
1485 ;
1486 else
1487 break;
1488 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001489
1490 case JUMP_ABSOLUTE:
1491 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001492 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001493
1494 case FOR_LOOP:
1495 /* for v in s: ...
1496 On entry: stack contains s, i.
1497 On exit: stack contains s, i+1, s[i];
1498 but if loop exhausted:
1499 s, i are popped, and we jump */
1500 w = POP(); /* Loop index */
1501 v = POP(); /* Sequence object */
1502 u = loop_subscript(v, w);
1503 if (u != NULL) {
1504 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001507 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001509 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 }
1511 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 Py_DECREF(v);
1513 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 /* A NULL can mean "s exhausted"
1515 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001516 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001518 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001519 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001520 continue;
1521 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001522 }
1523 break;
1524
1525 case SETUP_LOOP:
1526 case SETUP_EXCEPT:
1527 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001530 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001531
1532 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001533#ifdef LLTRACE
1534 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001535 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001537 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001538 if (f->f_trace == NULL)
1539 continue;
1540 /* Trace each line of code reached */
1541 f->f_lasti = INSTR_OFFSET();
1542 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001545
1546 case CALL_FUNCTION:
1547 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001548 int na = oparg & 0xff;
1549 int nk = (oparg>>8) & 0xff;
1550 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 PyObject **pfunc = stack_pointer - n - 1;
1552 PyObject *func = *pfunc;
1553 PyObject *self = NULL;
1554 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001555 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 if (PyMethod_Check(func)) {
1557 self = PyMethod_Self(func);
1558 class = PyMethod_Class(func);
1559 func = PyMethod_Function(func);
1560 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001561 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 Py_INCREF(self);
1563 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001564 *pfunc = self;
1565 na++;
1566 n++;
1567 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 else {
1569 /* Unbound methods must be
1570 called with an instance of
1571 the class (or a derived
1572 class) as first argument */
1573 if (na > 0 &&
1574 (self = stack_pointer[-n])
1575 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 PyInstance_Check(self) &&
1577 PyClass_IsSubclass(
1578 (PyObject *)
1579 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001580 ->in_class),
1581 class))
1582 /* Handy-dandy */ ;
1583 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001584 PyErr_SetString(
1585 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001586 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001587 x = NULL;
1588 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001589 }
1590 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001591 }
1592 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 Py_INCREF(func);
1594 if (PyFunction_Check(func)) {
1595 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001596 PyObject *globals =
1597 PyFunction_GetGlobals(func);
1598 PyObject *argdefs =
1599 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001600 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 int nd;
1602 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001604 nd = ((PyTupleObject *)argdefs) ->
1605 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 }
1607 else {
1608 d = NULL;
1609 nd = 0;
1610 }
1611 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001612 (PyCodeObject *)co,
1613 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001614 stack_pointer-n, na,
1615 stack_pointer-2*nk, nk,
1616 d, nd,
1617 class);
1618 }
1619 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 PyObject *args = PyTuple_New(na);
1621 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001622 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001623 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001625 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001626 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001627 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 if (kwdict == NULL) {
1629 x = NULL;
1630 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001631 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001632 err = 0;
1633 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 PyObject *value = POP();
1635 PyObject *key = POP();
1636 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001637 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 Py_DECREF(key);
1639 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001640 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001641 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001642 }
1643 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 Py_DECREF(args);
1645 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001646 break;
1647 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001648 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001649 while (--na >= 0) {
1650 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001652 }
1653 x = PyEval_CallObjectWithKeywords(
1654 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001655 Py_DECREF(args);
1656 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001657 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001658 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659 while (stack_pointer > pfunc) {
1660 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001662 }
1663 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001664 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001665 break;
1666 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001667
Guido van Rossum681d79a1995-07-18 14:51:37 +00001668 case MAKE_FUNCTION:
1669 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001670 x = PyFunction_New(v, f->f_globals);
1671 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001672 /* XXX Maybe this should be a separate opcode? */
1673 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001675 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001677 x = NULL;
1678 break;
1679 }
1680 while (--oparg >= 0) {
1681 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001682 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001683 }
1684 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001686 }
1687 PUSH(x);
1688 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001689
1690 case BUILD_SLICE:
1691 if (oparg == 3)
1692 w = POP();
1693 else
1694 w = NULL;
1695 v = POP();
1696 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001697 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001698 Py_DECREF(u);
1699 Py_DECREF(v);
1700 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001702 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001703 break;
1704
1705
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 default:
1707 fprintf(stderr,
1708 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001709 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 why = WHY_EXCEPTION;
1712 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001713
1714#ifdef CASE_TOO_BIG
1715 }
1716#endif
1717
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 } /* switch */
1719
1720 on_error:
1721
1722 /* Quickly continue if no error occurred */
1723
1724 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001725 if (err == 0 && x != NULL) {
1726#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001727 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001728 fprintf(stderr,
1729 "XXX undetected error\n");
1730 else
1731#endif
1732 continue; /* Normal, fast path */
1733 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001736 err = 0;
1737 }
1738
Guido van Rossum801dcae1992-04-08 11:32:32 +00001739#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 /* Double-check exception status */
1741
1742 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001745 PyErr_SetString(PyExc_SystemError,
1746 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 why = WHY_EXCEPTION;
1748 }
1749 }
1750 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001752 fprintf(stderr,
1753 "XXX undetected error (why=%d)\n",
1754 why);
1755 why = WHY_EXCEPTION;
1756 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001757 }
1758#endif
1759
1760 /* Log traceback info if this is a real exception */
1761
1762 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001763 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001765 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001767
Guido van Rossume59214e1994-08-30 08:01:59 +00001768 if (f->f_trace)
1769 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001770 if (tstate->sys_profilefunc)
1771 call_exc_trace(&tstate->sys_profilefunc,
1772 (PyObject**)0, f);
1773}
Guido van Rossum374a9221991-04-04 10:40:29 +00001774
1775 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1776
1777 if (why == WHY_RERAISE)
1778 why = WHY_EXCEPTION;
1779
1780 /* Unwind stacks if a (pseudo) exception occurred */
1781
1782 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001784 while (STACK_LEVEL() > b->b_level) {
1785 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001786 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 }
1788 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1789 why = WHY_NOT;
1790 JUMPTO(b->b_handler);
1791 break;
1792 }
1793 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001794 (b->b_type == SETUP_EXCEPT &&
1795 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001797 PyObject *exc, *val, *tb;
1798 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 val = Py_None;
1801 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001803 /* Make the raw exception data
1804 available to the handler,
1805 so a program can emulate the
1806 Python main loop. Don't do
1807 this for 'finally'. */
1808 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001809 PyErr_NormalizeException(
1810 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001811 set_exc_info(tstate,
1812 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 PUSH(val);
1816 PUSH(exc);
1817 }
1818 else {
1819 if (why == WHY_RETURN)
1820 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001821 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001822 PUSH(v);
1823 }
1824 why = WHY_NOT;
1825 JUMPTO(b->b_handler);
1826 break;
1827 }
1828 } /* unwind stack */
1829
1830 /* End the loop if we still have an error (or return) */
1831
1832 if (why != WHY_NOT)
1833 break;
1834
1835 } /* main loop */
1836
1837 /* Pop remaining stack entries */
1838
1839 while (!EMPTY()) {
1840 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 }
1843
Guido van Rossum96a42c81992-01-12 02:29:51 +00001844 if (why != WHY_RETURN)
1845 retval = NULL;
1846
Guido van Rossume59214e1994-08-30 08:01:59 +00001847 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001848 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001849 if (call_trace(&f->f_trace, &f->f_trace, f,
1850 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001853 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001854 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001855 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001856 }
1857
Guido van Rossuma027efa1997-05-05 20:56:21 +00001858 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1859 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001860 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001862 retval = NULL;
1863 why = WHY_EXCEPTION;
1864 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001865 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001866
Guido van Rossuma027efa1997-05-05 20:56:21 +00001867 reset_exc_info(tstate);
1868
1869 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001870
1871 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001872
Guido van Rossum374a9221991-04-04 10:40:29 +00001873 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001874
Guido van Rossuma027efa1997-05-05 20:56:21 +00001875 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001876 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001877
Guido van Rossum96a42c81992-01-12 02:29:51 +00001878 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001879}
1880
Guido van Rossuma027efa1997-05-05 20:56:21 +00001881static void
1882set_exc_info(tstate, type, value, tb)
1883 PyThreadState *tstate;
1884 PyObject *type;
1885 PyObject *value;
1886 PyObject *tb;
1887{
1888 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001889 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001890
Guido van Rossuma027efa1997-05-05 20:56:21 +00001891 frame = tstate->frame;
1892 if (frame->f_exc_type == NULL) {
1893 /* This frame didn't catch an exception before */
1894 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001895 if (tstate->exc_type == NULL) {
1896 Py_INCREF(Py_None);
1897 tstate->exc_type = Py_None;
1898 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001899 tmp_type = frame->f_exc_type;
1900 tmp_value = frame->f_exc_value;
1901 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001902 Py_XINCREF(tstate->exc_type);
1903 Py_XINCREF(tstate->exc_value);
1904 Py_XINCREF(tstate->exc_traceback);
1905 frame->f_exc_type = tstate->exc_type;
1906 frame->f_exc_value = tstate->exc_value;
1907 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001908 Py_XDECREF(tmp_type);
1909 Py_XDECREF(tmp_value);
1910 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001911 }
1912 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001913 tmp_type = tstate->exc_type;
1914 tmp_value = tstate->exc_value;
1915 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001916 Py_XINCREF(type);
1917 Py_XINCREF(value);
1918 Py_XINCREF(tb);
1919 tstate->exc_type = type;
1920 tstate->exc_value = value;
1921 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001922 Py_XDECREF(tmp_type);
1923 Py_XDECREF(tmp_value);
1924 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001925 /* For b/w compatibility */
1926 PySys_SetObject("exc_type", type);
1927 PySys_SetObject("exc_value", value);
1928 PySys_SetObject("exc_traceback", tb);
1929}
1930
1931static void
1932reset_exc_info(tstate)
1933 PyThreadState *tstate;
1934{
1935 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001936 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001937 frame = tstate->frame;
1938 if (frame->f_exc_type != NULL) {
1939 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001940 tmp_type = tstate->exc_type;
1941 tmp_value = tstate->exc_value;
1942 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001943 Py_XINCREF(frame->f_exc_type);
1944 Py_XINCREF(frame->f_exc_value);
1945 Py_XINCREF(frame->f_exc_traceback);
1946 tstate->exc_type = frame->f_exc_type;
1947 tstate->exc_value = frame->f_exc_value;
1948 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001949 Py_XDECREF(tmp_type);
1950 Py_XDECREF(tmp_value);
1951 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001952 /* For b/w compatibility */
1953 PySys_SetObject("exc_type", frame->f_exc_type);
1954 PySys_SetObject("exc_value", frame->f_exc_value);
1955 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1956 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001957 tmp_type = frame->f_exc_type;
1958 tmp_value = frame->f_exc_value;
1959 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001960 frame->f_exc_type = NULL;
1961 frame->f_exc_value = NULL;
1962 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001963 Py_XDECREF(tmp_type);
1964 Py_XDECREF(tmp_value);
1965 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001966}
1967
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001968/* Logic for the raise statement (too complicated for inlining).
1969 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001970static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001971do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001973{
Guido van Rossumd295f121998-04-09 21:39:57 +00001974 if (type == NULL) {
1975 /* Reraise */
1976 PyThreadState *tstate = PyThreadState_Get();
1977 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
1978 value = tstate->exc_value;
1979 tb = tstate->exc_traceback;
1980 Py_XINCREF(type);
1981 Py_XINCREF(value);
1982 Py_XINCREF(tb);
1983 }
1984
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001985 /* We support the following forms of raise:
1986 raise <class>, <classinstance>
1987 raise <class>, <argument tuple>
1988 raise <class>, None
1989 raise <class>, <argument>
1990 raise <classinstance>, None
1991 raise <string>, <object>
1992 raise <string>, None
1993
1994 An omitted second argument is the same as None.
1995
1996 In addition, raise <tuple>, <anything> is the same as
1997 raising the tuple's first item (and it better have one!);
1998 this rule is applied recursively.
1999
2000 Finally, an optional third argument can be supplied, which
2001 gives the traceback to be substituted (useful when
2002 re-raising an exception after examining it). */
2003
2004 /* First, check the traceback argument, replacing None with
2005 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002006 if (tb == Py_None) {
2007 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002008 tb = NULL;
2009 }
2010 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002012 "raise 3rd arg must be traceback or None");
2013 goto raise_error;
2014 }
2015
2016 /* Next, replace a missing value with None */
2017 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002018 value = Py_None;
2019 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002020 }
2021
2022 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2024 PyObject *tmp = type;
2025 type = PyTuple_GET_ITEM(type, 0);
2026 Py_INCREF(type);
2027 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002028 }
2029
Barry Warsaw4249f541997-08-22 21:26:19 +00002030 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002031 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002032
2033 else if (PyClass_Check(type))
2034 PyErr_NormalizeException(&type, &value, &tb);
2035
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002037 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002038 if (value != Py_None) {
2039 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002040 "instance exception may not have a separate value");
2041 goto raise_error;
2042 }
2043 else {
2044 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002046 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002047 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2048 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002049 }
2050 }
2051 else {
2052 /* Not something you can raise. You get an exception
2053 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002054 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002055 "exceptions must be strings, classes, or instances");
2056 goto raise_error;
2057 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002059 if (tb == NULL)
2060 return WHY_EXCEPTION;
2061 else
2062 return WHY_RERAISE;
2063 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 Py_XDECREF(value);
2065 Py_XDECREF(type);
2066 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002067 return WHY_EXCEPTION;
2068}
2069
Barry Warsawe42b18f1997-08-25 22:13:04 +00002070static int
2071unpack_sequence(v, argcnt, sp)
2072 PyObject *v;
2073 int argcnt;
2074 PyObject **sp;
2075{
2076 int i;
2077 PyObject *w;
2078
2079 for (i = 0; i < argcnt; i++) {
2080 if (! (w = PySequence_GetItem(v, i))) {
2081 if (PyErr_ExceptionMatches(PyExc_IndexError))
2082 PyErr_SetString(PyExc_ValueError,
2083 "unpack sequence of wrong size");
2084 goto finally;
2085 }
2086 *--sp = w;
2087 }
2088 /* we better get an IndexError now */
2089 if (PySequence_GetItem(v, i) == NULL) {
2090 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2091 PyErr_Clear();
2092 return 1;
2093 }
2094 /* some other exception occurred. fall through to finally */
2095 }
2096 else
2097 PyErr_SetString(PyExc_ValueError,
2098 "unpack sequence of wrong size");
2099 /* fall through */
2100finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002101 for (; i > 0; i--, sp++)
2102 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002103
2104 return 0;
2105}
2106
2107
Guido van Rossum96a42c81992-01-12 02:29:51 +00002108#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002109static int
2110prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002112 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002114 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 if (PyObject_Print(v, stdout, 0) != 0)
2116 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002119#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002121static void
2122call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 PyObject **p_trace, **p_newtrace;
2124 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002125{
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002127 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002129 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 value = Py_None;
2131 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002132 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002134 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002137 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002142 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 Py_XDECREF(type);
2144 Py_XDECREF(value);
2145 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002146 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002147}
2148
2149static int
2150call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002154 may point to NULL variable;
2155 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002158 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002159{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002160 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyObject *args, *what;
2162 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002163
Guido van Rossuma027efa1997-05-05 20:56:21 +00002164 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002165 /* Don't do recursive traces */
2166 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002168 *p_newtrace = NULL;
2169 }
2170 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002171 }
2172
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002174 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002175 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002176 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002177 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002178 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 Py_INCREF(f);
2180 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2181 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002182 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002183 arg = Py_None;
2184 Py_INCREF(arg);
2185 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002186 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002187 PyFrame_FastToLocals(f);
2188 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2189 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002190 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002191 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002193 if (res == NULL) {
2194 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002195 PyTraceBack_Here(f);
2196 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002197 *p_trace = NULL;
2198 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002200 *p_newtrace = NULL;
2201 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002202 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002203 }
2204 else {
2205 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 Py_XDECREF(*p_newtrace);
2207 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002208 *p_newtrace = NULL;
2209 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002210 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002211 *p_newtrace = res;
2212 }
2213 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002214 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002215 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002216 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217}
2218
Guido van Rossumb209a111997-04-29 18:18:01 +00002219PyObject *
2220PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002221{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002222 PyThreadState *tstate = PyThreadState_Get();
2223 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002224 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002225 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002226 else
2227 return current_frame->f_builtins;
2228}
2229
Guido van Rossumb209a111997-04-29 18:18:01 +00002230PyObject *
2231PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002232{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002233 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002234 if (current_frame == NULL)
2235 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002236 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002237 return current_frame->f_locals;
2238}
2239
Guido van Rossumb209a111997-04-29 18:18:01 +00002240PyObject *
2241PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002244 if (current_frame == NULL)
2245 return NULL;
2246 else
2247 return current_frame->f_globals;
2248}
2249
Guido van Rossumb209a111997-04-29 18:18:01 +00002250PyObject *
2251PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002252{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002254 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002255}
2256
Guido van Rossum6135a871995-01-09 17:53:26 +00002257int
Guido van Rossumb209a111997-04-29 18:18:01 +00002258PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002259{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002261 return current_frame == NULL ? 0 : current_frame->f_restricted;
2262}
2263
Guido van Rossumbe270261997-05-22 22:26:18 +00002264int
Guido van Rossumb209a111997-04-29 18:18:01 +00002265Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266{
Guido van Rossumb209a111997-04-29 18:18:01 +00002267 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002268 if (f == NULL)
2269 return 0;
2270 if (!PyFile_SoftSpace(f, 0))
2271 return 0;
2272 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273}
2274
Guido van Rossum3f5da241990-12-20 15:06:42 +00002275
Guido van Rossum681d79a1995-07-18 14:51:37 +00002276/* External interface to call any callable object.
2277 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002278
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002279#undef PyEval_CallObject
2280/* for backward compatibility: export this interface */
2281
Guido van Rossumb209a111997-04-29 18:18:01 +00002282PyObject *
2283PyEval_CallObject(func, arg)
2284 PyObject *func;
2285 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002286{
Guido van Rossumb209a111997-04-29 18:18:01 +00002287 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002288}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002289#define PyEval_CallObject(func,arg) \
2290 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002291
Guido van Rossumb209a111997-04-29 18:18:01 +00002292PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002293PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 PyObject *func;
2295 PyObject *arg;
2296 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002297{
2298 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002299 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002300
2301 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002302 arg = PyTuple_New(0);
2303 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002304 PyErr_SetString(PyExc_TypeError,
2305 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306 return NULL;
2307 }
2308 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002310
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002312 PyErr_SetString(PyExc_TypeError,
2313 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002314 return NULL;
2315 }
2316
Guido van Rossum150b2df1996-12-05 23:17:11 +00002317 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002318 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002319 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002320 result = call_function(func, arg, kw);
2321 else
2322 result = call_builtin(func, arg, kw);
2323
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002325
Guido van Rossumb209a111997-04-29 18:18:01 +00002326 if (result == NULL && !PyErr_Occurred())
2327 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002328 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002329
2330 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002331}
2332
Guido van Rossumb209a111997-04-29 18:18:01 +00002333static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 PyObject *func;
2336 PyObject *arg;
2337 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338{
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 if (PyCFunction_Check(func)) {
2340 PyCFunction meth = PyCFunction_GetFunction(func);
2341 PyObject *self = PyCFunction_GetSelf(func);
2342 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002343 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002345 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002347 else if (size == 0)
2348 arg = NULL;
2349 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002350 if (flags & METH_KEYWORDS)
2351 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 if (kw != NULL && PyDict_Size(kw) != 0) {
2353 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002354 "this function takes no keyword arguments");
2355 return NULL;
2356 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002357 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002359 if (PyClass_Check(func)) {
2360 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 if (PyInstance_Check(func)) {
2363 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002364 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 PyErr_Clear();
2366 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002367 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002368 return NULL;
2369 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002370 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002372 return res;
2373 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return NULL;
2376}
2377
Guido van Rossumb209a111997-04-29 18:18:01 +00002378static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002379call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 PyObject *func;
2381 PyObject *arg;
2382 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383{
Guido van Rossumb209a111997-04-29 18:18:01 +00002384 PyObject *class = NULL; /* == owner */
2385 PyObject *argdefs;
2386 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002387 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002388 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002389
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 if (kw != NULL && !PyDict_Check(kw)) {
2391 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002392 return NULL;
2393 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394
Guido van Rossumb209a111997-04-29 18:18:01 +00002395 if (PyMethod_Check(func)) {
2396 PyObject *self = PyMethod_Self(func);
2397 class = PyMethod_Class(func);
2398 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002399 if (self == NULL) {
2400 /* Unbound methods must be called with an instance of
2401 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 if (PyTuple_Size(arg) >= 1) {
2403 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002404 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 PyInstance_Check(self) &&
2406 PyClass_IsSubclass((PyObject *)
2407 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002408 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002409 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002410 else
2411 self = NULL;
2412 }
2413 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002416 return NULL;
2417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002419 }
2420 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 int argcount = PyTuple_Size(arg);
2422 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002423 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002424 if (newarg == NULL)
2425 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 Py_INCREF(self);
2427 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 PyObject *v = PyTuple_GET_ITEM(arg, i);
2430 Py_XINCREF(v);
2431 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002432 }
2433 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 }
2435 }
2436 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002437 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002438 PyErr_SetString(PyExc_TypeError,
2439 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 return NULL;
2441 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002442 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002444
2445 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002446 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2447 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2448 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002449 }
2450 else {
2451 d = NULL;
2452 nd = 0;
2453 }
2454
2455 if (kw != NULL) {
2456 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 nk = PyDict_Size(kw);
2458 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002459 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002460 PyErr_NoMemory();
2461 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002462 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002463 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002465 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002466 i += 2;
2467 nk = i/2;
2468 /* XXX This is broken if the caller deletes dict items! */
2469 }
2470 else {
2471 k = NULL;
2472 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002473 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474
Guido van Rossum681d79a1995-07-18 14:51:37 +00002475 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002476 (PyCodeObject *)PyFunction_GetCode(func),
2477 PyFunction_GetGlobals(func), (PyObject *)NULL,
2478 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002479 k, nk,
2480 d, nd,
2481 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 Py_DECREF(arg);
2484 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485
Guido van Rossum681d79a1995-07-18 14:51:37 +00002486 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487}
2488
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002489#define SLICE_ERROR_MSG \
2490 "standard sequence type does not support step size other than one"
2491
Guido van Rossumb209a111997-04-29 18:18:01 +00002492static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002493loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002494 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495{
Guido van Rossumb209a111997-04-29 18:18:01 +00002496 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002497 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002498 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002499 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500 return NULL;
2501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002502 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002503 v = (*sq->sq_item)(v, i);
2504 if (v)
2505 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002506 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002507 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002508 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509}
2510
2511static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002512slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 int *pi;
2515{
2516 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002517 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519 PyErr_SetString(PyExc_TypeError,
2520 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002523 x = PyInt_AsLong(v);
2524 /* Truncate -- very long indices are truncated anyway */
2525 if (x > INT_MAX)
2526 x = INT_MAX;
2527 else if (x < -INT_MAX)
2528 x = 0;
2529 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002531 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532}
2533
Guido van Rossumb209a111997-04-29 18:18:01 +00002534static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002535apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002536 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002538 int ilow = 0, ihigh = INT_MAX;
2539 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002541 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002542 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002545
2546static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002547assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002550 int ilow = 0, ihigh = INT_MAX;
2551 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002554 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002555 if (x == NULL)
2556 return PySequence_DelSlice(u, ilow, ihigh);
2557 else
2558 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559}
2560
Guido van Rossumb209a111997-04-29 18:18:01 +00002561static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002562cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002563 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002564 register PyObject *v;
2565 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566{
2567 register int cmp;
2568 register int res = 0;
2569 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570 case IS:
2571 case IS_NOT:
2572 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002573 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574 res = !res;
2575 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002576 case IN:
2577 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002578 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 if (res < 0)
2580 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002581 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002582 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002583 break;
2584 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002585 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 break;
2587 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002588 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002589 if (cmp && PyErr_Occurred())
2590 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002591 switch (op) {
2592 case LT: res = cmp < 0; break;
2593 case LE: res = cmp <= 0; break;
2594 case EQ: res = cmp == 0; break;
2595 case NE: res = cmp != 0; break;
2596 case GT: res = cmp > 0; break;
2597 case GE: res = cmp >= 0; break;
2598 /* XXX no default? (res is initialized to 0 though) */
2599 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002600 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002601 v = res ? Py_True : Py_False;
2602 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 return v;
2604}
2605
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606static int
2607import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002608 PyObject *locals;
2609 PyObject *v;
2610 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002611{
Guido van Rossumb209a111997-04-29 18:18:01 +00002612 PyObject *w, *x;
2613 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002614 PyErr_SetString(PyExc_TypeError,
2615 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002616 return -1;
2617 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002618 w = PyModule_GetDict(v);
2619 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002620 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002622 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 while (PyDict_Next(w, &pos, &name, &value)) {
2624 if (!PyString_Check(name) ||
2625 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002626 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 Py_INCREF(value);
2628 err = PyDict_SetItem(locals, name, value);
2629 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002630 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002631 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002632 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002633 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002634 }
2635 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002637 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002638 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002639 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 PyString_AsString(name));
2641 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002642 return -1;
2643 }
2644 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002646 }
2647}
2648
Guido van Rossumb209a111997-04-29 18:18:01 +00002649static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002650build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002651 PyObject *methods; /* dictionary */
2652 PyObject *bases; /* tuple containing classes */
2653 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002654{
Guido van Rossumcd649651997-08-22 16:56:16 +00002655 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002657 PyErr_SetString(PyExc_SystemError,
2658 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002659 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002660 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002662 PyErr_SetString(PyExc_SystemError,
2663 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002664 return NULL;
2665 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002667 PyErr_SetString(PyExc_SystemError,
2668 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002669 return NULL;
2670 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002671 n = PyTuple_Size(bases);
2672 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 PyObject *base = PyTuple_GET_ITEM(bases, i);
2674 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002675 /* Call the base's *type*, if it is callable.
2676 This code is a hook for Donald Beaudry's
2677 and Jim Fulton's type extensions. In
2678 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002679 since its types are not callable.
2680 Ditto: call the bases's *class*, if it has
2681 one. This makes the same thing possible
2682 without writing C code. A true meta-object
2683 protocol! */
2684 PyObject *basetype = (PyObject *)base->ob_type;
2685 PyObject *callable = NULL;
2686 if (PyCallable_Check(basetype))
2687 callable = basetype;
2688 else
2689 callable = PyObject_GetAttrString(
2690 base, "__class__");
2691 if (callable) {
2692 PyObject *args;
2693 PyObject *newclass = NULL;
2694 args = Py_BuildValue(
2695 "(OOO)", name, bases, methods);
2696 if (args != NULL) {
2697 newclass = PyEval_CallObject(
2698 callable, args);
2699 Py_DECREF(args);
2700 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002701 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002702 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002703 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002704 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002705 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002706 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002707 "base is not a class object");
2708 return NULL;
2709 }
2710 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002712}
2713
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002714static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002715exec_statement(f, prog, globals, locals)
2716 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002717 PyObject *prog;
2718 PyObject *globals;
2719 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002720{
2721 char *s;
2722 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002723 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002724 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002725
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2727 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002728 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002729 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002730 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 locals = PyTuple_GetItem(prog, 2);
2732 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002733 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 if (globals == Py_None) {
2735 globals = PyEval_GetGlobals();
2736 if (locals == Py_None) {
2737 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002738 plain = 1;
2739 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002740 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002742 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 if (!PyString_Check(prog) &&
2744 !PyCode_Check(prog) &&
2745 !PyFile_Check(prog)) {
2746 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002747 "exec 1st arg must be string, code or file object");
2748 return -1;
2749 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2751 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002752 "exec 2nd/3rd args must be dict or None");
2753 return -1;
2754 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002756 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 if (PyCode_Check(prog)) {
Guido van Rossumdfed7251997-11-11 16:29:38 +00002758 v = PyEval_EvalCode((PyCodeObject *) prog,
2759 globals, locals);
2760 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002761 return -1;
Guido van Rossumdfed7251997-11-11 16:29:38 +00002762 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002763 return 0;
2764 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 if (PyFile_Check(prog)) {
2766 FILE *fp = PyFile_AsFile(prog);
2767 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002768 if (PyRun_File(fp, name, Py_file_input,
2769 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002770 return -1;
2771 return 0;
2772 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002773 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002774 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002775 PyErr_SetString(PyExc_ValueError,
2776 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002777 return -1;
2778 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002779 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002780 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002781 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002783 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002784 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002785 return 0;
2786}
Guido van Rossum24c13741995-02-14 09:42:43 +00002787
Guido van Rossum1aa14831997-01-21 05:34:20 +00002788/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002789static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002790find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002792 int nexti;
2793{
2794 int opcode;
2795 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002797 unsigned char *next_instr;
2798
2799 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2800 opcode = (*next_instr++);
2801 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 Py_INCREF(Py_None);
2803 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002804 }
2805
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002807 if (list == NULL)
2808 return NULL;
2809
2810 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002811 oparg = (next_instr[1]<<8) + next_instr[0];
2812 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002813 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 if (PyList_Append(list, name) < 0) {
2815 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002816 break;
2817 }
2818 opcode = (*next_instr++);
2819 } while (opcode == IMPORT_FROM);
2820
2821 return list;
2822}
Guido van Rossum950361c1997-01-24 13:49:28 +00002823
2824
2825#ifdef DYNAMIC_EXECUTION_PROFILE
2826
2827PyObject *
2828getarray(a)
2829 long a[256];
2830{
2831 int i;
2832 PyObject *l = PyList_New(256);
2833 if (l == NULL) return NULL;
2834 for (i = 0; i < 256; i++) {
2835 PyObject *x = PyInt_FromLong(a[i]);
2836 if (x == NULL) {
2837 Py_DECREF(l);
2838 return NULL;
2839 }
2840 PyList_SetItem(l, i, x);
2841 }
2842 for (i = 0; i < 256; i++)
2843 a[i] = 0;
2844 return l;
2845}
2846
2847PyObject *
2848_Py_GetDXProfile(self, args)
2849 PyObject *self, *args;
2850{
2851#ifndef DXPAIRS
2852 return getarray(dxp);
2853#else
2854 int i;
2855 PyObject *l = PyList_New(257);
2856 if (l == NULL) return NULL;
2857 for (i = 0; i < 257; i++) {
2858 PyObject *x = getarray(dxpairs[i]);
2859 if (x == NULL) {
2860 Py_DECREF(l);
2861 return NULL;
2862 }
2863 PyList_SetItem(l, i, x);
2864 }
2865 return l;
2866#endif
2867}
2868
2869#endif