blob: 205d8d42e069e1631b325a1fc5c8d1d5e52d94a3 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000033
Guido van Rossum681d79a1995-07-18 14:51:37 +000034/* XXX TO DO:
35 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +000036 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +000037 XXX document it!
38 */
39
Guido van Rossumb209a111997-04-29 18:18:01 +000040#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000041
Guido van Rossum10dc2e81990-11-18 17:27:39 +000042#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000043#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000044#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000045#include "opcode.h"
46
Guido van Rossumc6004111993-11-05 10:22:19 +000047#include <ctype.h>
48
Guido van Rossuma027efa1997-05-05 20:56:21 +000049#ifdef HAVE_LIMITS_H
50#include <limits.h>
51#else
52#define INT_MAX 2147483647
53#endif
54
Guido van Rossum04691fc1992-08-12 15:35:34 +000055/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000057
Guido van Rossum408027e1996-12-30 16:17:54 +000058#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000059/* For debugging the interpreter: */
60#define LLTRACE 1 /* Low-level trace feature */
61#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000062#endif
63
Guido van Rossum5b722181993-03-30 17:46:03 +000064
Guido van Rossum374a9221991-04-04 10:40:29 +000065/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000066
Guido van Rossumb209a111997-04-29 18:18:01 +000067static PyObject *eval_code2 Py_PROTO((PyCodeObject *,
68 PyObject *, PyObject *,
69 PyObject **, int,
70 PyObject **, int,
71 PyObject **, int,
72 PyObject *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000073#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +000074static int prtrace Py_PROTO((PyObject *, char *));
Guido van Rossum0a066c01992-03-27 17:29:15 +000075#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +000076static void call_exc_trace Py_PROTO((PyObject **, PyObject**,
77 PyFrameObject *));
78static int call_trace Py_PROTO((PyObject **, PyObject **,
79 PyFrameObject *, char *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000080static PyObject *call_builtin Py_PROTO((PyObject *, PyObject *, PyObject *));
81static PyObject *call_function Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000082static PyObject *loop_subscript Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000083static int slice_index Py_PROTO((PyObject *, int *));
Guido van Rossumb209a111997-04-29 18:18:01 +000084static PyObject *apply_slice Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000085static int assign_slice Py_PROTO((PyObject *, PyObject *,
86 PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000087static int cmp_exception Py_PROTO((PyObject *, PyObject *));
88static int cmp_member Py_PROTO((PyObject *, PyObject *));
89static PyObject *cmp_outcome Py_PROTO((int, PyObject *, PyObject *));
90static int import_from Py_PROTO((PyObject *, PyObject *, PyObject *));
91static PyObject *build_class Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossuma027efa1997-05-05 20:56:21 +000092static int exec_statement Py_PROTO((PyFrameObject *,
93 PyObject *, PyObject *, PyObject *));
Guido van Rossumb209a111997-04-29 18:18:01 +000094static PyObject *find_from_args Py_PROTO((PyFrameObject *, int));
Guido van Rossuma027efa1997-05-05 20:56:21 +000095static void set_exc_info Py_PROTO((PyThreadState *,
96 PyObject *, PyObject *, PyObject *));
97static void reset_exc_info Py_PROTO((PyThreadState *));
Guido van Rossum374a9221991-04-04 10:40:29 +000098
99
Guido van Rossum950361c1997-01-24 13:49:28 +0000100/* Dynamic execution profile */
101#ifdef DYNAMIC_EXECUTION_PROFILE
102#ifdef DXPAIRS
103static long dxpairs[257][256];
104#define dxp dxpairs[256]
105#else
106static long dxp[256];
107#endif
108#endif
109
110
Guido van Rossume59214e1994-08-30 08:01:59 +0000111#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000112
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000113#include <errno.h>
114#include "thread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116extern int _PyThread_Started; /* Flag for Py_Exit */
117
Guido van Rossuma9672091994-09-14 13:31:22 +0000118static type_lock interpreter_lock = 0;
119static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120
121void
Guido van Rossumb209a111997-04-29 18:18:01 +0000122PyEval_InitThreads()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000125 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126 _PyThread_Started = 1;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000127 interpreter_lock = allocate_lock();
128 acquire_lock(interpreter_lock, 1);
Guido van Rossuma9672091994-09-14 13:31:22 +0000129 main_thread = get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000132void
133PyEval_AcquireThread(tstate)
134 PyThreadState *tstate;
135{
136 if (tstate == NULL)
137 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
138 acquire_lock(interpreter_lock, 1);
139 if (PyThreadState_Swap(tstate) != NULL)
140 Py_FatalError(
141 "PyEval_AcquireThread: non-NULL old thread state");
142}
143
144void
145PyEval_ReleaseThread(tstate)
146 PyThreadState *tstate;
147{
148 if (tstate == NULL)
149 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
150 if (PyThreadState_Swap(NULL) != tstate)
151 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
152 release_lock(interpreter_lock);
153}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000154#endif
155
Guido van Rossumff4949e1992-08-05 19:58:53 +0000156/* Functions save_thread and restore_thread are always defined so
157 dynamically loaded modules needn't be compiled separately for use
158 with and without threads: */
159
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000160PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000161PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000162{
Guido van Rossume59214e1994-08-30 08:01:59 +0000163#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164 if (interpreter_lock) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000165 PyThreadState *tstate = PyThreadState_Swap(NULL);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000166 if (tstate == NULL)
167 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000168 release_lock(interpreter_lock);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000169 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000172 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173}
174
175void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000176PyEval_RestoreThread(tstate)
177 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000178{
Guido van Rossume59214e1994-08-30 08:01:59 +0000179#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000180 if (interpreter_lock) {
181 int err;
182 err = errno;
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000183 if (tstate == NULL)
184 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185 acquire_lock(interpreter_lock, 1);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000186 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000188 }
189#endif
190}
191
192
Guido van Rossuma9672091994-09-14 13:31:22 +0000193/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
194 signal handlers or Mac I/O completion routines) can schedule calls
195 to a function to be called synchronously.
196 The synchronous function is called with one void* argument.
197 It should return 0 for success or -1 for failure -- failure should
198 be accompanied by an exception.
199
200 If registry succeeds, the registry function returns 0; if it fails
201 (e.g. due to too many pending calls) it returns -1 (without setting
202 an exception condition).
203
204 Note that because registry may occur from within signal handlers,
205 or other asynchronous events, calling malloc() is unsafe!
206
207#ifdef WITH_THREAD
208 Any thread can schedule pending calls, but only the main thread
209 will execute them.
210#endif
211
212 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
213 There are two possible race conditions:
214 (1) nested asynchronous registry calls;
215 (2) registry calls made while pending calls are being processed.
216 While (1) is very unlikely, (2) is a real possibility.
217 The current code is safe against (2), but not against (1).
218 The safety against (2) is derived from the fact that only one
219 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000220
Guido van Rossuma027efa1997-05-05 20:56:21 +0000221 XXX Darn! With the advent of thread state, we should have an array
222 of pending calls per thread in the thread state! Later...
223*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000224
Guido van Rossuma9672091994-09-14 13:31:22 +0000225#define NPENDINGCALLS 32
226static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000227 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000228 ANY *arg;
229} pendingcalls[NPENDINGCALLS];
230static volatile int pendingfirst = 0;
231static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000232static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000233
234int
235Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000236 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000237 ANY *arg;
238{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000239 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240 int i, j;
241 /* XXX Begin critical section */
242 /* XXX If you want this to be safe against nested
243 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000244 if (busy)
245 return -1;
246 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000247 i = pendinglast;
248 j = (i + 1) % NPENDINGCALLS;
249 if (j == pendingfirst)
250 return -1; /* Queue full */
251 pendingcalls[i].func = func;
252 pendingcalls[i].arg = arg;
253 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000254 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000255 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 /* XXX End critical section */
257 return 0;
258}
259
Guido van Rossum180d7b41994-09-29 09:45:57 +0000260int
261Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000262{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000263 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000264#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000265 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000266 return 0;
267#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000268 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000269 return 0;
270 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000271 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000272 for (;;) {
273 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000274 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000275 ANY *arg;
276 i = pendingfirst;
277 if (i == pendinglast)
278 break; /* Queue empty */
279 func = pendingcalls[i].func;
280 arg = pendingcalls[i].arg;
281 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000282 if (func(arg) < 0) {
283 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000284 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000285 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000286 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000287 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000288 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000289 return 0;
290}
291
292
Guido van Rossum374a9221991-04-04 10:40:29 +0000293/* Status code for main loop (reason for stack unwind) */
294
295enum why_code {
296 WHY_NOT, /* No error */
297 WHY_EXCEPTION, /* Exception occurred */
298 WHY_RERAISE, /* Exception re-raised by 'finally' */
299 WHY_RETURN, /* 'return' statement */
300 WHY_BREAK /* 'break' statement */
301};
302
Guido van Rossumb209a111997-04-29 18:18:01 +0000303static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000304
Guido van Rossum374a9221991-04-04 10:40:29 +0000305
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000307
Guido van Rossumb209a111997-04-29 18:18:01 +0000308PyObject *
309PyEval_EvalCode(co, globals, locals)
310 PyCodeObject *co;
311 PyObject *globals;
312 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000313{
314 return eval_code2(co,
315 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000316 (PyObject **)NULL, 0,
317 (PyObject **)NULL, 0,
318 (PyObject **)NULL, 0,
319 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000320}
321
322
323/* Interpreter main loop */
324
Guido van Rossum8861b741996-07-30 16:49:37 +0000325#ifndef MAX_RECURSION_DEPTH
326#define MAX_RECURSION_DEPTH 10000
327#endif
328
Guido van Rossumb209a111997-04-29 18:18:01 +0000329static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000330eval_code2(co, globals, locals,
331 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000332 PyCodeObject *co;
333 PyObject *globals;
334 PyObject *locals;
335 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000337 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000338 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000339 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000340 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000341 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000342{
Guido van Rossum950361c1997-01-24 13:49:28 +0000343#ifdef DXPAIRS
344 int lastopcode = 0;
345#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000346 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000347 register int opcode = 0; /* Current opcode */
348 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000350 register enum why_code why; /* Reason for block stack unwind */
351 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000352 register PyObject *x; /* Result object -- NULL if error */
353 register PyObject *v; /* Temporary objects popped off stack */
354 register PyObject *w;
355 register PyObject *u;
356 register PyObject *t;
357 register PyFrameObject *f; /* Current frame */
358 register PyObject **fastlocals = NULL;
359 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000360 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000361#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000362 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000363#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000364#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000366 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000367#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000368
369/* Code access macros */
370
371#define GETCONST(i) Getconst(f, i)
372#define GETNAME(i) Getname(f, i)
373#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000374#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000375#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
376#define NEXTOP() (*next_instr++)
377#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
378#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
379#define JUMPBY(x) (next_instr += (x))
380
381/* Stack manipulation macros */
382
383#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
384#define EMPTY() (STACK_LEVEL() == 0)
385#define TOP() (stack_pointer[-1])
386#define BASIC_PUSH(v) (*stack_pointer++ = (v))
387#define BASIC_POP() (*--stack_pointer)
388
Guido van Rossum96a42c81992-01-12 02:29:51 +0000389#ifdef LLTRACE
390#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
391#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000392#else
393#define PUSH(v) BASIC_PUSH(v)
394#define POP() BASIC_POP()
395#endif
396
Guido van Rossum681d79a1995-07-18 14:51:37 +0000397/* Local variable macros */
398
399#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000400#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000401 GETLOCAL(i) = value; } while (0)
402
Guido van Rossuma027efa1997-05-05 20:56:21 +0000403/* Start of code */
404
405 if (tstate == NULL)
406 Py_FatalError("eval_code2 called without a current thread");
407
Guido van Rossum8861b741996-07-30 16:49:37 +0000408#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000409 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000410 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000411 return NULL;
412 }
413#endif
414
Guido van Rossum681d79a1995-07-18 14:51:37 +0000415 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000416 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000417 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000418 }
419
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000420#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000421 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000422#endif
423
Guido van Rossumb209a111997-04-29 18:18:01 +0000424 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000426 co, /*code*/
427 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000428 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000429 if (f == NULL)
430 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000431
Guido van Rossuma027efa1997-05-05 20:56:21 +0000432 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000433 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000434
435 if (co->co_argcount > 0 ||
436 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
437 int i;
438 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000439 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000441 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000442 if (kwdict == NULL)
443 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000444 i = co->co_argcount;
445 if (co->co_flags & CO_VARARGS)
446 i++;
447 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 }
449 if (argcount > co->co_argcount) {
450 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000451 PyErr_SetString(PyExc_TypeError,
452 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000453 goto fail;
454 }
455 n = co->co_argcount;
456 }
457 for (i = 0; i < n; i++) {
458 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000459 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 SETLOCAL(i, x);
461 }
462 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000463 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000464 if (u == NULL)
465 goto fail;
466 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000467 for (i = n; i < argcount; i++) {
468 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000469 Py_INCREF(x);
470 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000471 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000472 }
473 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000474 PyObject *keyword = kws[2*i];
475 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 int j;
477 /* XXX slow -- speed up using dictionary? */
478 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000479 PyObject *nm = PyTuple_GET_ITEM(
480 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000481 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000482 break;
483 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000484 /* Check errors from Compare */
485 if (PyErr_Occurred())
486 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 if (j >= co->co_argcount) {
488 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000489 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000490 "unexpected keyword argument: %.400s",
491 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000492 goto fail;
493 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000494 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000495 }
496 else {
497 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 "keyword parameter redefined");
500 goto fail;
501 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000502 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 SETLOCAL(j, value);
504 }
505 }
506 if (argcount < co->co_argcount) {
507 int m = co->co_argcount - defcount;
508 for (i = argcount; i < m; i++) {
509 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000510 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000511 "not enough arguments");
512 goto fail;
513 }
514 }
515 if (n > m)
516 i = n - m;
517 else
518 i = 0;
519 for (; i < defcount; i++) {
520 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000521 PyObject *def = defs[i];
522 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 SETLOCAL(m+i, def);
524 }
525 }
526 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000527 }
528 else {
529 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000530 PyErr_SetString(PyExc_TypeError,
531 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000532 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000533 }
534 }
535
Guido van Rossuma027efa1997-05-05 20:56:21 +0000536 if (tstate->sys_tracefunc != NULL) {
537 /* tstate->sys_tracefunc, if defined, is a function that
538 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000539 Its return value, if not None, is a function that
540 will be called at the start of each executed line
541 of code. (Actually, the function must return
542 itself in order to continue tracing.)
543 The trace functions are called with three arguments:
544 a pointer to the current frame, a string indicating
545 why the function is called, and an argument which
546 depends on the situation. The global trace function
547 (sys.trace) is also called whenever an exception
548 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000549 if (call_trace(&tstate->sys_tracefunc,
550 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000551 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000552 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000553 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000554 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000555 }
556
Guido van Rossuma027efa1997-05-05 20:56:21 +0000557 if (tstate->sys_profilefunc != NULL) {
558 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000559 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560 if (call_trace(&tstate->sys_profilefunc,
561 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000562 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000563 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000564 }
565 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000566
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
568 --tstate->recursion_depth;
569 PyErr_SetString(PyExc_RuntimeError,
570 "Maximum recursion depth exceeded");
571 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000572 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000573 return NULL;
574 }
575
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000576 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000577 stack_pointer = f->f_valuestack;
578
Guido van Rossum374a9221991-04-04 10:40:29 +0000579 why = WHY_NOT;
580 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000581 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000582
583 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000584 /* Do periodic things. Doing this every time through
585 the loop would add too much overhead, so we do it
586 only every Nth instruction. We also do it if
587 ``things_to_do'' is set, i.e. when an asynchronous
588 event needs attention (e.g. a signal handler or
589 async I/O handler); see Py_AddPendingCall() and
590 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000591
Guido van Rossuma027efa1997-05-05 20:56:21 +0000592 if (things_to_do || --tstate->ticker < 0) {
593 tstate->ticker = tstate->sys_checkinterval;
594 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000595 if (Py_MakePendingCalls() < 0) {
596 why = WHY_EXCEPTION;
597 goto on_error;
598 }
599 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000600#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 /* If we have true signals, the signal handler
602 will call Py_AddPendingCall() so we don't
603 have to call sigcheck(). On the Mac and
604 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000605 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000606 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000607 goto on_error;
608 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000609#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000610
Guido van Rossume59214e1994-08-30 08:01:59 +0000611#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000612 if (interpreter_lock) {
613 /* Give another thread a chance */
614
Guido van Rossuma027efa1997-05-05 20:56:21 +0000615 PyThreadState *tstate =
616 PyThreadState_Swap(NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000617 release_lock(interpreter_lock);
618
619 /* Other threads may run now */
620
621 acquire_lock(interpreter_lock, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000622 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000623 }
624#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000628
Guido van Rossum408027e1996-12-30 16:17:54 +0000629#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000630 f->f_lasti = INSTR_OFFSET();
631#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000632
633 opcode = NEXTOP();
634 if (HAS_ARG(opcode))
635 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000636#ifdef DYNAMIC_EXECUTION_PROFILE
637#ifdef DXPAIRS
638 dxpairs[lastopcode][opcode]++;
639 lastopcode = opcode;
640#endif
641 dxp[opcode]++;
642#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000643
Guido van Rossum96a42c81992-01-12 02:29:51 +0000644#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 /* Instruction tracing */
646
Guido van Rossum96a42c81992-01-12 02:29:51 +0000647 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000648 if (HAS_ARG(opcode)) {
649 printf("%d: %d, %d\n",
650 (int) (INSTR_OFFSET() - 3),
651 opcode, oparg);
652 }
653 else {
654 printf("%d: %d\n",
655 (int) (INSTR_OFFSET() - 1), opcode);
656 }
657 }
658#endif
659
660 /* Main switch on opcode */
661
662 switch (opcode) {
663
664 /* BEWARE!
665 It is essential that any operation that fails sets either
666 x to NULL, err to nonzero, or why to anything but WHY_NOT,
667 and that no operation that succeeds does this! */
668
669 /* case STOP_CODE: this is an error! */
670
671 case POP_TOP:
672 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000673 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000674 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000675
676 case ROT_TWO:
677 v = POP();
678 w = POP();
679 PUSH(v);
680 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000681 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000682
683 case ROT_THREE:
684 v = POP();
685 w = POP();
686 x = POP();
687 PUSH(v);
688 PUSH(x);
689 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000690 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000691
692 case DUP_TOP:
693 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000694 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000696 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000697
698 case UNARY_POSITIVE:
699 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000700 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000701 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000703 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 break;
705
706 case UNARY_NEGATIVE:
707 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000708 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000709 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000710 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000711 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 break;
713
714 case UNARY_NOT:
715 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000716 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000718 if (err == 0) {
719 Py_INCREF(Py_True);
720 PUSH(Py_True);
721 continue;
722 }
723 else if (err > 0) {
724 Py_INCREF(Py_False);
725 PUSH(Py_False);
726 err = 0;
727 continue;
728 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 break;
730
731 case UNARY_CONVERT:
732 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000733 x = PyObject_Repr(v);
734 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000738
739 case UNARY_INVERT:
740 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000741 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000742 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000744 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000745 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000746
Guido van Rossum50564e81996-01-12 01:13:16 +0000747 case BINARY_POWER:
748 w = POP();
749 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000750 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000751 Py_DECREF(v);
752 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000754 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000755 break;
756
Guido van Rossum374a9221991-04-04 10:40:29 +0000757 case BINARY_MULTIPLY:
758 w = POP();
759 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000760 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_DECREF(v);
762 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000763 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000764 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 break;
766
767 case BINARY_DIVIDE:
768 w = POP();
769 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000770 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000771 Py_DECREF(v);
772 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000774 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000775 break;
776
777 case BINARY_MODULO:
778 w = POP();
779 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000780 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000781 Py_DECREF(v);
782 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000784 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 break;
786
787 case BINARY_ADD:
788 w = POP();
789 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000790 if (PyInt_Check(v) && PyInt_Check(w)) {
791 /* INLINE: int + int */
792 register long a, b, i;
793 a = ((PyIntObject*) v)->ob_ival;
794 b = ((PyIntObject*) w)->ob_ival;
795 i = a + b;
796 if ((i^a) < 0 && (i^b) < 0) {
797 PyErr_SetString(PyExc_OverflowError,
798 "integer addition");
799 x = NULL;
800 }
801 else
802 x = PyInt_FromLong(i);
803 }
804 else
805 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000806 Py_DECREF(v);
807 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000808 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000809 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 break;
811
812 case BINARY_SUBTRACT:
813 w = POP();
814 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000815 if (PyInt_Check(v) && PyInt_Check(w)) {
816 /* INLINE: int - int */
817 register long a, b, i;
818 a = ((PyIntObject*) v)->ob_ival;
819 b = ((PyIntObject*) w)->ob_ival;
820 i = a - b;
821 if ((i^a) < 0 && (i^~b) < 0) {
822 PyErr_SetString(PyExc_OverflowError,
823 "integer subtraction");
824 x = NULL;
825 }
826 else
827 x = PyInt_FromLong(i);
828 }
829 else
830 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000831 Py_DECREF(v);
832 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000834 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 break;
836
837 case BINARY_SUBSCR:
838 w = POP();
839 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000840 if (PyList_Check(v) && PyInt_Check(w)) {
841 /* INLINE: list[int] */
842 long i = PyInt_AsLong(w);
843 if (i < 0)
844 i += ((PyListObject*) v)->ob_size;
845 if (i < 0 ||
846 i >= ((PyListObject*) v)->ob_size) {
847 PyErr_SetString(PyExc_IndexError,
848 "list index out of range");
849 x = NULL;
850 }
851 else {
852 x = ((PyListObject*) v)->ob_item[i];
853 Py_INCREF(x);
854 }
855 }
856 else
857 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000858 Py_DECREF(v);
859 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000860 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000861 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000862 break;
863
Guido van Rossum7928cd71991-10-24 14:59:31 +0000864 case BINARY_LSHIFT:
865 w = POP();
866 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000867 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000868 Py_DECREF(v);
869 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000872 break;
873
874 case BINARY_RSHIFT:
875 w = POP();
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
879 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 break;
883
884 case BINARY_AND:
885 w = POP();
886 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000887 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000892 break;
893
894 case BINARY_XOR:
895 w = POP();
896 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000897 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(v);
899 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000902 break;
903
904 case BINARY_OR:
905 w = POP();
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
909 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000912 break;
913
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 case SLICE+0:
915 case SLICE+1:
916 case SLICE+2:
917 case SLICE+3:
918 if ((opcode-SLICE) & 2)
919 w = POP();
920 else
921 w = NULL;
922 if ((opcode-SLICE) & 1)
923 v = POP();
924 else
925 v = NULL;
926 u = POP();
927 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000928 Py_DECREF(u);
929 Py_XDECREF(v);
930 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000932 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000933 break;
934
935 case STORE_SLICE+0:
936 case STORE_SLICE+1:
937 case STORE_SLICE+2:
938 case STORE_SLICE+3:
939 if ((opcode-STORE_SLICE) & 2)
940 w = POP();
941 else
942 w = NULL;
943 if ((opcode-STORE_SLICE) & 1)
944 v = POP();
945 else
946 v = NULL;
947 u = POP();
948 t = POP();
949 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000950 Py_DECREF(t);
951 Py_DECREF(u);
952 Py_XDECREF(v);
953 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000954 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 break;
956
957 case DELETE_SLICE+0:
958 case DELETE_SLICE+1:
959 case DELETE_SLICE+2:
960 case DELETE_SLICE+3:
961 if ((opcode-DELETE_SLICE) & 2)
962 w = POP();
963 else
964 w = NULL;
965 if ((opcode-DELETE_SLICE) & 1)
966 v = POP();
967 else
968 v = NULL;
969 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000970 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000972 Py_DECREF(u);
973 Py_XDECREF(v);
974 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000975 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 break;
977
978 case STORE_SUBSCR:
979 w = POP();
980 v = POP();
981 u = POP();
982 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000983 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000984 Py_DECREF(u);
985 Py_DECREF(v);
986 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000987 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 break;
989
990 case DELETE_SUBSCR:
991 w = POP();
992 v = POP();
993 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +0000994 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000995 Py_DECREF(v);
996 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000997 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 break;
999
1000 case PRINT_EXPR:
1001 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001002 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +00001003 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001005 (err = PyDict_SetItemString(
Guido van Rossum9cc8a201997-07-19 19:55:50 +00001006 f->f_builtins, "_", v)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001007 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001008 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001009 x = PySys_GetObject("stdout");
1010 if (x == NULL)
1011 err = -1;
1012 }
1013 if (err == 0)
1014 err = PyFile_WriteObject(v, x, 0);
1015 if (err == 0) {
1016 PyFile_SoftSpace(x, 1);
1017 err = Py_FlushLine();
1018 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001019 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001020 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001021 break;
1022
1023 case PRINT_ITEM:
1024 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 w = PySys_GetObject("stdout");
1026 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001027 err = PyFile_WriteString(" ", w);
1028 if (err == 0)
1029 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001030 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001031 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001032 char *s = PyString_AsString(v);
1033 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001034 if (len > 0 &&
1035 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001036 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001038 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001039 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001040 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001041 break;
1042
1043 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001044 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001045 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001046 PyErr_SetString(PyExc_RuntimeError,
1047 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001048 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001049 err = PyFile_WriteString("\n", x);
1050 if (err == 0)
1051 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001052 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001053 break;
1054
1055 case BREAK_LOOP:
1056 why = WHY_BREAK;
1057 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001058
Guido van Rossumf10570b1995-07-07 22:53:21 +00001059 case RAISE_VARARGS:
1060 u = v = w = NULL;
1061 switch (oparg) {
1062 case 3:
1063 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001064 /* Fallthrough */
1065 case 2:
1066 v = POP(); /* value */
1067 /* Fallthrough */
1068 case 1:
1069 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001070 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001071 break;
1072 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001073 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001074 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001075 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001076 break;
1077 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001078 break;
1079
1080 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001081 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001082 PyErr_SetString(PyExc_SystemError,
1083 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001084 break;
1085 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001086 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001087 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001088 break;
1089
1090 case RETURN_VALUE:
1091 retval = POP();
1092 why = WHY_RETURN;
1093 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001094
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001095 case EXEC_STMT:
1096 w = POP();
1097 v = POP();
1098 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001099 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001100 Py_DECREF(u);
1101 Py_DECREF(v);
1102 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001103 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001104
Guido van Rossum374a9221991-04-04 10:40:29 +00001105 case POP_BLOCK:
1106 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001107 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001108 while (STACK_LEVEL() > b->b_level) {
1109 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001110 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001111 }
1112 }
1113 break;
1114
1115 case END_FINALLY:
1116 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001117 if (PyInt_Check(v)) {
1118 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001119 if (why == WHY_RETURN)
1120 retval = POP();
1121 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001122 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001123 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001124 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001125 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001126 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001127 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001128 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001129 else if (v != Py_None) {
1130 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001131 "'finally' pops bad exception");
1132 why = WHY_EXCEPTION;
1133 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001134 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001135 break;
1136
1137 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001138 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001139 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001140 w = POP();
1141 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001142 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001143 Py_DECREF(u);
1144 Py_DECREF(v);
1145 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001146 break;
1147
1148 case STORE_NAME:
1149 w = GETNAMEV(oparg);
1150 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001151 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001152 PyErr_SetString(PyExc_SystemError,
1153 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001154 break;
1155 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001156 err = PyDict_SetItem(x, w, v);
1157 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 break;
1159
1160 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001161 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001162 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001163 PyErr_SetString(PyExc_SystemError,
1164 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001165 break;
1166 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001167 if ((err = PyDict_DelItem(x, w)) != 0)
1168 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001170
1171#ifdef CASE_TOO_BIG
1172 default: switch (opcode) {
1173#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001174
1175 case UNPACK_TUPLE:
1176 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001177 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001178 PyErr_SetString(PyExc_TypeError,
1179 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001180 why = WHY_EXCEPTION;
1181 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001182 else if (PyTuple_Size(v) != oparg) {
1183 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001184 "unpack tuple of wrong size");
1185 why = WHY_EXCEPTION;
1186 }
1187 else {
1188 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001189 w = PyTuple_GET_ITEM(v, oparg);
1190 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 PUSH(w);
1192 }
1193 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001194 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001195 break;
1196
1197 case UNPACK_LIST:
1198 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001199 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001200 PyErr_SetString(PyExc_TypeError,
1201 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001202 why = WHY_EXCEPTION;
1203 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001204 else if (PyList_Size(v) != oparg) {
1205 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001206 "unpack list of wrong size");
1207 why = WHY_EXCEPTION;
1208 }
1209 else {
1210 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001211 w = PyList_GetItem(v, oparg);
1212 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001213 PUSH(w);
1214 }
1215 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001217 break;
1218
1219 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001220 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001221 v = POP();
1222 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001223 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1224 Py_DECREF(v);
1225 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 break;
1227
1228 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001229 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001230 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001231 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1232 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 break;
1235
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001236 case STORE_GLOBAL:
1237 w = GETNAMEV(oparg);
1238 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 err = PyDict_SetItem(f->f_globals, w, v);
1240 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001241 break;
1242
1243 case DELETE_GLOBAL:
1244 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001245 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1246 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001247 break;
1248
Guido van Rossum374a9221991-04-04 10:40:29 +00001249 case LOAD_CONST:
1250 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 PUSH(x);
1253 break;
1254
1255 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001256 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001257 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001258 PyErr_SetString(PyExc_SystemError,
1259 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001260 break;
1261 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 PyErr_Clear();
1265 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001267 PyErr_Clear();
1268 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001270 PyErr_SetObject(
1271 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 break;
1273 }
1274 }
1275 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001276 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 PUSH(x);
1278 break;
1279
1280 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001281 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001282 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001283 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001284 PyErr_Clear();
1285 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001288 break;
1289 }
1290 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001291 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 PUSH(x);
1293 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001294
Guido van Rossum9bfef441993-03-29 10:43:31 +00001295 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001296 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001297 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001298 PyErr_SetObject(PyExc_NameError,
1299 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001300 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001301 break;
1302 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001303 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001304 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001305 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001306 break;
1307
1308 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001309 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001310 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001311 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001312
1313 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001314 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001315 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001316
1317 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001319 if (x != NULL) {
1320 for (; --oparg >= 0;) {
1321 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001322 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001323 }
1324 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001325 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 }
1327 break;
1328
1329 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001331 if (x != NULL) {
1332 for (; --oparg >= 0;) {
1333 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001334 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 if (err != 0)
1336 break;
1337 }
1338 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001339 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001340 }
1341 break;
1342
1343 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001344 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001346 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 break;
1348
1349 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001350 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001351 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001352 x = PyObject_GetAttr(v, w);
1353 Py_DECREF(v);
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 COMPARE_OP:
1359 w = POP();
1360 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001361 if (PyInt_Check(v) && PyInt_Check(w)) {
1362 /* INLINE: cmp(int, int) */
1363 register long a, b;
1364 register int res;
1365 a = ((PyIntObject*) v)->ob_ival;
1366 b = ((PyIntObject*) w)->ob_ival;
1367 switch (oparg) {
1368 case LT: res = a < b; break;
1369 case LE: res = a <= b; break;
1370 case EQ: res = a == b; break;
1371 case NE: res = a != b; break;
1372 case GT: res = a > b; break;
1373 case GE: res = a >= b; break;
1374 case IS: res = v == w; break;
1375 case IS_NOT: res = v != w; break;
1376 default: goto slow_compare;
1377 }
1378 x = res ? Py_True : Py_False;
1379 Py_INCREF(x);
1380 }
1381 else {
1382 slow_compare:
1383 x = cmp_outcome(oparg, v, w);
1384 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001385 Py_DECREF(v);
1386 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001388 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 break;
1390
1391 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001392 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001393 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001394 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001396 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001397 break;
1398 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001399 if (PyCFunction_Check(x)) {
1400 u = Py_None;
1401 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001402 }
1403 else {
1404 u = find_from_args(f, INSTR_OFFSET());
1405 if (u == NULL) {
1406 x = u;
1407 break;
1408 }
1409 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001410 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001411 w,
1412 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001413 f->f_locals == NULL ?
1414 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001415 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001417 if (w == NULL) {
1418 x = NULL;
1419 break;
1420 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001421 x = PyEval_CallObject(x, w);
1422 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001423 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001424 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 break;
1426
1427 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001428 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001431 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001432 PyErr_SetString(PyExc_SystemError,
1433 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 break;
1435 }
1436 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001437 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001438 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001440
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 case JUMP_FORWARD:
1442 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001443 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001444
1445 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001446 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001447 if (err > 0)
1448 err = 0;
1449 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001451 else
1452 break;
1453 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001454
1455 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001456 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001457 if (err > 0) {
1458 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001461 else if (err == 0)
1462 ;
1463 else
1464 break;
1465 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001466
1467 case JUMP_ABSOLUTE:
1468 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001469 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001470
1471 case FOR_LOOP:
1472 /* for v in s: ...
1473 On entry: stack contains s, i.
1474 On exit: stack contains s, i+1, s[i];
1475 but if loop exhausted:
1476 s, i are popped, and we jump */
1477 w = POP(); /* Loop index */
1478 v = POP(); /* Sequence object */
1479 u = loop_subscript(v, w);
1480 if (u != NULL) {
1481 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001483 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001484 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001486 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001487 }
1488 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001489 Py_DECREF(v);
1490 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 /* A NULL can mean "s exhausted"
1492 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001495 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001497 continue;
1498 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 }
1500 break;
1501
1502 case SETUP_LOOP:
1503 case SETUP_EXCEPT:
1504 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001505 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001507 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001508
1509 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001510#ifdef LLTRACE
1511 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001514 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001515 if (f->f_trace == NULL)
1516 continue;
1517 /* Trace each line of code reached */
1518 f->f_lasti = INSTR_OFFSET();
1519 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001522
1523 case CALL_FUNCTION:
1524 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001525 int na = oparg & 0xff;
1526 int nk = (oparg>>8) & 0xff;
1527 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001528 PyObject **pfunc = stack_pointer - n - 1;
1529 PyObject *func = *pfunc;
1530 PyObject *self = NULL;
1531 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001532 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 if (PyMethod_Check(func)) {
1534 self = PyMethod_Self(func);
1535 class = PyMethod_Class(func);
1536 func = PyMethod_Function(func);
1537 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001538 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 Py_INCREF(self);
1540 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001541 *pfunc = self;
1542 na++;
1543 n++;
1544 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001545 else {
1546 /* Unbound methods must be
1547 called with an instance of
1548 the class (or a derived
1549 class) as first argument */
1550 if (na > 0 &&
1551 (self = stack_pointer[-n])
1552 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 PyInstance_Check(self) &&
1554 PyClass_IsSubclass(
1555 (PyObject *)
1556 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001557 ->in_class),
1558 class))
1559 /* Handy-dandy */ ;
1560 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001561 PyErr_SetString(
1562 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001563 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001564 x = NULL;
1565 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001566 }
1567 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 }
1569 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 Py_INCREF(func);
1571 if (PyFunction_Check(func)) {
1572 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001573 PyObject *globals =
1574 PyFunction_GetGlobals(func);
1575 PyObject *argdefs =
1576 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001577 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 int nd;
1579 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001581 nd = ((PyTupleObject *)argdefs) ->
1582 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583 }
1584 else {
1585 d = NULL;
1586 nd = 0;
1587 }
1588 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001589 (PyCodeObject *)co,
1590 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001591 stack_pointer-n, na,
1592 stack_pointer-2*nk, nk,
1593 d, nd,
1594 class);
1595 }
1596 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001597 PyObject *args = PyTuple_New(na);
1598 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001599 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001600 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001601 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001602 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001603 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001604 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001605 if (kwdict == NULL) {
1606 x = NULL;
1607 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001609 err = 0;
1610 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001611 PyObject *value = POP();
1612 PyObject *key = POP();
1613 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001614 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001615 Py_DECREF(key);
1616 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001617 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001618 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001619 }
1620 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001621 Py_DECREF(args);
1622 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001623 break;
1624 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001625 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001626 while (--na >= 0) {
1627 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001628 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001629 }
1630 x = PyEval_CallObjectWithKeywords(
1631 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001632 Py_DECREF(args);
1633 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001634 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001635 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001636 while (stack_pointer > pfunc) {
1637 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001639 }
1640 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001641 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001642 break;
1643 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001644
Guido van Rossum681d79a1995-07-18 14:51:37 +00001645 case MAKE_FUNCTION:
1646 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 x = PyFunction_New(v, f->f_globals);
1648 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001649 /* XXX Maybe this should be a separate opcode? */
1650 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001652 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001654 x = NULL;
1655 break;
1656 }
1657 while (--oparg >= 0) {
1658 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001659 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001660 }
1661 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001662 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001663 }
1664 PUSH(x);
1665 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001666
1667 case BUILD_SLICE:
1668 if (oparg == 3)
1669 w = POP();
1670 else
1671 w = NULL;
1672 v = POP();
1673 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001674 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 Py_DECREF(u);
1676 Py_DECREF(v);
1677 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001678 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001679 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001680 break;
1681
1682
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 default:
1684 fprintf(stderr,
1685 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001686 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001687 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 why = WHY_EXCEPTION;
1689 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001690
1691#ifdef CASE_TOO_BIG
1692 }
1693#endif
1694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 } /* switch */
1696
1697 on_error:
1698
1699 /* Quickly continue if no error occurred */
1700
1701 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001702 if (err == 0 && x != NULL) {
1703#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001704 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001705 fprintf(stderr,
1706 "XXX undetected error\n");
1707 else
1708#endif
1709 continue; /* Normal, fast path */
1710 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001711 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001712 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 err = 0;
1714 }
1715
Guido van Rossum801dcae1992-04-08 11:32:32 +00001716#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 /* Double-check exception status */
1718
1719 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001722 PyErr_SetString(PyExc_SystemError,
1723 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 why = WHY_EXCEPTION;
1725 }
1726 }
1727 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001728 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001729 fprintf(stderr,
1730 "XXX undetected error (why=%d)\n",
1731 why);
1732 why = WHY_EXCEPTION;
1733 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 }
1735#endif
1736
1737 /* Log traceback info if this is a real exception */
1738
1739 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001740 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001741 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001742 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001744
Guido van Rossume59214e1994-08-30 08:01:59 +00001745 if (f->f_trace)
1746 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001747 if (tstate->sys_profilefunc)
1748 call_exc_trace(&tstate->sys_profilefunc,
1749 (PyObject**)0, f);
1750}
Guido van Rossum374a9221991-04-04 10:40:29 +00001751
1752 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1753
1754 if (why == WHY_RERAISE)
1755 why = WHY_EXCEPTION;
1756
1757 /* Unwind stacks if a (pseudo) exception occurred */
1758
1759 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001760 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 while (STACK_LEVEL() > b->b_level) {
1762 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001764 }
1765 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1766 why = WHY_NOT;
1767 JUMPTO(b->b_handler);
1768 break;
1769 }
1770 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001771 (b->b_type == SETUP_EXCEPT &&
1772 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001773 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001774 PyObject *exc, *val, *tb;
1775 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001777 val = Py_None;
1778 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 /* Make the raw exception data
1781 available to the handler,
1782 so a program can emulate the
1783 Python main loop. Don't do
1784 this for 'finally'. */
1785 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001786 set_exc_info(tstate,
1787 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001789 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 PUSH(val);
1791 PUSH(exc);
1792 }
1793 else {
1794 if (why == WHY_RETURN)
1795 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001796 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 PUSH(v);
1798 }
1799 why = WHY_NOT;
1800 JUMPTO(b->b_handler);
1801 break;
1802 }
1803 } /* unwind stack */
1804
1805 /* End the loop if we still have an error (or return) */
1806
1807 if (why != WHY_NOT)
1808 break;
1809
1810 } /* main loop */
1811
1812 /* Pop remaining stack entries */
1813
1814 while (!EMPTY()) {
1815 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001816 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001817 }
1818
Guido van Rossum96a42c81992-01-12 02:29:51 +00001819 if (why != WHY_RETURN)
1820 retval = NULL;
1821
Guido van Rossume59214e1994-08-30 08:01:59 +00001822 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001823 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001824 if (call_trace(&f->f_trace, &f->f_trace, f,
1825 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001827 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001828 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001829 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001830 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001831 }
1832
Guido van Rossuma027efa1997-05-05 20:56:21 +00001833 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1834 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001835 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001837 retval = NULL;
1838 why = WHY_EXCEPTION;
1839 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001840 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001841
Guido van Rossuma027efa1997-05-05 20:56:21 +00001842 reset_exc_info(tstate);
1843
1844 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001845
1846 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001847
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001849
Guido van Rossuma027efa1997-05-05 20:56:21 +00001850 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001851 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001852
Guido van Rossum96a42c81992-01-12 02:29:51 +00001853 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001854}
1855
Guido van Rossuma027efa1997-05-05 20:56:21 +00001856static void
1857set_exc_info(tstate, type, value, tb)
1858 PyThreadState *tstate;
1859 PyObject *type;
1860 PyObject *value;
1861 PyObject *tb;
1862{
1863 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001864 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001865 frame = tstate->frame;
1866 if (frame->f_exc_type == NULL) {
1867 /* This frame didn't catch an exception before */
1868 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001869 if (tstate->exc_type == NULL) {
1870 Py_INCREF(Py_None);
1871 tstate->exc_type = Py_None;
1872 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001873 tmp_type = frame->f_exc_type;
1874 tmp_value = frame->f_exc_value;
1875 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001876 Py_XINCREF(tstate->exc_type);
1877 Py_XINCREF(tstate->exc_value);
1878 Py_XINCREF(tstate->exc_traceback);
1879 frame->f_exc_type = tstate->exc_type;
1880 frame->f_exc_value = tstate->exc_value;
1881 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001882 Py_XDECREF(tmp_type);
1883 Py_XDECREF(tmp_value);
1884 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001885 }
1886 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001887 tmp_type = tstate->exc_type;
1888 tmp_value = tstate->exc_value;
1889 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001890 Py_XINCREF(type);
1891 Py_XINCREF(value);
1892 Py_XINCREF(tb);
1893 tstate->exc_type = type;
1894 tstate->exc_value = value;
1895 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001896 Py_XDECREF(tmp_type);
1897 Py_XDECREF(tmp_value);
1898 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001899 /* For b/w compatibility */
1900 PySys_SetObject("exc_type", type);
1901 PySys_SetObject("exc_value", value);
1902 PySys_SetObject("exc_traceback", tb);
1903}
1904
1905static void
1906reset_exc_info(tstate)
1907 PyThreadState *tstate;
1908{
1909 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001910 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001911 frame = tstate->frame;
1912 if (frame->f_exc_type != NULL) {
1913 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001914 tmp_type = tstate->exc_type;
1915 tmp_value = tstate->exc_value;
1916 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001917 Py_XINCREF(frame->f_exc_type);
1918 Py_XINCREF(frame->f_exc_value);
1919 Py_XINCREF(frame->f_exc_traceback);
1920 tstate->exc_type = frame->f_exc_type;
1921 tstate->exc_value = frame->f_exc_value;
1922 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001923 Py_XDECREF(tmp_type);
1924 Py_XDECREF(tmp_value);
1925 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001926 /* For b/w compatibility */
1927 PySys_SetObject("exc_type", frame->f_exc_type);
1928 PySys_SetObject("exc_value", frame->f_exc_value);
1929 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1930 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001931 tmp_type = frame->f_exc_type;
1932 tmp_value = frame->f_exc_value;
1933 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001934 frame->f_exc_type = NULL;
1935 frame->f_exc_value = NULL;
1936 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001937 Py_XDECREF(tmp_type);
1938 Py_XDECREF(tmp_value);
1939 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001940}
1941
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001942/* Logic for the raise statement (too complicated for inlining).
1943 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001944static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001945do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001946 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001947{
1948 /* We support the following forms of raise:
1949 raise <class>, <classinstance>
1950 raise <class>, <argument tuple>
1951 raise <class>, None
1952 raise <class>, <argument>
1953 raise <classinstance>, None
1954 raise <string>, <object>
1955 raise <string>, None
1956
1957 An omitted second argument is the same as None.
1958
1959 In addition, raise <tuple>, <anything> is the same as
1960 raising the tuple's first item (and it better have one!);
1961 this rule is applied recursively.
1962
1963 Finally, an optional third argument can be supplied, which
1964 gives the traceback to be substituted (useful when
1965 re-raising an exception after examining it). */
1966
1967 /* First, check the traceback argument, replacing None with
1968 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001969 if (tb == Py_None) {
1970 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001971 tb = NULL;
1972 }
1973 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001974 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001975 "raise 3rd arg must be traceback or None");
1976 goto raise_error;
1977 }
1978
1979 /* Next, replace a missing value with None */
1980 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001981 value = Py_None;
1982 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001983 }
1984
1985 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1987 PyObject *tmp = type;
1988 type = PyTuple_GET_ITEM(type, 0);
1989 Py_INCREF(type);
1990 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001991 }
1992
1993 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001995 ;
1996 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001997 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001998 /* Raising a class. If the value is an instance, it
1999 better be an instance of the class. If it is not,
2000 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002001 if (PyInstance_Check(value)) {
2002 PyObject *inclass = (PyObject*)
2003 (((PyInstanceObject*)value)->in_class);
2004 if (!PyClass_IsSubclass(inclass, type)) {
2005 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002006 "raise <class>, <instance> requires that <instance> is a member of <class>");
2007 goto raise_error;
2008 }
2009 }
2010 else {
2011 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00002012 PyObject *args, *res;
2013 if (value == Py_None)
2014 args = Py_BuildValue("()");
2015 else if (PyTuple_Check(value)) {
2016 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002017 args = value;
2018 }
2019 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002020 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002021 if (args == NULL)
2022 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00002023 res = PyEval_CallObject(type, args);
2024 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002025 if (res == NULL)
2026 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00002027 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002028 value = res;
2029 }
2030 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002031 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002032 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002033 if (value != Py_None) {
2034 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002035 "instance exception may not have a separate value");
2036 goto raise_error;
2037 }
2038 else {
2039 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002040 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002041 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002042 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2043 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002044 }
2045 }
2046 else {
2047 /* Not something you can raise. You get an exception
2048 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002049 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002050 "exceptions must be strings, classes, or instances");
2051 goto raise_error;
2052 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002053 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002054 if (tb == NULL)
2055 return WHY_EXCEPTION;
2056 else
2057 return WHY_RERAISE;
2058 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 Py_XDECREF(value);
2060 Py_XDECREF(type);
2061 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002062 return WHY_EXCEPTION;
2063}
2064
Guido van Rossum96a42c81992-01-12 02:29:51 +00002065#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002066static int
2067prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002068 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002069 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002071 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002072 if (PyObject_Print(v, stdout, 0) != 0)
2073 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002074 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002078static void
2079call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002080 PyObject **p_trace, **p_newtrace;
2081 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002082{
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002084 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002085 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002086 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 value = Py_None;
2088 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002089 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002091 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002093 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002094 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002095 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002096 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002097 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002098 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002099 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 Py_XDECREF(type);
2101 Py_XDECREF(value);
2102 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002104}
2105
2106static int
2107call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002109 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002110 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002111 may point to NULL variable;
2112 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002113 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002114 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002115 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002116{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002117 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 PyObject *args, *what;
2119 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002120
Guido van Rossuma027efa1997-05-05 20:56:21 +00002121 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002122 /* Don't do recursive traces */
2123 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002124 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002125 *p_newtrace = NULL;
2126 }
2127 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002128 }
2129
Guido van Rossumb209a111997-04-29 18:18:01 +00002130 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002131 if (args == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002132 goto Py_Cleanup;
2133 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002134 if (what == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 goto Py_Cleanup;
2136 Py_INCREF(f);
2137 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2138 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002139 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 arg = Py_None;
2141 Py_INCREF(arg);
2142 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002143 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002144 PyFrame_FastToLocals(f);
2145 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2146 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002147 tstate->tracing--;
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 Py_Cleanup:
2149 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002150 if (res == NULL) {
2151 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002152 PyTraceBack_Here(f);
2153 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002154 *p_trace = NULL;
2155 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002156 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002157 *p_newtrace = NULL;
2158 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002159 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002160 }
2161 else {
2162 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 Py_XDECREF(*p_newtrace);
2164 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002165 *p_newtrace = NULL;
2166 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002168 *p_newtrace = res;
2169 }
2170 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002171 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002172 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002173 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002174}
2175
Guido van Rossumb209a111997-04-29 18:18:01 +00002176PyObject *
2177PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002178{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002179 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002180 if (current_frame == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 return PyBuiltin_GetModule();
Guido van Rossum6135a871995-01-09 17:53:26 +00002182 else
2183 return current_frame->f_builtins;
2184}
2185
Guido van Rossumb209a111997-04-29 18:18:01 +00002186PyObject *
2187PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002188{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002189 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002190 if (current_frame == NULL)
2191 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002192 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002193 return current_frame->f_locals;
2194}
2195
Guido van Rossumb209a111997-04-29 18:18:01 +00002196PyObject *
2197PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002198{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002199 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002200 if (current_frame == NULL)
2201 return NULL;
2202 else
2203 return current_frame->f_globals;
2204}
2205
Guido van Rossumb209a111997-04-29 18:18:01 +00002206PyObject *
2207PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002208{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002209 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002210 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002211}
2212
Guido van Rossum6135a871995-01-09 17:53:26 +00002213int
Guido van Rossumb209a111997-04-29 18:18:01 +00002214PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002215{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002216 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002217 return current_frame == NULL ? 0 : current_frame->f_restricted;
2218}
2219
Guido van Rossumbe270261997-05-22 22:26:18 +00002220int
Guido van Rossumb209a111997-04-29 18:18:01 +00002221Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222{
Guido van Rossumb209a111997-04-29 18:18:01 +00002223 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002224 if (f == NULL)
2225 return 0;
2226 if (!PyFile_SoftSpace(f, 0))
2227 return 0;
2228 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229}
2230
Guido van Rossum3f5da241990-12-20 15:06:42 +00002231
Guido van Rossum681d79a1995-07-18 14:51:37 +00002232/* External interface to call any callable object.
2233 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002234
Guido van Rossumb209a111997-04-29 18:18:01 +00002235PyObject *
2236PyEval_CallObject(func, arg)
2237 PyObject *func;
2238 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002239{
Guido van Rossumb209a111997-04-29 18:18:01 +00002240 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002241}
Guido van Rossume59214e1994-08-30 08:01:59 +00002242
Guido van Rossumb209a111997-04-29 18:18:01 +00002243PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002244PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002245 PyObject *func;
2246 PyObject *arg;
2247 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002248{
2249 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002251
2252 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002253 arg = PyTuple_New(0);
2254 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002255 PyErr_SetString(PyExc_TypeError,
2256 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002257 return NULL;
2258 }
2259 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002260 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002261
Guido van Rossumb209a111997-04-29 18:18:01 +00002262 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002263 PyErr_SetString(PyExc_TypeError,
2264 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002265 return NULL;
2266 }
2267
Guido van Rossum150b2df1996-12-05 23:17:11 +00002268 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002269 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002270 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002271 result = call_function(func, arg, kw);
2272 else
2273 result = call_builtin(func, arg, kw);
2274
Guido van Rossumb209a111997-04-29 18:18:01 +00002275 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002276
Guido van Rossumb209a111997-04-29 18:18:01 +00002277 if (result == NULL && !PyErr_Occurred())
2278 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002279 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002280
2281 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002282}
2283
Guido van Rossumb209a111997-04-29 18:18:01 +00002284static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002285call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002286 PyObject *func;
2287 PyObject *arg;
2288 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289{
Guido van Rossumb209a111997-04-29 18:18:01 +00002290 if (PyCFunction_Check(func)) {
2291 PyCFunction meth = PyCFunction_GetFunction(func);
2292 PyObject *self = PyCFunction_GetSelf(func);
2293 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002294 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002295 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002296 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002297 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002298 else if (size == 0)
2299 arg = NULL;
2300 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002301 if (flags & METH_KEYWORDS)
2302 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002303 if (kw != NULL && PyDict_Size(kw) != 0) {
2304 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002305 "this function takes no keyword arguments");
2306 return NULL;
2307 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002308 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 if (PyClass_Check(func)) {
2311 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002313 if (PyInstance_Check(func)) {
2314 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002315 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002316 PyErr_Clear();
2317 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002318 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002319 return NULL;
2320 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002321 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002322 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002323 return res;
2324 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002325 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 return NULL;
2327}
2328
Guido van Rossumb209a111997-04-29 18:18:01 +00002329static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002330call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002331 PyObject *func;
2332 PyObject *arg;
2333 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002334{
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 PyObject *class = NULL; /* == owner */
2336 PyObject *argdefs;
2337 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002338 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002339 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002340
Guido van Rossumb209a111997-04-29 18:18:01 +00002341 if (kw != NULL && !PyDict_Check(kw)) {
2342 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002343 return NULL;
2344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 if (PyMethod_Check(func)) {
2347 PyObject *self = PyMethod_Self(func);
2348 class = PyMethod_Class(func);
2349 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002350 if (self == NULL) {
2351 /* Unbound methods must be called with an instance of
2352 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002353 if (PyTuple_Size(arg) >= 1) {
2354 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002355 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002356 PyInstance_Check(self) &&
2357 PyClass_IsSubclass((PyObject *)
2358 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002359 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002360 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002361 else
2362 self = NULL;
2363 }
2364 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002365 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002366 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002367 return NULL;
2368 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002369 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002370 }
2371 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002372 int argcount = PyTuple_Size(arg);
2373 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002374 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002375 if (newarg == NULL)
2376 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002377 Py_INCREF(self);
2378 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002379 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 PyObject *v = PyTuple_GET_ITEM(arg, i);
2381 Py_XINCREF(v);
2382 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002383 }
2384 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 }
2386 }
2387 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002388 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002389 PyErr_SetString(PyExc_TypeError,
2390 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 return NULL;
2392 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002393 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395
2396 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002397 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2398 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2399 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002400 }
2401 else {
2402 d = NULL;
2403 nd = 0;
2404 }
2405
2406 if (kw != NULL) {
2407 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 nk = PyDict_Size(kw);
2409 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002410 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002411 PyErr_NoMemory();
2412 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002413 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002414 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002415 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002416 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002417 i += 2;
2418 nk = i/2;
2419 /* XXX This is broken if the caller deletes dict items! */
2420 }
2421 else {
2422 k = NULL;
2423 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002424 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 (PyCodeObject *)PyFunction_GetCode(func),
2428 PyFunction_GetGlobals(func), (PyObject *)NULL,
2429 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002430 k, nk,
2431 d, nd,
2432 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433
Guido van Rossumb209a111997-04-29 18:18:01 +00002434 Py_DECREF(arg);
2435 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438}
2439
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002440#define SLICE_ERROR_MSG \
2441 "standard sequence type does not support step size other than one"
2442
Guido van Rossumb209a111997-04-29 18:18:01 +00002443static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002444loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446{
Guido van Rossumb209a111997-04-29 18:18:01 +00002447 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002448 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002450 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451 return NULL;
2452 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002453 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002454 v = (*sq->sq_item)(v, i);
2455 if (v)
2456 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002457 if (PyErr_Occurred() == PyExc_IndexError)
2458 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002459 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460}
2461
2462static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002463slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 int *pi;
2466{
2467 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002468 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002469 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002470 PyErr_SetString(PyExc_TypeError,
2471 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002474 x = PyInt_AsLong(v);
2475 /* Truncate -- very long indices are truncated anyway */
2476 if (x > INT_MAX)
2477 x = INT_MAX;
2478 else if (x < -INT_MAX)
2479 x = 0;
2480 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002482 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483}
2484
Guido van Rossumb209a111997-04-29 18:18:01 +00002485static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002486apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002489 int ilow = 0, ihigh = INT_MAX;
2490 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002492 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002493 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002494 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002496
2497static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002498assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002499 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002501 int ilow = 0, ihigh = INT_MAX;
2502 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002503 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002504 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002505 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002506 if (x == NULL)
2507 return PySequence_DelSlice(u, ilow, ihigh);
2508 else
2509 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510}
2511
2512static int
2513cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515{
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002518 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002519 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002520 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002521 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002522 return 1;
2523 }
2524 return 0;
2525 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 if (PyClass_Check(v) && PyClass_Check(err))
2527 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 return err == v;
2529}
2530
Guido van Rossum3f5da241990-12-20 15:06:42 +00002531static int
2532cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002534{
Guido van Rossume59214e1994-08-30 08:01:59 +00002535 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002536 PyObject *x;
2537 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002538 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002540 register char *s, *end;
2541 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002542 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2543 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002544 "string member test needs char left operand");
2545 return -1;
2546 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002547 c = PyString_AsString(v)[0];
2548 s = PyString_AsString(w);
2549 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002550 while (s < end) {
2551 if (c == *s++)
2552 return 1;
2553 }
2554 return 0;
2555 }
2556 sq = w->ob_type->tp_as_sequence;
2557 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002558 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002559 "'in' or 'not in' needs sequence right argument");
2560 return -1;
2561 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002562 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002563 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002564 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002565 if (PyErr_Occurred() == PyExc_IndexError) {
2566 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002567 break;
2568 }
2569 return -1;
2570 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 cmp = PyObject_Compare(v, x);
2572 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002573 if (cmp == 0)
2574 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002575 if (PyErr_Occurred())
2576 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002577 }
2578 return 0;
2579}
2580
Guido van Rossumb209a111997-04-29 18:18:01 +00002581static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002582cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002583 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 register PyObject *v;
2585 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586{
2587 register int cmp;
2588 register int res = 0;
2589 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002590 case IS:
2591 case IS_NOT:
2592 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002593 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002594 res = !res;
2595 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 case IN:
2597 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002598 res = cmp_member(v, w);
2599 if (res < 0)
2600 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002601 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002602 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 break;
2604 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 break;
2607 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002608 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002609 if (cmp && PyErr_Occurred())
2610 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002611 switch (op) {
2612 case LT: res = cmp < 0; break;
2613 case LE: res = cmp <= 0; break;
2614 case EQ: res = cmp == 0; break;
2615 case NE: res = cmp != 0; break;
2616 case GT: res = cmp > 0; break;
2617 case GE: res = cmp >= 0; break;
2618 /* XXX no default? (res is initialized to 0 though) */
2619 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 v = res ? Py_True : Py_False;
2622 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 return v;
2624}
2625
Guido van Rossum3f5da241990-12-20 15:06:42 +00002626static int
2627import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 PyObject *locals;
2629 PyObject *v;
2630 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002631{
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 PyObject *w, *x;
2633 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 PyErr_SetString(PyExc_TypeError,
2635 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002636 return -1;
2637 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002638 w = PyModule_GetDict(v);
2639 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002640 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002642 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 while (PyDict_Next(w, &pos, &name, &value)) {
2644 if (!PyString_Check(name) ||
2645 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002646 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 Py_INCREF(value);
2648 err = PyDict_SetItem(locals, name, value);
2649 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002650 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002651 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002652 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002653 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002654 }
2655 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002656 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002657 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002658 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002659 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002660 PyString_AsString(name));
2661 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662 return -1;
2663 }
2664 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002665 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002666 }
2667}
2668
Guido van Rossumb209a111997-04-29 18:18:01 +00002669static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002670build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 PyObject *methods; /* dictionary */
2672 PyObject *bases; /* tuple containing classes */
2673 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002674{
Guido van Rossum25831651993-05-19 14:50:45 +00002675 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002677 PyErr_SetString(PyExc_SystemError,
2678 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002679 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002680 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002681 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002682 PyErr_SetString(PyExc_SystemError,
2683 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002684 return NULL;
2685 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002686 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002687 PyErr_SetString(PyExc_SystemError,
2688 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002689 return NULL;
2690 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 for (i = PyTuple_Size(bases); --i >= 0; ) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002692 /* XXX Is it intentional that the *last* base gets a
2693 chance at this first? */
Guido van Rossumb209a111997-04-29 18:18:01 +00002694 PyObject *base = PyTuple_GET_ITEM(bases, i);
2695 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002696 /* Call the base's *type*, if it is callable.
2697 This code is a hook for Donald Beaudry's
2698 and Jim Fulton's type extensions. In
2699 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002700 since its types are not callable.
2701 Ditto: call the bases's *class*, if it has
2702 one. This makes the same thing possible
2703 without writing C code. A true meta-object
2704 protocol! */
2705 PyObject *basetype = (PyObject *)base->ob_type;
2706 PyObject *callable = NULL;
2707 if (PyCallable_Check(basetype))
2708 callable = basetype;
2709 else
2710 callable = PyObject_GetAttrString(
2711 base, "__class__");
2712 if (callable) {
2713 PyObject *args;
2714 PyObject *newclass = NULL;
2715 args = Py_BuildValue(
2716 "(OOO)", name, bases, methods);
2717 if (args != NULL) {
2718 newclass = PyEval_CallObject(
2719 callable, args);
2720 Py_DECREF(args);
2721 }
2722 if (callable != basetype)
2723 Py_DECREF(callable);
2724 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002725 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002727 "base is not a class object");
2728 return NULL;
2729 }
2730 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002731 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002732}
2733
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002734static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002735exec_statement(f, prog, globals, locals)
2736 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 PyObject *prog;
2738 PyObject *globals;
2739 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002740{
2741 char *s;
2742 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002744 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002745
Guido van Rossumb209a111997-04-29 18:18:01 +00002746 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2747 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002748 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002750 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 locals = PyTuple_GetItem(prog, 2);
2752 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002753 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 if (globals == Py_None) {
2755 globals = PyEval_GetGlobals();
2756 if (locals == Py_None) {
2757 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002758 plain = 1;
2759 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002760 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002762 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 if (!PyString_Check(prog) &&
2764 !PyCode_Check(prog) &&
2765 !PyFile_Check(prog)) {
2766 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002767 "exec 1st arg must be string, code or file object");
2768 return -1;
2769 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002770 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2771 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002772 "exec 2nd/3rd args must be dict or None");
2773 return -1;
2774 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002775 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002776 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002777 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002778 if (PyEval_EvalCode((PyCodeObject *) prog,
2779 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002780 return -1;
2781 return 0;
2782 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 if (PyFile_Check(prog)) {
2784 FILE *fp = PyFile_AsFile(prog);
2785 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002786 if (PyRun_File(fp, name, Py_file_input,
2787 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002788 return -1;
2789 return 0;
2790 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002792 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002793 PyErr_SetString(PyExc_ValueError,
2794 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002795 return -1;
2796 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002797 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002798 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002799 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002800 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002801 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002802 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002803 return 0;
2804}
Guido van Rossum24c13741995-02-14 09:42:43 +00002805
Guido van Rossum1aa14831997-01-21 05:34:20 +00002806/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002807static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002808find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002809 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002810 int nexti;
2811{
2812 int opcode;
2813 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002814 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002815 unsigned char *next_instr;
2816
2817 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2818 opcode = (*next_instr++);
2819 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 Py_INCREF(Py_None);
2821 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002822 }
2823
Guido van Rossumb209a111997-04-29 18:18:01 +00002824 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002825 if (list == NULL)
2826 return NULL;
2827
2828 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002829 oparg = (next_instr[1]<<8) + next_instr[0];
2830 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002831 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002832 if (PyList_Append(list, name) < 0) {
2833 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002834 break;
2835 }
2836 opcode = (*next_instr++);
2837 } while (opcode == IMPORT_FROM);
2838
2839 return list;
2840}
Guido van Rossum950361c1997-01-24 13:49:28 +00002841
2842
2843#ifdef DYNAMIC_EXECUTION_PROFILE
2844
2845PyObject *
2846getarray(a)
2847 long a[256];
2848{
2849 int i;
2850 PyObject *l = PyList_New(256);
2851 if (l == NULL) return NULL;
2852 for (i = 0; i < 256; i++) {
2853 PyObject *x = PyInt_FromLong(a[i]);
2854 if (x == NULL) {
2855 Py_DECREF(l);
2856 return NULL;
2857 }
2858 PyList_SetItem(l, i, x);
2859 }
2860 for (i = 0; i < 256; i++)
2861 a[i] = 0;
2862 return l;
2863}
2864
2865PyObject *
2866_Py_GetDXProfile(self, args)
2867 PyObject *self, *args;
2868{
2869#ifndef DXPAIRS
2870 return getarray(dxp);
2871#else
2872 int i;
2873 PyObject *l = PyList_New(257);
2874 if (l == NULL) return NULL;
2875 for (i = 0; i < 257; i++) {
2876 PyObject *x = getarray(dxpairs[i]);
2877 if (x == NULL) {
2878 Py_DECREF(l);
2879 return NULL;
2880 }
2881 PyList_SetItem(l, i, x);
2882 }
2883 return l;
2884#endif
2885}
2886
2887#endif