blob: 4c7a9585b5e3679a8ab73241d42446d43f8b5794 [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 *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000315
Guido van Rossum374a9221991-04-04 10:40:29 +0000316
Guido van Rossum681d79a1995-07-18 14:51:37 +0000317/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000318
Guido van Rossumb209a111997-04-29 18:18:01 +0000319PyObject *
320PyEval_EvalCode(co, globals, locals)
321 PyCodeObject *co;
322 PyObject *globals;
323 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000324{
325 return eval_code2(co,
326 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000327 (PyObject **)NULL, 0,
328 (PyObject **)NULL, 0,
329 (PyObject **)NULL, 0,
330 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000331}
332
333
334/* Interpreter main loop */
335
Guido van Rossum8861b741996-07-30 16:49:37 +0000336#ifndef MAX_RECURSION_DEPTH
337#define MAX_RECURSION_DEPTH 10000
338#endif
339
Guido van Rossumb209a111997-04-29 18:18:01 +0000340static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000341eval_code2(co, globals, locals,
342 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000343 PyCodeObject *co;
344 PyObject *globals;
345 PyObject *locals;
346 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000347 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000348 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000349 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000350 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000351 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000352 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000353{
Guido van Rossum950361c1997-01-24 13:49:28 +0000354#ifdef DXPAIRS
355 int lastopcode = 0;
356#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000357 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000358 register int opcode = 0; /* Current opcode */
359 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000360 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000361 register enum why_code why; /* Reason for block stack unwind */
362 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000363 register PyObject *x; /* Result object -- NULL if error */
364 register PyObject *v; /* Temporary objects popped off stack */
365 register PyObject *w;
366 register PyObject *u;
367 register PyObject *t;
368 register PyFrameObject *f; /* Current frame */
369 register PyObject **fastlocals = NULL;
370 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000371 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000372#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000373 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000374#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000375#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000377 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000378#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000379
380/* Code access macros */
381
382#define GETCONST(i) Getconst(f, i)
383#define GETNAME(i) Getname(f, i)
384#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000385#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000386#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
387#define NEXTOP() (*next_instr++)
388#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
389#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
390#define JUMPBY(x) (next_instr += (x))
391
392/* Stack manipulation macros */
393
394#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
395#define EMPTY() (STACK_LEVEL() == 0)
396#define TOP() (stack_pointer[-1])
397#define BASIC_PUSH(v) (*stack_pointer++ = (v))
398#define BASIC_POP() (*--stack_pointer)
399
Guido van Rossum96a42c81992-01-12 02:29:51 +0000400#ifdef LLTRACE
401#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
402#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000403#else
404#define PUSH(v) BASIC_PUSH(v)
405#define POP() BASIC_POP()
406#endif
407
Guido van Rossum681d79a1995-07-18 14:51:37 +0000408/* Local variable macros */
409
410#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000411#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412 GETLOCAL(i) = value; } while (0)
413
Guido van Rossuma027efa1997-05-05 20:56:21 +0000414/* Start of code */
415
Guido van Rossum8861b741996-07-30 16:49:37 +0000416#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000417 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000418 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000419 return NULL;
420 }
421#endif
422
Guido van Rossum681d79a1995-07-18 14:51:37 +0000423 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000424 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000425 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000426 }
427
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000428#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000429 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000430#endif
431
Guido van Rossumb209a111997-04-29 18:18:01 +0000432 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000433 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 co, /*code*/
435 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000436 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000437 if (f == NULL)
438 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000439
Guido van Rossuma027efa1997-05-05 20:56:21 +0000440 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000441 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442
443 if (co->co_argcount > 0 ||
444 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
445 int i;
446 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000449 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450 if (kwdict == NULL)
451 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000452 i = co->co_argcount;
453 if (co->co_flags & CO_VARARGS)
454 i++;
455 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000456 }
457 if (argcount > co->co_argcount) {
458 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000459 PyErr_SetString(PyExc_TypeError,
460 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000461 goto fail;
462 }
463 n = co->co_argcount;
464 }
465 for (i = 0; i < n; i++) {
466 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000467 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 SETLOCAL(i, x);
469 }
470 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000471 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000472 if (u == NULL)
473 goto fail;
474 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000475 for (i = n; i < argcount; i++) {
476 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 Py_INCREF(x);
478 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000479 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 }
481 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000482 PyObject *keyword = kws[2*i];
483 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 int j;
485 /* XXX slow -- speed up using dictionary? */
486 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000487 PyObject *nm = PyTuple_GET_ITEM(
488 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000489 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000490 break;
491 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000492 /* Check errors from Compare */
493 if (PyErr_Occurred())
494 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000495 if (j >= co->co_argcount) {
496 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000497 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000498 "unexpected keyword argument: %.400s",
499 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000500 goto fail;
501 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000502 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 }
504 else {
505 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000506 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000507 "keyword parameter redefined");
508 goto fail;
509 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000510 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 SETLOCAL(j, value);
512 }
513 }
514 if (argcount < co->co_argcount) {
515 int m = co->co_argcount - defcount;
516 for (i = argcount; i < m; i++) {
517 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000518 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000519 "not enough arguments");
520 goto fail;
521 }
522 }
523 if (n > m)
524 i = n - m;
525 else
526 i = 0;
527 for (; i < defcount; i++) {
528 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000529 PyObject *def = defs[i];
530 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 SETLOCAL(m+i, def);
532 }
533 }
534 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000535 }
536 else {
537 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000538 PyErr_SetString(PyExc_TypeError,
539 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000540 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000541 }
542 }
543
Guido van Rossuma027efa1997-05-05 20:56:21 +0000544 if (tstate->sys_tracefunc != NULL) {
545 /* tstate->sys_tracefunc, if defined, is a function that
546 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000547 Its return value, if not None, is a function that
548 will be called at the start of each executed line
549 of code. (Actually, the function must return
550 itself in order to continue tracing.)
551 The trace functions are called with three arguments:
552 a pointer to the current frame, a string indicating
553 why the function is called, and an argument which
554 depends on the situation. The global trace function
555 (sys.trace) is also called whenever an exception
556 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557 if (call_trace(&tstate->sys_tracefunc,
558 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000559 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000560 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000561 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000562 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000563 }
564
Guido van Rossuma027efa1997-05-05 20:56:21 +0000565 if (tstate->sys_profilefunc != NULL) {
566 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000567 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000568 if (call_trace(&tstate->sys_profilefunc,
569 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000570 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000571 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000572 }
573 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000574
Guido van Rossuma027efa1997-05-05 20:56:21 +0000575 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
576 --tstate->recursion_depth;
577 PyErr_SetString(PyExc_RuntimeError,
578 "Maximum recursion depth exceeded");
579 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000580 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000581 return NULL;
582 }
583
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000584 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000585 stack_pointer = f->f_valuestack;
586
Guido van Rossum374a9221991-04-04 10:40:29 +0000587 why = WHY_NOT;
588 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000589 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000590
591 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 /* Do periodic things. Doing this every time through
593 the loop would add too much overhead, so we do it
594 only every Nth instruction. We also do it if
595 ``things_to_do'' is set, i.e. when an asynchronous
596 event needs attention (e.g. a signal handler or
597 async I/O handler); see Py_AddPendingCall() and
598 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000599
Guido van Rossuma027efa1997-05-05 20:56:21 +0000600 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000601 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000602 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000603 if (Py_MakePendingCalls() < 0) {
604 why = WHY_EXCEPTION;
605 goto on_error;
606 }
607 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000608#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 /* If we have true signals, the signal handler
610 will call Py_AddPendingCall() so we don't
611 have to call sigcheck(). On the Mac and
612 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000613 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000614 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 goto on_error;
616 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000617#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000618
Guido van Rossume59214e1994-08-30 08:01:59 +0000619#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000620 if (interpreter_lock) {
621 /* Give another thread a chance */
622
Guido van Rossum25ce5661997-08-02 03:10:38 +0000623 if (PyThreadState_Swap(NULL) != tstate)
624 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625 release_lock(interpreter_lock);
626
627 /* Other threads may run now */
628
629 acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000630 if (PyThreadState_Swap(tstate) != NULL)
631 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000632 }
633#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635
Guido van Rossum374a9221991-04-04 10:40:29 +0000636 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000637
Guido van Rossum408027e1996-12-30 16:17:54 +0000638#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000639 f->f_lasti = INSTR_OFFSET();
640#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000641
642 opcode = NEXTOP();
643 if (HAS_ARG(opcode))
644 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000645#ifdef DYNAMIC_EXECUTION_PROFILE
646#ifdef DXPAIRS
647 dxpairs[lastopcode][opcode]++;
648 lastopcode = opcode;
649#endif
650 dxp[opcode]++;
651#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000652
Guido van Rossum96a42c81992-01-12 02:29:51 +0000653#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000654 /* Instruction tracing */
655
Guido van Rossum96a42c81992-01-12 02:29:51 +0000656 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 if (HAS_ARG(opcode)) {
658 printf("%d: %d, %d\n",
659 (int) (INSTR_OFFSET() - 3),
660 opcode, oparg);
661 }
662 else {
663 printf("%d: %d\n",
664 (int) (INSTR_OFFSET() - 1), opcode);
665 }
666 }
667#endif
668
669 /* Main switch on opcode */
670
671 switch (opcode) {
672
673 /* BEWARE!
674 It is essential that any operation that fails sets either
675 x to NULL, err to nonzero, or why to anything but WHY_NOT,
676 and that no operation that succeeds does this! */
677
678 /* case STOP_CODE: this is an error! */
679
680 case POP_TOP:
681 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000682 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000683 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000684
685 case ROT_TWO:
686 v = POP();
687 w = POP();
688 PUSH(v);
689 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691
692 case ROT_THREE:
693 v = POP();
694 w = POP();
695 x = POP();
696 PUSH(v);
697 PUSH(x);
698 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000699 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000700
701 case DUP_TOP:
702 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000703 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000705 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000706
707 case UNARY_POSITIVE:
708 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000709 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000710 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000711 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000712 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000713 break;
714
715 case UNARY_NEGATIVE:
716 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000717 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000718 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000720 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 break;
722
723 case UNARY_NOT:
724 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000725 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000726 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000727 if (err == 0) {
728 Py_INCREF(Py_True);
729 PUSH(Py_True);
730 continue;
731 }
732 else if (err > 0) {
733 Py_INCREF(Py_False);
734 PUSH(Py_False);
735 err = 0;
736 continue;
737 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 break;
739
740 case UNARY_CONVERT:
741 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000742 x = PyObject_Repr(v);
743 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000744 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000745 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000746 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000747
748 case UNARY_INVERT:
749 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000750 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000751 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000752 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000753 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000754 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000755
Guido van Rossum50564e81996-01-12 01:13:16 +0000756 case BINARY_POWER:
757 w = POP();
758 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000759 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_DECREF(v);
761 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000762 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000763 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000764 break;
765
Guido van Rossum374a9221991-04-04 10:40:29 +0000766 case BINARY_MULTIPLY:
767 w = POP();
768 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000769 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000770 Py_DECREF(v);
771 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 break;
775
776 case BINARY_DIVIDE:
777 w = POP();
778 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000779 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000780 Py_DECREF(v);
781 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000782 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000783 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000784 break;
785
786 case BINARY_MODULO:
787 w = POP();
788 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000789 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000790 Py_DECREF(v);
791 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000792 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000793 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 break;
795
796 case BINARY_ADD:
797 w = POP();
798 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000799 if (PyInt_Check(v) && PyInt_Check(w)) {
800 /* INLINE: int + int */
801 register long a, b, i;
802 a = ((PyIntObject*) v)->ob_ival;
803 b = ((PyIntObject*) w)->ob_ival;
804 i = a + b;
805 if ((i^a) < 0 && (i^b) < 0) {
806 PyErr_SetString(PyExc_OverflowError,
807 "integer addition");
808 x = NULL;
809 }
810 else
811 x = PyInt_FromLong(i);
812 }
813 else
814 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000815 Py_DECREF(v);
816 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000817 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000818 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000819 break;
820
821 case BINARY_SUBTRACT:
822 w = POP();
823 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000824 if (PyInt_Check(v) && PyInt_Check(w)) {
825 /* INLINE: int - int */
826 register long a, b, i;
827 a = ((PyIntObject*) v)->ob_ival;
828 b = ((PyIntObject*) w)->ob_ival;
829 i = a - b;
830 if ((i^a) < 0 && (i^~b) < 0) {
831 PyErr_SetString(PyExc_OverflowError,
832 "integer subtraction");
833 x = NULL;
834 }
835 else
836 x = PyInt_FromLong(i);
837 }
838 else
839 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000840 Py_DECREF(v);
841 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000844 break;
845
846 case BINARY_SUBSCR:
847 w = POP();
848 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000849 if (PyList_Check(v) && PyInt_Check(w)) {
850 /* INLINE: list[int] */
851 long i = PyInt_AsLong(w);
852 if (i < 0)
853 i += ((PyListObject*) v)->ob_size;
854 if (i < 0 ||
855 i >= ((PyListObject*) v)->ob_size) {
856 PyErr_SetString(PyExc_IndexError,
857 "list index out of range");
858 x = NULL;
859 }
860 else {
861 x = ((PyListObject*) v)->ob_item[i];
862 Py_INCREF(x);
863 }
864 }
865 else
866 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(v);
868 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000870 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 break;
872
Guido van Rossum7928cd71991-10-24 14:59:31 +0000873 case BINARY_LSHIFT:
874 w = POP();
875 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000876 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000877 Py_DECREF(v);
878 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 break;
882
883 case BINARY_RSHIFT:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000891 break;
892
893 case BINARY_AND:
894 w = POP();
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
898 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000899 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000900 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000901 break;
902
903 case BINARY_XOR:
904 w = POP();
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(v);
908 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000909 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000910 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000911 break;
912
913 case BINARY_OR:
914 w = POP();
915 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 Py_DECREF(v);
918 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000921 break;
922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 case SLICE+0:
924 case SLICE+1:
925 case SLICE+2:
926 case SLICE+3:
927 if ((opcode-SLICE) & 2)
928 w = POP();
929 else
930 w = NULL;
931 if ((opcode-SLICE) & 1)
932 v = POP();
933 else
934 v = NULL;
935 u = POP();
936 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000937 Py_DECREF(u);
938 Py_XDECREF(v);
939 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000940 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000941 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000942 break;
943
944 case STORE_SLICE+0:
945 case STORE_SLICE+1:
946 case STORE_SLICE+2:
947 case STORE_SLICE+3:
948 if ((opcode-STORE_SLICE) & 2)
949 w = POP();
950 else
951 w = NULL;
952 if ((opcode-STORE_SLICE) & 1)
953 v = POP();
954 else
955 v = NULL;
956 u = POP();
957 t = POP();
958 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000959 Py_DECREF(t);
960 Py_DECREF(u);
961 Py_XDECREF(v);
962 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000963 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 break;
965
966 case DELETE_SLICE+0:
967 case DELETE_SLICE+1:
968 case DELETE_SLICE+2:
969 case DELETE_SLICE+3:
970 if ((opcode-DELETE_SLICE) & 2)
971 w = POP();
972 else
973 w = NULL;
974 if ((opcode-DELETE_SLICE) & 1)
975 v = POP();
976 else
977 v = NULL;
978 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000979 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000980 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000981 Py_DECREF(u);
982 Py_XDECREF(v);
983 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000984 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000985 break;
986
987 case STORE_SUBSCR:
988 w = POP();
989 v = POP();
990 u = POP();
991 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000992 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000993 Py_DECREF(u);
994 Py_DECREF(v);
995 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000996 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000997 break;
998
999 case DELETE_SUBSCR:
1000 w = POP();
1001 v = POP();
1002 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001003 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001006 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001007 break;
1008
1009 case PRINT_EXPR:
1010 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001011 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +00001012 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +00001013 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001014 (err = PyDict_SetItemString(
Guido van Rossum9cc8a201997-07-19 19:55:50 +00001015 f->f_builtins, "_", v)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001016 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001017 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001018 x = PySys_GetObject("stdout");
1019 if (x == NULL)
1020 err = -1;
1021 }
1022 if (err == 0)
1023 err = PyFile_WriteObject(v, x, 0);
1024 if (err == 0) {
1025 PyFile_SoftSpace(x, 1);
1026 err = Py_FlushLine();
1027 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001028 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001029 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001030 break;
1031
1032 case PRINT_ITEM:
1033 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 w = PySys_GetObject("stdout");
1035 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001036 err = PyFile_WriteString(" ", w);
1037 if (err == 0)
1038 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001040 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001041 char *s = PyString_AsString(v);
1042 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001043 if (len > 0 &&
1044 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001045 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001046 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001047 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001048 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001049 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001050 break;
1051
1052 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001053 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001054 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001055 PyErr_SetString(PyExc_RuntimeError,
1056 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001057 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001058 err = PyFile_WriteString("\n", x);
1059 if (err == 0)
1060 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001061 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001062 break;
1063
1064 case BREAK_LOOP:
1065 why = WHY_BREAK;
1066 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001067
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068 case RAISE_VARARGS:
1069 u = v = w = NULL;
1070 switch (oparg) {
1071 case 3:
1072 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001073 /* Fallthrough */
1074 case 2:
1075 v = POP(); /* value */
1076 /* Fallthrough */
1077 case 1:
1078 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001079 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001080 break;
1081 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001082 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001083 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001084 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001085 break;
1086 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001087 break;
1088
1089 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001090 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001091 PyErr_SetString(PyExc_SystemError,
1092 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001093 break;
1094 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001095 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001096 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001097 break;
1098
1099 case RETURN_VALUE:
1100 retval = POP();
1101 why = WHY_RETURN;
1102 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001103
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001104 case EXEC_STMT:
1105 w = POP();
1106 v = POP();
1107 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001108 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001109 Py_DECREF(u);
1110 Py_DECREF(v);
1111 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001112 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001113
Guido van Rossum374a9221991-04-04 10:40:29 +00001114 case POP_BLOCK:
1115 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001116 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001117 while (STACK_LEVEL() > b->b_level) {
1118 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001119 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001120 }
1121 }
1122 break;
1123
1124 case END_FINALLY:
1125 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001126 if (PyInt_Check(v)) {
1127 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 if (why == WHY_RETURN)
1129 retval = POP();
1130 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001131 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001132 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001133 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001134 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001136 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001137 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001138 else if (v != Py_None) {
1139 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001140 "'finally' pops bad exception");
1141 why = WHY_EXCEPTION;
1142 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001143 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001144 break;
1145
1146 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001147 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001148 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001149 w = POP();
1150 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001151 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001152 Py_DECREF(u);
1153 Py_DECREF(v);
1154 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001155 break;
1156
1157 case STORE_NAME:
1158 w = GETNAMEV(oparg);
1159 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001160 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001161 PyErr_SetString(PyExc_SystemError,
1162 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001163 break;
1164 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001165 err = PyDict_SetItem(x, w, v);
1166 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 break;
1168
1169 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001170 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001171 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001172 PyErr_SetString(PyExc_SystemError,
1173 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001174 break;
1175 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001176 if ((err = PyDict_DelItem(x, w)) != 0)
1177 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001178 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001179
1180#ifdef CASE_TOO_BIG
1181 default: switch (opcode) {
1182#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001183
1184 case UNPACK_TUPLE:
1185 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001186 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001187 PyErr_SetString(PyExc_TypeError,
1188 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001189 why = WHY_EXCEPTION;
1190 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001191 else if (PyTuple_Size(v) != oparg) {
1192 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 "unpack tuple of wrong size");
1194 why = WHY_EXCEPTION;
1195 }
1196 else {
1197 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001198 w = PyTuple_GET_ITEM(v, oparg);
1199 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001200 PUSH(w);
1201 }
1202 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001203 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001204 break;
1205
1206 case UNPACK_LIST:
1207 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001208 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001209 PyErr_SetString(PyExc_TypeError,
1210 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 why = WHY_EXCEPTION;
1212 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001213 else if (PyList_Size(v) != oparg) {
1214 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 "unpack list of wrong size");
1216 why = WHY_EXCEPTION;
1217 }
1218 else {
1219 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001220 w = PyList_GetItem(v, oparg);
1221 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 PUSH(w);
1223 }
1224 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001225 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 break;
1227
1228 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001229 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 v = POP();
1231 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001232 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1233 Py_DECREF(v);
1234 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001235 break;
1236
1237 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001238 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001239 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001240 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1241 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001242 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001243 break;
1244
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001245 case STORE_GLOBAL:
1246 w = GETNAMEV(oparg);
1247 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 err = PyDict_SetItem(f->f_globals, w, v);
1249 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001250 break;
1251
1252 case DELETE_GLOBAL:
1253 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001254 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1255 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001256 break;
1257
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 case LOAD_CONST:
1259 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001261 PUSH(x);
1262 break;
1263
1264 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001265 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001266 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001267 PyErr_SetString(PyExc_SystemError,
1268 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001269 break;
1270 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001273 PyErr_Clear();
1274 x = PyDict_GetItem(f->f_globals, 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_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001278 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001279 PyErr_SetObject(
1280 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001281 break;
1282 }
1283 }
1284 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 PUSH(x);
1287 break;
1288
1289 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001290 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 PyErr_Clear();
1294 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001297 break;
1298 }
1299 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001300 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 PUSH(x);
1302 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001303
Guido van Rossum9bfef441993-03-29 10:43:31 +00001304 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001305 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001306 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001307 PyErr_SetObject(PyExc_NameError,
1308 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001309 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001310 break;
1311 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001312 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001313 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001314 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001315 break;
1316
1317 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001318 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001319 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001320 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001321
1322 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001323 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001324 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001325
1326 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001328 if (x != NULL) {
1329 for (; --oparg >= 0;) {
1330 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001331 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 }
1333 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001334 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 }
1336 break;
1337
1338 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001339 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 if (x != NULL) {
1341 for (; --oparg >= 0;) {
1342 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001343 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001344 if (err != 0)
1345 break;
1346 }
1347 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001348 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 }
1350 break;
1351
1352 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001353 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001354 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001355 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 break;
1357
1358 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001359 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001360 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001361 x = PyObject_GetAttr(v, w);
1362 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001363 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001364 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
1366
1367 case COMPARE_OP:
1368 w = POP();
1369 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001370 if (PyInt_Check(v) && PyInt_Check(w)) {
1371 /* INLINE: cmp(int, int) */
1372 register long a, b;
1373 register int res;
1374 a = ((PyIntObject*) v)->ob_ival;
1375 b = ((PyIntObject*) w)->ob_ival;
1376 switch (oparg) {
1377 case LT: res = a < b; break;
1378 case LE: res = a <= b; break;
1379 case EQ: res = a == b; break;
1380 case NE: res = a != b; break;
1381 case GT: res = a > b; break;
1382 case GE: res = a >= b; break;
1383 case IS: res = v == w; break;
1384 case IS_NOT: res = v != w; break;
1385 default: goto slow_compare;
1386 }
1387 x = res ? Py_True : Py_False;
1388 Py_INCREF(x);
1389 }
1390 else {
1391 slow_compare:
1392 x = cmp_outcome(oparg, v, w);
1393 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001394 Py_DECREF(v);
1395 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001397 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001398 break;
1399
1400 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001401 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001403 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001405 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406 break;
1407 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 if (PyCFunction_Check(x)) {
1409 u = Py_None;
1410 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001411 }
1412 else {
1413 u = find_from_args(f, INSTR_OFFSET());
1414 if (u == NULL) {
1415 x = u;
1416 break;
1417 }
1418 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001420 w,
1421 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001422 f->f_locals == NULL ?
1423 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001424 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001425 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001426 if (w == NULL) {
1427 x = NULL;
1428 break;
1429 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 x = PyEval_CallObject(x, w);
1431 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001432 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001433 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001434 break;
1435
1436 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001437 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001441 PyErr_SetString(PyExc_SystemError,
1442 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001443 break;
1444 }
1445 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001446 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001447 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001449
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 case JUMP_FORWARD:
1451 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001452 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001453
1454 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001455 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001456 if (err > 0)
1457 err = 0;
1458 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001460 else
1461 break;
1462 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001463
1464 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001465 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001466 if (err > 0) {
1467 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001469 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001470 else if (err == 0)
1471 ;
1472 else
1473 break;
1474 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001475
1476 case JUMP_ABSOLUTE:
1477 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001478 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001479
1480 case FOR_LOOP:
1481 /* for v in s: ...
1482 On entry: stack contains s, i.
1483 On exit: stack contains s, i+1, s[i];
1484 but if loop exhausted:
1485 s, i are popped, and we jump */
1486 w = POP(); /* Loop index */
1487 v = POP(); /* Sequence object */
1488 u = loop_subscript(v, w);
1489 if (u != NULL) {
1490 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001491 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001492 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001495 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 }
1497 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001498 Py_DECREF(v);
1499 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 /* A NULL can mean "s exhausted"
1501 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001504 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001506 continue;
1507 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 }
1509 break;
1510
1511 case SETUP_LOOP:
1512 case SETUP_EXCEPT:
1513 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001514 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001516 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001517
1518 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001519#ifdef LLTRACE
1520 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001521 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001522#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001523 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001524 if (f->f_trace == NULL)
1525 continue;
1526 /* Trace each line of code reached */
1527 f->f_lasti = INSTR_OFFSET();
1528 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001531
1532 case CALL_FUNCTION:
1533 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001534 int na = oparg & 0xff;
1535 int nk = (oparg>>8) & 0xff;
1536 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 PyObject **pfunc = stack_pointer - n - 1;
1538 PyObject *func = *pfunc;
1539 PyObject *self = NULL;
1540 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001542 if (PyMethod_Check(func)) {
1543 self = PyMethod_Self(func);
1544 class = PyMethod_Class(func);
1545 func = PyMethod_Function(func);
1546 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001547 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001548 Py_INCREF(self);
1549 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550 *pfunc = self;
1551 na++;
1552 n++;
1553 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001554 else {
1555 /* Unbound methods must be
1556 called with an instance of
1557 the class (or a derived
1558 class) as first argument */
1559 if (na > 0 &&
1560 (self = stack_pointer[-n])
1561 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 PyInstance_Check(self) &&
1563 PyClass_IsSubclass(
1564 (PyObject *)
1565 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001566 ->in_class),
1567 class))
1568 /* Handy-dandy */ ;
1569 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001570 PyErr_SetString(
1571 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001573 x = NULL;
1574 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001575 }
1576 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001577 }
1578 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 Py_INCREF(func);
1580 if (PyFunction_Check(func)) {
1581 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001582 PyObject *globals =
1583 PyFunction_GetGlobals(func);
1584 PyObject *argdefs =
1585 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001587 int nd;
1588 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001590 nd = ((PyTupleObject *)argdefs) ->
1591 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001592 }
1593 else {
1594 d = NULL;
1595 nd = 0;
1596 }
1597 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 (PyCodeObject *)co,
1599 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 stack_pointer-n, na,
1601 stack_pointer-2*nk, nk,
1602 d, nd,
1603 class);
1604 }
1605 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 PyObject *args = PyTuple_New(na);
1607 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001608 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001610 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001611 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001612 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001613 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001614 if (kwdict == NULL) {
1615 x = NULL;
1616 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001617 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001618 err = 0;
1619 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 PyObject *value = POP();
1621 PyObject *key = POP();
1622 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001623 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001624 Py_DECREF(key);
1625 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001626 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001627 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 }
1629 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001630 Py_DECREF(args);
1631 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001632 break;
1633 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001634 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001635 while (--na >= 0) {
1636 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001638 }
1639 x = PyEval_CallObjectWithKeywords(
1640 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001641 Py_DECREF(args);
1642 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001643 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001644 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001645 while (stack_pointer > pfunc) {
1646 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001648 }
1649 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001650 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001651 break;
1652 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001653
Guido van Rossum681d79a1995-07-18 14:51:37 +00001654 case MAKE_FUNCTION:
1655 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001656 x = PyFunction_New(v, f->f_globals);
1657 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001658 /* XXX Maybe this should be a separate opcode? */
1659 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001661 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 x = NULL;
1664 break;
1665 }
1666 while (--oparg >= 0) {
1667 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001668 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001669 }
1670 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001671 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001672 }
1673 PUSH(x);
1674 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001675
1676 case BUILD_SLICE:
1677 if (oparg == 3)
1678 w = POP();
1679 else
1680 w = NULL;
1681 v = POP();
1682 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001683 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 Py_DECREF(u);
1685 Py_DECREF(v);
1686 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001687 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001688 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001689 break;
1690
1691
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 default:
1693 fprintf(stderr,
1694 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001695 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001696 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001697 why = WHY_EXCEPTION;
1698 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001699
1700#ifdef CASE_TOO_BIG
1701 }
1702#endif
1703
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 } /* switch */
1705
1706 on_error:
1707
1708 /* Quickly continue if no error occurred */
1709
1710 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001711 if (err == 0 && x != NULL) {
1712#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001713 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001714 fprintf(stderr,
1715 "XXX undetected error\n");
1716 else
1717#endif
1718 continue; /* Normal, fast path */
1719 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001721 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001722 err = 0;
1723 }
1724
Guido van Rossum801dcae1992-04-08 11:32:32 +00001725#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 /* Double-check exception status */
1727
1728 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001729 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001730 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001731 PyErr_SetString(PyExc_SystemError,
1732 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 why = WHY_EXCEPTION;
1734 }
1735 }
1736 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001738 fprintf(stderr,
1739 "XXX undetected error (why=%d)\n",
1740 why);
1741 why = WHY_EXCEPTION;
1742 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 }
1744#endif
1745
1746 /* Log traceback info if this is a real exception */
1747
1748 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001749 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001751 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001753
Guido van Rossume59214e1994-08-30 08:01:59 +00001754 if (f->f_trace)
1755 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001756 if (tstate->sys_profilefunc)
1757 call_exc_trace(&tstate->sys_profilefunc,
1758 (PyObject**)0, f);
1759}
Guido van Rossum374a9221991-04-04 10:40:29 +00001760
1761 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1762
1763 if (why == WHY_RERAISE)
1764 why = WHY_EXCEPTION;
1765
1766 /* Unwind stacks if a (pseudo) exception occurred */
1767
1768 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001769 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001770 while (STACK_LEVEL() > b->b_level) {
1771 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001772 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 }
1774 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1775 why = WHY_NOT;
1776 JUMPTO(b->b_handler);
1777 break;
1778 }
1779 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001780 (b->b_type == SETUP_EXCEPT &&
1781 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 PyObject *exc, *val, *tb;
1784 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001786 val = Py_None;
1787 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 /* Make the raw exception data
1790 available to the handler,
1791 so a program can emulate the
1792 Python main loop. Don't do
1793 this for 'finally'. */
1794 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001795 set_exc_info(tstate,
1796 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001798 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 PUSH(val);
1800 PUSH(exc);
1801 }
1802 else {
1803 if (why == WHY_RETURN)
1804 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001805 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001806 PUSH(v);
1807 }
1808 why = WHY_NOT;
1809 JUMPTO(b->b_handler);
1810 break;
1811 }
1812 } /* unwind stack */
1813
1814 /* End the loop if we still have an error (or return) */
1815
1816 if (why != WHY_NOT)
1817 break;
1818
1819 } /* main loop */
1820
1821 /* Pop remaining stack entries */
1822
1823 while (!EMPTY()) {
1824 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001825 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001826 }
1827
Guido van Rossum96a42c81992-01-12 02:29:51 +00001828 if (why != WHY_RETURN)
1829 retval = NULL;
1830
Guido van Rossume59214e1994-08-30 08:01:59 +00001831 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001832 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001833 if (call_trace(&f->f_trace, &f->f_trace, f,
1834 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001835 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001836 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001837 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001838 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001839 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001840 }
1841
Guido van Rossuma027efa1997-05-05 20:56:21 +00001842 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1843 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001844 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001846 retval = NULL;
1847 why = WHY_EXCEPTION;
1848 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001849 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001850
Guido van Rossuma027efa1997-05-05 20:56:21 +00001851 reset_exc_info(tstate);
1852
1853 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001854
1855 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001856
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001858
Guido van Rossuma027efa1997-05-05 20:56:21 +00001859 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001860 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001861
Guido van Rossum96a42c81992-01-12 02:29:51 +00001862 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001863}
1864
Guido van Rossuma027efa1997-05-05 20:56:21 +00001865static void
1866set_exc_info(tstate, type, value, tb)
1867 PyThreadState *tstate;
1868 PyObject *type;
1869 PyObject *value;
1870 PyObject *tb;
1871{
1872 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001873 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00001874
1875 PyErr_NormalizeException(&type, &value, &tb);
1876
Guido van Rossuma027efa1997-05-05 20:56:21 +00001877 frame = tstate->frame;
1878 if (frame->f_exc_type == NULL) {
1879 /* This frame didn't catch an exception before */
1880 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001881 if (tstate->exc_type == NULL) {
1882 Py_INCREF(Py_None);
1883 tstate->exc_type = Py_None;
1884 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001885 tmp_type = frame->f_exc_type;
1886 tmp_value = frame->f_exc_value;
1887 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001888 Py_XINCREF(tstate->exc_type);
1889 Py_XINCREF(tstate->exc_value);
1890 Py_XINCREF(tstate->exc_traceback);
1891 frame->f_exc_type = tstate->exc_type;
1892 frame->f_exc_value = tstate->exc_value;
1893 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001894 Py_XDECREF(tmp_type);
1895 Py_XDECREF(tmp_value);
1896 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001897 }
1898 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001899 tmp_type = tstate->exc_type;
1900 tmp_value = tstate->exc_value;
1901 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001902 Py_XINCREF(type);
1903 Py_XINCREF(value);
1904 Py_XINCREF(tb);
1905 tstate->exc_type = type;
1906 tstate->exc_value = value;
1907 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001908 Py_XDECREF(tmp_type);
1909 Py_XDECREF(tmp_value);
1910 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001911 /* For b/w compatibility */
1912 PySys_SetObject("exc_type", type);
1913 PySys_SetObject("exc_value", value);
1914 PySys_SetObject("exc_traceback", tb);
1915}
1916
1917static void
1918reset_exc_info(tstate)
1919 PyThreadState *tstate;
1920{
1921 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001922 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001923 frame = tstate->frame;
1924 if (frame->f_exc_type != NULL) {
1925 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001926 tmp_type = tstate->exc_type;
1927 tmp_value = tstate->exc_value;
1928 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001929 Py_XINCREF(frame->f_exc_type);
1930 Py_XINCREF(frame->f_exc_value);
1931 Py_XINCREF(frame->f_exc_traceback);
1932 tstate->exc_type = frame->f_exc_type;
1933 tstate->exc_value = frame->f_exc_value;
1934 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001935 Py_XDECREF(tmp_type);
1936 Py_XDECREF(tmp_value);
1937 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001938 /* For b/w compatibility */
1939 PySys_SetObject("exc_type", frame->f_exc_type);
1940 PySys_SetObject("exc_value", frame->f_exc_value);
1941 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1942 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001943 tmp_type = frame->f_exc_type;
1944 tmp_value = frame->f_exc_value;
1945 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001946 frame->f_exc_type = NULL;
1947 frame->f_exc_value = NULL;
1948 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001949 Py_XDECREF(tmp_type);
1950 Py_XDECREF(tmp_value);
1951 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001952}
1953
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001954/* Logic for the raise statement (too complicated for inlining).
1955 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001956static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001957do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001958 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001959{
1960 /* We support the following forms of raise:
1961 raise <class>, <classinstance>
1962 raise <class>, <argument tuple>
1963 raise <class>, None
1964 raise <class>, <argument>
1965 raise <classinstance>, None
1966 raise <string>, <object>
1967 raise <string>, None
1968
1969 An omitted second argument is the same as None.
1970
1971 In addition, raise <tuple>, <anything> is the same as
1972 raising the tuple's first item (and it better have one!);
1973 this rule is applied recursively.
1974
1975 Finally, an optional third argument can be supplied, which
1976 gives the traceback to be substituted (useful when
1977 re-raising an exception after examining it). */
1978
1979 /* First, check the traceback argument, replacing None with
1980 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001981 if (tb == Py_None) {
1982 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001983 tb = NULL;
1984 }
1985 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001987 "raise 3rd arg must be traceback or None");
1988 goto raise_error;
1989 }
1990
1991 /* Next, replace a missing value with None */
1992 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001993 value = Py_None;
1994 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001995 }
1996
1997 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001998 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1999 PyObject *tmp = type;
2000 type = PyTuple_GET_ITEM(type, 0);
2001 Py_INCREF(type);
2002 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002003 }
2004
Barry Warsaw4249f541997-08-22 21:26:19 +00002005 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002006 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002007
2008 else if (PyClass_Check(type))
2009 PyErr_NormalizeException(&type, &value, &tb);
2010
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002012 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002013 if (value != Py_None) {
2014 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002015 "instance exception may not have a separate value");
2016 goto raise_error;
2017 }
2018 else {
2019 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002020 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002021 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2023 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002024 }
2025 }
2026 else {
2027 /* Not something you can raise. You get an exception
2028 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002029 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002030 "exceptions must be strings, classes, or instances");
2031 goto raise_error;
2032 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002033 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002034 if (tb == NULL)
2035 return WHY_EXCEPTION;
2036 else
2037 return WHY_RERAISE;
2038 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002039 Py_XDECREF(value);
2040 Py_XDECREF(type);
2041 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002042 return WHY_EXCEPTION;
2043}
2044
Guido van Rossum96a42c81992-01-12 02:29:51 +00002045#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002046static int
2047prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002048 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002049 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002051 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 if (PyObject_Print(v, stdout, 0) != 0)
2053 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002054 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002056#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002058static void
2059call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002060 PyObject **p_trace, **p_newtrace;
2061 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002062{
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002064 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002065 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002066 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002067 value = Py_None;
2068 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002069 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002070 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002071 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002073 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002074 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002075 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002076 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002077 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002079 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 Py_XDECREF(type);
2081 Py_XDECREF(value);
2082 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002083 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002084}
2085
2086static int
2087call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002088 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002089 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002091 may point to NULL variable;
2092 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002093 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002094 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002095 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002096{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002097 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 PyObject *args, *what;
2099 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002100
Guido van Rossuma027efa1997-05-05 20:56:21 +00002101 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002102 /* Don't do recursive traces */
2103 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002104 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002105 *p_newtrace = NULL;
2106 }
2107 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002108 }
2109
Guido van Rossumb209a111997-04-29 18:18:01 +00002110 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002111 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002112 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002114 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002115 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 Py_INCREF(f);
2117 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2118 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002119 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 arg = Py_None;
2121 Py_INCREF(arg);
2122 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002123 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 PyFrame_FastToLocals(f);
2125 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2126 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002127 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002128 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002129 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002130 if (res == NULL) {
2131 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 PyTraceBack_Here(f);
2133 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002134 *p_trace = NULL;
2135 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002136 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002137 *p_newtrace = NULL;
2138 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002139 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002140 }
2141 else {
2142 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 Py_XDECREF(*p_newtrace);
2144 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002145 *p_newtrace = NULL;
2146 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002148 *p_newtrace = res;
2149 }
2150 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002151 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002152 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002153 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002154}
2155
Guido van Rossumb209a111997-04-29 18:18:01 +00002156PyObject *
2157PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002158{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002159 PyThreadState *tstate = PyThreadState_Get();
2160 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002161 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002162 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002163 else
2164 return current_frame->f_builtins;
2165}
2166
Guido van Rossumb209a111997-04-29 18:18:01 +00002167PyObject *
2168PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002169{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002170 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002171 if (current_frame == NULL)
2172 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002174 return current_frame->f_locals;
2175}
2176
Guido van Rossumb209a111997-04-29 18:18:01 +00002177PyObject *
2178PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002179{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002180 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002181 if (current_frame == NULL)
2182 return NULL;
2183 else
2184 return current_frame->f_globals;
2185}
2186
Guido van Rossumb209a111997-04-29 18:18:01 +00002187PyObject *
2188PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002189{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002190 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002192}
2193
Guido van Rossum6135a871995-01-09 17:53:26 +00002194int
Guido van Rossumb209a111997-04-29 18:18:01 +00002195PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002196{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002197 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002198 return current_frame == NULL ? 0 : current_frame->f_restricted;
2199}
2200
Guido van Rossumbe270261997-05-22 22:26:18 +00002201int
Guido van Rossumb209a111997-04-29 18:18:01 +00002202Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203{
Guido van Rossumb209a111997-04-29 18:18:01 +00002204 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002205 if (f == NULL)
2206 return 0;
2207 if (!PyFile_SoftSpace(f, 0))
2208 return 0;
2209 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210}
2211
Guido van Rossum3f5da241990-12-20 15:06:42 +00002212
Guido van Rossum681d79a1995-07-18 14:51:37 +00002213/* External interface to call any callable object.
2214 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002215
Guido van Rossumb209a111997-04-29 18:18:01 +00002216PyObject *
2217PyEval_CallObject(func, arg)
2218 PyObject *func;
2219 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002220{
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002222}
Guido van Rossume59214e1994-08-30 08:01:59 +00002223
Guido van Rossumb209a111997-04-29 18:18:01 +00002224PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002225PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 PyObject *func;
2227 PyObject *arg;
2228 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002229{
2230 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002231 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002232
2233 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002234 arg = PyTuple_New(0);
2235 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002236 PyErr_SetString(PyExc_TypeError,
2237 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002238 return NULL;
2239 }
2240 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002242
Guido van Rossumb209a111997-04-29 18:18:01 +00002243 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002244 PyErr_SetString(PyExc_TypeError,
2245 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002246 return NULL;
2247 }
2248
Guido van Rossum150b2df1996-12-05 23:17:11 +00002249 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002250 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002252 result = call_function(func, arg, kw);
2253 else
2254 result = call_builtin(func, arg, kw);
2255
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002257
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 if (result == NULL && !PyErr_Occurred())
2259 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002260 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002261
2262 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002263}
2264
Guido van Rossumb209a111997-04-29 18:18:01 +00002265static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002266call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002267 PyObject *func;
2268 PyObject *arg;
2269 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270{
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 if (PyCFunction_Check(func)) {
2272 PyCFunction meth = PyCFunction_GetFunction(func);
2273 PyObject *self = PyCFunction_GetSelf(func);
2274 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002275 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002276 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002277 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002278 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002279 else if (size == 0)
2280 arg = NULL;
2281 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002282 if (flags & METH_KEYWORDS)
2283 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002284 if (kw != NULL && PyDict_Size(kw) != 0) {
2285 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002286 "this function takes no keyword arguments");
2287 return NULL;
2288 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002289 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002291 if (PyClass_Check(func)) {
2292 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002294 if (PyInstance_Check(func)) {
2295 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002296 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002297 PyErr_Clear();
2298 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002299 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002300 return NULL;
2301 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002302 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002303 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002304 return res;
2305 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002306 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 return NULL;
2308}
2309
Guido van Rossumb209a111997-04-29 18:18:01 +00002310static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002311call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002312 PyObject *func;
2313 PyObject *arg;
2314 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315{
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 PyObject *class = NULL; /* == owner */
2317 PyObject *argdefs;
2318 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002321
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 if (kw != NULL && !PyDict_Check(kw)) {
2323 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002324 return NULL;
2325 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326
Guido van Rossumb209a111997-04-29 18:18:01 +00002327 if (PyMethod_Check(func)) {
2328 PyObject *self = PyMethod_Self(func);
2329 class = PyMethod_Class(func);
2330 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002331 if (self == NULL) {
2332 /* Unbound methods must be called with an instance of
2333 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002334 if (PyTuple_Size(arg) >= 1) {
2335 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002336 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002337 PyInstance_Check(self) &&
2338 PyClass_IsSubclass((PyObject *)
2339 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002340 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002342 else
2343 self = NULL;
2344 }
2345 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002347 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002348 return NULL;
2349 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002351 }
2352 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002353 int argcount = PyTuple_Size(arg);
2354 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002355 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002356 if (newarg == NULL)
2357 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002358 Py_INCREF(self);
2359 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002361 PyObject *v = PyTuple_GET_ITEM(arg, i);
2362 Py_XINCREF(v);
2363 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002364 }
2365 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 }
2367 }
2368 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002369 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002370 PyErr_SetString(PyExc_TypeError,
2371 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 return NULL;
2373 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002376
2377 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002378 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2379 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2380 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002381 }
2382 else {
2383 d = NULL;
2384 nd = 0;
2385 }
2386
2387 if (kw != NULL) {
2388 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 nk = PyDict_Size(kw);
2390 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002391 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002392 PyErr_NoMemory();
2393 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002394 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002395 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002396 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002398 i += 2;
2399 nk = i/2;
2400 /* XXX This is broken if the caller deletes dict items! */
2401 }
2402 else {
2403 k = NULL;
2404 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406
Guido van Rossum681d79a1995-07-18 14:51:37 +00002407 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 (PyCodeObject *)PyFunction_GetCode(func),
2409 PyFunction_GetGlobals(func), (PyObject *)NULL,
2410 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002411 k, nk,
2412 d, nd,
2413 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414
Guido van Rossumb209a111997-04-29 18:18:01 +00002415 Py_DECREF(arg);
2416 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417
Guido van Rossum681d79a1995-07-18 14:51:37 +00002418 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419}
2420
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002421#define SLICE_ERROR_MSG \
2422 "standard sequence type does not support step size other than one"
2423
Guido van Rossumb209a111997-04-29 18:18:01 +00002424static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002425loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002426 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427{
Guido van Rossumb209a111997-04-29 18:18:01 +00002428 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002429 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002431 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432 return NULL;
2433 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002435 v = (*sq->sq_item)(v, i);
2436 if (v)
2437 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00002438 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00002439 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002440 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441}
2442
2443static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002444slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 int *pi;
2447{
2448 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002449 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002451 PyErr_SetString(PyExc_TypeError,
2452 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002455 x = PyInt_AsLong(v);
2456 /* Truncate -- very long indices are truncated anyway */
2457 if (x > INT_MAX)
2458 x = INT_MAX;
2459 else if (x < -INT_MAX)
2460 x = 0;
2461 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002463 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464}
2465
Guido van Rossumb209a111997-04-29 18:18:01 +00002466static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002467apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002469{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002470 int ilow = 0, ihigh = INT_MAX;
2471 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002473 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002474 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002475 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002477
2478static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002479assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002482 int ilow = 0, ihigh = INT_MAX;
2483 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002484 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002485 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002487 if (x == NULL)
2488 return PySequence_DelSlice(u, ilow, ihigh);
2489 else
2490 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491}
2492
2493static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002494cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002495 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496{
Guido van Rossume59214e1994-08-30 08:01:59 +00002497 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 PyObject *x;
2499 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002500 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002502 register char *s, *end;
2503 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2505 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002506 "string member test needs char left operand");
2507 return -1;
2508 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002509 c = PyString_AsString(v)[0];
2510 s = PyString_AsString(w);
2511 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002512 while (s < end) {
2513 if (c == *s++)
2514 return 1;
2515 }
2516 return 0;
2517 }
2518 sq = w->ob_type->tp_as_sequence;
2519 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002521 "'in' or 'not in' needs sequence right argument");
2522 return -1;
2523 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002524 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002525 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002526 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002527 if (PyErr_Occurred() == PyExc_IndexError) {
2528 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002529 break;
2530 }
2531 return -1;
2532 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 cmp = PyObject_Compare(v, x);
2534 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002535 if (cmp == 0)
2536 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002537 if (PyErr_Occurred())
2538 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002539 }
2540 return 0;
2541}
2542
Guido van Rossumb209a111997-04-29 18:18:01 +00002543static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002545 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002546 register PyObject *v;
2547 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548{
2549 register int cmp;
2550 register int res = 0;
2551 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002552 case IS:
2553 case IS_NOT:
2554 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002555 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002556 res = !res;
2557 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 case IN:
2559 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002560 res = cmp_member(v, w);
2561 if (res < 0)
2562 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002563 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002564 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565 break;
2566 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00002567 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002568 break;
2569 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002571 if (cmp && PyErr_Occurred())
2572 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002573 switch (op) {
2574 case LT: res = cmp < 0; break;
2575 case LE: res = cmp <= 0; break;
2576 case EQ: res = cmp == 0; break;
2577 case NE: res = cmp != 0; break;
2578 case GT: res = cmp > 0; break;
2579 case GE: res = cmp >= 0; break;
2580 /* XXX no default? (res is initialized to 0 though) */
2581 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002583 v = res ? Py_True : Py_False;
2584 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585 return v;
2586}
2587
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588static int
2589import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002590 PyObject *locals;
2591 PyObject *v;
2592 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002593{
Guido van Rossumb209a111997-04-29 18:18:01 +00002594 PyObject *w, *x;
2595 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002596 PyErr_SetString(PyExc_TypeError,
2597 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002598 return -1;
2599 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 w = PyModule_GetDict(v);
2601 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002602 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002603 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002604 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002605 while (PyDict_Next(w, &pos, &name, &value)) {
2606 if (!PyString_Check(name) ||
2607 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002608 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002609 Py_INCREF(value);
2610 err = PyDict_SetItem(locals, name, value);
2611 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002612 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002614 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002615 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002616 }
2617 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002618 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002619 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002620 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002621 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002622 PyString_AsString(name));
2623 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002624 return -1;
2625 }
2626 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002628 }
2629}
2630
Guido van Rossumb209a111997-04-29 18:18:01 +00002631static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002632build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002633 PyObject *methods; /* dictionary */
2634 PyObject *bases; /* tuple containing classes */
2635 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002636{
Guido van Rossumcd649651997-08-22 16:56:16 +00002637 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002639 PyErr_SetString(PyExc_SystemError,
2640 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002641 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002642 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002644 PyErr_SetString(PyExc_SystemError,
2645 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002646 return NULL;
2647 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002648 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002649 PyErr_SetString(PyExc_SystemError,
2650 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002651 return NULL;
2652 }
Guido van Rossumcd649651997-08-22 16:56:16 +00002653 n = PyTuple_Size(bases);
2654 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002655 PyObject *base = PyTuple_GET_ITEM(bases, i);
2656 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002657 /* Call the base's *type*, if it is callable.
2658 This code is a hook for Donald Beaudry's
2659 and Jim Fulton's type extensions. In
2660 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002661 since its types are not callable.
2662 Ditto: call the bases's *class*, if it has
2663 one. This makes the same thing possible
2664 without writing C code. A true meta-object
2665 protocol! */
2666 PyObject *basetype = (PyObject *)base->ob_type;
2667 PyObject *callable = NULL;
2668 if (PyCallable_Check(basetype))
2669 callable = basetype;
2670 else
2671 callable = PyObject_GetAttrString(
2672 base, "__class__");
2673 if (callable) {
2674 PyObject *args;
2675 PyObject *newclass = NULL;
2676 args = Py_BuildValue(
2677 "(OOO)", name, bases, methods);
2678 if (args != NULL) {
2679 newclass = PyEval_CallObject(
2680 callable, args);
2681 Py_DECREF(args);
2682 }
2683 if (callable != basetype)
2684 Py_DECREF(callable);
2685 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002688 "base is not a class object");
2689 return NULL;
2690 }
2691 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002693}
2694
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002695static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002696exec_statement(f, prog, globals, locals)
2697 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 PyObject *prog;
2699 PyObject *globals;
2700 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002701{
2702 char *s;
2703 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002704 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002705 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002706
Guido van Rossumb209a111997-04-29 18:18:01 +00002707 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2708 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002709 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002710 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002711 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002712 locals = PyTuple_GetItem(prog, 2);
2713 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002714 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 if (globals == Py_None) {
2716 globals = PyEval_GetGlobals();
2717 if (locals == Py_None) {
2718 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002719 plain = 1;
2720 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002722 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002723 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 if (!PyString_Check(prog) &&
2725 !PyCode_Check(prog) &&
2726 !PyFile_Check(prog)) {
2727 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002728 "exec 1st arg must be string, code or file object");
2729 return -1;
2730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2732 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002733 "exec 2nd/3rd args must be dict or None");
2734 return -1;
2735 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002737 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002739 if (PyEval_EvalCode((PyCodeObject *) prog,
2740 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002741 return -1;
2742 return 0;
2743 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002744 if (PyFile_Check(prog)) {
2745 FILE *fp = PyFile_AsFile(prog);
2746 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002747 if (PyRun_File(fp, name, Py_file_input,
2748 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002749 return -1;
2750 return 0;
2751 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002752 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002753 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002754 PyErr_SetString(PyExc_ValueError,
2755 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002756 return -1;
2757 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002758 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002759 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002760 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002762 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002763 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002764 return 0;
2765}
Guido van Rossum24c13741995-02-14 09:42:43 +00002766
Guido van Rossum1aa14831997-01-21 05:34:20 +00002767/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002768static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002769find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002770 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002771 int nexti;
2772{
2773 int opcode;
2774 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002776 unsigned char *next_instr;
2777
2778 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2779 opcode = (*next_instr++);
2780 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 Py_INCREF(Py_None);
2782 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002783 }
2784
Guido van Rossumb209a111997-04-29 18:18:01 +00002785 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002786 if (list == NULL)
2787 return NULL;
2788
2789 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002790 oparg = (next_instr[1]<<8) + next_instr[0];
2791 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002792 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002793 if (PyList_Append(list, name) < 0) {
2794 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002795 break;
2796 }
2797 opcode = (*next_instr++);
2798 } while (opcode == IMPORT_FROM);
2799
2800 return list;
2801}
Guido van Rossum950361c1997-01-24 13:49:28 +00002802
2803
2804#ifdef DYNAMIC_EXECUTION_PROFILE
2805
2806PyObject *
2807getarray(a)
2808 long a[256];
2809{
2810 int i;
2811 PyObject *l = PyList_New(256);
2812 if (l == NULL) return NULL;
2813 for (i = 0; i < 256; i++) {
2814 PyObject *x = PyInt_FromLong(a[i]);
2815 if (x == NULL) {
2816 Py_DECREF(l);
2817 return NULL;
2818 }
2819 PyList_SetItem(l, i, x);
2820 }
2821 for (i = 0; i < 256; i++)
2822 a[i] = 0;
2823 return l;
2824}
2825
2826PyObject *
2827_Py_GetDXProfile(self, args)
2828 PyObject *self, *args;
2829{
2830#ifndef DXPAIRS
2831 return getarray(dxp);
2832#else
2833 int i;
2834 PyObject *l = PyList_New(257);
2835 if (l == NULL) return NULL;
2836 for (i = 0; i < 257; i++) {
2837 PyObject *x = getarray(dxpairs[i]);
2838 if (x == NULL) {
2839 Py_DECREF(l);
2840 return NULL;
2841 }
2842 PyList_SetItem(l, i, x);
2843 }
2844 return l;
2845#endif
2846}
2847
2848#endif