blob: 0178f84498d8c4cb0d46d0e64a26fde6181e35a9 [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)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000852 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000853 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000854 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000855 PyErr_SetString(PyExc_IndexError,
856 "list index out of range");
857 x = NULL;
858 }
859 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000860 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000861 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 Rossum5053efc1998-08-04 15:27:50 +00001363 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 }
1365 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001366 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 }
1368 break;
1369
1370 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001372 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001373 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001374 break;
1375
1376 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001377 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001378 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001379 x = PyObject_GetAttr(v, w);
1380 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001381 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001382 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001383 break;
1384
1385 case COMPARE_OP:
1386 w = POP();
1387 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001388 if (PyInt_Check(v) && PyInt_Check(w)) {
1389 /* INLINE: cmp(int, int) */
1390 register long a, b;
1391 register int res;
1392 a = ((PyIntObject*) v)->ob_ival;
1393 b = ((PyIntObject*) w)->ob_ival;
1394 switch (oparg) {
1395 case LT: res = a < b; break;
1396 case LE: res = a <= b; break;
1397 case EQ: res = a == b; break;
1398 case NE: res = a != b; break;
1399 case GT: res = a > b; break;
1400 case GE: res = a >= b; break;
1401 case IS: res = v == w; break;
1402 case IS_NOT: res = v != w; break;
1403 default: goto slow_compare;
1404 }
1405 x = res ? Py_True : Py_False;
1406 Py_INCREF(x);
1407 }
1408 else {
1409 slow_compare:
1410 x = cmp_outcome(oparg, v, w);
1411 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 Py_DECREF(v);
1413 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001415 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 break;
1417
1418 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001419 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001421 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001423 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001424 break;
1425 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001426 u = find_from_args(f, INSTR_OFFSET());
1427 if (u == NULL) {
1428 x = u;
1429 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001432 w,
1433 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001434 f->f_locals == NULL ?
1435 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001436 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001438 if (w == NULL) {
1439 x = NULL;
1440 break;
1441 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001442 x = PyEval_CallObject(x, w);
1443 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001444 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001445 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
1447
1448 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001449 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001451 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001452 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001453 PyErr_SetString(PyExc_SystemError,
1454 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001455 break;
1456 }
1457 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001458 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001459 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001461
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 case JUMP_FORWARD:
1463 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001464 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001465
1466 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001468 if (err > 0)
1469 err = 0;
1470 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001472 else
1473 break;
1474 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001475
1476 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001477 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001478 if (err > 0) {
1479 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001481 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001482 else if (err == 0)
1483 ;
1484 else
1485 break;
1486 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001487
1488 case JUMP_ABSOLUTE:
1489 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001490 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001491
1492 case FOR_LOOP:
1493 /* for v in s: ...
1494 On entry: stack contains s, i.
1495 On exit: stack contains s, i+1, s[i];
1496 but if loop exhausted:
1497 s, i are popped, and we jump */
1498 w = POP(); /* Loop index */
1499 v = POP(); /* Sequence object */
1500 u = loop_subscript(v, w);
1501 if (u != NULL) {
1502 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001507 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 }
1509 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 Py_DECREF(v);
1511 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 /* A NULL can mean "s exhausted"
1513 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001514 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001516 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001518 continue;
1519 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 }
1521 break;
1522
1523 case SETUP_LOOP:
1524 case SETUP_EXCEPT:
1525 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001528 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001529
1530 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001531#ifdef LLTRACE
1532 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001533 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001535 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001536 if (f->f_trace == NULL)
1537 continue;
1538 /* Trace each line of code reached */
1539 f->f_lasti = INSTR_OFFSET();
1540 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001541 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001542 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001543
1544 case CALL_FUNCTION:
1545 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001546 int na = oparg & 0xff;
1547 int nk = (oparg>>8) & 0xff;
1548 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 PyObject **pfunc = stack_pointer - n - 1;
1550 PyObject *func = *pfunc;
1551 PyObject *self = NULL;
1552 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001554 if (PyMethod_Check(func)) {
1555 self = PyMethod_Self(func);
1556 class = PyMethod_Class(func);
1557 func = PyMethod_Function(func);
1558 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001560 Py_INCREF(self);
1561 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 *pfunc = self;
1563 na++;
1564 n++;
1565 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 else {
1567 /* Unbound methods must be
1568 called with an instance of
1569 the class (or a derived
1570 class) as first argument */
1571 if (na > 0 &&
1572 (self = stack_pointer[-n])
1573 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 PyInstance_Check(self) &&
1575 PyClass_IsSubclass(
1576 (PyObject *)
1577 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 ->in_class),
1579 class))
1580 /* Handy-dandy */ ;
1581 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001582 PyErr_SetString(
1583 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001585 x = NULL;
1586 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001587 }
1588 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 }
1590 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001591 Py_INCREF(func);
1592 if (PyFunction_Check(func)) {
1593 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001594 PyObject *globals =
1595 PyFunction_GetGlobals(func);
1596 PyObject *argdefs =
1597 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001599 int nd;
1600 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001601 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001602 nd = ((PyTupleObject *)argdefs) ->
1603 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001604 }
1605 else {
1606 d = NULL;
1607 nd = 0;
1608 }
1609 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001610 (PyCodeObject *)co,
1611 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 stack_pointer-n, na,
1613 stack_pointer-2*nk, nk,
1614 d, nd,
1615 class);
1616 }
1617 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001618 PyObject *args = PyTuple_New(na);
1619 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001620 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001621 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001622 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001623 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001626 if (kwdict == NULL) {
1627 x = NULL;
1628 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001629 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001630 err = 0;
1631 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001632 PyObject *value = POP();
1633 PyObject *key = POP();
1634 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001635 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 Py_DECREF(key);
1637 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001638 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001639 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001640 }
1641 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_DECREF(args);
1643 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001644 break;
1645 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001646 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001647 while (--na >= 0) {
1648 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001650 }
1651 x = PyEval_CallObjectWithKeywords(
1652 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 Py_DECREF(args);
1654 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001655 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001657 while (stack_pointer > pfunc) {
1658 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001660 }
1661 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001662 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001663 break;
1664 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001665
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 case MAKE_FUNCTION:
1667 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 x = PyFunction_New(v, f->f_globals);
1669 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 /* XXX Maybe this should be a separate opcode? */
1671 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001674 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001675 x = NULL;
1676 break;
1677 }
1678 while (--oparg >= 0) {
1679 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 }
1682 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001684 }
1685 PUSH(x);
1686 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001687
1688 case BUILD_SLICE:
1689 if (oparg == 3)
1690 w = POP();
1691 else
1692 w = NULL;
1693 v = POP();
1694 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001695 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 Py_DECREF(u);
1697 Py_DECREF(v);
1698 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001699 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001700 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 break;
1702
1703
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 default:
1705 fprintf(stderr,
1706 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001707 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001709 why = WHY_EXCEPTION;
1710 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001711
1712#ifdef CASE_TOO_BIG
1713 }
1714#endif
1715
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 } /* switch */
1717
1718 on_error:
1719
1720 /* Quickly continue if no error occurred */
1721
1722 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001723 if (err == 0 && x != NULL) {
1724#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001726 fprintf(stderr,
1727 "XXX undetected error\n");
1728 else
1729#endif
1730 continue; /* Normal, fast path */
1731 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001732 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 err = 0;
1735 }
1736
Guido van Rossum801dcae1992-04-08 11:32:32 +00001737#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001738 /* Double-check exception status */
1739
1740 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001742 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001743 PyErr_SetString(PyExc_SystemError,
1744 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 why = WHY_EXCEPTION;
1746 }
1747 }
1748 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001750 fprintf(stderr,
1751 "XXX undetected error (why=%d)\n",
1752 why);
1753 why = WHY_EXCEPTION;
1754 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 }
1756#endif
1757
1758 /* Log traceback info if this is a real exception */
1759
1760 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001761 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001762 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001763 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001764 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001765
Guido van Rossume59214e1994-08-30 08:01:59 +00001766 if (f->f_trace)
1767 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001768 if (tstate->sys_profilefunc)
1769 call_exc_trace(&tstate->sys_profilefunc,
1770 (PyObject**)0, f);
1771}
Guido van Rossum374a9221991-04-04 10:40:29 +00001772
1773 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1774
1775 if (why == WHY_RERAISE)
1776 why = WHY_EXCEPTION;
1777
1778 /* Unwind stacks if a (pseudo) exception occurred */
1779
1780 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 while (STACK_LEVEL() > b->b_level) {
1783 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 }
1786 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1787 why = WHY_NOT;
1788 JUMPTO(b->b_handler);
1789 break;
1790 }
1791 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001792 (b->b_type == SETUP_EXCEPT &&
1793 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 PyObject *exc, *val, *tb;
1796 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001798 val = Py_None;
1799 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001801 /* Make the raw exception data
1802 available to the handler,
1803 so a program can emulate the
1804 Python main loop. Don't do
1805 this for 'finally'. */
1806 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001807 PyErr_NormalizeException(
1808 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001809 set_exc_info(tstate,
1810 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001811 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 PUSH(val);
1814 PUSH(exc);
1815 }
1816 else {
1817 if (why == WHY_RETURN)
1818 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001820 PUSH(v);
1821 }
1822 why = WHY_NOT;
1823 JUMPTO(b->b_handler);
1824 break;
1825 }
1826 } /* unwind stack */
1827
1828 /* End the loop if we still have an error (or return) */
1829
1830 if (why != WHY_NOT)
1831 break;
1832
1833 } /* main loop */
1834
1835 /* Pop remaining stack entries */
1836
1837 while (!EMPTY()) {
1838 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 }
1841
Guido van Rossum96a42c81992-01-12 02:29:51 +00001842 if (why != WHY_RETURN)
1843 retval = NULL;
1844
Guido van Rossume59214e1994-08-30 08:01:59 +00001845 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001846 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001847 if (call_trace(&f->f_trace, &f->f_trace, f,
1848 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001849 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001850 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001851 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001853 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001854 }
1855
Guido van Rossuma027efa1997-05-05 20:56:21 +00001856 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1857 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001858 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001860 retval = NULL;
1861 why = WHY_EXCEPTION;
1862 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001863 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001864
Guido van Rossuma027efa1997-05-05 20:56:21 +00001865 reset_exc_info(tstate);
1866
1867 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001868
1869 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001870
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001872
Guido van Rossuma027efa1997-05-05 20:56:21 +00001873 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001875
Guido van Rossum96a42c81992-01-12 02:29:51 +00001876 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001877}
1878
Guido van Rossuma027efa1997-05-05 20:56:21 +00001879static void
1880set_exc_info(tstate, type, value, tb)
1881 PyThreadState *tstate;
1882 PyObject *type;
1883 PyObject *value;
1884 PyObject *tb;
1885{
1886 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001887 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001888
Guido van Rossuma027efa1997-05-05 20:56:21 +00001889 frame = tstate->frame;
1890 if (frame->f_exc_type == NULL) {
1891 /* This frame didn't catch an exception before */
1892 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001893 if (tstate->exc_type == NULL) {
1894 Py_INCREF(Py_None);
1895 tstate->exc_type = Py_None;
1896 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001897 tmp_type = frame->f_exc_type;
1898 tmp_value = frame->f_exc_value;
1899 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001900 Py_XINCREF(tstate->exc_type);
1901 Py_XINCREF(tstate->exc_value);
1902 Py_XINCREF(tstate->exc_traceback);
1903 frame->f_exc_type = tstate->exc_type;
1904 frame->f_exc_value = tstate->exc_value;
1905 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001906 Py_XDECREF(tmp_type);
1907 Py_XDECREF(tmp_value);
1908 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001909 }
1910 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001911 tmp_type = tstate->exc_type;
1912 tmp_value = tstate->exc_value;
1913 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001914 Py_XINCREF(type);
1915 Py_XINCREF(value);
1916 Py_XINCREF(tb);
1917 tstate->exc_type = type;
1918 tstate->exc_value = value;
1919 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001920 Py_XDECREF(tmp_type);
1921 Py_XDECREF(tmp_value);
1922 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001923 /* For b/w compatibility */
1924 PySys_SetObject("exc_type", type);
1925 PySys_SetObject("exc_value", value);
1926 PySys_SetObject("exc_traceback", tb);
1927}
1928
1929static void
1930reset_exc_info(tstate)
1931 PyThreadState *tstate;
1932{
1933 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001934 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001935 frame = tstate->frame;
1936 if (frame->f_exc_type != NULL) {
1937 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001938 tmp_type = tstate->exc_type;
1939 tmp_value = tstate->exc_value;
1940 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001941 Py_XINCREF(frame->f_exc_type);
1942 Py_XINCREF(frame->f_exc_value);
1943 Py_XINCREF(frame->f_exc_traceback);
1944 tstate->exc_type = frame->f_exc_type;
1945 tstate->exc_value = frame->f_exc_value;
1946 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001947 Py_XDECREF(tmp_type);
1948 Py_XDECREF(tmp_value);
1949 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001950 /* For b/w compatibility */
1951 PySys_SetObject("exc_type", frame->f_exc_type);
1952 PySys_SetObject("exc_value", frame->f_exc_value);
1953 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1954 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001955 tmp_type = frame->f_exc_type;
1956 tmp_value = frame->f_exc_value;
1957 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001958 frame->f_exc_type = NULL;
1959 frame->f_exc_value = NULL;
1960 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001961 Py_XDECREF(tmp_type);
1962 Py_XDECREF(tmp_value);
1963 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001964}
1965
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001966/* Logic for the raise statement (too complicated for inlining).
1967 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001968static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001969do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001970 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001971{
Guido van Rossumd295f121998-04-09 21:39:57 +00001972 if (type == NULL) {
1973 /* Reraise */
1974 PyThreadState *tstate = PyThreadState_Get();
1975 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
1976 value = tstate->exc_value;
1977 tb = tstate->exc_traceback;
1978 Py_XINCREF(type);
1979 Py_XINCREF(value);
1980 Py_XINCREF(tb);
1981 }
1982
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001983 /* We support the following forms of raise:
1984 raise <class>, <classinstance>
1985 raise <class>, <argument tuple>
1986 raise <class>, None
1987 raise <class>, <argument>
1988 raise <classinstance>, None
1989 raise <string>, <object>
1990 raise <string>, None
1991
1992 An omitted second argument is the same as None.
1993
1994 In addition, raise <tuple>, <anything> is the same as
1995 raising the tuple's first item (and it better have one!);
1996 this rule is applied recursively.
1997
1998 Finally, an optional third argument can be supplied, which
1999 gives the traceback to be substituted (useful when
2000 re-raising an exception after examining it). */
2001
2002 /* First, check the traceback argument, replacing None with
2003 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002004 if (tb == Py_None) {
2005 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002006 tb = NULL;
2007 }
2008 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002009 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002010 "raise 3rd arg must be traceback or None");
2011 goto raise_error;
2012 }
2013
2014 /* Next, replace a missing value with None */
2015 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002016 value = Py_None;
2017 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002018 }
2019
2020 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002021 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2022 PyObject *tmp = type;
2023 type = PyTuple_GET_ITEM(type, 0);
2024 Py_INCREF(type);
2025 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002026 }
2027
Barry Warsaw4249f541997-08-22 21:26:19 +00002028 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002029 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002030
2031 else if (PyClass_Check(type))
2032 PyErr_NormalizeException(&type, &value, &tb);
2033
Guido van Rossumb209a111997-04-29 18:18:01 +00002034 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002035 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 if (value != Py_None) {
2037 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002038 "instance exception may not have a separate value");
2039 goto raise_error;
2040 }
2041 else {
2042 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002044 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2046 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002047 }
2048 }
2049 else {
2050 /* Not something you can raise. You get an exception
2051 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002053 "exceptions must be strings, classes, or instances");
2054 goto raise_error;
2055 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002056 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002057 if (tb == NULL)
2058 return WHY_EXCEPTION;
2059 else
2060 return WHY_RERAISE;
2061 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002062 Py_XDECREF(value);
2063 Py_XDECREF(type);
2064 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002065 return WHY_EXCEPTION;
2066}
2067
Barry Warsawe42b18f1997-08-25 22:13:04 +00002068static int
2069unpack_sequence(v, argcnt, sp)
2070 PyObject *v;
2071 int argcnt;
2072 PyObject **sp;
2073{
2074 int i;
2075 PyObject *w;
2076
2077 for (i = 0; i < argcnt; i++) {
2078 if (! (w = PySequence_GetItem(v, i))) {
2079 if (PyErr_ExceptionMatches(PyExc_IndexError))
2080 PyErr_SetString(PyExc_ValueError,
2081 "unpack sequence of wrong size");
2082 goto finally;
2083 }
2084 *--sp = w;
2085 }
2086 /* we better get an IndexError now */
2087 if (PySequence_GetItem(v, i) == NULL) {
2088 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2089 PyErr_Clear();
2090 return 1;
2091 }
2092 /* some other exception occurred. fall through to finally */
2093 }
2094 else
2095 PyErr_SetString(PyExc_ValueError,
2096 "unpack sequence of wrong size");
2097 /* fall through */
2098finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002099 for (; i > 0; i--, sp++)
2100 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002101
2102 return 0;
2103}
2104
2105
Guido van Rossum96a42c81992-01-12 02:29:51 +00002106#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002107static int
2108prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002109 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002110 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002112 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 if (PyObject_Print(v, stdout, 0) != 0)
2114 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002115 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002117#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002119static void
2120call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 PyObject **p_trace, **p_newtrace;
2122 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002123{
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002125 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002126 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002127 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 value = Py_None;
2129 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002130 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002132 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002134 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002135 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002136 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002137 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002138 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002140 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002141 Py_XDECREF(type);
2142 Py_XDECREF(value);
2143 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002144 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002145}
2146
2147static int
2148call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002149 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002150 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152 may point to NULL variable;
2153 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002155 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002157{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002158 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 PyObject *args, *what;
2160 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002161
Guido van Rossuma027efa1997-05-05 20:56:21 +00002162 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002163 /* Don't do recursive traces */
2164 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002165 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002166 *p_newtrace = NULL;
2167 }
2168 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002169 }
2170
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002172 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002173 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002175 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002176 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 Py_INCREF(f);
2178 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2179 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002180 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 arg = Py_None;
2182 Py_INCREF(arg);
2183 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002184 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002185 PyFrame_FastToLocals(f);
2186 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2187 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002189 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002191 if (res == NULL) {
2192 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002193 PyTraceBack_Here(f);
2194 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002195 *p_trace = NULL;
2196 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002198 *p_newtrace = NULL;
2199 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002200 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002201 }
2202 else {
2203 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002204 Py_XDECREF(*p_newtrace);
2205 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002206 *p_newtrace = NULL;
2207 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002208 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002209 *p_newtrace = res;
2210 }
2211 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002213 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002214 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002215}
2216
Guido van Rossumb209a111997-04-29 18:18:01 +00002217PyObject *
2218PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002219{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002220 PyThreadState *tstate = PyThreadState_Get();
2221 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002222 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002223 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002224 else
2225 return current_frame->f_builtins;
2226}
2227
Guido van Rossumb209a111997-04-29 18:18:01 +00002228PyObject *
2229PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002230{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002231 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002232 if (current_frame == NULL)
2233 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002234 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002235 return current_frame->f_locals;
2236}
2237
Guido van Rossumb209a111997-04-29 18:18:01 +00002238PyObject *
2239PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002240{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002241 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242 if (current_frame == NULL)
2243 return NULL;
2244 else
2245 return current_frame->f_globals;
2246}
2247
Guido van Rossumb209a111997-04-29 18:18:01 +00002248PyObject *
2249PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002250{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002251 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002252 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002253}
2254
Guido van Rossum6135a871995-01-09 17:53:26 +00002255int
Guido van Rossumb209a111997-04-29 18:18:01 +00002256PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002257{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002258 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002259 return current_frame == NULL ? 0 : current_frame->f_restricted;
2260}
2261
Guido van Rossumbe270261997-05-22 22:26:18 +00002262int
Guido van Rossumb209a111997-04-29 18:18:01 +00002263Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264{
Guido van Rossumb209a111997-04-29 18:18:01 +00002265 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002266 if (f == NULL)
2267 return 0;
2268 if (!PyFile_SoftSpace(f, 0))
2269 return 0;
2270 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002271}
2272
Guido van Rossum3f5da241990-12-20 15:06:42 +00002273
Guido van Rossum681d79a1995-07-18 14:51:37 +00002274/* External interface to call any callable object.
2275 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002276
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002277#undef PyEval_CallObject
2278/* for backward compatibility: export this interface */
2279
Guido van Rossumb209a111997-04-29 18:18:01 +00002280PyObject *
2281PyEval_CallObject(func, arg)
2282 PyObject *func;
2283 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002284{
Guido van Rossumb209a111997-04-29 18:18:01 +00002285 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002286}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002287#define PyEval_CallObject(func,arg) \
2288 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002289
Guido van Rossumb209a111997-04-29 18:18:01 +00002290PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002291PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002292 PyObject *func;
2293 PyObject *arg;
2294 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002295{
2296 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002297 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002298
2299 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 arg = PyTuple_New(0);
2301 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002302 PyErr_SetString(PyExc_TypeError,
2303 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002304 return NULL;
2305 }
2306 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002308
Guido van Rossumb209a111997-04-29 18:18:01 +00002309 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002310 PyErr_SetString(PyExc_TypeError,
2311 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002312 return NULL;
2313 }
2314
Guido van Rossum150b2df1996-12-05 23:17:11 +00002315 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002316 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002317 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002318 result = call_function(func, arg, kw);
2319 else
2320 result = call_builtin(func, arg, kw);
2321
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002323
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (result == NULL && !PyErr_Occurred())
2325 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002326 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002327
2328 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002329}
2330
Guido van Rossumb209a111997-04-29 18:18:01 +00002331static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002332call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 PyObject *func;
2334 PyObject *arg;
2335 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336{
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 if (PyCFunction_Check(func)) {
2338 PyCFunction meth = PyCFunction_GetFunction(func);
2339 PyObject *self = PyCFunction_GetSelf(func);
2340 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002341 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002342 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002343 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002344 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002345 else if (size == 0)
2346 arg = NULL;
2347 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002348 if (flags & METH_KEYWORDS)
2349 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 if (kw != NULL && PyDict_Size(kw) != 0) {
2351 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002352 "this function takes no keyword arguments");
2353 return NULL;
2354 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002355 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002357 if (PyClass_Check(func)) {
2358 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 if (PyInstance_Check(func)) {
2361 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002362 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002363 PyErr_Clear();
2364 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002365 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002366 return NULL;
2367 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002368 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002369 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002370 return res;
2371 }
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002372 PyErr_Format(PyExc_TypeError, "call of non-function (type %s)",
2373 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002374 return NULL;
2375}
2376
Guido van Rossumb209a111997-04-29 18:18:01 +00002377static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002378call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002379 PyObject *func;
2380 PyObject *arg;
2381 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382{
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 PyObject *class = NULL; /* == owner */
2384 PyObject *argdefs;
2385 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002386 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002387 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002388
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 if (kw != NULL && !PyDict_Check(kw)) {
2390 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 return NULL;
2392 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393
Guido van Rossumb209a111997-04-29 18:18:01 +00002394 if (PyMethod_Check(func)) {
2395 PyObject *self = PyMethod_Self(func);
2396 class = PyMethod_Class(func);
2397 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002398 if (self == NULL) {
2399 /* Unbound methods must be called with an instance of
2400 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002401 if (PyTuple_Size(arg) >= 1) {
2402 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002403 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 PyInstance_Check(self) &&
2405 PyClass_IsSubclass((PyObject *)
2406 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002407 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002408 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002409 else
2410 self = NULL;
2411 }
2412 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002413 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002414 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002415 return NULL;
2416 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002418 }
2419 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002420 int argcount = PyTuple_Size(arg);
2421 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002422 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002423 if (newarg == NULL)
2424 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002425 Py_INCREF(self);
2426 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002427 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 PyObject *v = PyTuple_GET_ITEM(arg, i);
2429 Py_XINCREF(v);
2430 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002431 }
2432 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 }
Guido van Rossum7859f871998-07-08 14:58:16 +00002434 if (!PyFunction_Check(func)) {
2435 result = PyEval_CallObjectWithKeywords(func, arg, kw);
2436 Py_DECREF(arg);
2437 return result;
2438 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 }
2440 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002441 if (!PyFunction_Check(func)) {
Guido van Rossum2d1ad391998-08-25 18:16:54 +00002442 PyErr_Format(PyExc_TypeError,
2443 "call of non-function (type %s)",
2444 func->ob_type->tp_name);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 return NULL;
2446 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002447 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002449
2450 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2452 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2453 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002454 }
2455 else {
2456 d = NULL;
2457 nd = 0;
2458 }
2459
2460 if (kw != NULL) {
2461 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 nk = PyDict_Size(kw);
2463 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002464 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002465 PyErr_NoMemory();
2466 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002467 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002468 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002469 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002471 i += 2;
2472 nk = i/2;
2473 /* XXX This is broken if the caller deletes dict items! */
2474 }
2475 else {
2476 k = NULL;
2477 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002478 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479
Guido van Rossum681d79a1995-07-18 14:51:37 +00002480 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 (PyCodeObject *)PyFunction_GetCode(func),
2482 PyFunction_GetGlobals(func), (PyObject *)NULL,
2483 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002484 k, nk,
2485 d, nd,
2486 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487
Guido van Rossumb209a111997-04-29 18:18:01 +00002488 Py_DECREF(arg);
2489 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490
Guido van Rossum681d79a1995-07-18 14:51:37 +00002491 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492}
2493
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002494#define SLICE_ERROR_MSG \
2495 "standard sequence type does not support step size other than one"
2496
Guido van Rossumb209a111997-04-29 18:18:01 +00002497static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002498loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002499 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500{
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002502 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002503 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002505 return NULL;
2506 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002507 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002508 v = (*sq->sq_item)(v, i);
2509 if (v)
2510 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002511 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002512 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002513 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514}
2515
2516static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002517slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 int *pi;
2520{
2521 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002522 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002523 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002524 PyErr_SetString(PyExc_TypeError,
2525 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002526 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002528 x = PyInt_AsLong(v);
2529 /* Truncate -- very long indices are truncated anyway */
2530 if (x > INT_MAX)
2531 x = INT_MAX;
2532 else if (x < -INT_MAX)
2533 x = 0;
2534 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002536 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537}
2538
Guido van Rossumb209a111997-04-29 18:18:01 +00002539static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002540apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 int ilow = 0, ihigh = INT_MAX;
2544 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002546 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002547 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002548 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002550
2551static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002554{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002555 int ilow = 0, ihigh = INT_MAX;
2556 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002557 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002558 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002560 if (x == NULL)
2561 return PySequence_DelSlice(u, ilow, ihigh);
2562 else
2563 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564}
2565
Guido van Rossumb209a111997-04-29 18:18:01 +00002566static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002567cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002568 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002569 register PyObject *v;
2570 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571{
2572 register int cmp;
2573 register int res = 0;
2574 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 case IS:
2576 case IS_NOT:
2577 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002578 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 res = !res;
2580 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 case IN:
2582 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00002583 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002584 if (res < 0)
2585 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002586 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 break;
2589 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002590 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002591 break;
2592 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002593 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002594 if (cmp && PyErr_Occurred())
2595 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 switch (op) {
2597 case LT: res = cmp < 0; break;
2598 case LE: res = cmp <= 0; break;
2599 case EQ: res = cmp == 0; break;
2600 case NE: res = cmp != 0; break;
2601 case GT: res = cmp > 0; break;
2602 case GE: res = cmp >= 0; break;
2603 /* XXX no default? (res is initialized to 0 though) */
2604 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002606 v = res ? Py_True : Py_False;
2607 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 return v;
2609}
2610
Guido van Rossum3f5da241990-12-20 15:06:42 +00002611static int
2612import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002613 PyObject *locals;
2614 PyObject *v;
2615 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002616{
Guido van Rossumb209a111997-04-29 18:18:01 +00002617 PyObject *w, *x;
2618 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002619 PyErr_SetString(PyExc_TypeError,
2620 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002621 return -1;
2622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 w = PyModule_GetDict(v);
2624 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002625 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002626 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002627 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 while (PyDict_Next(w, &pos, &name, &value)) {
2629 if (!PyString_Check(name) ||
2630 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002631 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 Py_INCREF(value);
2633 err = PyDict_SetItem(locals, name, value);
2634 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002635 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002637 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002638 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002639 }
2640 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002642 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002643 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002644 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 PyString_AsString(name));
2646 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002647 return -1;
2648 }
2649 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002650 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002651 }
2652}
2653
Guido van Rossumb209a111997-04-29 18:18:01 +00002654static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002655build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 PyObject *methods; /* dictionary */
2657 PyObject *bases; /* tuple containing classes */
2658 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002659{
Guido van Rossumcd649651997-08-22 16:56:16 +00002660 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002662 PyErr_SetString(PyExc_SystemError,
2663 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002664 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002665 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002667 PyErr_SetString(PyExc_SystemError,
2668 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002669 return NULL;
2670 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002672 PyErr_SetString(PyExc_SystemError,
2673 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002674 return NULL;
2675 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002676 n = PyTuple_Size(bases);
2677 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 PyObject *base = PyTuple_GET_ITEM(bases, i);
2679 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002680 /* Call the base's *type*, if it is callable.
2681 This code is a hook for Donald Beaudry's
2682 and Jim Fulton's type extensions. In
2683 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002684 since its types are not callable.
2685 Ditto: call the bases's *class*, if it has
2686 one. This makes the same thing possible
2687 without writing C code. A true meta-object
2688 protocol! */
2689 PyObject *basetype = (PyObject *)base->ob_type;
2690 PyObject *callable = NULL;
2691 if (PyCallable_Check(basetype))
2692 callable = basetype;
2693 else
2694 callable = PyObject_GetAttrString(
2695 base, "__class__");
2696 if (callable) {
2697 PyObject *args;
2698 PyObject *newclass = NULL;
2699 args = Py_BuildValue(
2700 "(OOO)", name, bases, methods);
2701 if (args != NULL) {
2702 newclass = PyEval_CallObject(
2703 callable, args);
2704 Py_DECREF(args);
2705 }
Guido van Rossum730806d1998-04-10 22:27:42 +00002706 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002707 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00002708 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002709 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002710 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002711 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002712 "base is not a class object");
2713 return NULL;
2714 }
2715 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002717}
2718
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002719static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002720exec_statement(f, prog, globals, locals)
2721 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002722 PyObject *prog;
2723 PyObject *globals;
2724 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002725{
2726 char *s;
2727 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002728 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002729 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002730
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2732 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002733 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002735 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 locals = PyTuple_GetItem(prog, 2);
2737 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002738 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002739 if (globals == Py_None) {
2740 globals = PyEval_GetGlobals();
2741 if (locals == Py_None) {
2742 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002743 plain = 1;
2744 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002745 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002747 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 if (!PyString_Check(prog) &&
2749 !PyCode_Check(prog) &&
2750 !PyFile_Check(prog)) {
2751 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002752 "exec 1st arg must be string, code or file object");
2753 return -1;
2754 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2756 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002757 "exec 2nd/3rd args must be dict or None");
2758 return -1;
2759 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002761 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 if (PyCode_Check(prog)) {
Guido van Rossumdfed7251997-11-11 16:29:38 +00002763 v = PyEval_EvalCode((PyCodeObject *) prog,
2764 globals, locals);
2765 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002766 return -1;
Guido van Rossumdfed7251997-11-11 16:29:38 +00002767 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002768 return 0;
2769 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002770 if (PyFile_Check(prog)) {
2771 FILE *fp = PyFile_AsFile(prog);
2772 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002773 if (PyRun_File(fp, name, Py_file_input,
2774 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002775 return -1;
2776 return 0;
2777 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002778 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002779 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002780 PyErr_SetString(PyExc_ValueError,
2781 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002782 return -1;
2783 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002784 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002785 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002786 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002787 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002788 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002789 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002790 return 0;
2791}
Guido van Rossum24c13741995-02-14 09:42:43 +00002792
Guido van Rossum1aa14831997-01-21 05:34:20 +00002793/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002794static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002795find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002796 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002797 int nexti;
2798{
2799 int opcode;
2800 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002802 unsigned char *next_instr;
2803
2804 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2805 opcode = (*next_instr++);
2806 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 Py_INCREF(Py_None);
2808 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002809 }
2810
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002812 if (list == NULL)
2813 return NULL;
2814
2815 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002816 oparg = (next_instr[1]<<8) + next_instr[0];
2817 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002818 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 if (PyList_Append(list, name) < 0) {
2820 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002821 break;
2822 }
2823 opcode = (*next_instr++);
2824 } while (opcode == IMPORT_FROM);
2825
2826 return list;
2827}
Guido van Rossum950361c1997-01-24 13:49:28 +00002828
2829
2830#ifdef DYNAMIC_EXECUTION_PROFILE
2831
2832PyObject *
2833getarray(a)
2834 long a[256];
2835{
2836 int i;
2837 PyObject *l = PyList_New(256);
2838 if (l == NULL) return NULL;
2839 for (i = 0; i < 256; i++) {
2840 PyObject *x = PyInt_FromLong(a[i]);
2841 if (x == NULL) {
2842 Py_DECREF(l);
2843 return NULL;
2844 }
2845 PyList_SetItem(l, i, x);
2846 }
2847 for (i = 0; i < 256; i++)
2848 a[i] = 0;
2849 return l;
2850}
2851
2852PyObject *
2853_Py_GetDXProfile(self, args)
2854 PyObject *self, *args;
2855{
2856#ifndef DXPAIRS
2857 return getarray(dxp);
2858#else
2859 int i;
2860 PyObject *l = PyList_New(257);
2861 if (l == NULL) return NULL;
2862 for (i = 0; i < 257; i++) {
2863 PyObject *x = getarray(dxpairs[i]);
2864 if (x == NULL) {
2865 Py_DECREF(l);
2866 return NULL;
2867 }
2868 PyList_SetItem(l, i, x);
2869 }
2870 return l;
2871#endif
2872}
2873
2874#endif