blob: d8c9a05f28e09360c4b07f000a72cfe8102bfb7c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossumb209a111997-04-29 18:18:01 +000040#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
46
Guido van Rossumc6004111993-11-05 10:22:19 +000047#include <ctype.h>
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049#ifdef HAVE_LIMITS_H
50#include <limits.h>
51#else
52#define INT_MAX 2147483647
53#endif
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossum408027e1996-12-30 16:17:54 +000058#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000059/* For debugging the interpreter: */
60#define LLTRACE 1 /* Low-level trace feature */
61#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062#endif
63
Guido van Rossum5b722181993-03-30 17:46:03 +000064
Guido van Rossum374a9221991-04-04 10:40:29 +000065/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
68 PyObject *, PyObject *,
69 PyObject **, int,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000073#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000074static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000076static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
77 PyFrameObject *));
78static int call_trace Py_PROTO((PyObject **, PyObject **,
79 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000080static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
81static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000082static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000083static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000084static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000085static int assign_slice Py_PROTO((PyObject *, PyObject *,
86 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000087static int cmp_member Py_PROTO((PyObject *, PyObject *));
88static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
89static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
90static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000091static int exec_statement Py_PROTO((PyFrameObject *,
92 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000093static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000094static void set_exc_info Py_PROTO((PyThreadState *,
95 PyObject *, PyObject *, PyObject *));
96static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000097
98
Guido van Rossum950361c1997-01-24 13:49:28 +000099/* Dynamic execution profile */
100#ifdef DYNAMIC_EXECUTION_PROFILE
101#ifdef DXPAIRS
102static long dxpairs[257][256];
103#define dxp dxpairs[256]
104#else
105static long dxp[256];
106#endif
107#endif
108
109
Guido van Rossume59214e1994-08-30 08:01:59 +0000110#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000111
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112#include <errno.h>
113#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000114
Guido van Rossuma027efa1997-05-05 20:56:21 +0000115extern int _PyThread_Started; /* Flag for Py_Exit */
116
Guido van Rossuma9672091994-09-14 13:31:22 +0000117static type_lock interpreter_lock = 0;
118static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000119
120void
Guido van Rossumb209a111997-04-29 18:18:01 +0000121PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000122{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000124 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000125 _PyThread_Started = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000126 interpreter_lock = allocate_lock();
127 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000128 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000129}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000130
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000131void
Guido van Rossum25ce5661997-08-02 03:10:38 +0000132PyEval_AcquireLock()
133{
134 acquire_lock(interpreter_lock, 1);
135}
136
137void
138PyEval_ReleaseLock()
139{
140 release_lock(interpreter_lock);
141}
142
143void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000144PyEval_AcquireThread(tstate)
145 PyThreadState *tstate;
146{
147 if (tstate == NULL)
148 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
149 acquire_lock(interpreter_lock, 1);
150 if (PyThreadState_Swap(tstate) != NULL)
151 Py_FatalError(
152 "PyEval_AcquireThread: non-NULL old thread state");
153}
154
155void
156PyEval_ReleaseThread(tstate)
157 PyThreadState *tstate;
158{
159 if (tstate == NULL)
160 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
161 if (PyThreadState_Swap(NULL) != tstate)
162 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
163 release_lock(interpreter_lock);
164}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000165#endif
166
Guido van Rossumff4949e1992-08-05 19:58:53 +0000167/* Functions save_thread and restore_thread are always defined so
168 dynamically loaded modules needn't be compiled separately for use
169 with and without threads: */
170
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000171PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000172PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173{
Guido van Rossume59214e1994-08-30 08:01:59 +0000174#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000175 if (interpreter_lock) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000176 PyThreadState *tstate = PyThreadState_Swap(NULL);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000177 if (tstate == NULL)
178 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000179 release_lock(interpreter_lock);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000180 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000183 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000184}
185
186void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000187PyEval_RestoreThread(tstate)
188 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000189{
Guido van Rossume59214e1994-08-30 08:01:59 +0000190#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191 if (interpreter_lock) {
192 int err;
193 err = errno;
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000194 if (tstate == NULL)
195 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196 acquire_lock(interpreter_lock, 1);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000197 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199 }
200#endif
201}
202
203
Guido van Rossuma9672091994-09-14 13:31:22 +0000204/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
205 signal handlers or Mac I/O completion routines) can schedule calls
206 to a function to be called synchronously.
207 The synchronous function is called with one void* argument.
208 It should return 0 for success or -1 for failure -- failure should
209 be accompanied by an exception.
210
211 If registry succeeds, the registry function returns 0; if it fails
212 (e.g. due to too many pending calls) it returns -1 (without setting
213 an exception condition).
214
215 Note that because registry may occur from within signal handlers,
216 or other asynchronous events, calling malloc() is unsafe!
217
218#ifdef WITH_THREAD
219 Any thread can schedule pending calls, but only the main thread
220 will execute them.
221#endif
222
223 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
224 There are two possible race conditions:
225 (1) nested asynchronous registry calls;
226 (2) registry calls made while pending calls are being processed.
227 While (1) is very unlikely, (2) is a real possibility.
228 The current code is safe against (2), but not against (1).
229 The safety against (2) is derived from the fact that only one
230 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000231
Guido van Rossuma027efa1997-05-05 20:56:21 +0000232 XXX Darn! With the advent of thread state, we should have an array
233 of pending calls per thread in the thread state! Later...
234*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000235
Guido van Rossuma9672091994-09-14 13:31:22 +0000236#define NPENDINGCALLS 32
237static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000238 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000239 ANY *arg;
240} pendingcalls[NPENDINGCALLS];
241static volatile int pendingfirst = 0;
242static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000244
245int
246Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000247 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000248 ANY *arg;
249{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000250 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000251 int i, j;
252 /* XXX Begin critical section */
253 /* XXX If you want this to be safe against nested
254 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 if (busy)
256 return -1;
257 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000258 i = pendinglast;
259 j = (i + 1) % NPENDINGCALLS;
260 if (j == pendingfirst)
261 return -1; /* Queue full */
262 pendingcalls[i].func = func;
263 pendingcalls[i].arg = arg;
264 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000265 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000266 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000267 /* XXX End critical section */
268 return 0;
269}
270
Guido van Rossum180d7b41994-09-29 09:45:57 +0000271int
272Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000273{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000274 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000275#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000276 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000277 return 0;
278#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000279 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000280 return 0;
281 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000282 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000283 for (;;) {
284 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000285 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000286 ANY *arg;
287 i = pendingfirst;
288 if (i == pendinglast)
289 break; /* Queue empty */
290 func = pendingcalls[i].func;
291 arg = pendingcalls[i].arg;
292 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000293 if (func(arg) < 0) {
294 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000295 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000296 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000297 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000298 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000299 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000300 return 0;
301}
302
303
Guido van Rossum374a9221991-04-04 10:40:29 +0000304/* Status code for main loop (reason for stack unwind) */
305
306enum why_code {
307 WHY_NOT, /* No error */
308 WHY_EXCEPTION, /* Exception occurred */
309 WHY_RERAISE, /* Exception re-raised by 'finally' */
310 WHY_RETURN, /* 'return' statement */
311 WHY_BREAK /* 'break' statement */
312};
313
Guido van Rossumb209a111997-04-29 18:18:01 +0000314static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Barry Warsawe42b18f1997-08-25 22:13:04 +0000315static int unpack_sequence Py_PROTO((PyObject *, int, PyObject **));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000316
Guido van Rossum374a9221991-04-04 10:40:29 +0000317
Guido van Rossum681d79a1995-07-18 14:51:37 +0000318/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000319
Guido van Rossumb209a111997-04-29 18:18:01 +0000320PyObject *
321PyEval_EvalCode(co, globals, locals)
322 PyCodeObject *co;
323 PyObject *globals;
324 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000325{
326 return eval_code2(co,
327 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000328 (PyObject **)NULL, 0,
329 (PyObject **)NULL, 0,
330 (PyObject **)NULL, 0,
331 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000332}
333
334
335/* Interpreter main loop */
336
Guido van Rossum8861b741996-07-30 16:49:37 +0000337#ifndef MAX_RECURSION_DEPTH
338#define MAX_RECURSION_DEPTH 10000
339#endif
340
Guido van Rossumb209a111997-04-29 18:18:01 +0000341static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000342eval_code2(co, globals, locals,
343 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000344 PyCodeObject *co;
345 PyObject *globals;
346 PyObject *locals;
347 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000351 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000352 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000353 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000354{
Guido van Rossum950361c1997-01-24 13:49:28 +0000355#ifdef DXPAIRS
356 int lastopcode = 0;
357#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000358 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000359 register int opcode = 0; /* Current opcode */
360 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000361 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000362 register enum why_code why; /* Reason for block stack unwind */
363 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000364 register PyObject *x; /* Result object -- NULL if error */
365 register PyObject *v; /* Temporary objects popped off stack */
366 register PyObject *w;
367 register PyObject *u;
368 register PyObject *t;
369 register PyFrameObject *f; /* Current frame */
370 register PyObject **fastlocals = NULL;
371 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000372 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000373#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000374 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000375#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000376#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000377 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000378 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000379#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000380
381/* Code access macros */
382
383#define GETCONST(i) Getconst(f, i)
384#define GETNAME(i) Getname(f, i)
385#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000386#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000387#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
388#define NEXTOP() (*next_instr++)
389#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
390#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
391#define JUMPBY(x) (next_instr += (x))
392
393/* Stack manipulation macros */
394
395#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
396#define EMPTY() (STACK_LEVEL() == 0)
397#define TOP() (stack_pointer[-1])
398#define BASIC_PUSH(v) (*stack_pointer++ = (v))
399#define BASIC_POP() (*--stack_pointer)
400
Guido van Rossum96a42c81992-01-12 02:29:51 +0000401#ifdef LLTRACE
402#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
403#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000404#else
405#define PUSH(v) BASIC_PUSH(v)
406#define POP() BASIC_POP()
407#endif
408
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409/* Local variable macros */
410
411#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000412#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000413 GETLOCAL(i) = value; } while (0)
414
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415/* Start of code */
416
Guido van Rossum8861b741996-07-30 16:49:37 +0000417#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000418 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000419 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000420 return NULL;
421 }
422#endif
423
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000425 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000426 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000427 }
428
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000429#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000431#endif
432
Guido van Rossumb209a111997-04-29 18:18:01 +0000433 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000434 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000435 co, /*code*/
436 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000437 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000438 if (f == NULL)
439 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440
Guido van Rossuma027efa1997-05-05 20:56:21 +0000441 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000442 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443
444 if (co->co_argcount > 0 ||
445 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
446 int i;
447 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000448 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000450 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 if (kwdict == NULL)
452 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000453 i = co->co_argcount;
454 if (co->co_flags & CO_VARARGS)
455 i++;
456 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 }
458 if (argcount > co->co_argcount) {
459 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000460 PyErr_SetString(PyExc_TypeError,
461 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 goto fail;
463 }
464 n = co->co_argcount;
465 }
466 for (i = 0; i < n; i++) {
467 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000468 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 SETLOCAL(i, x);
470 }
471 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000472 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000473 if (u == NULL)
474 goto fail;
475 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 for (i = n; i < argcount; i++) {
477 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 Py_INCREF(x);
479 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 }
482 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 PyObject *keyword = kws[2*i];
484 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 int j;
486 /* XXX slow -- speed up using dictionary? */
487 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000488 PyObject *nm = PyTuple_GET_ITEM(
489 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000490 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 break;
492 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000493 /* Check errors from Compare */
494 if (PyErr_Occurred())
495 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 if (j >= co->co_argcount) {
497 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000499 "unexpected keyword argument: %.400s",
500 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 goto fail;
502 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000503 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000504 }
505 else {
506 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000507 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 "keyword parameter redefined");
509 goto fail;
510 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000511 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000512 SETLOCAL(j, value);
513 }
514 }
515 if (argcount < co->co_argcount) {
516 int m = co->co_argcount - defcount;
517 for (i = argcount; i < m; i++) {
518 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000519 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 "not enough arguments");
521 goto fail;
522 }
523 }
524 if (n > m)
525 i = n - m;
526 else
527 i = 0;
528 for (; i < defcount; i++) {
529 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000530 PyObject *def = defs[i];
531 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 SETLOCAL(m+i, def);
533 }
534 }
535 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000536 }
537 else {
538 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000539 PyErr_SetString(PyExc_TypeError,
540 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000541 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000542 }
543 }
544
Guido van Rossuma027efa1997-05-05 20:56:21 +0000545 if (tstate->sys_tracefunc != NULL) {
546 /* tstate->sys_tracefunc, if defined, is a function that
547 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000548 Its return value, if not None, is a function that
549 will be called at the start of each executed line
550 of code. (Actually, the function must return
551 itself in order to continue tracing.)
552 The trace functions are called with three arguments:
553 a pointer to the current frame, a string indicating
554 why the function is called, and an argument which
555 depends on the situation. The global trace function
556 (sys.trace) is also called whenever an exception
557 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000558 if (call_trace(&tstate->sys_tracefunc,
559 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000562 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000563 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000564 }
565
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->sys_profilefunc != NULL) {
567 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000568 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000569 if (call_trace(&tstate->sys_profilefunc,
570 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000571 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000572 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000573 }
574 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000575
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
577 --tstate->recursion_depth;
578 PyErr_SetString(PyExc_RuntimeError,
579 "Maximum recursion depth exceeded");
580 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000581 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000582 return NULL;
583 }
584
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000585 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 stack_pointer = f->f_valuestack;
587
Guido van Rossum374a9221991-04-04 10:40:29 +0000588 why = WHY_NOT;
589 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000590 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000591
592 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000593 /* Do periodic things. Doing this every time through
594 the loop would add too much overhead, so we do it
595 only every Nth instruction. We also do it if
596 ``things_to_do'' is set, i.e. when an asynchronous
597 event needs attention (e.g. a signal handler or
598 async I/O handler); see Py_AddPendingCall() and
599 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000600
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000602 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000604 if (Py_MakePendingCalls() < 0) {
605 why = WHY_EXCEPTION;
606 goto on_error;
607 }
608 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000609#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000610 /* If we have true signals, the signal handler
611 will call Py_AddPendingCall() so we don't
612 have to call sigcheck(). On the Mac and
613 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000614 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 goto on_error;
617 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000618#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619
Guido van Rossume59214e1994-08-30 08:01:59 +0000620#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000621 if (interpreter_lock) {
622 /* Give another thread a chance */
623
Guido van Rossum25ce5661997-08-02 03:10:38 +0000624 if (PyThreadState_Swap(NULL) != tstate)
625 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626 release_lock(interpreter_lock);
627
628 /* Other threads may run now */
629
630 acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000631 if (PyThreadState_Swap(tstate) != NULL)
632 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000633 }
634#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000638
Guido van Rossum408027e1996-12-30 16:17:54 +0000639#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000640 f->f_lasti = INSTR_OFFSET();
641#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000642
643 opcode = NEXTOP();
644 if (HAS_ARG(opcode))
645 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000646#ifdef DYNAMIC_EXECUTION_PROFILE
647#ifdef DXPAIRS
648 dxpairs[lastopcode][opcode]++;
649 lastopcode = opcode;
650#endif
651 dxp[opcode]++;
652#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000653
Guido van Rossum96a42c81992-01-12 02:29:51 +0000654#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000655 /* Instruction tracing */
656
Guido van Rossum96a42c81992-01-12 02:29:51 +0000657 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 if (HAS_ARG(opcode)) {
659 printf("%d: %d, %d\n",
660 (int) (INSTR_OFFSET() - 3),
661 opcode, oparg);
662 }
663 else {
664 printf("%d: %d\n",
665 (int) (INSTR_OFFSET() - 1), opcode);
666 }
667 }
668#endif
669
670 /* Main switch on opcode */
671
672 switch (opcode) {
673
674 /* BEWARE!
675 It is essential that any operation that fails sets either
676 x to NULL, err to nonzero, or why to anything but WHY_NOT,
677 and that no operation that succeeds does this! */
678
679 /* case STOP_CODE: this is an error! */
680
681 case POP_TOP:
682 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000683 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000684 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685
686 case ROT_TWO:
687 v = POP();
688 w = POP();
689 PUSH(v);
690 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000691 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000692
693 case ROT_THREE:
694 v = POP();
695 w = POP();
696 x = POP();
697 PUSH(v);
698 PUSH(x);
699 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000700 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000701
702 case DUP_TOP:
703 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000704 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000706 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000707
708 case UNARY_POSITIVE:
709 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000710 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000711 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000713 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 break;
715
716 case UNARY_NEGATIVE:
717 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000718 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000719 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000721 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 break;
723
724 case UNARY_NOT:
725 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000726 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000727 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000728 if (err == 0) {
729 Py_INCREF(Py_True);
730 PUSH(Py_True);
731 continue;
732 }
733 else if (err > 0) {
734 Py_INCREF(Py_False);
735 PUSH(Py_False);
736 err = 0;
737 continue;
738 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 break;
740
741 case UNARY_CONVERT:
742 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000743 x = PyObject_Repr(v);
744 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000748
749 case UNARY_INVERT:
750 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000751 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000752 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000754 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000755 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000756
Guido van Rossum50564e81996-01-12 01:13:16 +0000757 case BINARY_POWER:
758 w = POP();
759 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000760 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_DECREF(v);
762 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000763 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000764 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000765 break;
766
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 case BINARY_MULTIPLY:
768 w = POP();
769 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000770 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000771 Py_DECREF(v);
772 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000774 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000775 break;
776
777 case BINARY_DIVIDE:
778 w = POP();
779 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000780 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000781 Py_DECREF(v);
782 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000784 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 break;
786
787 case BINARY_MODULO:
788 w = POP();
789 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000790 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000791 Py_DECREF(v);
792 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000793 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000794 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 break;
796
797 case BINARY_ADD:
798 w = POP();
799 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000800 if (PyInt_Check(v) && PyInt_Check(w)) {
801 /* INLINE: int + int */
802 register long a, b, i;
803 a = ((PyIntObject*) v)->ob_ival;
804 b = ((PyIntObject*) w)->ob_ival;
805 i = a + b;
806 if ((i^a) < 0 && (i^b) < 0) {
807 PyErr_SetString(PyExc_OverflowError,
808 "integer addition");
809 x = NULL;
810 }
811 else
812 x = PyInt_FromLong(i);
813 }
814 else
815 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000816 Py_DECREF(v);
817 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000819 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 break;
821
822 case BINARY_SUBTRACT:
823 w = POP();
824 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000825 if (PyInt_Check(v) && PyInt_Check(w)) {
826 /* INLINE: int - int */
827 register long a, b, i;
828 a = ((PyIntObject*) v)->ob_ival;
829 b = ((PyIntObject*) w)->ob_ival;
830 i = a - b;
831 if ((i^a) < 0 && (i^~b) < 0) {
832 PyErr_SetString(PyExc_OverflowError,
833 "integer subtraction");
834 x = NULL;
835 }
836 else
837 x = PyInt_FromLong(i);
838 }
839 else
840 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_DECREF(v);
842 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000844 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 break;
846
847 case BINARY_SUBSCR:
848 w = POP();
849 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000850 if (PyList_Check(v) && PyInt_Check(w)) {
851 /* INLINE: list[int] */
852 long i = PyInt_AsLong(w);
853 if (i < 0)
854 i += ((PyListObject*) v)->ob_size;
855 if (i < 0 ||
856 i >= ((PyListObject*) v)->ob_size) {
857 PyErr_SetString(PyExc_IndexError,
858 "list index out of range");
859 x = NULL;
860 }
861 else {
862 x = ((PyListObject*) v)->ob_item[i];
863 Py_INCREF(x);
864 }
865 }
866 else
867 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000868 Py_DECREF(v);
869 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 break;
873
Guido van Rossum7928cd71991-10-24 14:59:31 +0000874 case BINARY_LSHIFT:
875 w = POP();
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
879 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 break;
883
884 case BINARY_RSHIFT:
885 w = POP();
886 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000887 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000892 break;
893
894 case BINARY_AND:
895 w = POP();
896 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000897 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(v);
899 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000902 break;
903
904 case BINARY_XOR:
905 w = POP();
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
909 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000912 break;
913
914 case BINARY_OR:
915 w = POP();
916 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000917 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000918 Py_DECREF(v);
919 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000920 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000921 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000922 break;
923
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 case SLICE+0:
925 case SLICE+1:
926 case SLICE+2:
927 case SLICE+3:
928 if ((opcode-SLICE) & 2)
929 w = POP();
930 else
931 w = NULL;
932 if ((opcode-SLICE) & 1)
933 v = POP();
934 else
935 v = NULL;
936 u = POP();
937 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(u);
939 Py_XDECREF(v);
940 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000942 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 break;
944
945 case STORE_SLICE+0:
946 case STORE_SLICE+1:
947 case STORE_SLICE+2:
948 case STORE_SLICE+3:
949 if ((opcode-STORE_SLICE) & 2)
950 w = POP();
951 else
952 w = NULL;
953 if ((opcode-STORE_SLICE) & 1)
954 v = POP();
955 else
956 v = NULL;
957 u = POP();
958 t = POP();
959 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000960 Py_DECREF(t);
961 Py_DECREF(u);
962 Py_XDECREF(v);
963 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000964 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 break;
966
967 case DELETE_SLICE+0:
968 case DELETE_SLICE+1:
969 case DELETE_SLICE+2:
970 case DELETE_SLICE+3:
971 if ((opcode-DELETE_SLICE) & 2)
972 w = POP();
973 else
974 w = NULL;
975 if ((opcode-DELETE_SLICE) & 1)
976 v = POP();
977 else
978 v = NULL;
979 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000980 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(u);
983 Py_XDECREF(v);
984 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 break;
987
988 case STORE_SUBSCR:
989 w = POP();
990 v = POP();
991 u = POP();
992 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000993 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000994 Py_DECREF(u);
995 Py_DECREF(v);
996 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000997 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 break;
999
1000 case DELETE_SUBSCR:
1001 w = POP();
1002 v = POP();
1003 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001004 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001005 Py_DECREF(v);
1006 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001007 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 break;
1009
1010 case PRINT_EXPR:
1011 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +00001013 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001015 (err = PyDict_SetItemString(
Guido van Rossum9cc8a201997-07-19 19:55:50 +00001016 f->f_builtins, "_", v)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001017 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001019 x = PySys_GetObject("stdout");
1020 if (x == NULL)
1021 err = -1;
1022 }
1023 if (err == 0)
1024 err = PyFile_WriteObject(v, x, 0);
1025 if (err == 0) {
1026 PyFile_SoftSpace(x, 1);
1027 err = Py_FlushLine();
1028 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001030 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 break;
1032
1033 case PRINT_ITEM:
1034 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 w = PySys_GetObject("stdout");
1036 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001037 err = PyFile_WriteString(" ", w);
1038 if (err == 0)
1039 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001040 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001041 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 char *s = PyString_AsString(v);
1043 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001044 if (len > 0 &&
1045 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001046 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001049 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001050 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 break;
1052
1053 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001054 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001055 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001056 PyErr_SetString(PyExc_RuntimeError,
1057 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001058 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001059 err = PyFile_WriteString("\n", x);
1060 if (err == 0)
1061 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001062 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
1064
1065 case BREAK_LOOP:
1066 why = WHY_BREAK;
1067 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068
Guido van Rossumf10570b1995-07-07 22:53:21 +00001069 case RAISE_VARARGS:
1070 u = v = w = NULL;
1071 switch (oparg) {
1072 case 3:
1073 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001074 /* Fallthrough */
1075 case 2:
1076 v = POP(); /* value */
1077 /* Fallthrough */
1078 case 1:
1079 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001080 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001081 break;
1082 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001083 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001084 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001085 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001086 break;
1087 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001088 break;
1089
1090 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001091 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001092 PyErr_SetString(PyExc_SystemError,
1093 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001094 break;
1095 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001096 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001097 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 break;
1099
1100 case RETURN_VALUE:
1101 retval = POP();
1102 why = WHY_RETURN;
1103 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001104
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001105 case EXEC_STMT:
1106 w = POP();
1107 v = POP();
1108 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001109 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001110 Py_DECREF(u);
1111 Py_DECREF(v);
1112 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001113 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001114
Guido van Rossum374a9221991-04-04 10:40:29 +00001115 case POP_BLOCK:
1116 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001117 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 while (STACK_LEVEL() > b->b_level) {
1119 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001120 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 }
1122 }
1123 break;
1124
1125 case END_FINALLY:
1126 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001127 if (PyInt_Check(v)) {
1128 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 if (why == WHY_RETURN)
1130 retval = POP();
1131 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001132 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001134 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001135 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001137 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001139 else if (v != Py_None) {
1140 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001141 "'finally' pops bad exception");
1142 why = WHY_EXCEPTION;
1143 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001144 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 break;
1146
1147 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001148 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001150 w = POP();
1151 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001153 Py_DECREF(u);
1154 Py_DECREF(v);
1155 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 break;
1157
1158 case STORE_NAME:
1159 w = GETNAMEV(oparg);
1160 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001161 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001162 PyErr_SetString(PyExc_SystemError,
1163 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001164 break;
1165 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001166 err = PyDict_SetItem(x, w, v);
1167 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 break;
1169
1170 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001171 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001172 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001173 PyErr_SetString(PyExc_SystemError,
1174 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001175 break;
1176 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001177 if ((err = PyDict_DelItem(x, w)) != 0)
1178 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001180
1181#ifdef CASE_TOO_BIG
1182 default: switch (opcode) {
1183#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001184
1185 case UNPACK_TUPLE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001186 case UNPACK_LIST:
1187 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001188 if (PyTuple_Check(v)) {
1189 if (PyTuple_Size(v) != oparg) {
1190 PyErr_SetString(PyExc_ValueError,
1191 "unpack tuple of wrong size");
1192 why = WHY_EXCEPTION;
1193 }
1194 else {
1195 for (; --oparg >= 0; ) {
1196 w = PyTuple_GET_ITEM(v, oparg);
1197 Py_INCREF(w);
1198 PUSH(w);
1199 }
1200 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001202 else if (PyList_Check(v)) {
1203 if (PyList_Size(v) != oparg) {
1204 PyErr_SetString(PyExc_ValueError,
1205 "unpack list of wrong size");
1206 why = WHY_EXCEPTION;
1207 }
1208 else {
1209 for (; --oparg >= 0; ) {
1210 w = PyList_GET_ITEM(v, oparg);
1211 Py_INCREF(w);
1212 PUSH(w);
1213 }
1214 }
1215 }
1216 else if (PySequence_Check(v)) {
1217 if (unpack_sequence(v, oparg,
1218 stack_pointer + oparg))
1219 stack_pointer += oparg;
1220 else
1221 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 }
1223 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001224 PyErr_SetString(PyExc_TypeError,
1225 "unpack non-sequence");
1226 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001228 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001229 break;
1230
1231 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001232 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 v = POP();
1234 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001235 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1236 Py_DECREF(v);
1237 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001238 break;
1239
1240 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001241 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001243 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1244 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001245 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001246 break;
1247
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001248 case STORE_GLOBAL:
1249 w = GETNAMEV(oparg);
1250 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 err = PyDict_SetItem(f->f_globals, w, v);
1252 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001253 break;
1254
1255 case DELETE_GLOBAL:
1256 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001257 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1258 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001259 break;
1260
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 case LOAD_CONST:
1262 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 PUSH(x);
1265 break;
1266
1267 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001268 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001269 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001270 PyErr_SetString(PyExc_SystemError,
1271 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001272 break;
1273 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 PyErr_Clear();
1277 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001279 PyErr_Clear();
1280 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001282 PyErr_SetObject(
1283 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001284 break;
1285 }
1286 }
1287 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 PUSH(x);
1290 break;
1291
1292 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001293 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 PyErr_Clear();
1297 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 break;
1301 }
1302 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001303 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 PUSH(x);
1305 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306
Guido van Rossum9bfef441993-03-29 10:43:31 +00001307 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001308 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001309 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001310 PyErr_SetObject(PyExc_NameError,
1311 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001312 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001313 break;
1314 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001315 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001316 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001317 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001318 break;
1319
1320 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001321 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001322 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001323 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001324
1325 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001326 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001327 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001328
1329 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 if (x != NULL) {
1332 for (; --oparg >= 0;) {
1333 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 }
1336 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001337 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 }
1339 break;
1340
1341 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001343 if (x != NULL) {
1344 for (; --oparg >= 0;) {
1345 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001346 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 if (err != 0)
1348 break;
1349 }
1350 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001351 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 }
1353 break;
1354
1355 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001356 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001358 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 break;
1360
1361 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001362 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 x = PyObject_GetAttr(v, w);
1365 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001367 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001368 break;
1369
1370 case COMPARE_OP:
1371 w = POP();
1372 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001373 if (PyInt_Check(v) && PyInt_Check(w)) {
1374 /* INLINE: cmp(int, int) */
1375 register long a, b;
1376 register int res;
1377 a = ((PyIntObject*) v)->ob_ival;
1378 b = ((PyIntObject*) w)->ob_ival;
1379 switch (oparg) {
1380 case LT: res = a < b; break;
1381 case LE: res = a <= b; break;
1382 case EQ: res = a == b; break;
1383 case NE: res = a != b; break;
1384 case GT: res = a > b; break;
1385 case GE: res = a >= b; break;
1386 case IS: res = v == w; break;
1387 case IS_NOT: res = v != w; break;
1388 default: goto slow_compare;
1389 }
1390 x = res ? Py_True : Py_False;
1391 Py_INCREF(x);
1392 }
1393 else {
1394 slow_compare:
1395 x = cmp_outcome(oparg, v, w);
1396 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001397 Py_DECREF(v);
1398 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001400 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001401 break;
1402
1403 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001405 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001407 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001408 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001409 break;
1410 }
Guido van Rossumaee0bad1997-09-05 07:33:22 +00001411 u = find_from_args(f, INSTR_OFFSET());
1412 if (u == NULL) {
1413 x = u;
1414 break;
Guido van Rossum24c13741995-02-14 09:42:43 +00001415 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001417 w,
1418 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001419 f->f_locals == NULL ?
1420 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423 if (w == NULL) {
1424 x = NULL;
1425 break;
1426 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001427 x = PyEval_CallObject(x, w);
1428 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001429 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001430 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 break;
1432
1433 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001434 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001438 PyErr_SetString(PyExc_SystemError,
1439 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 break;
1441 }
1442 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001443 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001444 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001446
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 case JUMP_FORWARD:
1448 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001449 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001450
1451 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001452 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001453 if (err > 0)
1454 err = 0;
1455 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001457 else
1458 break;
1459 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001460
1461 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001462 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001463 if (err > 0) {
1464 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001465 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001466 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001467 else if (err == 0)
1468 ;
1469 else
1470 break;
1471 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001472
1473 case JUMP_ABSOLUTE:
1474 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001475 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001476
1477 case FOR_LOOP:
1478 /* for v in s: ...
1479 On entry: stack contains s, i.
1480 On exit: stack contains s, i+1, s[i];
1481 but if loop exhausted:
1482 s, i are popped, and we jump */
1483 w = POP(); /* Loop index */
1484 v = POP(); /* Sequence object */
1485 u = loop_subscript(v, w);
1486 if (u != NULL) {
1487 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001492 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 }
1494 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 Py_DECREF(v);
1496 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 /* A NULL can mean "s exhausted"
1498 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001501 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001503 continue;
1504 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 }
1506 break;
1507
1508 case SETUP_LOOP:
1509 case SETUP_EXCEPT:
1510 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001512 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001513 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001514
1515 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001516#ifdef LLTRACE
1517 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001518 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001519#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001520 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001521 if (f->f_trace == NULL)
1522 continue;
1523 /* Trace each line of code reached */
1524 f->f_lasti = INSTR_OFFSET();
1525 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001528
1529 case CALL_FUNCTION:
1530 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001531 int na = oparg & 0xff;
1532 int nk = (oparg>>8) & 0xff;
1533 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001534 PyObject **pfunc = stack_pointer - n - 1;
1535 PyObject *func = *pfunc;
1536 PyObject *self = NULL;
1537 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001538 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 if (PyMethod_Check(func)) {
1540 self = PyMethod_Self(func);
1541 class = PyMethod_Class(func);
1542 func = PyMethod_Function(func);
1543 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001544 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001545 Py_INCREF(self);
1546 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001547 *pfunc = self;
1548 na++;
1549 n++;
1550 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001551 else {
1552 /* Unbound methods must be
1553 called with an instance of
1554 the class (or a derived
1555 class) as first argument */
1556 if (na > 0 &&
1557 (self = stack_pointer[-n])
1558 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001559 PyInstance_Check(self) &&
1560 PyClass_IsSubclass(
1561 (PyObject *)
1562 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001563 ->in_class),
1564 class))
1565 /* Handy-dandy */ ;
1566 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001567 PyErr_SetString(
1568 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001569 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001570 x = NULL;
1571 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001572 }
1573 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001574 }
1575 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 Py_INCREF(func);
1577 if (PyFunction_Check(func)) {
1578 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001579 PyObject *globals =
1580 PyFunction_GetGlobals(func);
1581 PyObject *argdefs =
1582 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001583 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001584 int nd;
1585 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001587 nd = ((PyTupleObject *)argdefs) ->
1588 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001589 }
1590 else {
1591 d = NULL;
1592 nd = 0;
1593 }
1594 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 (PyCodeObject *)co,
1596 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001597 stack_pointer-n, na,
1598 stack_pointer-2*nk, nk,
1599 d, nd,
1600 class);
1601 }
1602 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 PyObject *args = PyTuple_New(na);
1604 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001605 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001607 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001609 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001610 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001611 if (kwdict == NULL) {
1612 x = NULL;
1613 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001614 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001615 err = 0;
1616 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 PyObject *value = POP();
1618 PyObject *key = POP();
1619 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001620 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001621 Py_DECREF(key);
1622 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001623 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001625 }
1626 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001627 Py_DECREF(args);
1628 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001629 break;
1630 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001631 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001632 while (--na >= 0) {
1633 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001635 }
1636 x = PyEval_CallObjectWithKeywords(
1637 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 Py_DECREF(args);
1639 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001640 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001642 while (stack_pointer > pfunc) {
1643 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001645 }
1646 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001647 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001648 break;
1649 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001650
Guido van Rossum681d79a1995-07-18 14:51:37 +00001651 case MAKE_FUNCTION:
1652 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 x = PyFunction_New(v, f->f_globals);
1654 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 /* XXX Maybe this should be a separate opcode? */
1656 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001660 x = NULL;
1661 break;
1662 }
1663 while (--oparg >= 0) {
1664 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001665 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 }
1667 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001669 }
1670 PUSH(x);
1671 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001672
1673 case BUILD_SLICE:
1674 if (oparg == 3)
1675 w = POP();
1676 else
1677 w = NULL;
1678 v = POP();
1679 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001680 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 Py_DECREF(u);
1682 Py_DECREF(v);
1683 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001684 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001685 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001686 break;
1687
1688
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 default:
1690 fprintf(stderr,
1691 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001692 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001693 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 why = WHY_EXCEPTION;
1695 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001696
1697#ifdef CASE_TOO_BIG
1698 }
1699#endif
1700
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 } /* switch */
1702
1703 on_error:
1704
1705 /* Quickly continue if no error occurred */
1706
1707 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001708 if (err == 0 && x != NULL) {
1709#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001710 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001711 fprintf(stderr,
1712 "XXX undetected error\n");
1713 else
1714#endif
1715 continue; /* Normal, fast path */
1716 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001718 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 err = 0;
1720 }
1721
Guido van Rossum801dcae1992-04-08 11:32:32 +00001722#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 /* Double-check exception status */
1724
1725 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001726 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001728 PyErr_SetString(PyExc_SystemError,
1729 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 why = WHY_EXCEPTION;
1731 }
1732 }
1733 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001734 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001735 fprintf(stderr,
1736 "XXX undetected error (why=%d)\n",
1737 why);
1738 why = WHY_EXCEPTION;
1739 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 }
1741#endif
1742
1743 /* Log traceback info if this is a real exception */
1744
1745 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001746 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001748 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001750
Guido van Rossume59214e1994-08-30 08:01:59 +00001751 if (f->f_trace)
1752 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001753 if (tstate->sys_profilefunc)
1754 call_exc_trace(&tstate->sys_profilefunc,
1755 (PyObject**)0, f);
1756}
Guido van Rossum374a9221991-04-04 10:40:29 +00001757
1758 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1759
1760 if (why == WHY_RERAISE)
1761 why = WHY_EXCEPTION;
1762
1763 /* Unwind stacks if a (pseudo) exception occurred */
1764
1765 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 while (STACK_LEVEL() > b->b_level) {
1768 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001770 }
1771 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1772 why = WHY_NOT;
1773 JUMPTO(b->b_handler);
1774 break;
1775 }
1776 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001777 (b->b_type == SETUP_EXCEPT &&
1778 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001780 PyObject *exc, *val, *tb;
1781 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 val = Py_None;
1784 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 /* Make the raw exception data
1787 available to the handler,
1788 so a program can emulate the
1789 Python main loop. Don't do
1790 this for 'finally'. */
1791 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00001792 PyErr_NormalizeException(
1793 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001794 set_exc_info(tstate,
1795 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001796 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 PUSH(val);
1799 PUSH(exc);
1800 }
1801 else {
1802 if (why == WHY_RETURN)
1803 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001804 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 PUSH(v);
1806 }
1807 why = WHY_NOT;
1808 JUMPTO(b->b_handler);
1809 break;
1810 }
1811 } /* unwind stack */
1812
1813 /* End the loop if we still have an error (or return) */
1814
1815 if (why != WHY_NOT)
1816 break;
1817
1818 } /* main loop */
1819
1820 /* Pop remaining stack entries */
1821
1822 while (!EMPTY()) {
1823 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 }
1826
Guido van Rossum96a42c81992-01-12 02:29:51 +00001827 if (why != WHY_RETURN)
1828 retval = NULL;
1829
Guido van Rossume59214e1994-08-30 08:01:59 +00001830 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001831 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001832 if (call_trace(&f->f_trace, &f->f_trace, f,
1833 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001834 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001835 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001836 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001837 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001838 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001839 }
1840
Guido van Rossuma027efa1997-05-05 20:56:21 +00001841 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1842 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001843 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001845 retval = NULL;
1846 why = WHY_EXCEPTION;
1847 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001848 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001849
Guido van Rossuma027efa1997-05-05 20:56:21 +00001850 reset_exc_info(tstate);
1851
1852 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001853
1854 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001855
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001857
Guido van Rossuma027efa1997-05-05 20:56:21 +00001858 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001860
Guido van Rossum96a42c81992-01-12 02:29:51 +00001861 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001862}
1863
Guido van Rossuma027efa1997-05-05 20:56:21 +00001864static void
1865set_exc_info(tstate, type, value, tb)
1866 PyThreadState *tstate;
1867 PyObject *type;
1868 PyObject *value;
1869 PyObject *tb;
1870{
1871 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001872 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001873
Guido van Rossuma027efa1997-05-05 20:56:21 +00001874 frame = tstate->frame;
1875 if (frame->f_exc_type == NULL) {
1876 /* This frame didn't catch an exception before */
1877 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001878 if (tstate->exc_type == NULL) {
1879 Py_INCREF(Py_None);
1880 tstate->exc_type = Py_None;
1881 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001882 tmp_type = frame->f_exc_type;
1883 tmp_value = frame->f_exc_value;
1884 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001885 Py_XINCREF(tstate->exc_type);
1886 Py_XINCREF(tstate->exc_value);
1887 Py_XINCREF(tstate->exc_traceback);
1888 frame->f_exc_type = tstate->exc_type;
1889 frame->f_exc_value = tstate->exc_value;
1890 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001891 Py_XDECREF(tmp_type);
1892 Py_XDECREF(tmp_value);
1893 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001894 }
1895 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001896 tmp_type = tstate->exc_type;
1897 tmp_value = tstate->exc_value;
1898 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001899 Py_XINCREF(type);
1900 Py_XINCREF(value);
1901 Py_XINCREF(tb);
1902 tstate->exc_type = type;
1903 tstate->exc_value = value;
1904 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001905 Py_XDECREF(tmp_type);
1906 Py_XDECREF(tmp_value);
1907 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001908 /* For b/w compatibility */
1909 PySys_SetObject("exc_type", type);
1910 PySys_SetObject("exc_value", value);
1911 PySys_SetObject("exc_traceback", tb);
1912}
1913
1914static void
1915reset_exc_info(tstate)
1916 PyThreadState *tstate;
1917{
1918 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001919 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001920 frame = tstate->frame;
1921 if (frame->f_exc_type != NULL) {
1922 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001923 tmp_type = tstate->exc_type;
1924 tmp_value = tstate->exc_value;
1925 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001926 Py_XINCREF(frame->f_exc_type);
1927 Py_XINCREF(frame->f_exc_value);
1928 Py_XINCREF(frame->f_exc_traceback);
1929 tstate->exc_type = frame->f_exc_type;
1930 tstate->exc_value = frame->f_exc_value;
1931 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001932 Py_XDECREF(tmp_type);
1933 Py_XDECREF(tmp_value);
1934 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001935 /* For b/w compatibility */
1936 PySys_SetObject("exc_type", frame->f_exc_type);
1937 PySys_SetObject("exc_value", frame->f_exc_value);
1938 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1939 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001940 tmp_type = frame->f_exc_type;
1941 tmp_value = frame->f_exc_value;
1942 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001943 frame->f_exc_type = NULL;
1944 frame->f_exc_value = NULL;
1945 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001946 Py_XDECREF(tmp_type);
1947 Py_XDECREF(tmp_value);
1948 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001949}
1950
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001951/* Logic for the raise statement (too complicated for inlining).
1952 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001953static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001954do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001955 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001956{
1957 /* We support the following forms of raise:
1958 raise <class>, <classinstance>
1959 raise <class>, <argument tuple>
1960 raise <class>, None
1961 raise <class>, <argument>
1962 raise <classinstance>, None
1963 raise <string>, <object>
1964 raise <string>, None
1965
1966 An omitted second argument is the same as None.
1967
1968 In addition, raise <tuple>, <anything> is the same as
1969 raising the tuple's first item (and it better have one!);
1970 this rule is applied recursively.
1971
1972 Finally, an optional third argument can be supplied, which
1973 gives the traceback to be substituted (useful when
1974 re-raising an exception after examining it). */
1975
1976 /* First, check the traceback argument, replacing None with
1977 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001978 if (tb == Py_None) {
1979 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001980 tb = NULL;
1981 }
1982 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001983 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001984 "raise 3rd arg must be traceback or None");
1985 goto raise_error;
1986 }
1987
1988 /* Next, replace a missing value with None */
1989 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001990 value = Py_None;
1991 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001992 }
1993
1994 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001995 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1996 PyObject *tmp = type;
1997 type = PyTuple_GET_ITEM(type, 0);
1998 Py_INCREF(type);
1999 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002000 }
2001
Barry Warsaw4249f541997-08-22 21:26:19 +00002002 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002003 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002004
2005 else if (PyClass_Check(type))
2006 PyErr_NormalizeException(&type, &value, &tb);
2007
Guido van Rossumb209a111997-04-29 18:18:01 +00002008 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002009 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002010 if (value != Py_None) {
2011 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002012 "instance exception may not have a separate value");
2013 goto raise_error;
2014 }
2015 else {
2016 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002017 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002018 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002019 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2020 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002021 }
2022 }
2023 else {
2024 /* Not something you can raise. You get an exception
2025 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002026 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002027 "exceptions must be strings, classes, or instances");
2028 goto raise_error;
2029 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002031 if (tb == NULL)
2032 return WHY_EXCEPTION;
2033 else
2034 return WHY_RERAISE;
2035 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002036 Py_XDECREF(value);
2037 Py_XDECREF(type);
2038 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002039 return WHY_EXCEPTION;
2040}
2041
Barry Warsawe42b18f1997-08-25 22:13:04 +00002042static int
2043unpack_sequence(v, argcnt, sp)
2044 PyObject *v;
2045 int argcnt;
2046 PyObject **sp;
2047{
2048 int i;
2049 PyObject *w;
2050
2051 for (i = 0; i < argcnt; i++) {
2052 if (! (w = PySequence_GetItem(v, i))) {
2053 if (PyErr_ExceptionMatches(PyExc_IndexError))
2054 PyErr_SetString(PyExc_ValueError,
2055 "unpack sequence of wrong size");
2056 goto finally;
2057 }
2058 *--sp = w;
2059 }
2060 /* we better get an IndexError now */
2061 if (PySequence_GetItem(v, i) == NULL) {
2062 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2063 PyErr_Clear();
2064 return 1;
2065 }
2066 /* some other exception occurred. fall through to finally */
2067 }
2068 else
2069 PyErr_SetString(PyExc_ValueError,
2070 "unpack sequence of wrong size");
2071 /* fall through */
2072finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002073 for (; i > 0; i--, sp++)
2074 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002075
2076 return 0;
2077}
2078
2079
Guido van Rossum96a42c81992-01-12 02:29:51 +00002080#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002081static int
2082prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 if (PyObject_Print(v, stdout, 0) != 0)
2088 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002089 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002091#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002093static void
2094call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002095 PyObject **p_trace, **p_newtrace;
2096 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002097{
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002099 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002101 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 value = Py_None;
2103 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002104 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002105 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002106 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002108 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002109 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002110 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002111 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002112 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002114 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 Py_XDECREF(type);
2116 Py_XDECREF(value);
2117 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002118 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002119}
2120
2121static int
2122call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002124 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002126 may point to NULL variable;
2127 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002129 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002131{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002132 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002133 PyObject *args, *what;
2134 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002135
Guido van Rossuma027efa1997-05-05 20:56:21 +00002136 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002137 /* Don't do recursive traces */
2138 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002140 *p_newtrace = NULL;
2141 }
2142 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002143 }
2144
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002146 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002147 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002149 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002150 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 Py_INCREF(f);
2152 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2153 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002154 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002155 arg = Py_None;
2156 Py_INCREF(arg);
2157 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002158 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 PyFrame_FastToLocals(f);
2160 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2161 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002162 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002163 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002165 if (res == NULL) {
2166 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 PyTraceBack_Here(f);
2168 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002169 *p_trace = NULL;
2170 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002172 *p_newtrace = NULL;
2173 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002174 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002175 }
2176 else {
2177 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002178 Py_XDECREF(*p_newtrace);
2179 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002180 *p_newtrace = NULL;
2181 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002182 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002183 *p_newtrace = res;
2184 }
2185 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002187 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002188 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002189}
2190
Guido van Rossumb209a111997-04-29 18:18:01 +00002191PyObject *
2192PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002193{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002194 PyThreadState *tstate = PyThreadState_Get();
2195 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002196 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002197 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002198 else
2199 return current_frame->f_builtins;
2200}
2201
Guido van Rossumb209a111997-04-29 18:18:01 +00002202PyObject *
2203PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002204{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002205 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002206 if (current_frame == NULL)
2207 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002208 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002209 return current_frame->f_locals;
2210}
2211
Guido van Rossumb209a111997-04-29 18:18:01 +00002212PyObject *
2213PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002214{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002215 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002216 if (current_frame == NULL)
2217 return NULL;
2218 else
2219 return current_frame->f_globals;
2220}
2221
Guido van Rossumb209a111997-04-29 18:18:01 +00002222PyObject *
2223PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002224{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002225 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002227}
2228
Guido van Rossum6135a871995-01-09 17:53:26 +00002229int
Guido van Rossumb209a111997-04-29 18:18:01 +00002230PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002231{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002233 return current_frame == NULL ? 0 : current_frame->f_restricted;
2234}
2235
Guido van Rossumbe270261997-05-22 22:26:18 +00002236int
Guido van Rossumb209a111997-04-29 18:18:01 +00002237Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238{
Guido van Rossumb209a111997-04-29 18:18:01 +00002239 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002240 if (f == NULL)
2241 return 0;
2242 if (!PyFile_SoftSpace(f, 0))
2243 return 0;
2244 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002245}
2246
Guido van Rossum3f5da241990-12-20 15:06:42 +00002247
Guido van Rossum681d79a1995-07-18 14:51:37 +00002248/* External interface to call any callable object.
2249 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002250
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002251#undef PyEval_CallObject
2252/* for backward compatibility: export this interface */
2253
Guido van Rossumb209a111997-04-29 18:18:01 +00002254PyObject *
2255PyEval_CallObject(func, arg)
2256 PyObject *func;
2257 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002258{
Guido van Rossumb209a111997-04-29 18:18:01 +00002259 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002260}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002261#define PyEval_CallObject(func,arg) \
2262 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002263
Guido van Rossumb209a111997-04-29 18:18:01 +00002264PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002265PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002266 PyObject *func;
2267 PyObject *arg;
2268 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002269{
2270 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002272
2273 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002274 arg = PyTuple_New(0);
2275 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002276 PyErr_SetString(PyExc_TypeError,
2277 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002278 return NULL;
2279 }
2280 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002281 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002282
Guido van Rossumb209a111997-04-29 18:18:01 +00002283 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002284 PyErr_SetString(PyExc_TypeError,
2285 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002286 return NULL;
2287 }
2288
Guido van Rossum150b2df1996-12-05 23:17:11 +00002289 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002290 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002292 result = call_function(func, arg, kw);
2293 else
2294 result = call_builtin(func, arg, kw);
2295
Guido van Rossumb209a111997-04-29 18:18:01 +00002296 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002297
Guido van Rossumb209a111997-04-29 18:18:01 +00002298 if (result == NULL && !PyErr_Occurred())
2299 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002300 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002301
2302 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002303}
2304
Guido van Rossumb209a111997-04-29 18:18:01 +00002305static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002306call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002307 PyObject *func;
2308 PyObject *arg;
2309 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310{
Guido van Rossumb209a111997-04-29 18:18:01 +00002311 if (PyCFunction_Check(func)) {
2312 PyCFunction meth = PyCFunction_GetFunction(func);
2313 PyObject *self = PyCFunction_GetSelf(func);
2314 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002315 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002317 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002318 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002319 else if (size == 0)
2320 arg = NULL;
2321 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002322 if (flags & METH_KEYWORDS)
2323 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (kw != NULL && PyDict_Size(kw) != 0) {
2325 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002326 "this function takes no keyword arguments");
2327 return NULL;
2328 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002329 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002330 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 if (PyClass_Check(func)) {
2332 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 if (PyInstance_Check(func)) {
2335 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002336 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 PyErr_Clear();
2338 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002339 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002340 return NULL;
2341 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002342 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002343 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002344 return res;
2345 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 return NULL;
2348}
2349
Guido van Rossumb209a111997-04-29 18:18:01 +00002350static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 PyObject *func;
2353 PyObject *arg;
2354 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355{
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 PyObject *class = NULL; /* == owner */
2357 PyObject *argdefs;
2358 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002359 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002360 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002361
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 if (kw != NULL && !PyDict_Check(kw)) {
2363 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002364 return NULL;
2365 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366
Guido van Rossumb209a111997-04-29 18:18:01 +00002367 if (PyMethod_Check(func)) {
2368 PyObject *self = PyMethod_Self(func);
2369 class = PyMethod_Class(func);
2370 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002371 if (self == NULL) {
2372 /* Unbound methods must be called with an instance of
2373 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 if (PyTuple_Size(arg) >= 1) {
2375 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002376 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002377 PyInstance_Check(self) &&
2378 PyClass_IsSubclass((PyObject *)
2379 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002380 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002381 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002382 else
2383 self = NULL;
2384 }
2385 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002386 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002387 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002388 return NULL;
2389 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002390 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002391 }
2392 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 int argcount = PyTuple_Size(arg);
2394 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002396 if (newarg == NULL)
2397 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 Py_INCREF(self);
2399 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002400 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002401 PyObject *v = PyTuple_GET_ITEM(arg, i);
2402 Py_XINCREF(v);
2403 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002404 }
2405 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 }
2407 }
2408 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002409 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002410 PyErr_SetString(PyExc_TypeError,
2411 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 return NULL;
2413 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002416
2417 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2419 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2420 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002421 }
2422 else {
2423 d = NULL;
2424 nd = 0;
2425 }
2426
2427 if (kw != NULL) {
2428 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002429 nk = PyDict_Size(kw);
2430 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002431 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002432 PyErr_NoMemory();
2433 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002434 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002435 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002436 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002437 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002438 i += 2;
2439 nk = i/2;
2440 /* XXX This is broken if the caller deletes dict items! */
2441 }
2442 else {
2443 k = NULL;
2444 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002445 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446
Guido van Rossum681d79a1995-07-18 14:51:37 +00002447 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002448 (PyCodeObject *)PyFunction_GetCode(func),
2449 PyFunction_GetGlobals(func), (PyObject *)NULL,
2450 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002451 k, nk,
2452 d, nd,
2453 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454
Guido van Rossumb209a111997-04-29 18:18:01 +00002455 Py_DECREF(arg);
2456 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457
Guido van Rossum681d79a1995-07-18 14:51:37 +00002458 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002459}
2460
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002461#define SLICE_ERROR_MSG \
2462 "standard sequence type does not support step size other than one"
2463
Guido van Rossumb209a111997-04-29 18:18:01 +00002464static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002465loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467{
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002469 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 return NULL;
2473 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002474 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002475 v = (*sq->sq_item)(v, i);
2476 if (v)
2477 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002478 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002479 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002480 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481}
2482
2483static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002484slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 int *pi;
2487{
2488 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002489 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002491 PyErr_SetString(PyExc_TypeError,
2492 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002493 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002495 x = PyInt_AsLong(v);
2496 /* Truncate -- very long indices are truncated anyway */
2497 if (x > INT_MAX)
2498 x = INT_MAX;
2499 else if (x < -INT_MAX)
2500 x = 0;
2501 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002503 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504}
2505
Guido van Rossumb209a111997-04-29 18:18:01 +00002506static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002507apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002508 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002509{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002510 int ilow = 0, ihigh = INT_MAX;
2511 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002513 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002514 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002515 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002517
2518static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002519assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002522 int ilow = 0, ihigh = INT_MAX;
2523 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002524 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002525 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002526 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002527 if (x == NULL)
2528 return PySequence_DelSlice(u, ilow, ihigh);
2529 else
2530 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531}
2532
2533static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002534cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002536{
Guido van Rossume59214e1994-08-30 08:01:59 +00002537 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002538 PyObject *x;
2539 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002540 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002542 register char *s, *end;
2543 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002544 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2545 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002546 "string member test needs char left operand");
2547 return -1;
2548 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002549 c = PyString_AsString(v)[0];
2550 s = PyString_AsString(w);
2551 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552 while (s < end) {
2553 if (c == *s++)
2554 return 1;
2555 }
2556 return 0;
2557 }
2558 sq = w->ob_type->tp_as_sequence;
2559 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002560 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561 "'in' or 'not in' needs sequence right argument");
2562 return -1;
2563 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002564 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002565 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002566 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002567 if (PyErr_Occurred() == PyExc_IndexError) {
2568 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002569 break;
2570 }
2571 return -1;
2572 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002573 cmp = PyObject_Compare(v, x);
2574 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002575 if (cmp == 0)
2576 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002577 if (PyErr_Occurred())
2578 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002579 }
2580 return 0;
2581}
2582
Guido van Rossumb209a111997-04-29 18:18:01 +00002583static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002584cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002585 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002586 register PyObject *v;
2587 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588{
2589 register int cmp;
2590 register int res = 0;
2591 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002592 case IS:
2593 case IS_NOT:
2594 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002595 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002596 res = !res;
2597 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 case IN:
2599 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002600 res = cmp_member(v, w);
2601 if (res < 0)
2602 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002603 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002604 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002605 break;
2606 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002607 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 break;
2609 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002610 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002611 if (cmp && PyErr_Occurred())
2612 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613 switch (op) {
2614 case LT: res = cmp < 0; break;
2615 case LE: res = cmp <= 0; break;
2616 case EQ: res = cmp == 0; break;
2617 case NE: res = cmp != 0; break;
2618 case GT: res = cmp > 0; break;
2619 case GE: res = cmp >= 0; break;
2620 /* XXX no default? (res is initialized to 0 though) */
2621 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 v = res ? Py_True : Py_False;
2624 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 return v;
2626}
2627
Guido van Rossum3f5da241990-12-20 15:06:42 +00002628static int
2629import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 PyObject *locals;
2631 PyObject *v;
2632 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002633{
Guido van Rossumb209a111997-04-29 18:18:01 +00002634 PyObject *w, *x;
2635 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002636 PyErr_SetString(PyExc_TypeError,
2637 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002638 return -1;
2639 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 w = PyModule_GetDict(v);
2641 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002642 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002644 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 while (PyDict_Next(w, &pos, &name, &value)) {
2646 if (!PyString_Check(name) ||
2647 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002648 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 Py_INCREF(value);
2650 err = PyDict_SetItem(locals, name, value);
2651 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002652 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002653 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002654 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002655 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002656 }
2657 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002659 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002660 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002661 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 PyString_AsString(name));
2663 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 return -1;
2665 }
2666 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002668 }
2669}
2670
Guido van Rossumb209a111997-04-29 18:18:01 +00002671static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002672build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 PyObject *methods; /* dictionary */
2674 PyObject *bases; /* tuple containing classes */
2675 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002676{
Guido van Rossumcd649651997-08-22 16:56:16 +00002677 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002679 PyErr_SetString(PyExc_SystemError,
2680 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002681 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002682 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002683 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002684 PyErr_SetString(PyExc_SystemError,
2685 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002686 return NULL;
2687 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002688 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002689 PyErr_SetString(PyExc_SystemError,
2690 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002691 return NULL;
2692 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002693 n = PyTuple_Size(bases);
2694 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002695 PyObject *base = PyTuple_GET_ITEM(bases, i);
2696 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002697 /* Call the base's *type*, if it is callable.
2698 This code is a hook for Donald Beaudry's
2699 and Jim Fulton's type extensions. In
2700 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002701 since its types are not callable.
2702 Ditto: call the bases's *class*, if it has
2703 one. This makes the same thing possible
2704 without writing C code. A true meta-object
2705 protocol! */
2706 PyObject *basetype = (PyObject *)base->ob_type;
2707 PyObject *callable = NULL;
2708 if (PyCallable_Check(basetype))
2709 callable = basetype;
2710 else
2711 callable = PyObject_GetAttrString(
2712 base, "__class__");
2713 if (callable) {
2714 PyObject *args;
2715 PyObject *newclass = NULL;
2716 args = Py_BuildValue(
2717 "(OOO)", name, bases, methods);
2718 if (args != NULL) {
2719 newclass = PyEval_CallObject(
2720 callable, args);
2721 Py_DECREF(args);
2722 }
2723 if (callable != basetype)
2724 Py_DECREF(callable);
2725 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002726 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002727 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002728 "base is not a class object");
2729 return NULL;
2730 }
2731 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002732 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002733}
2734
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002735static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002736exec_statement(f, prog, globals, locals)
2737 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 PyObject *prog;
2739 PyObject *globals;
2740 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002741{
2742 char *s;
2743 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002745 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002746
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2748 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002749 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002750 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002751 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 locals = PyTuple_GetItem(prog, 2);
2753 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002754 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002755 if (globals == Py_None) {
2756 globals = PyEval_GetGlobals();
2757 if (locals == Py_None) {
2758 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 plain = 1;
2760 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002761 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002763 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 if (!PyString_Check(prog) &&
2765 !PyCode_Check(prog) &&
2766 !PyFile_Check(prog)) {
2767 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002768 "exec 1st arg must be string, code or file object");
2769 return -1;
2770 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2772 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002773 "exec 2nd/3rd args must be dict or None");
2774 return -1;
2775 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002777 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002778 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002779 if (PyEval_EvalCode((PyCodeObject *) prog,
2780 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002781 return -1;
2782 return 0;
2783 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 if (PyFile_Check(prog)) {
2785 FILE *fp = PyFile_AsFile(prog);
2786 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002787 if (PyRun_File(fp, name, Py_file_input,
2788 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002789 return -1;
2790 return 0;
2791 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002792 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002793 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002794 PyErr_SetString(PyExc_ValueError,
2795 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002796 return -1;
2797 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002798 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002799 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002800 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002802 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002803 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002804 return 0;
2805}
Guido van Rossum24c13741995-02-14 09:42:43 +00002806
Guido van Rossum1aa14831997-01-21 05:34:20 +00002807/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002808static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002809find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002810 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002811 int nexti;
2812{
2813 int opcode;
2814 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002816 unsigned char *next_instr;
2817
2818 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2819 opcode = (*next_instr++);
2820 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 Py_INCREF(Py_None);
2822 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002823 }
2824
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002826 if (list == NULL)
2827 return NULL;
2828
2829 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002830 oparg = (next_instr[1]<<8) + next_instr[0];
2831 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002832 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 if (PyList_Append(list, name) < 0) {
2834 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002835 break;
2836 }
2837 opcode = (*next_instr++);
2838 } while (opcode == IMPORT_FROM);
2839
2840 return list;
2841}
Guido van Rossum950361c1997-01-24 13:49:28 +00002842
2843
2844#ifdef DYNAMIC_EXECUTION_PROFILE
2845
2846PyObject *
2847getarray(a)
2848 long a[256];
2849{
2850 int i;
2851 PyObject *l = PyList_New(256);
2852 if (l == NULL) return NULL;
2853 for (i = 0; i < 256; i++) {
2854 PyObject *x = PyInt_FromLong(a[i]);
2855 if (x == NULL) {
2856 Py_DECREF(l);
2857 return NULL;
2858 }
2859 PyList_SetItem(l, i, x);
2860 }
2861 for (i = 0; i < 256; i++)
2862 a[i] = 0;
2863 return l;
2864}
2865
2866PyObject *
2867_Py_GetDXProfile(self, args)
2868 PyObject *self, *args;
2869{
2870#ifndef DXPAIRS
2871 return getarray(dxp);
2872#else
2873 int i;
2874 PyObject *l = PyList_New(257);
2875 if (l == NULL) return NULL;
2876 for (i = 0; i < 257; i++) {
2877 PyObject *x = getarray(dxpairs[i]);
2878 if (x == NULL) {
2879 Py_DECREF(l);
2880 return NULL;
2881 }
2882 PyList_SetItem(l, i, x);
2883 }
2884 return l;
2885#endif
2886}
2887
2888#endif