blob: 07c3ab67df939e57eb89f71b83513a3b6a151fca [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
Guido van Rossum25ce5661997-08-02 03:10:38 +0000133PyEval_AcquireLock()
134{
135 acquire_lock(interpreter_lock, 1);
136}
137
138void
139PyEval_ReleaseLock()
140{
141 release_lock(interpreter_lock);
142}
143
144void
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000145PyEval_AcquireThread(tstate)
146 PyThreadState *tstate;
147{
148 if (tstate == NULL)
149 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
150 acquire_lock(interpreter_lock, 1);
151 if (PyThreadState_Swap(tstate) != NULL)
152 Py_FatalError(
153 "PyEval_AcquireThread: non-NULL old thread state");
154}
155
156void
157PyEval_ReleaseThread(tstate)
158 PyThreadState *tstate;
159{
160 if (tstate == NULL)
161 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
162 if (PyThreadState_Swap(NULL) != tstate)
163 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
164 release_lock(interpreter_lock);
165}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000166#endif
167
Guido van Rossumff4949e1992-08-05 19:58:53 +0000168/* Functions save_thread and restore_thread are always defined so
169 dynamically loaded modules needn't be compiled separately for use
170 with and without threads: */
171
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000172PyThreadState *
Guido van Rossumb209a111997-04-29 18:18:01 +0000173PyEval_SaveThread()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000174{
Guido van Rossume59214e1994-08-30 08:01:59 +0000175#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000176 if (interpreter_lock) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000177 PyThreadState *tstate = PyThreadState_Swap(NULL);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000178 if (tstate == NULL)
179 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000180 release_lock(interpreter_lock);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000181 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000182 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183#endif
Guido van Rossum9575a441993-04-07 14:06:14 +0000184 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000185}
186
187void
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000188PyEval_RestoreThread(tstate)
189 PyThreadState *tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190{
Guido van Rossume59214e1994-08-30 08:01:59 +0000191#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000192 if (interpreter_lock) {
193 int err;
194 err = errno;
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000195 if (tstate == NULL)
196 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197 acquire_lock(interpreter_lock, 1);
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000198 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000199 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200 }
201#endif
202}
203
204
Guido van Rossuma9672091994-09-14 13:31:22 +0000205/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
206 signal handlers or Mac I/O completion routines) can schedule calls
207 to a function to be called synchronously.
208 The synchronous function is called with one void* argument.
209 It should return 0 for success or -1 for failure -- failure should
210 be accompanied by an exception.
211
212 If registry succeeds, the registry function returns 0; if it fails
213 (e.g. due to too many pending calls) it returns -1 (without setting
214 an exception condition).
215
216 Note that because registry may occur from within signal handlers,
217 or other asynchronous events, calling malloc() is unsafe!
218
219#ifdef WITH_THREAD
220 Any thread can schedule pending calls, but only the main thread
221 will execute them.
222#endif
223
224 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
225 There are two possible race conditions:
226 (1) nested asynchronous registry calls;
227 (2) registry calls made while pending calls are being processed.
228 While (1) is very unlikely, (2) is a real possibility.
229 The current code is safe against (2), but not against (1).
230 The safety against (2) is derived from the fact that only one
231 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000232
Guido van Rossuma027efa1997-05-05 20:56:21 +0000233 XXX Darn! With the advent of thread state, we should have an array
234 of pending calls per thread in the thread state! Later...
235*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000236
Guido van Rossuma9672091994-09-14 13:31:22 +0000237#define NPENDINGCALLS 32
238static struct {
Guido van Rossumb209a111997-04-29 18:18:01 +0000239 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000240 ANY *arg;
241} pendingcalls[NPENDINGCALLS];
242static volatile int pendingfirst = 0;
243static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000244static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000245
246int
247Py_AddPendingCall(func, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +0000248 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 ANY *arg;
250{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000251 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000252 int i, j;
253 /* XXX Begin critical section */
254 /* XXX If you want this to be safe against nested
255 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000256 if (busy)
257 return -1;
258 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000259 i = pendinglast;
260 j = (i + 1) % NPENDINGCALLS;
261 if (j == pendingfirst)
262 return -1; /* Queue full */
263 pendingcalls[i].func = func;
264 pendingcalls[i].arg = arg;
265 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000266 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000268 /* XXX End critical section */
269 return 0;
270}
271
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272int
273Py_MakePendingCalls()
Guido van Rossuma9672091994-09-14 13:31:22 +0000274{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000275 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000276#ifdef WITH_THREAD
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 if (main_thread && get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000278 return 0;
279#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000280 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000281 return 0;
282 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000283 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000284 for (;;) {
285 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +0000286 int (*func) Py_PROTO((ANY *));
Guido van Rossuma9672091994-09-14 13:31:22 +0000287 ANY *arg;
288 i = pendingfirst;
289 if (i == pendinglast)
290 break; /* Queue empty */
291 func = pendingcalls[i].func;
292 arg = pendingcalls[i].arg;
293 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000294 if (func(arg) < 0) {
295 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000296 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000297 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000298 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000299 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000300 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000301 return 0;
302}
303
304
Guido van Rossum374a9221991-04-04 10:40:29 +0000305/* Status code for main loop (reason for stack unwind) */
306
307enum why_code {
308 WHY_NOT, /* No error */
309 WHY_EXCEPTION, /* Exception occurred */
310 WHY_RERAISE, /* Exception re-raised by 'finally' */
311 WHY_RETURN, /* 'return' statement */
312 WHY_BREAK /* 'break' statement */
313};
314
Guido van Rossumb209a111997-04-29 18:18:01 +0000315static enum why_code do_raise Py_PROTO((PyObject *, PyObject *, PyObject *));
Guido van Rossum1aa14831997-01-21 05:34:20 +0000316
Guido van Rossum374a9221991-04-04 10:40:29 +0000317
Guido van Rossum681d79a1995-07-18 14:51:37 +0000318/* Backward compatible interface */
Guido van Rossum374a9221991-04-04 10:40:29 +0000319
Guido van Rossumb209a111997-04-29 18:18:01 +0000320PyObject *
321PyEval_EvalCode(co, globals, locals)
322 PyCodeObject *co;
323 PyObject *globals;
324 PyObject *locals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000325{
326 return eval_code2(co,
327 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000328 (PyObject **)NULL, 0,
329 (PyObject **)NULL, 0,
330 (PyObject **)NULL, 0,
331 (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000332}
333
334
335/* Interpreter main loop */
336
Guido van Rossum8861b741996-07-30 16:49:37 +0000337#ifndef MAX_RECURSION_DEPTH
338#define MAX_RECURSION_DEPTH 10000
339#endif
340
Guido van Rossumb209a111997-04-29 18:18:01 +0000341static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +0000342eval_code2(co, globals, locals,
343 args, argcount, kws, kwcount, defs, defcount, owner)
Guido van Rossumb209a111997-04-29 18:18:01 +0000344 PyCodeObject *co;
345 PyObject *globals;
346 PyObject *locals;
347 PyObject **args;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000348 int argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000349 PyObject **kws; /* length: 2*kwcount */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000350 int kwcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000351 PyObject **defs;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000352 int defcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000353 PyObject *owner;
Guido van Rossum374a9221991-04-04 10:40:29 +0000354{
Guido van Rossum950361c1997-01-24 13:49:28 +0000355#ifdef DXPAIRS
356 int lastopcode = 0;
357#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000358 register unsigned char *next_instr;
Guido van Rossum150b2df1996-12-05 23:17:11 +0000359 register int opcode = 0; /* Current opcode */
360 register int oparg = 0; /* Current opcode argument, if any */
Guido van Rossumb209a111997-04-29 18:18:01 +0000361 register PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000362 register enum why_code why; /* Reason for block stack unwind */
363 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000364 register PyObject *x; /* Result object -- NULL if error */
365 register PyObject *v; /* Temporary objects popped off stack */
366 register PyObject *w;
367 register PyObject *u;
368 register PyObject *t;
369 register PyFrameObject *f; /* Current frame */
370 register PyObject **fastlocals = NULL;
371 PyObject *retval = NULL; /* Return value */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000372 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum96a42c81992-01-12 02:29:51 +0000373#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000374 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000375#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000376#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000377 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000378 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000379#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000380
381/* Code access macros */
382
383#define GETCONST(i) Getconst(f, i)
384#define GETNAME(i) Getname(f, i)
385#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000386#define FIRST_INSTR() (GETUSTRINGVALUE(co->co_code))
Guido van Rossum374a9221991-04-04 10:40:29 +0000387#define INSTR_OFFSET() (next_instr - FIRST_INSTR())
388#define NEXTOP() (*next_instr++)
389#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
390#define JUMPTO(x) (next_instr = FIRST_INSTR() + (x))
391#define JUMPBY(x) (next_instr += (x))
392
393/* Stack manipulation macros */
394
395#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
396#define EMPTY() (STACK_LEVEL() == 0)
397#define TOP() (stack_pointer[-1])
398#define BASIC_PUSH(v) (*stack_pointer++ = (v))
399#define BASIC_POP() (*--stack_pointer)
400
Guido van Rossum96a42c81992-01-12 02:29:51 +0000401#ifdef LLTRACE
402#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
403#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000404#else
405#define PUSH(v) BASIC_PUSH(v)
406#define POP() BASIC_POP()
407#endif
408
Guido van Rossum681d79a1995-07-18 14:51:37 +0000409/* Local variable macros */
410
411#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000412#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000413 GETLOCAL(i) = value; } while (0)
414
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415/* Start of code */
416
Guido van Rossum8861b741996-07-30 16:49:37 +0000417#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000418 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000419 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000420 return NULL;
421 }
422#endif
423
Guido van Rossum681d79a1995-07-18 14:51:37 +0000424 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000425 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000426 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000427 }
428
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000429#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000430 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000431#endif
432
Guido van Rossumb209a111997-04-29 18:18:01 +0000433 f = PyFrame_New(
Guido van Rossuma027efa1997-05-05 20:56:21 +0000434 tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000435 co, /*code*/
436 globals, /*globals*/
Guido van Rossum76836021997-01-20 04:26:20 +0000437 locals); /*locals*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000438 if (f == NULL)
439 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440
Guido van Rossuma027efa1997-05-05 20:56:21 +0000441 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000442 fastlocals = f->f_localsplus;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000443
444 if (co->co_argcount > 0 ||
445 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
446 int i;
447 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000448 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000449 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000450 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000451 if (kwdict == NULL)
452 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000453 i = co->co_argcount;
454 if (co->co_flags & CO_VARARGS)
455 i++;
456 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000457 }
458 if (argcount > co->co_argcount) {
459 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000460 PyErr_SetString(PyExc_TypeError,
461 "too many arguments");
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 goto fail;
463 }
464 n = co->co_argcount;
465 }
466 for (i = 0; i < n; i++) {
467 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000468 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000469 SETLOCAL(i, x);
470 }
471 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000472 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000473 if (u == NULL)
474 goto fail;
475 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000476 for (i = n; i < argcount; i++) {
477 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000478 Py_INCREF(x);
479 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481 }
482 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000483 PyObject *keyword = kws[2*i];
484 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 int j;
486 /* XXX slow -- speed up using dictionary? */
487 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000488 PyObject *nm = PyTuple_GET_ITEM(
489 co->co_varnames, j);
Guido van Rossumb209a111997-04-29 18:18:01 +0000490 if (PyObject_Compare(keyword, nm) == 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491 break;
492 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000493 /* Check errors from Compare */
494 if (PyErr_Occurred())
495 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 if (j >= co->co_argcount) {
497 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 PyErr_Format(PyExc_TypeError,
Guido van Rossuma027efa1997-05-05 20:56:21 +0000499 "unexpected keyword argument: %.400s",
500 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000501 goto fail;
502 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000503 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000504 }
505 else {
506 if (GETLOCAL(j) != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000507 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000508 "keyword parameter redefined");
509 goto fail;
510 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000511 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000512 SETLOCAL(j, value);
513 }
514 }
515 if (argcount < co->co_argcount) {
516 int m = co->co_argcount - defcount;
517 for (i = argcount; i < m; i++) {
518 if (GETLOCAL(i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000519 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 "not enough arguments");
521 goto fail;
522 }
523 }
524 if (n > m)
525 i = n - m;
526 else
527 i = 0;
528 for (; i < defcount; i++) {
529 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000530 PyObject *def = defs[i];
531 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 SETLOCAL(m+i, def);
533 }
534 }
535 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000536 }
537 else {
538 if (argcount > 0 || kwcount > 0) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000539 PyErr_SetString(PyExc_TypeError,
540 "no arguments expected");
Guido van Rossum8c5df061997-01-24 04:19:24 +0000541 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000542 }
543 }
544
Guido van Rossuma027efa1997-05-05 20:56:21 +0000545 if (tstate->sys_tracefunc != NULL) {
546 /* tstate->sys_tracefunc, if defined, is a function that
547 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000548 Its return value, if not None, is a function that
549 will be called at the start of each executed line
550 of code. (Actually, the function must return
551 itself in order to continue tracing.)
552 The trace functions are called with three arguments:
553 a pointer to the current frame, a string indicating
554 why the function is called, and an argument which
555 depends on the situation. The global trace function
556 (sys.trace) is also called whenever an exception
557 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000558 if (call_trace(&tstate->sys_tracefunc,
559 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000560 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000561 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000562 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000563 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000564 }
565
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->sys_profilefunc != NULL) {
567 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000568 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000569 if (call_trace(&tstate->sys_profilefunc,
570 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000571 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000572 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000573 }
574 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000575
Guido van Rossuma027efa1997-05-05 20:56:21 +0000576 if (++tstate->recursion_depth > MAX_RECURSION_DEPTH) {
577 --tstate->recursion_depth;
578 PyErr_SetString(PyExc_RuntimeError,
579 "Maximum recursion depth exceeded");
580 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000581 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000582 return NULL;
583 }
584
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000585 next_instr = GETUSTRINGVALUE(co->co_code);
Guido van Rossum374a9221991-04-04 10:40:29 +0000586 stack_pointer = f->f_valuestack;
587
Guido van Rossum374a9221991-04-04 10:40:29 +0000588 why = WHY_NOT;
589 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000590 x = Py_None; /* Not a reference, just anything non-NULL */
Guido van Rossum374a9221991-04-04 10:40:29 +0000591
592 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000593 /* Do periodic things. Doing this every time through
594 the loop would add too much overhead, so we do it
595 only every Nth instruction. We also do it if
596 ``things_to_do'' is set, i.e. when an asynchronous
597 event needs attention (e.g. a signal handler or
598 async I/O handler); see Py_AddPendingCall() and
599 Py_MakePendingCalls() above. */
Guido van Rossuma9672091994-09-14 13:31:22 +0000600
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000602 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000604 if (Py_MakePendingCalls() < 0) {
605 why = WHY_EXCEPTION;
606 goto on_error;
607 }
608 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000609#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000610 /* If we have true signals, the signal handler
611 will call Py_AddPendingCall() so we don't
612 have to call sigcheck(). On the Mac and
613 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000614 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000615 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000616 goto on_error;
617 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000618#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619
Guido van Rossume59214e1994-08-30 08:01:59 +0000620#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000621 if (interpreter_lock) {
622 /* Give another thread a chance */
623
Guido van Rossum25ce5661997-08-02 03:10:38 +0000624 if (PyThreadState_Swap(NULL) != tstate)
625 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000626 release_lock(interpreter_lock);
627
628 /* Other threads may run now */
629
630 acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000631 if (PyThreadState_Swap(tstate) != NULL)
632 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000633 }
634#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000635 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000636
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000638
Guido van Rossum408027e1996-12-30 16:17:54 +0000639#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000640 f->f_lasti = INSTR_OFFSET();
641#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000642
643 opcode = NEXTOP();
644 if (HAS_ARG(opcode))
645 oparg = NEXTARG();
Guido van Rossum950361c1997-01-24 13:49:28 +0000646#ifdef DYNAMIC_EXECUTION_PROFILE
647#ifdef DXPAIRS
648 dxpairs[lastopcode][opcode]++;
649 lastopcode = opcode;
650#endif
651 dxp[opcode]++;
652#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000653
Guido van Rossum96a42c81992-01-12 02:29:51 +0000654#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000655 /* Instruction tracing */
656
Guido van Rossum96a42c81992-01-12 02:29:51 +0000657 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 if (HAS_ARG(opcode)) {
659 printf("%d: %d, %d\n",
660 (int) (INSTR_OFFSET() - 3),
661 opcode, oparg);
662 }
663 else {
664 printf("%d: %d\n",
665 (int) (INSTR_OFFSET() - 1), opcode);
666 }
667 }
668#endif
669
670 /* Main switch on opcode */
671
672 switch (opcode) {
673
674 /* BEWARE!
675 It is essential that any operation that fails sets either
676 x to NULL, err to nonzero, or why to anything but WHY_NOT,
677 and that no operation that succeeds does this! */
678
679 /* case STOP_CODE: this is an error! */
680
681 case POP_TOP:
682 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000683 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000684 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685
686 case ROT_TWO:
687 v = POP();
688 w = POP();
689 PUSH(v);
690 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000691 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000692
693 case ROT_THREE:
694 v = POP();
695 w = POP();
696 x = POP();
697 PUSH(v);
698 PUSH(x);
699 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000700 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000701
702 case DUP_TOP:
703 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000704 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000705 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000706 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000707
708 case UNARY_POSITIVE:
709 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000710 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000711 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000713 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 break;
715
716 case UNARY_NEGATIVE:
717 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000718 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000719 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000720 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000721 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000722 break;
723
724 case UNARY_NOT:
725 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000726 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000727 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000728 if (err == 0) {
729 Py_INCREF(Py_True);
730 PUSH(Py_True);
731 continue;
732 }
733 else if (err > 0) {
734 Py_INCREF(Py_False);
735 PUSH(Py_False);
736 err = 0;
737 continue;
738 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000739 break;
740
741 case UNARY_CONVERT:
742 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000743 x = PyObject_Repr(v);
744 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000747 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000748
749 case UNARY_INVERT:
750 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000751 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000752 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000754 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000755 break;
Guido van Rossum374a9221991-04-04 10:40:29 +0000756
Guido van Rossum50564e81996-01-12 01:13:16 +0000757 case BINARY_POWER:
758 w = POP();
759 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000760 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000761 Py_DECREF(v);
762 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000763 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000764 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000765 break;
766
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 case BINARY_MULTIPLY:
768 w = POP();
769 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000770 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000771 Py_DECREF(v);
772 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000773 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000774 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000775 break;
776
777 case BINARY_DIVIDE:
778 w = POP();
779 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000780 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000781 Py_DECREF(v);
782 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000783 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000784 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000785 break;
786
787 case BINARY_MODULO:
788 w = POP();
789 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000790 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000791 Py_DECREF(v);
792 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000793 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000794 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000795 break;
796
797 case BINARY_ADD:
798 w = POP();
799 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000800 if (PyInt_Check(v) && PyInt_Check(w)) {
801 /* INLINE: int + int */
802 register long a, b, i;
803 a = ((PyIntObject*) v)->ob_ival;
804 b = ((PyIntObject*) w)->ob_ival;
805 i = a + b;
806 if ((i^a) < 0 && (i^b) < 0) {
807 PyErr_SetString(PyExc_OverflowError,
808 "integer addition");
809 x = NULL;
810 }
811 else
812 x = PyInt_FromLong(i);
813 }
814 else
815 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000816 Py_DECREF(v);
817 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000819 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000820 break;
821
822 case BINARY_SUBTRACT:
823 w = POP();
824 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000825 if (PyInt_Check(v) && PyInt_Check(w)) {
826 /* INLINE: int - int */
827 register long a, b, i;
828 a = ((PyIntObject*) v)->ob_ival;
829 b = ((PyIntObject*) w)->ob_ival;
830 i = a - b;
831 if ((i^a) < 0 && (i^~b) < 0) {
832 PyErr_SetString(PyExc_OverflowError,
833 "integer subtraction");
834 x = NULL;
835 }
836 else
837 x = PyInt_FromLong(i);
838 }
839 else
840 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000841 Py_DECREF(v);
842 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000844 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 break;
846
847 case BINARY_SUBSCR:
848 w = POP();
849 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000850 if (PyList_Check(v) && PyInt_Check(w)) {
851 /* INLINE: list[int] */
852 long i = PyInt_AsLong(w);
853 if (i < 0)
854 i += ((PyListObject*) v)->ob_size;
855 if (i < 0 ||
856 i >= ((PyListObject*) v)->ob_size) {
857 PyErr_SetString(PyExc_IndexError,
858 "list index out of range");
859 x = NULL;
860 }
861 else {
862 x = ((PyListObject*) v)->ob_item[i];
863 Py_INCREF(x);
864 }
865 }
866 else
867 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000868 Py_DECREF(v);
869 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000871 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000872 break;
873
Guido van Rossum7928cd71991-10-24 14:59:31 +0000874 case BINARY_LSHIFT:
875 w = POP();
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
879 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000880 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000881 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 break;
883
884 case BINARY_RSHIFT:
885 w = POP();
886 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000887 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000888 Py_DECREF(v);
889 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000892 break;
893
894 case BINARY_AND:
895 w = POP();
896 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000897 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000898 Py_DECREF(v);
899 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000900 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000901 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000902 break;
903
904 case BINARY_XOR:
905 w = POP();
906 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000907 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000908 Py_DECREF(v);
909 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000910 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000911 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000912 break;
913
914 case BINARY_OR:
915 w = POP();
916 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000917 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000918 Py_DECREF(v);
919 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000920 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000921 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000922 break;
923
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 case SLICE+0:
925 case SLICE+1:
926 case SLICE+2:
927 case SLICE+3:
928 if ((opcode-SLICE) & 2)
929 w = POP();
930 else
931 w = NULL;
932 if ((opcode-SLICE) & 1)
933 v = POP();
934 else
935 v = NULL;
936 u = POP();
937 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000938 Py_DECREF(u);
939 Py_XDECREF(v);
940 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000942 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 break;
944
945 case STORE_SLICE+0:
946 case STORE_SLICE+1:
947 case STORE_SLICE+2:
948 case STORE_SLICE+3:
949 if ((opcode-STORE_SLICE) & 2)
950 w = POP();
951 else
952 w = NULL;
953 if ((opcode-STORE_SLICE) & 1)
954 v = POP();
955 else
956 v = NULL;
957 u = POP();
958 t = POP();
959 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +0000960 Py_DECREF(t);
961 Py_DECREF(u);
962 Py_XDECREF(v);
963 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000964 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 break;
966
967 case DELETE_SLICE+0:
968 case DELETE_SLICE+1:
969 case DELETE_SLICE+2:
970 case DELETE_SLICE+3:
971 if ((opcode-DELETE_SLICE) & 2)
972 w = POP();
973 else
974 w = NULL;
975 if ((opcode-DELETE_SLICE) & 1)
976 v = POP();
977 else
978 v = NULL;
979 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000980 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(u);
983 Py_XDECREF(v);
984 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000986 break;
987
988 case STORE_SUBSCR:
989 w = POP();
990 v = POP();
991 u = POP();
992 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +0000993 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +0000994 Py_DECREF(u);
995 Py_DECREF(v);
996 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000997 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 break;
999
1000 case DELETE_SUBSCR:
1001 w = POP();
1002 v = POP();
1003 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001004 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001005 Py_DECREF(v);
1006 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001007 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001008 break;
1009
1010 case PRINT_EXPR:
1011 v = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001012 /* Print value except if procedure result */
Guido van Rossume59214e1994-08-30 08:01:59 +00001013 /* Before printing, also assign to '_' */
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 if (v != Py_None &&
Guido van Rossuma027efa1997-05-05 20:56:21 +00001015 (err = PyDict_SetItemString(
Guido van Rossum9cc8a201997-07-19 19:55:50 +00001016 f->f_builtins, "_", v)) == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001017 err = Py_FlushLine();
Guido van Rossumc12da691997-07-17 23:12:42 +00001018 if (err == 0) {
Guido van Rossumbe270261997-05-22 22:26:18 +00001019 x = PySys_GetObject("stdout");
1020 if (x == NULL)
1021 err = -1;
1022 }
1023 if (err == 0)
1024 err = PyFile_WriteObject(v, x, 0);
1025 if (err == 0) {
1026 PyFile_SoftSpace(x, 1);
1027 err = Py_FlushLine();
1028 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001030 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 break;
1032
1033 case PRINT_ITEM:
1034 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001035 w = PySys_GetObject("stdout");
1036 if (PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001037 err = PyFile_WriteString(" ", w);
1038 if (err == 0)
1039 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001040 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001041 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001042 char *s = PyString_AsString(v);
1043 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001044 if (len > 0 &&
1045 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001046 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001048 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001049 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001050 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001051 break;
1052
1053 case PRINT_NEWLINE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001054 x = PySys_GetObject("stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001055 if (x == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00001056 PyErr_SetString(PyExc_RuntimeError,
1057 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001058 else {
Guido van Rossumbe270261997-05-22 22:26:18 +00001059 err = PyFile_WriteString("\n", x);
1060 if (err == 0)
1061 PyFile_SoftSpace(x, 0);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001062 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001063 break;
1064
1065 case BREAK_LOOP:
1066 why = WHY_BREAK;
1067 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001068
Guido van Rossumf10570b1995-07-07 22:53:21 +00001069 case RAISE_VARARGS:
1070 u = v = w = NULL;
1071 switch (oparg) {
1072 case 3:
1073 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001074 /* Fallthrough */
1075 case 2:
1076 v = POP(); /* value */
1077 /* Fallthrough */
1078 case 1:
1079 w = POP(); /* exc */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001080 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001081 break;
1082 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001083 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001084 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001085 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001086 break;
1087 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001088 break;
1089
1090 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001091 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001092 PyErr_SetString(PyExc_SystemError,
1093 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001094 break;
1095 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001096 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001097 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001098 break;
1099
1100 case RETURN_VALUE:
1101 retval = POP();
1102 why = WHY_RETURN;
1103 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001104
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001105 case EXEC_STMT:
1106 w = POP();
1107 v = POP();
1108 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001109 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001110 Py_DECREF(u);
1111 Py_DECREF(v);
1112 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001113 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001114
Guido van Rossum374a9221991-04-04 10:40:29 +00001115 case POP_BLOCK:
1116 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001117 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001118 while (STACK_LEVEL() > b->b_level) {
1119 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001120 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001121 }
1122 }
1123 break;
1124
1125 case END_FINALLY:
1126 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001127 if (PyInt_Check(v)) {
1128 why = (enum why_code) PyInt_AsLong(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001129 if (why == WHY_RETURN)
1130 retval = POP();
1131 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001132 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001133 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001134 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001135 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001136 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001137 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001138 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001139 else if (v != Py_None) {
1140 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001141 "'finally' pops bad exception");
1142 why = WHY_EXCEPTION;
1143 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001144 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001145 break;
1146
1147 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001148 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001149 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001150 w = POP();
1151 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001152 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001153 Py_DECREF(u);
1154 Py_DECREF(v);
1155 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001156 break;
1157
1158 case STORE_NAME:
1159 w = GETNAMEV(oparg);
1160 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001161 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001162 PyErr_SetString(PyExc_SystemError,
1163 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001164 break;
1165 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001166 err = PyDict_SetItem(x, w, v);
1167 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001168 break;
1169
1170 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001171 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001172 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001173 PyErr_SetString(PyExc_SystemError,
1174 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001175 break;
1176 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001177 if ((err = PyDict_DelItem(x, w)) != 0)
1178 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001180
1181#ifdef CASE_TOO_BIG
1182 default: switch (opcode) {
1183#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001184
1185 case UNPACK_TUPLE:
1186 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001187 if (!PyTuple_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001188 PyErr_SetString(PyExc_TypeError,
1189 "unpack non-tuple");
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 why = WHY_EXCEPTION;
1191 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001192 else if (PyTuple_Size(v) != oparg) {
1193 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001194 "unpack tuple of wrong size");
1195 why = WHY_EXCEPTION;
1196 }
1197 else {
1198 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001199 w = PyTuple_GET_ITEM(v, oparg);
1200 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 PUSH(w);
1202 }
1203 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001204 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001205 break;
1206
1207 case UNPACK_LIST:
1208 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001209 if (!PyList_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001210 PyErr_SetString(PyExc_TypeError,
1211 "unpack non-list");
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 why = WHY_EXCEPTION;
1213 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001214 else if (PyList_Size(v) != oparg) {
1215 PyErr_SetString(PyExc_ValueError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001216 "unpack list of wrong size");
1217 why = WHY_EXCEPTION;
1218 }
1219 else {
1220 for (; --oparg >= 0; ) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001221 w = PyList_GetItem(v, oparg);
1222 Py_INCREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001223 PUSH(w);
1224 }
1225 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001227 break;
1228
1229 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001230 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 v = POP();
1232 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001233 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1234 Py_DECREF(v);
1235 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 break;
1237
1238 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001239 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001240 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001241 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1242 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001243 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 break;
1245
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001246 case STORE_GLOBAL:
1247 w = GETNAMEV(oparg);
1248 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 err = PyDict_SetItem(f->f_globals, w, v);
1250 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001251 break;
1252
1253 case DELETE_GLOBAL:
1254 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001255 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
1256 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001257 break;
1258
Guido van Rossum374a9221991-04-04 10:40:29 +00001259 case LOAD_CONST:
1260 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001261 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001262 PUSH(x);
1263 break;
1264
1265 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001266 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001267 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001268 PyErr_SetString(PyExc_SystemError,
1269 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001270 break;
1271 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001272 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001273 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 PyErr_Clear();
1275 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001277 PyErr_Clear();
1278 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 if (x == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001280 PyErr_SetObject(
1281 PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001282 break;
1283 }
1284 }
1285 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001286 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001287 PUSH(x);
1288 break;
1289
1290 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001291 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001293 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001294 PyErr_Clear();
1295 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001297 PyErr_SetObject(PyExc_NameError, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
1299 }
1300 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001301 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001302 PUSH(x);
1303 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001304
Guido van Rossum9bfef441993-03-29 10:43:31 +00001305 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001306 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001307 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001308 PyErr_SetObject(PyExc_NameError,
1309 PyTuple_GetItem(co->co_varnames,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001310 oparg));
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001311 break;
1312 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001313 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001314 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001315 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001316 break;
1317
1318 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001319 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001320 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001321 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001322
1323 case DELETE_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001324 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001325 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001326
1327 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 if (x != NULL) {
1330 for (; --oparg >= 0;) {
1331 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001332 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001333 }
1334 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001335 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001336 }
1337 break;
1338
1339 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001340 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 if (x != NULL) {
1342 for (; --oparg >= 0;) {
1343 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001344 err = PyList_SetItem(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001345 if (err != 0)
1346 break;
1347 }
1348 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001349 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001350 }
1351 break;
1352
1353 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001356 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 break;
1358
1359 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001360 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 x = PyObject_GetAttr(v, w);
1363 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001364 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001365 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001366 break;
1367
1368 case COMPARE_OP:
1369 w = POP();
1370 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001371 if (PyInt_Check(v) && PyInt_Check(w)) {
1372 /* INLINE: cmp(int, int) */
1373 register long a, b;
1374 register int res;
1375 a = ((PyIntObject*) v)->ob_ival;
1376 b = ((PyIntObject*) w)->ob_ival;
1377 switch (oparg) {
1378 case LT: res = a < b; break;
1379 case LE: res = a <= b; break;
1380 case EQ: res = a == b; break;
1381 case NE: res = a != b; break;
1382 case GT: res = a > b; break;
1383 case GE: res = a >= b; break;
1384 case IS: res = v == w; break;
1385 case IS_NOT: res = v != w; break;
1386 default: goto slow_compare;
1387 }
1388 x = res ? Py_True : Py_False;
1389 Py_INCREF(x);
1390 }
1391 else {
1392 slow_compare:
1393 x = cmp_outcome(oparg, v, w);
1394 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_DECREF(v);
1396 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001398 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 break;
1400
1401 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001402 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001403 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001405 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001406 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001407 break;
1408 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 if (PyCFunction_Check(x)) {
1410 u = Py_None;
1411 Py_INCREF(u);
Guido van Rossum24c13741995-02-14 09:42:43 +00001412 }
1413 else {
1414 u = find_from_args(f, INSTR_OFFSET());
1415 if (u == NULL) {
1416 x = u;
1417 break;
1418 }
1419 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001420 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001421 w,
1422 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001423 f->f_locals == NULL ?
1424 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001425 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001427 if (w == NULL) {
1428 x = NULL;
1429 break;
1430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001431 x = PyEval_CallObject(x, w);
1432 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001433 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001434 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 break;
1436
1437 case IMPORT_FROM:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001438 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001441 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001442 PyErr_SetString(PyExc_SystemError,
1443 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001444 break;
1445 }
1446 err = import_from(x, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001447 PyFrame_LocalsToFast(f, 0);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001448 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001450
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 case JUMP_FORWARD:
1452 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001453 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001454
1455 case JUMP_IF_FALSE:
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;
1459 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001460 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001461 else
1462 break;
1463 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001464
1465 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001466 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001467 if (err > 0) {
1468 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001470 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001471 else if (err == 0)
1472 ;
1473 else
1474 break;
1475 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001476
1477 case JUMP_ABSOLUTE:
1478 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001479 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001480
1481 case FOR_LOOP:
1482 /* for v in s: ...
1483 On entry: stack contains s, i.
1484 On exit: stack contains s, i+1, s[i];
1485 but if loop exhausted:
1486 s, i are popped, and we jump */
1487 w = POP(); /* Loop index */
1488 v = POP(); /* Sequence object */
1489 u = loop_subscript(v, w);
1490 if (u != NULL) {
1491 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001492 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001494 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001495 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001496 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 }
1498 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001499 Py_DECREF(v);
1500 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001501 /* A NULL can mean "s exhausted"
1502 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001505 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001507 continue;
1508 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 }
1510 break;
1511
1512 case SETUP_LOOP:
1513 case SETUP_EXCEPT:
1514 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001515 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001517 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001518
1519 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001520#ifdef LLTRACE
1521 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001522 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001523#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001524 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001525 if (f->f_trace == NULL)
1526 continue;
1527 /* Trace each line of code reached */
1528 f->f_lasti = INSTR_OFFSET();
1529 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001530 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001532
1533 case CALL_FUNCTION:
1534 {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001535 int na = oparg & 0xff;
1536 int nk = (oparg>>8) & 0xff;
1537 int n = na + 2*nk;
Guido van Rossumb209a111997-04-29 18:18:01 +00001538 PyObject **pfunc = stack_pointer - n - 1;
1539 PyObject *func = *pfunc;
1540 PyObject *self = NULL;
1541 PyObject *class = NULL;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001542 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 if (PyMethod_Check(func)) {
1544 self = PyMethod_Self(func);
1545 class = PyMethod_Class(func);
1546 func = PyMethod_Function(func);
1547 Py_INCREF(func);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001548 if (self != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 Py_INCREF(self);
1550 Py_DECREF(*pfunc);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001551 *pfunc = self;
1552 na++;
1553 n++;
1554 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001555 else {
1556 /* Unbound methods must be
1557 called with an instance of
1558 the class (or a derived
1559 class) as first argument */
1560 if (na > 0 &&
1561 (self = stack_pointer[-n])
1562 != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00001563 PyInstance_Check(self) &&
1564 PyClass_IsSubclass(
1565 (PyObject *)
1566 (((PyInstanceObject *)self)
Guido van Rossum681d79a1995-07-18 14:51:37 +00001567 ->in_class),
1568 class))
1569 /* Handy-dandy */ ;
1570 else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001571 PyErr_SetString(
1572 PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001573 "unbound method must be called with class instance 1st argument");
Guido van Rossum72b56e81995-12-10 04:57:42 +00001574 x = NULL;
1575 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001576 }
1577 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001578 }
1579 else
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 Py_INCREF(func);
1581 if (PyFunction_Check(func)) {
1582 PyObject *co = PyFunction_GetCode(func);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001583 PyObject *globals =
1584 PyFunction_GetGlobals(func);
1585 PyObject *argdefs =
1586 PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 PyObject **d;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001588 int nd;
1589 if (argdefs != NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 d = &PyTuple_GET_ITEM(argdefs, 0);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001591 nd = ((PyTupleObject *)argdefs) ->
1592 ob_size;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 }
1594 else {
1595 d = NULL;
1596 nd = 0;
1597 }
1598 x = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 (PyCodeObject *)co,
1600 globals, (PyObject *)NULL,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 stack_pointer-n, na,
1602 stack_pointer-2*nk, nk,
1603 d, nd,
1604 class);
1605 }
1606 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 PyObject *args = PyTuple_New(na);
1608 PyObject *kwdict = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001609 if (args == NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001610 x = NULL;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001611 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001613 if (nk > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001614 kwdict = PyDict_New();
Guido van Rossumff8b4941995-07-26 18:16:42 +00001615 if (kwdict == NULL) {
1616 x = NULL;
1617 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001618 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001619 err = 0;
1620 while (--nk >= 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001621 PyObject *value = POP();
1622 PyObject *key = POP();
1623 err = PyDict_SetItem(
Guido van Rossumff8b4941995-07-26 18:16:42 +00001624 kwdict, key, value);
Guido van Rossumb209a111997-04-29 18:18:01 +00001625 Py_DECREF(key);
1626 Py_DECREF(value);
Guido van Rossumd0eb4291997-01-27 21:30:09 +00001627 if (err)
Guido van Rossumff8b4941995-07-26 18:16:42 +00001628 break;
Guido van Rossumff8b4941995-07-26 18:16:42 +00001629 }
1630 if (err) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 Py_DECREF(args);
1632 Py_DECREF(kwdict);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001633 break;
1634 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001635 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00001636 while (--na >= 0) {
1637 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001638 PyTuple_SET_ITEM(args, na, w);
Guido van Rossumff8b4941995-07-26 18:16:42 +00001639 }
1640 x = PyEval_CallObjectWithKeywords(
1641 func, args, kwdict);
Guido van Rossumb209a111997-04-29 18:18:01 +00001642 Py_DECREF(args);
1643 Py_XDECREF(kwdict);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 Py_DECREF(func);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001646 while (stack_pointer > pfunc) {
1647 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001648 Py_DECREF(w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001649 }
1650 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001651 if (x != NULL) continue;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001652 break;
1653 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001654
Guido van Rossum681d79a1995-07-18 14:51:37 +00001655 case MAKE_FUNCTION:
1656 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 x = PyFunction_New(v, f->f_globals);
1658 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001659 /* XXX Maybe this should be a separate opcode? */
1660 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001662 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001663 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001664 x = NULL;
1665 break;
1666 }
1667 while (--oparg >= 0) {
1668 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001670 }
1671 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001673 }
1674 PUSH(x);
1675 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001676
1677 case BUILD_SLICE:
1678 if (oparg == 3)
1679 w = POP();
1680 else
1681 w = NULL;
1682 v = POP();
1683 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00001684 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001685 Py_DECREF(u);
1686 Py_DECREF(v);
1687 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00001688 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001689 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00001690 break;
1691
1692
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 default:
1694 fprintf(stderr,
1695 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00001696 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00001697 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 why = WHY_EXCEPTION;
1699 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001700
1701#ifdef CASE_TOO_BIG
1702 }
1703#endif
1704
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 } /* switch */
1706
1707 on_error:
1708
1709 /* Quickly continue if no error occurred */
1710
1711 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001712 if (err == 0 && x != NULL) {
1713#ifdef CHECKEXC
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00001715 fprintf(stderr,
1716 "XXX undetected error\n");
1717 else
1718#endif
1719 continue; /* Normal, fast path */
1720 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00001723 err = 0;
1724 }
1725
Guido van Rossum801dcae1992-04-08 11:32:32 +00001726#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 /* Double-check exception status */
1728
1729 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 if (!PyErr_Occurred()) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 fprintf(stderr, "XXX ghost error\n");
Guido van Rossuma027efa1997-05-05 20:56:21 +00001732 PyErr_SetString(PyExc_SystemError,
1733 "ghost error");
Guido van Rossum374a9221991-04-04 10:40:29 +00001734 why = WHY_EXCEPTION;
1735 }
1736 }
1737 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001738 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001739 fprintf(stderr,
1740 "XXX undetected error (why=%d)\n",
1741 why);
1742 why = WHY_EXCEPTION;
1743 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 }
1745#endif
1746
1747 /* Log traceback info if this is a real exception */
1748
1749 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001750 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00001752 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00001753 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001754
Guido van Rossume59214e1994-08-30 08:01:59 +00001755 if (f->f_trace)
1756 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001757 if (tstate->sys_profilefunc)
1758 call_exc_trace(&tstate->sys_profilefunc,
1759 (PyObject**)0, f);
1760}
Guido van Rossum374a9221991-04-04 10:40:29 +00001761
1762 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
1763
1764 if (why == WHY_RERAISE)
1765 why = WHY_EXCEPTION;
1766
1767 /* Unwind stacks if a (pseudo) exception occurred */
1768
1769 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001770 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 while (STACK_LEVEL() > b->b_level) {
1772 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001773 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 }
1775 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
1776 why = WHY_NOT;
1777 JUMPTO(b->b_handler);
1778 break;
1779 }
1780 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00001781 (b->b_type == SETUP_EXCEPT &&
1782 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 PyObject *exc, *val, *tb;
1785 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001787 val = Py_None;
1788 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 /* Make the raw exception data
1791 available to the handler,
1792 so a program can emulate the
1793 Python main loop. Don't do
1794 this for 'finally'. */
1795 if (b->b_type == SETUP_EXCEPT) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001796 set_exc_info(tstate,
1797 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001799 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00001800 PUSH(val);
1801 PUSH(exc);
1802 }
1803 else {
1804 if (why == WHY_RETURN)
1805 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 PUSH(v);
1808 }
1809 why = WHY_NOT;
1810 JUMPTO(b->b_handler);
1811 break;
1812 }
1813 } /* unwind stack */
1814
1815 /* End the loop if we still have an error (or return) */
1816
1817 if (why != WHY_NOT)
1818 break;
1819
1820 } /* main loop */
1821
1822 /* Pop remaining stack entries */
1823
1824 while (!EMPTY()) {
1825 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001827 }
1828
Guido van Rossum96a42c81992-01-12 02:29:51 +00001829 if (why != WHY_RETURN)
1830 retval = NULL;
1831
Guido van Rossume59214e1994-08-30 08:01:59 +00001832 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00001833 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00001834 if (call_trace(&f->f_trace, &f->f_trace, f,
1835 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00001837 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001838 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00001839 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001840 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001841 }
1842
Guido van Rossuma027efa1997-05-05 20:56:21 +00001843 if (tstate->sys_profilefunc && why == WHY_RETURN) {
1844 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001845 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00001847 retval = NULL;
1848 why = WHY_EXCEPTION;
1849 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00001850 }
Guido van Rossuma4240131997-01-21 21:18:36 +00001851
Guido van Rossuma027efa1997-05-05 20:56:21 +00001852 reset_exc_info(tstate);
1853
1854 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00001855
1856 fail: /* Jump here from prelude on failure */
Guido van Rossum96a42c81992-01-12 02:29:51 +00001857
Guido van Rossum374a9221991-04-04 10:40:29 +00001858 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001859
Guido van Rossuma027efa1997-05-05 20:56:21 +00001860 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00001861 Py_DECREF(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001862
Guido van Rossum96a42c81992-01-12 02:29:51 +00001863 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00001864}
1865
Guido van Rossuma027efa1997-05-05 20:56:21 +00001866static void
1867set_exc_info(tstate, type, value, tb)
1868 PyThreadState *tstate;
1869 PyObject *type;
1870 PyObject *value;
1871 PyObject *tb;
1872{
1873 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001874 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001875 frame = tstate->frame;
1876 if (frame->f_exc_type == NULL) {
1877 /* This frame didn't catch an exception before */
1878 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00001879 if (tstate->exc_type == NULL) {
1880 Py_INCREF(Py_None);
1881 tstate->exc_type = Py_None;
1882 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001883 tmp_type = frame->f_exc_type;
1884 tmp_value = frame->f_exc_value;
1885 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001886 Py_XINCREF(tstate->exc_type);
1887 Py_XINCREF(tstate->exc_value);
1888 Py_XINCREF(tstate->exc_traceback);
1889 frame->f_exc_type = tstate->exc_type;
1890 frame->f_exc_value = tstate->exc_value;
1891 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001892 Py_XDECREF(tmp_type);
1893 Py_XDECREF(tmp_value);
1894 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001895 }
1896 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001897 tmp_type = tstate->exc_type;
1898 tmp_value = tstate->exc_value;
1899 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001900 Py_XINCREF(type);
1901 Py_XINCREF(value);
1902 Py_XINCREF(tb);
1903 tstate->exc_type = type;
1904 tstate->exc_value = value;
1905 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001906 Py_XDECREF(tmp_type);
1907 Py_XDECREF(tmp_value);
1908 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001909 /* For b/w compatibility */
1910 PySys_SetObject("exc_type", type);
1911 PySys_SetObject("exc_value", value);
1912 PySys_SetObject("exc_traceback", tb);
1913}
1914
1915static void
1916reset_exc_info(tstate)
1917 PyThreadState *tstate;
1918{
1919 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001920 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001921 frame = tstate->frame;
1922 if (frame->f_exc_type != NULL) {
1923 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001924 tmp_type = tstate->exc_type;
1925 tmp_value = tstate->exc_value;
1926 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001927 Py_XINCREF(frame->f_exc_type);
1928 Py_XINCREF(frame->f_exc_value);
1929 Py_XINCREF(frame->f_exc_traceback);
1930 tstate->exc_type = frame->f_exc_type;
1931 tstate->exc_value = frame->f_exc_value;
1932 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001933 Py_XDECREF(tmp_type);
1934 Py_XDECREF(tmp_value);
1935 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001936 /* For b/w compatibility */
1937 PySys_SetObject("exc_type", frame->f_exc_type);
1938 PySys_SetObject("exc_value", frame->f_exc_value);
1939 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
1940 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001941 tmp_type = frame->f_exc_type;
1942 tmp_value = frame->f_exc_value;
1943 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00001944 frame->f_exc_type = NULL;
1945 frame->f_exc_value = NULL;
1946 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00001947 Py_XDECREF(tmp_type);
1948 Py_XDECREF(tmp_value);
1949 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00001950}
1951
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001952/* Logic for the raise statement (too complicated for inlining).
1953 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00001954static enum why_code
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001955do_raise(type, value, tb)
Guido van Rossumb209a111997-04-29 18:18:01 +00001956 PyObject *type, *value, *tb;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001957{
1958 /* We support the following forms of raise:
1959 raise <class>, <classinstance>
1960 raise <class>, <argument tuple>
1961 raise <class>, None
1962 raise <class>, <argument>
1963 raise <classinstance>, None
1964 raise <string>, <object>
1965 raise <string>, None
1966
1967 An omitted second argument is the same as None.
1968
1969 In addition, raise <tuple>, <anything> is the same as
1970 raising the tuple's first item (and it better have one!);
1971 this rule is applied recursively.
1972
1973 Finally, an optional third argument can be supplied, which
1974 gives the traceback to be substituted (useful when
1975 re-raising an exception after examining it). */
1976
1977 /* First, check the traceback argument, replacing None with
1978 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 if (tb == Py_None) {
1980 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001981 tb = NULL;
1982 }
1983 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001984 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001985 "raise 3rd arg must be traceback or None");
1986 goto raise_error;
1987 }
1988
1989 /* Next, replace a missing value with None */
1990 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 value = Py_None;
1992 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001993 }
1994
1995 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
1997 PyObject *tmp = type;
1998 type = PyTuple_GET_ITEM(type, 0);
1999 Py_INCREF(type);
2000 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002001 }
2002
2003 /* Now switch on the exception's type */
Guido van Rossumb209a111997-04-29 18:18:01 +00002004 if (PyString_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002005 ;
2006 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002007 else if (PyClass_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002008 /* Raising a class. If the value is an instance, it
2009 better be an instance of the class. If it is not,
2010 it will be used to create an instance. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002011 if (PyInstance_Check(value)) {
2012 PyObject *inclass = (PyObject*)
2013 (((PyInstanceObject*)value)->in_class);
2014 if (!PyClass_IsSubclass(inclass, type)) {
2015 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002016 "raise <class>, <instance> requires that <instance> is a member of <class>");
2017 goto raise_error;
2018 }
2019 }
2020 else {
2021 /* Go instantiate the class */
Guido van Rossumb209a111997-04-29 18:18:01 +00002022 PyObject *args, *res;
2023 if (value == Py_None)
2024 args = Py_BuildValue("()");
2025 else if (PyTuple_Check(value)) {
2026 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002027 args = value;
2028 }
2029 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002030 args = Py_BuildValue("(O)", value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002031 if (args == NULL)
2032 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00002033 res = PyEval_CallObject(type, args);
2034 Py_DECREF(args);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002035 if (res == NULL)
2036 goto raise_error;
Guido van Rossumb209a111997-04-29 18:18:01 +00002037 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002038 value = res;
2039 }
2040 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002041 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002042 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002043 if (value != Py_None) {
2044 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002045 "instance exception may not have a separate value");
2046 goto raise_error;
2047 }
2048 else {
2049 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002051 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002052 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2053 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002054 }
2055 }
2056 else {
2057 /* Not something you can raise. You get an exception
2058 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002059 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002060 "exceptions must be strings, classes, or instances");
2061 goto raise_error;
2062 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002064 if (tb == NULL)
2065 return WHY_EXCEPTION;
2066 else
2067 return WHY_RERAISE;
2068 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002069 Py_XDECREF(value);
2070 Py_XDECREF(type);
2071 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002072 return WHY_EXCEPTION;
2073}
2074
Guido van Rossum96a42c81992-01-12 02:29:51 +00002075#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002076static int
2077prtrace(v, str)
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002079 char *str;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002081 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002082 if (PyObject_Print(v, stdout, 0) != 0)
2083 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002084 printf("\n");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002086#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002088static void
2089call_exc_trace(p_trace, p_newtrace, f)
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 PyObject **p_trace, **p_newtrace;
2091 PyFrameObject *f;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002092{
Guido van Rossumb209a111997-04-29 18:18:01 +00002093 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002094 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002095 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002096 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 value = Py_None;
2098 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002099 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002101 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002103 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002104 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002105 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002106 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002107 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002109 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002110 Py_XDECREF(type);
2111 Py_XDECREF(value);
2112 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002113 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002114}
2115
2116static int
2117call_trace(p_trace, p_newtrace, f, msg, arg)
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 PyObject **p_trace; /* in/out; may not be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002119 may not point to NULL variable initially */
Guido van Rossumb209a111997-04-29 18:18:01 +00002120 PyObject **p_newtrace; /* in/out; may be NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002121 may point to NULL variable;
2122 may be same variable as p_newtrace */
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 PyFrameObject *f;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002124 char *msg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002125 PyObject *arg;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002126{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002127 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002128 PyObject *args, *what;
2129 PyObject *res = NULL;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002130
Guido van Rossuma027efa1997-05-05 20:56:21 +00002131 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002132 /* Don't do recursive traces */
2133 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002134 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002135 *p_newtrace = NULL;
2136 }
2137 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002138 }
2139
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002141 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002142 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002143 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002144 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002145 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002146 Py_INCREF(f);
2147 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2148 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002149 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 arg = Py_None;
2151 Py_INCREF(arg);
2152 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002153 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002154 PyFrame_FastToLocals(f);
2155 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2156 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002157 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002158 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002159 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002160 if (res == NULL) {
2161 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002162 PyTraceBack_Here(f);
2163 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002164 *p_trace = NULL;
2165 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002167 *p_newtrace = NULL;
2168 }
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002169 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002170 }
2171 else {
2172 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 Py_XDECREF(*p_newtrace);
2174 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002175 *p_newtrace = NULL;
2176 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002178 *p_newtrace = res;
2179 }
2180 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002182 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002183 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002184}
2185
Guido van Rossumb209a111997-04-29 18:18:01 +00002186PyObject *
2187PyEval_GetBuiltins()
Guido van Rossum6135a871995-01-09 17:53:26 +00002188{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002189 PyThreadState *tstate = PyThreadState_Get();
2190 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002191 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002192 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002193 else
2194 return current_frame->f_builtins;
2195}
2196
Guido van Rossumb209a111997-04-29 18:18:01 +00002197PyObject *
2198PyEval_GetLocals()
Guido van Rossum5b722181993-03-30 17:46:03 +00002199{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002200 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002201 if (current_frame == NULL)
2202 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002203 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002204 return current_frame->f_locals;
2205}
2206
Guido van Rossumb209a111997-04-29 18:18:01 +00002207PyObject *
2208PyEval_GetGlobals()
Guido van Rossum3f5da241990-12-20 15:06:42 +00002209{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002210 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002211 if (current_frame == NULL)
2212 return NULL;
2213 else
2214 return current_frame->f_globals;
2215}
2216
Guido van Rossumb209a111997-04-29 18:18:01 +00002217PyObject *
2218PyEval_GetFrame()
Guido van Rossume59214e1994-08-30 08:01:59 +00002219{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002220 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002221 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002222}
2223
Guido van Rossum6135a871995-01-09 17:53:26 +00002224int
Guido van Rossumb209a111997-04-29 18:18:01 +00002225PyEval_GetRestricted()
Guido van Rossum6135a871995-01-09 17:53:26 +00002226{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002227 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002228 return current_frame == NULL ? 0 : current_frame->f_restricted;
2229}
2230
Guido van Rossumbe270261997-05-22 22:26:18 +00002231int
Guido van Rossumb209a111997-04-29 18:18:01 +00002232Py_FlushLine()
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233{
Guido van Rossumb209a111997-04-29 18:18:01 +00002234 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002235 if (f == NULL)
2236 return 0;
2237 if (!PyFile_SoftSpace(f, 0))
2238 return 0;
2239 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240}
2241
Guido van Rossum3f5da241990-12-20 15:06:42 +00002242
Guido van Rossum681d79a1995-07-18 14:51:37 +00002243/* External interface to call any callable object.
2244 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002245
Guido van Rossumb209a111997-04-29 18:18:01 +00002246PyObject *
2247PyEval_CallObject(func, arg)
2248 PyObject *func;
2249 PyObject *arg;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002250{
Guido van Rossumb209a111997-04-29 18:18:01 +00002251 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002252}
Guido van Rossume59214e1994-08-30 08:01:59 +00002253
Guido van Rossumb209a111997-04-29 18:18:01 +00002254PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002255PyEval_CallObjectWithKeywords(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002256 PyObject *func;
2257 PyObject *arg;
2258 PyObject *kw;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002259{
2260 ternaryfunc call;
Guido van Rossumb209a111997-04-29 18:18:01 +00002261 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002262
2263 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002264 arg = PyTuple_New(0);
2265 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002266 PyErr_SetString(PyExc_TypeError,
2267 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002268 return NULL;
2269 }
2270 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002271 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002272
Guido van Rossumb209a111997-04-29 18:18:01 +00002273 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002274 PyErr_SetString(PyExc_TypeError,
2275 "keyword list must be a dictionary");
Guido van Rossume3e61c11995-08-04 04:14:47 +00002276 return NULL;
2277 }
2278
Guido van Rossum150b2df1996-12-05 23:17:11 +00002279 if ((call = func->ob_type->tp_call) != NULL)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002280 result = (*call)(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002281 else if (PyMethod_Check(func) || PyFunction_Check(func))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002282 result = call_function(func, arg, kw);
2283 else
2284 result = call_builtin(func, arg, kw);
2285
Guido van Rossumb209a111997-04-29 18:18:01 +00002286 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002287
Guido van Rossumb209a111997-04-29 18:18:01 +00002288 if (result == NULL && !PyErr_Occurred())
2289 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002290 "NULL result without error in call_object");
Guido van Rossume59214e1994-08-30 08:01:59 +00002291
2292 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002293}
2294
Guido van Rossumb209a111997-04-29 18:18:01 +00002295static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002296call_builtin(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002297 PyObject *func;
2298 PyObject *arg;
2299 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300{
Guido van Rossumb209a111997-04-29 18:18:01 +00002301 if (PyCFunction_Check(func)) {
2302 PyCFunction meth = PyCFunction_GetFunction(func);
2303 PyObject *self = PyCFunction_GetSelf(func);
2304 int flags = PyCFunction_GetFlags(func);
Guido van Rossumff8b4941995-07-26 18:16:42 +00002305 if (!(flags & METH_VARARGS)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002306 int size = PyTuple_Size(arg);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002307 if (size == 1)
Guido van Rossumb209a111997-04-29 18:18:01 +00002308 arg = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum9c7b8611991-12-16 13:04:47 +00002309 else if (size == 0)
2310 arg = NULL;
2311 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002312 if (flags & METH_KEYWORDS)
2313 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002314 if (kw != NULL && PyDict_Size(kw) != 0) {
2315 PyErr_SetString(PyExc_TypeError,
Guido van Rossumff8b4941995-07-26 18:16:42 +00002316 "this function takes no keyword arguments");
2317 return NULL;
2318 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002319 return (*meth)(self, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002321 if (PyClass_Check(func)) {
2322 return PyInstance_New(func, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002323 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002324 if (PyInstance_Check(func)) {
2325 PyObject *res, *call = PyObject_GetAttrString(func,"__call__");
Guido van Rossume59214e1994-08-30 08:01:59 +00002326 if (call == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002327 PyErr_Clear();
2328 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002329 "no __call__ method defined");
Guido van Rossume59214e1994-08-30 08:01:59 +00002330 return NULL;
2331 }
Guido van Rossumff8b4941995-07-26 18:16:42 +00002332 res = PyEval_CallObjectWithKeywords(call, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002333 Py_DECREF(call);
Guido van Rossume59214e1994-08-30 08:01:59 +00002334 return res;
2335 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002336 PyErr_SetString(PyExc_TypeError, "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002337 return NULL;
2338}
2339
Guido van Rossumb209a111997-04-29 18:18:01 +00002340static PyObject *
Guido van Rossum681d79a1995-07-18 14:51:37 +00002341call_function(func, arg, kw)
Guido van Rossumb209a111997-04-29 18:18:01 +00002342 PyObject *func;
2343 PyObject *arg;
2344 PyObject *kw;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345{
Guido van Rossumb209a111997-04-29 18:18:01 +00002346 PyObject *class = NULL; /* == owner */
2347 PyObject *argdefs;
2348 PyObject **d, **k;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002349 int nk, nd;
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002351
Guido van Rossumb209a111997-04-29 18:18:01 +00002352 if (kw != NULL && !PyDict_Check(kw)) {
2353 PyErr_BadInternalCall();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002354 return NULL;
2355 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356
Guido van Rossumb209a111997-04-29 18:18:01 +00002357 if (PyMethod_Check(func)) {
2358 PyObject *self = PyMethod_Self(func);
2359 class = PyMethod_Class(func);
2360 func = PyMethod_Function(func);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002361 if (self == NULL) {
2362 /* Unbound methods must be called with an instance of
2363 the class (or a derived class) as first argument */
Guido van Rossumb209a111997-04-29 18:18:01 +00002364 if (PyTuple_Size(arg) >= 1) {
2365 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002366 if (self != NULL &&
Guido van Rossumb209a111997-04-29 18:18:01 +00002367 PyInstance_Check(self) &&
2368 PyClass_IsSubclass((PyObject *)
2369 (((PyInstanceObject *)self)->in_class),
Guido van Rossumb3f72581993-05-21 19:56:10 +00002370 class))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002371 /* Handy-dandy */ ;
Guido van Rossumb3f72581993-05-21 19:56:10 +00002372 else
2373 self = NULL;
2374 }
2375 if (self == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002376 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002377 "unbound method must be called with class instance 1st argument");
Guido van Rossumb3f72581993-05-21 19:56:10 +00002378 return NULL;
2379 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 Py_INCREF(arg);
Guido van Rossumb3f72581993-05-21 19:56:10 +00002381 }
2382 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 int argcount = PyTuple_Size(arg);
2384 PyObject *newarg = PyTuple_New(argcount + 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002385 int i;
Guido van Rossum81daa321993-05-20 14:24:46 +00002386 if (newarg == NULL)
2387 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002388 Py_INCREF(self);
2389 PyTuple_SET_ITEM(newarg, 0, self);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002390 for (i = 0; i < argcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 PyObject *v = PyTuple_GET_ITEM(arg, i);
2392 Py_XINCREF(v);
2393 PyTuple_SET_ITEM(newarg, i+1, v);
Guido van Rossum81daa321993-05-20 14:24:46 +00002394 }
2395 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 }
2397 }
2398 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002399 if (!PyFunction_Check(func)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002400 PyErr_SetString(PyExc_TypeError,
2401 "call of non-function");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 return NULL;
2403 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002404 Py_INCREF(arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002406
2407 argdefs = PyFunction_GetDefaults(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2409 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2410 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002411 }
2412 else {
2413 d = NULL;
2414 nd = 0;
2415 }
2416
2417 if (kw != NULL) {
2418 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002419 nk = PyDict_Size(kw);
2420 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002421 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 PyErr_NoMemory();
2423 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002424 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002425 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002426 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002428 i += 2;
2429 nk = i/2;
2430 /* XXX This is broken if the caller deletes dict items! */
2431 }
2432 else {
2433 k = NULL;
2434 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002435 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436
Guido van Rossum681d79a1995-07-18 14:51:37 +00002437 result = eval_code2(
Guido van Rossumb209a111997-04-29 18:18:01 +00002438 (PyCodeObject *)PyFunction_GetCode(func),
2439 PyFunction_GetGlobals(func), (PyObject *)NULL,
2440 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Guido van Rossum681d79a1995-07-18 14:51:37 +00002441 k, nk,
2442 d, nd,
2443 class);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444
Guido van Rossumb209a111997-04-29 18:18:01 +00002445 Py_DECREF(arg);
2446 PyMem_XDEL(k);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447
Guido van Rossum681d79a1995-07-18 14:51:37 +00002448 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449}
2450
Guido van Rossum3b9c6671996-07-30 18:40:29 +00002451#define SLICE_ERROR_MSG \
2452 "standard sequence type does not support step size other than one"
2453
Guido van Rossumb209a111997-04-29 18:18:01 +00002454static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002455loop_subscript(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002456 PyObject *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457{
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00002459 int i;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002461 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462 return NULL;
2463 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00002465 v = (*sq->sq_item)(v, i);
2466 if (v)
2467 return v;
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 if (PyErr_Occurred() == PyExc_IndexError)
2469 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002470 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471}
2472
2473static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002474slice_index(v, pi)
Guido van Rossumb209a111997-04-29 18:18:01 +00002475 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 int *pi;
2477{
2478 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002479 long x;
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 if (!PyInt_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002481 PyErr_SetString(PyExc_TypeError,
2482 "slice index must be int");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002483 return -1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00002485 x = PyInt_AsLong(v);
2486 /* Truncate -- very long indices are truncated anyway */
2487 if (x > INT_MAX)
2488 x = INT_MAX;
2489 else if (x < -INT_MAX)
2490 x = 0;
2491 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002492 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002493 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494}
2495
Guido van Rossumb209a111997-04-29 18:18:01 +00002496static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002497apply_slice(u, v, w) /* return u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 PyObject *u, *v, *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002500 int ilow = 0, ihigh = INT_MAX;
2501 if (slice_index(v, &ilow) != 0)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002503 if (slice_index(w, &ihigh) != 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +00002504 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002505 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002507
2508static int
Guido van Rossum3f5da241990-12-20 15:06:42 +00002509assign_slice(u, v, w, x) /* u[v:w] = x */
Guido van Rossumb209a111997-04-29 18:18:01 +00002510 PyObject *u, *v, *w, *x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002512 int ilow = 0, ihigh = INT_MAX;
2513 if (slice_index(v, &ilow) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002514 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002515 if (slice_index(w, &ihigh) != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002517 if (x == NULL)
2518 return PySequence_DelSlice(u, ilow, ihigh);
2519 else
2520 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521}
2522
2523static int
2524cmp_exception(err, v)
Guido van Rossumb209a111997-04-29 18:18:01 +00002525 PyObject *err, *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526{
Guido van Rossumb209a111997-04-29 18:18:01 +00002527 if (PyTuple_Check(v)) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002529 n = PyTuple_Size(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 for (i = 0; i < n; i++) {
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00002531 /* Test recursively */
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 if (cmp_exception(err, PyTuple_GET_ITEM(v, i)))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533 return 1;
2534 }
2535 return 0;
2536 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002537 if (PyClass_Check(v) && PyClass_Check(err))
2538 return PyClass_IsSubclass(err, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539 return err == v;
2540}
2541
Guido van Rossum3f5da241990-12-20 15:06:42 +00002542static int
2543cmp_member(v, w)
Guido van Rossumb209a111997-04-29 18:18:01 +00002544 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002545{
Guido van Rossume59214e1994-08-30 08:01:59 +00002546 int i, cmp;
Guido van Rossumb209a111997-04-29 18:18:01 +00002547 PyObject *x;
2548 PySequenceMethods *sq;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002549 /* Special case for char in string */
Guido van Rossumb209a111997-04-29 18:18:01 +00002550 if (PyString_Check(w)) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002551 register char *s, *end;
2552 register char c;
Guido van Rossumb209a111997-04-29 18:18:01 +00002553 if (!PyString_Check(v) || PyString_Size(v) != 1) {
2554 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002555 "string member test needs char left operand");
2556 return -1;
2557 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002558 c = PyString_AsString(v)[0];
2559 s = PyString_AsString(w);
2560 end = s + PyString_Size(w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561 while (s < end) {
2562 if (c == *s++)
2563 return 1;
2564 }
2565 return 0;
2566 }
2567 sq = w->ob_type->tp_as_sequence;
2568 if (sq == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002569 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570 "'in' or 'not in' needs sequence right argument");
2571 return -1;
2572 }
Guido van Rossume59214e1994-08-30 08:01:59 +00002573 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002574 x = (*sq->sq_item)(w, i);
Guido van Rossume59214e1994-08-30 08:01:59 +00002575 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002576 if (PyErr_Occurred() == PyExc_IndexError) {
2577 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00002578 break;
2579 }
2580 return -1;
2581 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002582 cmp = PyObject_Compare(v, x);
2583 Py_XDECREF(x);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002584 if (cmp == 0)
2585 return 1;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002586 if (PyErr_Occurred())
2587 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002588 }
2589 return 0;
2590}
2591
Guido van Rossumb209a111997-04-29 18:18:01 +00002592static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00002593cmp_outcome(op, v, w)
Guido van Rossum5b7313a1992-04-06 13:24:57 +00002594 int op;
Guido van Rossumb209a111997-04-29 18:18:01 +00002595 register PyObject *v;
2596 register PyObject *w;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597{
2598 register int cmp;
2599 register int res = 0;
2600 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00002601 case IS:
2602 case IS_NOT:
2603 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00002604 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605 res = !res;
2606 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 case IN:
2608 case NOT_IN:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002609 res = cmp_member(v, w);
2610 if (res < 0)
2611 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002612 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002613 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002614 break;
2615 case EXC_MATCH:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002616 res = cmp_exception(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 break;
2618 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 cmp = PyObject_Compare(v, w);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00002620 if (cmp && PyErr_Occurred())
2621 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002622 switch (op) {
2623 case LT: res = cmp < 0; break;
2624 case LE: res = cmp <= 0; break;
2625 case EQ: res = cmp == 0; break;
2626 case NE: res = cmp != 0; break;
2627 case GT: res = cmp > 0; break;
2628 case GE: res = cmp >= 0; break;
2629 /* XXX no default? (res is initialized to 0 though) */
2630 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 v = res ? Py_True : Py_False;
2633 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 return v;
2635}
2636
Guido van Rossum3f5da241990-12-20 15:06:42 +00002637static int
2638import_from(locals, v, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002639 PyObject *locals;
2640 PyObject *v;
2641 PyObject *name;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002642{
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyObject *w, *x;
2644 if (!PyModule_Check(v)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002645 PyErr_SetString(PyExc_TypeError,
2646 "import-from requires module object");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002647 return -1;
2648 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 w = PyModule_GetDict(v);
2650 if (PyString_AsString(name)[0] == '*') {
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002651 int pos, err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002652 PyObject *name, *value;
Guido van Rossum25831651993-05-19 14:50:45 +00002653 pos = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 while (PyDict_Next(w, &pos, &name, &value)) {
2655 if (!PyString_Check(name) ||
2656 PyString_AsString(name)[0] == '_')
Guido van Rossume9736fc1990-11-18 17:33:06 +00002657 continue;
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 Py_INCREF(value);
2659 err = PyDict_SetItem(locals, name, value);
2660 Py_DECREF(value);
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002661 if (err != 0)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002662 return -1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002663 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00002664 return 0;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002665 }
2666 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 x = PyDict_GetItem(w, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002668 if (x == NULL) {
Guido van Rossum98256aa1991-12-24 13:25:19 +00002669 char buf[250];
Guido van Rossum16dfd291992-02-05 11:17:30 +00002670 sprintf(buf, "cannot import name %.230s",
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 PyString_AsString(name));
2672 PyErr_SetString(PyExc_ImportError, buf);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002673 return -1;
2674 }
2675 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 return PyDict_SetItem(locals, name, x);
Guido van Rossume9736fc1990-11-18 17:33:06 +00002677 }
2678}
2679
Guido van Rossumb209a111997-04-29 18:18:01 +00002680static PyObject *
Guido van Rossum25831651993-05-19 14:50:45 +00002681build_class(methods, bases, name)
Guido van Rossumb209a111997-04-29 18:18:01 +00002682 PyObject *methods; /* dictionary */
2683 PyObject *bases; /* tuple containing classes */
2684 PyObject *name; /* string */
Guido van Rossume9736fc1990-11-18 17:33:06 +00002685{
Guido van Rossum25831651993-05-19 14:50:45 +00002686 int i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002687 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002688 PyErr_SetString(PyExc_SystemError,
2689 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00002690 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00002691 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002692 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002693 PyErr_SetString(PyExc_SystemError,
2694 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00002695 return NULL;
2696 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002697 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002698 PyErr_SetString(PyExc_SystemError,
2699 "build_class witn non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00002700 return NULL;
2701 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002702 for (i = PyTuple_Size(bases); --i >= 0; ) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002703 /* XXX Is it intentional that the *last* base gets a
2704 chance at this first? */
Guido van Rossumb209a111997-04-29 18:18:01 +00002705 PyObject *base = PyTuple_GET_ITEM(bases, i);
2706 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00002707 /* Call the base's *type*, if it is callable.
2708 This code is a hook for Donald Beaudry's
2709 and Jim Fulton's type extensions. In
2710 unexended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00002711 since its types are not callable.
2712 Ditto: call the bases's *class*, if it has
2713 one. This makes the same thing possible
2714 without writing C code. A true meta-object
2715 protocol! */
2716 PyObject *basetype = (PyObject *)base->ob_type;
2717 PyObject *callable = NULL;
2718 if (PyCallable_Check(basetype))
2719 callable = basetype;
2720 else
2721 callable = PyObject_GetAttrString(
2722 base, "__class__");
2723 if (callable) {
2724 PyObject *args;
2725 PyObject *newclass = NULL;
2726 args = Py_BuildValue(
2727 "(OOO)", name, bases, methods);
2728 if (args != NULL) {
2729 newclass = PyEval_CallObject(
2730 callable, args);
2731 Py_DECREF(args);
2732 }
2733 if (callable != basetype)
2734 Py_DECREF(callable);
2735 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00002736 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00002738 "base is not a class object");
2739 return NULL;
2740 }
2741 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002742 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00002743}
2744
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002745static int
Guido van Rossuma027efa1997-05-05 20:56:21 +00002746exec_statement(f, prog, globals, locals)
2747 PyFrameObject *f;
Guido van Rossumb209a111997-04-29 18:18:01 +00002748 PyObject *prog;
2749 PyObject *globals;
2750 PyObject *locals;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002751{
2752 char *s;
2753 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002755 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002756
Guido van Rossumb209a111997-04-29 18:18:01 +00002757 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
2758 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002759 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002761 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 locals = PyTuple_GetItem(prog, 2);
2763 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002764 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002765 if (globals == Py_None) {
2766 globals = PyEval_GetGlobals();
2767 if (locals == Py_None) {
2768 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769 plain = 1;
2770 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002771 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002772 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002773 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 if (!PyString_Check(prog) &&
2775 !PyCode_Check(prog) &&
2776 !PyFile_Check(prog)) {
2777 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002778 "exec 1st arg must be string, code or file object");
2779 return -1;
2780 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 if (!PyDict_Check(globals) || !PyDict_Check(locals)) {
2782 PyErr_SetString(PyExc_TypeError,
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002783 "exec 2nd/3rd args must be dict or None");
2784 return -1;
2785 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002786 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002787 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00002788 if (PyCode_Check(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002789 if (PyEval_EvalCode((PyCodeObject *) prog,
2790 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002791 return -1;
2792 return 0;
2793 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 if (PyFile_Check(prog)) {
2795 FILE *fp = PyFile_AsFile(prog);
2796 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002797 if (PyRun_File(fp, name, Py_file_input,
2798 globals, locals) == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002799 return -1;
2800 return 0;
2801 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 s = PyString_AsString(prog);
Guido van Rossum5f15b961997-05-13 17:50:01 +00002803 if ((int)strlen(s) != PyString_Size(prog)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002804 PyErr_SetString(PyExc_ValueError,
2805 "embedded '\\0' in exec string");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002806 return -1;
2807 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00002808 v = PyRun_String(s, Py_file_input, globals, locals);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002809 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002810 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00002811 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002812 if (plain)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002813 PyFrame_LocalsToFast(f, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002814 return 0;
2815}
Guido van Rossum24c13741995-02-14 09:42:43 +00002816
Guido van Rossum1aa14831997-01-21 05:34:20 +00002817/* Hack for ni.py */
Guido van Rossumb209a111997-04-29 18:18:01 +00002818static PyObject *
Guido van Rossum24c13741995-02-14 09:42:43 +00002819find_from_args(f, nexti)
Guido van Rossumb209a111997-04-29 18:18:01 +00002820 PyFrameObject *f;
Guido van Rossum24c13741995-02-14 09:42:43 +00002821 int nexti;
2822{
2823 int opcode;
2824 int oparg;
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 PyObject *list, *name;
Guido van Rossum24c13741995-02-14 09:42:43 +00002826 unsigned char *next_instr;
2827
2828 next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti;
2829 opcode = (*next_instr++);
2830 if (opcode != IMPORT_FROM) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 Py_INCREF(Py_None);
2832 return Py_None;
Guido van Rossum24c13741995-02-14 09:42:43 +00002833 }
2834
Guido van Rossumb209a111997-04-29 18:18:01 +00002835 list = PyList_New(0);
Guido van Rossum24c13741995-02-14 09:42:43 +00002836 if (list == NULL)
2837 return NULL;
2838
2839 do {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002840 oparg = (next_instr[1]<<8) + next_instr[0];
2841 next_instr += 2;
Guido van Rossum24c13741995-02-14 09:42:43 +00002842 name = Getnamev(f, oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002843 if (PyList_Append(list, name) < 0) {
2844 Py_DECREF(list);
Guido van Rossum24c13741995-02-14 09:42:43 +00002845 break;
2846 }
2847 opcode = (*next_instr++);
2848 } while (opcode == IMPORT_FROM);
2849
2850 return list;
2851}
Guido van Rossum950361c1997-01-24 13:49:28 +00002852
2853
2854#ifdef DYNAMIC_EXECUTION_PROFILE
2855
2856PyObject *
2857getarray(a)
2858 long a[256];
2859{
2860 int i;
2861 PyObject *l = PyList_New(256);
2862 if (l == NULL) return NULL;
2863 for (i = 0; i < 256; i++) {
2864 PyObject *x = PyInt_FromLong(a[i]);
2865 if (x == NULL) {
2866 Py_DECREF(l);
2867 return NULL;
2868 }
2869 PyList_SetItem(l, i, x);
2870 }
2871 for (i = 0; i < 256; i++)
2872 a[i] = 0;
2873 return l;
2874}
2875
2876PyObject *
2877_Py_GetDXProfile(self, args)
2878 PyObject *self, *args;
2879{
2880#ifndef DXPAIRS
2881 return getarray(dxp);
2882#else
2883 int i;
2884 PyObject *l = PyList_New(257);
2885 if (l == NULL) return NULL;
2886 for (i = 0; i < 257; i++) {
2887 PyObject *x = getarray(dxpairs[i]);
2888 if (x == NULL) {
2889 Py_DECREF(l);
2890 return NULL;
2891 }
2892 PyList_SetItem(l, i, x);
2893 }
2894 return l;
2895#endif
2896}
2897
2898#endif