blob: 9d6549572f5600272ec3060a369a74956d72c993 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000040 PyObject **, int,
41 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000042
43static PyObject *call_object(PyObject *, PyObject *, PyObject *);
44static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
45static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
46static PyObject *call_method(PyObject *, PyObject *, PyObject *);
47static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
48static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
49static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
50static PyObject *do_call(PyObject *, PyObject ***, int, int);
51static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000052static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000053static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000054static PyObject *load_args(PyObject ***, int);
55#define CALL_FLAG_VAR 1
56#define CALL_FLAG_KW 2
57
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000060#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
62static int call_trace(PyObject **, PyObject **,
63 PyFrameObject *, char *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static PyObject *loop_subscript(PyObject *, PyObject *);
65static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
66static int assign_slice(PyObject *, PyObject *,
67 PyObject *, PyObject *);
68static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000069static PyObject *import_from(PyObject *, PyObject *);
70static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000071static PyObject *build_class(PyObject *, PyObject *, PyObject *);
72static int exec_statement(PyFrameObject *,
73 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
75static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000076static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Paul Prescode68140d2000-08-30 20:25:01 +000078#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000079 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000080#define GLOBAL_NAME_ERROR_MSG \
81 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000082#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000083 "local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000084
Guido van Rossum950361c1997-01-24 13:49:28 +000085/* Dynamic execution profile */
86#ifdef DYNAMIC_EXECUTION_PROFILE
87#ifdef DXPAIRS
88static long dxpairs[257][256];
89#define dxp dxpairs[256]
90#else
91static long dxp[256];
92#endif
93#endif
94
Guido van Rossume59214e1994-08-30 08:01:59 +000095#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000096
Guido van Rossum2571cc81999-04-07 16:07:23 +000097#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000098#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000099#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000100#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossuma027efa1997-05-05 20:56:21 +0000102extern int _PyThread_Started; /* Flag for Py_Exit */
103
Guido van Rossum65d5b571998-12-21 19:32:43 +0000104static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000105static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000106
107void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000108PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000111 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000113 interpreter_lock = PyThread_allocate_lock();
114 PyThread_acquire_lock(interpreter_lock, 1);
115 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000116}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000117
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000118void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000121 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122}
123
124void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000127 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000128}
129
130void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000131PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000132{
133 if (tstate == NULL)
134 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000135 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000136 if (PyThreadState_Swap(tstate) != NULL)
137 Py_FatalError(
138 "PyEval_AcquireThread: non-NULL old thread state");
139}
140
141void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000142PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000143{
144 if (tstate == NULL)
145 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
146 if (PyThreadState_Swap(NULL) != tstate)
147 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000149}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000150
151/* This function is called from PyOS_AfterFork to ensure that newly
152 created child processes don't hold locks referring to threads which
153 are not running in the child process. (This could also be done using
154 pthread_atfork mechanism, at least for the pthreads implementation.) */
155
156void
157PyEval_ReInitThreads(void)
158{
159 if (!interpreter_lock)
160 return;
161 /*XXX Can't use PyThread_free_lock here because it does too
162 much error-checking. Doing this cleanly would require
163 adding a new function to each thread_*.h. Instead, just
164 create a new lock and waste a little bit of memory */
165 interpreter_lock = PyThread_allocate_lock();
166 PyThread_acquire_lock(interpreter_lock, 1);
167 main_thread = PyThread_get_thread_ident();
168}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000169#endif
170
Guido van Rossumff4949e1992-08-05 19:58:53 +0000171/* Functions save_thread and restore_thread are always defined so
172 dynamically loaded modules needn't be compiled separately for use
173 with and without threads: */
174
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000175PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000176PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000178 PyThreadState *tstate = PyThreadState_Swap(NULL);
179 if (tstate == NULL)
180 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000181#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000182 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000183 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000184#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000185 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186}
187
188void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000189PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000191 if (tstate == NULL)
192 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000193#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000195 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000196 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198 }
199#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000200 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000201}
202
203
Guido van Rossuma9672091994-09-14 13:31:22 +0000204/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
205 signal handlers or Mac I/O completion routines) can schedule calls
206 to a function to be called synchronously.
207 The synchronous function is called with one void* argument.
208 It should return 0 for success or -1 for failure -- failure should
209 be accompanied by an exception.
210
211 If registry succeeds, the registry function returns 0; if it fails
212 (e.g. due to too many pending calls) it returns -1 (without setting
213 an exception condition).
214
215 Note that because registry may occur from within signal handlers,
216 or other asynchronous events, calling malloc() is unsafe!
217
218#ifdef WITH_THREAD
219 Any thread can schedule pending calls, but only the main thread
220 will execute them.
221#endif
222
223 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
224 There are two possible race conditions:
225 (1) nested asynchronous registry calls;
226 (2) registry calls made while pending calls are being processed.
227 While (1) is very unlikely, (2) is a real possibility.
228 The current code is safe against (2), but not against (1).
229 The safety against (2) is derived from the fact that only one
230 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000231
Guido van Rossuma027efa1997-05-05 20:56:21 +0000232 XXX Darn! With the advent of thread state, we should have an array
233 of pending calls per thread in the thread state! Later...
234*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000235
Guido van Rossuma9672091994-09-14 13:31:22 +0000236#define NPENDINGCALLS 32
237static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000238 int (*func)(void *);
239 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240} pendingcalls[NPENDINGCALLS];
241static volatile int pendingfirst = 0;
242static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000244
245int
Thomas Wouters334fb892000-07-25 12:56:38 +0000246Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000247{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 int i, j;
250 /* XXX Begin critical section */
251 /* XXX If you want this to be safe against nested
252 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 if (busy)
254 return -1;
255 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 i = pendinglast;
257 j = (i + 1) % NPENDINGCALLS;
258 if (j == pendingfirst)
259 return -1; /* Queue full */
260 pendingcalls[i].func = func;
261 pendingcalls[i].arg = arg;
262 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000263 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000264 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000265 /* XXX End critical section */
266 return 0;
267}
268
Guido van Rossum180d7b41994-09-29 09:45:57 +0000269int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000271{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000273#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000274 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000275 return 0;
276#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000278 return 0;
279 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000280 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000281 for (;;) {
282 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000283 int (*func)(void *);
284 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000285 i = pendingfirst;
286 if (i == pendinglast)
287 break; /* Queue empty */
288 func = pendingcalls[i].func;
289 arg = pendingcalls[i].arg;
290 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000291 if (func(arg) < 0) {
292 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000293 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000294 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000295 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000296 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000297 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000298 return 0;
299}
300
301
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000302/* The interpreter's recursion limit */
303
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000304static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000305
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000306int
307Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000308{
309 return recursion_limit;
310}
311
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000312void
313Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000314{
315 recursion_limit = new_limit;
316}
317
Guido van Rossum374a9221991-04-04 10:40:29 +0000318/* Status code for main loop (reason for stack unwind) */
319
320enum why_code {
321 WHY_NOT, /* No error */
322 WHY_EXCEPTION, /* Exception occurred */
323 WHY_RERAISE, /* Exception re-raised by 'finally' */
324 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000325 WHY_BREAK, /* 'break' statement */
326 WHY_CONTINUE, /* 'continue' statement */
Guido van Rossum374a9221991-04-04 10:40:29 +0000327};
328
Tim Petersdbd9ba62000-07-09 03:09:57 +0000329static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
330static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000331
Guido van Rossum374a9221991-04-04 10:40:29 +0000332
Guido van Rossumb209a111997-04-29 18:18:01 +0000333PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000335{
336 return eval_code2(co,
337 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000338 (PyObject **)NULL, 0,
339 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000340 (PyObject **)NULL, 0,
341 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000342}
343
344
345/* Interpreter main loop */
346
Guido van Rossumb209a111997-04-29 18:18:01 +0000347static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000348eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
349 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 PyObject **defs, int defcount, PyObject *closure)
Guido van Rossum374a9221991-04-04 10:40:29 +0000351{
Guido van Rossum950361c1997-01-24 13:49:28 +0000352#ifdef DXPAIRS
353 int lastopcode = 0;
354#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000355 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000356 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000357 register int opcode=0; /* Current opcode */
358 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000359 register enum why_code why; /* Reason for block stack unwind */
360 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000361 register PyObject *x; /* Result object -- NULL if error */
362 register PyObject *v; /* Temporary objects popped off stack */
363 register PyObject *w;
364 register PyObject *u;
365 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000366 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000367 register PyFrameObject *f; /* Current frame */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000368 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000369 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000370 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000371 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000372#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000373 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000374#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000375#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000377 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000378#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000379
380/* Code access macros */
381
382#define GETCONST(i) Getconst(f, i)
383#define GETNAME(i) Getname(f, i)
384#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000385#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000386#define NEXTOP() (*next_instr++)
387#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000388#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000389#define JUMPBY(x) (next_instr += (x))
390
391/* Stack manipulation macros */
392
393#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
394#define EMPTY() (STACK_LEVEL() == 0)
395#define TOP() (stack_pointer[-1])
396#define BASIC_PUSH(v) (*stack_pointer++ = (v))
397#define BASIC_POP() (*--stack_pointer)
398
Guido van Rossum96a42c81992-01-12 02:29:51 +0000399#ifdef LLTRACE
400#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
401#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000402#else
403#define PUSH(v) BASIC_PUSH(v)
404#define POP() BASIC_POP()
405#endif
406
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407/* Local variable macros */
408
409#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000410#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411 GETLOCAL(i) = value; } while (0)
412
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413/* Start of code */
414
Guido van Rossum8861b741996-07-30 16:49:37 +0000415#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000416 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000417 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000418 return NULL;
419 }
420#endif
421
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000423 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000424 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000425 }
426
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000427#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000429#endif
430
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000431 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 co, /*code*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000433 globals, locals, closure);
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 if (f == NULL)
435 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000438 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000439 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440
441 if (co->co_argcount > 0 ||
442 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
443 int i;
444 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 if (kwdict == NULL)
449 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000450 i = co->co_argcount;
451 if (co->co_flags & CO_VARARGS)
452 i++;
453 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000454 }
455 if (argcount > co->co_argcount) {
456 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000457 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000458 "%.200s() takes %s %d "
459 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000460 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000461 defcount ? "at most" : "exactly",
462 co->co_argcount,
463 kwcount ? "non-keyword " : "",
464 co->co_argcount == 1 ? "" : "s",
465 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 goto fail;
467 }
468 n = co->co_argcount;
469 }
470 for (i = 0; i < n; i++) {
471 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000472 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 SETLOCAL(i, x);
474 }
475 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000476 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000477 if (u == NULL)
478 goto fail;
479 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 for (i = n; i < argcount; i++) {
481 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000482 Py_INCREF(x);
483 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 }
486 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 PyObject *keyword = kws[2*i];
488 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000490 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000491 PyErr_Format(PyExc_TypeError,
492 "%.200s() keywords must be strings",
493 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000494 goto fail;
495 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 /* XXX slow -- speed up using dictionary? */
497 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000498 PyObject *nm = PyTuple_GET_ITEM(
499 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000500 int cmp = PyObject_RichCompareBool(
501 keyword, nm, Py_EQ);
502 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000504 else if (cmp < 0)
505 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000507 /* Check errors from Compare */
508 if (PyErr_Occurred())
509 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 if (j >= co->co_argcount) {
511 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000512 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000513 "%.200s() got an unexpected "
514 "keyword argument '%.400s'",
515 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000516 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517 goto fail;
518 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000519 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 }
521 else {
522 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000523 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000524 "%.200s() got multiple "
525 "values for keyword "
526 "argument '%.400s'",
527 PyString_AsString(co->co_name),
528 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 goto fail;
530 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000531 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 SETLOCAL(j, value);
533 }
534 }
535 if (argcount < co->co_argcount) {
536 int m = co->co_argcount - defcount;
537 for (i = argcount; i < m; i++) {
538 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000539 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000540 "%.200s() takes %s %d "
541 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000542 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000543 ((co->co_flags & CO_VARARGS) ||
544 defcount) ? "at least"
545 : "exactly",
546 m, kwcount ? "non-keyword " : "",
547 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000548 goto fail;
549 }
550 }
551 if (n > m)
552 i = n - m;
553 else
554 i = 0;
555 for (; i < defcount; i++) {
556 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000557 PyObject *def = defs[i];
558 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559 SETLOCAL(m+i, def);
560 }
561 }
562 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000563 }
564 else {
565 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000566 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000567 "%.200s() takes no arguments (%d given)",
568 PyString_AsString(co->co_name),
569 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000571 }
572 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000573 /* Allocate storage for cell vars and copy free vars into frame */
574 if (f->f_ncells) {
575 int i;
576 for (i = 0; i < f->f_ncells; ++i)
577 freevars[i] = PyCell_New(NULL);
578 }
579 if (f->f_nfreevars) {
580 int i;
581 for (i = 0; i < f->f_nfreevars; ++i)
582 freevars[f->f_ncells + i] = PyTuple_GET_ITEM(closure, i);
583 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000584
Guido van Rossuma027efa1997-05-05 20:56:21 +0000585 if (tstate->sys_tracefunc != NULL) {
586 /* tstate->sys_tracefunc, if defined, is a function that
587 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000588 Its return value, if not None, is a function that
589 will be called at the start of each executed line
590 of code. (Actually, the function must return
591 itself in order to continue tracing.)
592 The trace functions are called with three arguments:
593 a pointer to the current frame, a string indicating
594 why the function is called, and an argument which
595 depends on the situation. The global trace function
596 (sys.trace) is also called whenever an exception
597 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 if (call_trace(&tstate->sys_tracefunc,
599 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000600 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000601 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000602 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000603 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000604 }
605
Guido van Rossuma027efa1997-05-05 20:56:21 +0000606 if (tstate->sys_profilefunc != NULL) {
607 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000608 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 if (call_trace(&tstate->sys_profilefunc,
610 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000611 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000612 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000613 }
614 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000615
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000616 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000617 --tstate->recursion_depth;
618 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000619 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000621 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000622 return NULL;
623 }
624
Guido van Rossumd076c731998-10-07 19:42:25 +0000625 _PyCode_GETCODEPTR(co, &first_instr);
626 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000628
Guido van Rossum374a9221991-04-04 10:40:29 +0000629 why = WHY_NOT;
630 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000631 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000632 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000635 /* Do periodic things. Doing this every time through
636 the loop would add too much overhead, so we do it
637 only every Nth instruction. We also do it if
638 ``things_to_do'' is set, i.e. when an asynchronous
639 event needs attention (e.g. a signal handler or
640 async I/O handler); see Py_AddPendingCall() and
641 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000642
Guido van Rossuma027efa1997-05-05 20:56:21 +0000643 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000644 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000645 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000646 if (Py_MakePendingCalls() < 0) {
647 why = WHY_EXCEPTION;
648 goto on_error;
649 }
650 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000651#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000652 /* If we have true signals, the signal handler
653 will call Py_AddPendingCall() so we don't
654 have to call sigcheck(). On the Mac and
655 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000656 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 goto on_error;
659 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000660#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000661
Guido van Rossume59214e1994-08-30 08:01:59 +0000662#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663 if (interpreter_lock) {
664 /* Give another thread a chance */
665
Guido van Rossum25ce5661997-08-02 03:10:38 +0000666 if (PyThreadState_Swap(NULL) != tstate)
667 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000668 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669
670 /* Other threads may run now */
671
Guido van Rossum65d5b571998-12-21 19:32:43 +0000672 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000673 if (PyThreadState_Swap(tstate) != NULL)
674 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 }
676#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000680
Guido van Rossum408027e1996-12-30 16:17:54 +0000681#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000682 f->f_lasti = INSTR_OFFSET();
683#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000684
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 opcode = NEXTOP();
686 if (HAS_ARG(opcode))
687 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000688 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000689#ifdef DYNAMIC_EXECUTION_PROFILE
690#ifdef DXPAIRS
691 dxpairs[lastopcode][opcode]++;
692 lastopcode = opcode;
693#endif
694 dxp[opcode]++;
695#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000696
Guido van Rossum96a42c81992-01-12 02:29:51 +0000697#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000699
Guido van Rossum96a42c81992-01-12 02:29:51 +0000700 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 if (HAS_ARG(opcode)) {
702 printf("%d: %d, %d\n",
703 (int) (INSTR_OFFSET() - 3),
704 opcode, oparg);
705 }
706 else {
707 printf("%d: %d\n",
708 (int) (INSTR_OFFSET() - 1), opcode);
709 }
710 }
711#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000713
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 /* BEWARE!
717 It is essential that any operation that fails sets either
718 x to NULL, err to nonzero, or why to anything but WHY_NOT,
719 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000720
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 case POP_TOP:
724 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000725 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000726 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 case ROT_TWO:
729 v = POP();
730 w = POP();
731 PUSH(v);
732 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 case ROT_THREE:
736 v = POP();
737 w = POP();
738 x = POP();
739 PUSH(v);
740 PUSH(x);
741 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000742 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000743
Thomas Wouters434d0822000-08-24 20:11:32 +0000744 case ROT_FOUR:
745 u = POP();
746 v = POP();
747 w = POP();
748 x = POP();
749 PUSH(u);
750 PUSH(x);
751 PUSH(w);
752 PUSH(v);
753 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000754
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 case DUP_TOP:
756 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000757 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000759 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000760
Thomas Wouters434d0822000-08-24 20:11:32 +0000761 case DUP_TOPX:
762 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000764 x = TOP();
765 Py_INCREF(x);
766 PUSH(x);
767 continue;
768 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000769 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000770 Py_INCREF(x);
771 w = TOP();
772 Py_INCREF(w);
773 PUSH(x);
774 PUSH(w);
775 PUSH(x);
776 continue;
777 case 3:
778 x = POP();
779 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000780 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000781 Py_INCREF(w);
782 v = TOP();
783 Py_INCREF(v);
784 PUSH(w);
785 PUSH(x);
786 PUSH(v);
787 PUSH(w);
788 PUSH(x);
789 continue;
790 case 4:
791 x = POP();
792 Py_INCREF(x);
793 w = POP();
794 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000795 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000796 Py_INCREF(v);
797 u = TOP();
798 Py_INCREF(u);
799 PUSH(v);
800 PUSH(w);
801 PUSH(x);
802 PUSH(u);
803 PUSH(v);
804 PUSH(w);
805 PUSH(x);
806 continue;
807 case 5:
808 x = POP();
809 Py_INCREF(x);
810 w = POP();
811 Py_INCREF(w);
812 v = POP();
813 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000814 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000815 Py_INCREF(u);
816 t = TOP();
817 Py_INCREF(t);
818 PUSH(u);
819 PUSH(v);
820 PUSH(w);
821 PUSH(x);
822 PUSH(t);
823 PUSH(u);
824 PUSH(v);
825 PUSH(w);
826 PUSH(x);
827 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000828 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000829 Py_FatalError("invalid argument to DUP_TOPX"
830 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 }
Tim Peters35ba6892000-10-11 07:04:49 +0000832 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000833
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 case UNARY_POSITIVE:
835 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000836 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000841
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 case UNARY_NEGATIVE:
843 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000844 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000847 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000849
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 case UNARY_NOT:
851 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000852 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 if (err == 0) {
855 Py_INCREF(Py_True);
856 PUSH(Py_True);
857 continue;
858 }
859 else if (err > 0) {
860 Py_INCREF(Py_False);
861 PUSH(Py_False);
862 err = 0;
863 continue;
864 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000866
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 case UNARY_CONVERT:
868 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000869 x = PyObject_Repr(v);
870 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000872 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000874
Guido van Rossum7928cd71991-10-24 14:59:31 +0000875 case UNARY_INVERT:
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000882
Guido van Rossum50564e81996-01-12 01:13:16 +0000883 case BINARY_POWER:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000891 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000892
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 case BINARY_MULTIPLY:
894 w = POP();
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
898 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000900 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000902
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 case BINARY_DIVIDE:
904 w = POP();
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(v);
908 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000910 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 case BINARY_MODULO:
914 w = POP();
915 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 Py_DECREF(v);
918 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 case BINARY_ADD:
924 w = POP();
925 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000926 if (PyInt_Check(v) && PyInt_Check(w)) {
927 /* INLINE: int + int */
928 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000929 a = PyInt_AS_LONG(v);
930 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000931 i = a + b;
932 if ((i^a) < 0 && (i^b) < 0) {
933 PyErr_SetString(PyExc_OverflowError,
934 "integer addition");
935 x = NULL;
936 }
937 else
938 x = PyInt_FromLong(i);
939 }
940 else
941 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_SUBTRACT:
949 w = POP();
950 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000951 if (PyInt_Check(v) && PyInt_Check(w)) {
952 /* INLINE: int - int */
953 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000954 a = PyInt_AS_LONG(v);
955 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000956 i = a - b;
957 if ((i^a) < 0 && (i^~b) < 0) {
958 PyErr_SetString(PyExc_OverflowError,
959 "integer subtraction");
960 x = NULL;
961 }
962 else
963 x = PyInt_FromLong(i);
964 }
965 else
966 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000967 Py_DECREF(v);
968 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000970 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000972
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 case BINARY_SUBSCR:
974 w = POP();
975 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000976 if (PyList_Check(v) && PyInt_Check(w)) {
977 /* INLINE: list[int] */
978 long i = PyInt_AsLong(w);
979 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000980 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000982 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000983 PyErr_SetString(PyExc_IndexError,
984 "list index out of range");
985 x = NULL;
986 }
987 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000988 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000989 Py_INCREF(x);
990 }
991 }
992 else
993 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000994 Py_DECREF(v);
995 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000997 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000999
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 case BINARY_LSHIFT:
1001 w = POP();
1002 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001003 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001006 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001007 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001009
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 case BINARY_RSHIFT:
1011 w = POP();
1012 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001013 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 Py_DECREF(v);
1015 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001016 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001017 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001018 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001019
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 case BINARY_AND:
1021 w = POP();
1022 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001023 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 Py_DECREF(v);
1025 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001026 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001027 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001028 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001029
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 case BINARY_XOR:
1031 w = POP();
1032 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001033 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 Py_DECREF(v);
1035 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001036 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001037 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001038 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001039
Guido van Rossum7928cd71991-10-24 14:59:31 +00001040 case BINARY_OR:
1041 w = POP();
1042 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001043 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001044 Py_DECREF(v);
1045 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001046 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001047 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001048 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001049
1050 case INPLACE_POWER:
1051 w = POP();
1052 v = POP();
1053 x = PyNumber_InPlacePower(v, w, Py_None);
1054 Py_DECREF(v);
1055 Py_DECREF(w);
1056 PUSH(x);
1057 if (x != NULL) continue;
1058 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001059
Thomas Wouters434d0822000-08-24 20:11:32 +00001060 case INPLACE_MULTIPLY:
1061 w = POP();
1062 v = POP();
1063 x = PyNumber_InPlaceMultiply(v, w);
1064 Py_DECREF(v);
1065 Py_DECREF(w);
1066 PUSH(x);
1067 if (x != NULL) continue;
1068 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001069
Thomas Wouters434d0822000-08-24 20:11:32 +00001070 case INPLACE_DIVIDE:
1071 w = POP();
1072 v = POP();
1073 x = PyNumber_InPlaceDivide(v, w);
1074 Py_DECREF(v);
1075 Py_DECREF(w);
1076 PUSH(x);
1077 if (x != NULL) continue;
1078 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001079
Thomas Wouters434d0822000-08-24 20:11:32 +00001080 case INPLACE_MODULO:
1081 w = POP();
1082 v = POP();
1083 x = PyNumber_InPlaceRemainder(v, w);
1084 Py_DECREF(v);
1085 Py_DECREF(w);
1086 PUSH(x);
1087 if (x != NULL) continue;
1088 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001089
Thomas Wouters434d0822000-08-24 20:11:32 +00001090 case INPLACE_ADD:
1091 w = POP();
1092 v = POP();
1093 if (PyInt_Check(v) && PyInt_Check(w)) {
1094 /* INLINE: int + int */
1095 register long a, b, i;
1096 a = PyInt_AS_LONG(v);
1097 b = PyInt_AS_LONG(w);
1098 i = a + b;
1099 if ((i^a) < 0 && (i^b) < 0) {
1100 PyErr_SetString(PyExc_OverflowError,
1101 "integer addition");
1102 x = NULL;
1103 }
1104 else
1105 x = PyInt_FromLong(i);
1106 }
1107 else
1108 x = PyNumber_InPlaceAdd(v, w);
1109 Py_DECREF(v);
1110 Py_DECREF(w);
1111 PUSH(x);
1112 if (x != NULL) continue;
1113 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001114
Thomas Wouters434d0822000-08-24 20:11:32 +00001115 case INPLACE_SUBTRACT:
1116 w = POP();
1117 v = POP();
1118 if (PyInt_Check(v) && PyInt_Check(w)) {
1119 /* INLINE: int - int */
1120 register long a, b, i;
1121 a = PyInt_AS_LONG(v);
1122 b = PyInt_AS_LONG(w);
1123 i = a - b;
1124 if ((i^a) < 0 && (i^~b) < 0) {
1125 PyErr_SetString(PyExc_OverflowError,
1126 "integer subtraction");
1127 x = NULL;
1128 }
1129 else
1130 x = PyInt_FromLong(i);
1131 }
1132 else
1133 x = PyNumber_InPlaceSubtract(v, w);
1134 Py_DECREF(v);
1135 Py_DECREF(w);
1136 PUSH(x);
1137 if (x != NULL) continue;
1138 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001139
Thomas Wouters434d0822000-08-24 20:11:32 +00001140 case INPLACE_LSHIFT:
1141 w = POP();
1142 v = POP();
1143 x = PyNumber_InPlaceLshift(v, w);
1144 Py_DECREF(v);
1145 Py_DECREF(w);
1146 PUSH(x);
1147 if (x != NULL) continue;
1148 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001149
Thomas Wouters434d0822000-08-24 20:11:32 +00001150 case INPLACE_RSHIFT:
1151 w = POP();
1152 v = POP();
1153 x = PyNumber_InPlaceRshift(v, w);
1154 Py_DECREF(v);
1155 Py_DECREF(w);
1156 PUSH(x);
1157 if (x != NULL) continue;
1158 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001159
Thomas Wouters434d0822000-08-24 20:11:32 +00001160 case INPLACE_AND:
1161 w = POP();
1162 v = POP();
1163 x = PyNumber_InPlaceAnd(v, w);
1164 Py_DECREF(v);
1165 Py_DECREF(w);
1166 PUSH(x);
1167 if (x != NULL) continue;
1168 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001169
Thomas Wouters434d0822000-08-24 20:11:32 +00001170 case INPLACE_XOR:
1171 w = POP();
1172 v = POP();
1173 x = PyNumber_InPlaceXor(v, w);
1174 Py_DECREF(v);
1175 Py_DECREF(w);
1176 PUSH(x);
1177 if (x != NULL) continue;
1178 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001179
Thomas Wouters434d0822000-08-24 20:11:32 +00001180 case INPLACE_OR:
1181 w = POP();
1182 v = POP();
1183 x = PyNumber_InPlaceOr(v, w);
1184 Py_DECREF(v);
1185 Py_DECREF(w);
1186 PUSH(x);
1187 if (x != NULL) continue;
1188 break;
1189
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 case SLICE+0:
1191 case SLICE+1:
1192 case SLICE+2:
1193 case SLICE+3:
1194 if ((opcode-SLICE) & 2)
1195 w = POP();
1196 else
1197 w = NULL;
1198 if ((opcode-SLICE) & 1)
1199 v = POP();
1200 else
1201 v = NULL;
1202 u = POP();
1203 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001204 Py_DECREF(u);
1205 Py_XDECREF(v);
1206 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001208 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001210
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 case STORE_SLICE+0:
1212 case STORE_SLICE+1:
1213 case STORE_SLICE+2:
1214 case STORE_SLICE+3:
1215 if ((opcode-STORE_SLICE) & 2)
1216 w = POP();
1217 else
1218 w = NULL;
1219 if ((opcode-STORE_SLICE) & 1)
1220 v = POP();
1221 else
1222 v = NULL;
1223 u = POP();
1224 t = POP();
1225 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(t);
1227 Py_DECREF(u);
1228 Py_XDECREF(v);
1229 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001230 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001232
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 case DELETE_SLICE+0:
1234 case DELETE_SLICE+1:
1235 case DELETE_SLICE+2:
1236 case DELETE_SLICE+3:
1237 if ((opcode-DELETE_SLICE) & 2)
1238 w = POP();
1239 else
1240 w = NULL;
1241 if ((opcode-DELETE_SLICE) & 1)
1242 v = POP();
1243 else
1244 v = NULL;
1245 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 Py_DECREF(u);
1249 Py_XDECREF(v);
1250 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001251 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001253
Guido van Rossum374a9221991-04-04 10:40:29 +00001254 case STORE_SUBSCR:
1255 w = POP();
1256 v = POP();
1257 u = POP();
1258 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001259 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 Py_DECREF(u);
1261 Py_DECREF(v);
1262 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001263 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 case DELETE_SUBSCR:
1267 w = POP();
1268 v = POP();
1269 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001270 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 Py_DECREF(v);
1272 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001273 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001275
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 case PRINT_EXPR:
1277 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001278 w = PySys_GetObject("displayhook");
1279 if (w == NULL) {
1280 PyErr_SetString(PyExc_RuntimeError,
1281 "lost sys.displayhook");
1282 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001283 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001284 }
1285 if (err == 0) {
1286 x = Py_BuildValue("(O)", v);
1287 if (x == NULL)
1288 err = -1;
1289 }
1290 if (err == 0) {
1291 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001292 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001293 if (w == NULL)
1294 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001297 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001299
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001300 case PRINT_ITEM_TO:
1301 w = stream = POP();
1302 /* fall through to PRINT_ITEM */
1303
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 case PRINT_ITEM:
1305 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001306 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001307 w = PySys_GetObject("stdout");
1308 if (w == NULL) {
1309 PyErr_SetString(PyExc_RuntimeError,
1310 "lost sys.stdout");
1311 err = -1;
1312 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001313 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001314 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001315 err = PyFile_WriteString(" ", w);
1316 if (err == 0)
1317 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001319 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 char *s = PyString_AsString(v);
1321 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001322 if (len > 0 &&
1323 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001324 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001325 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001328 Py_XDECREF(stream);
1329 stream = NULL;
1330 if (err == 0)
1331 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001333
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001334 case PRINT_NEWLINE_TO:
1335 w = stream = POP();
1336 /* fall through to PRINT_NEWLINE */
1337
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001339 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001340 w = PySys_GetObject("stdout");
1341 if (w == NULL)
1342 PyErr_SetString(PyExc_RuntimeError,
1343 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001344 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001345 if (w != NULL) {
1346 err = PyFile_WriteString("\n", w);
1347 if (err == 0)
1348 PyFile_SoftSpace(w, 0);
1349 }
1350 Py_XDECREF(stream);
1351 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001353
Thomas Wouters434d0822000-08-24 20:11:32 +00001354
1355#ifdef CASE_TOO_BIG
1356 default: switch (opcode) {
1357#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 case BREAK_LOOP:
1359 why = WHY_BREAK;
1360 break;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001361
1362 case CONTINUE_LOOP:
1363 retval = PyInt_FromLong(oparg);
1364 why = WHY_CONTINUE;
1365 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001366
Guido van Rossumf10570b1995-07-07 22:53:21 +00001367 case RAISE_VARARGS:
1368 u = v = w = NULL;
1369 switch (oparg) {
1370 case 3:
1371 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001372 /* Fallthrough */
1373 case 2:
1374 v = POP(); /* value */
1375 /* Fallthrough */
1376 case 1:
1377 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001378 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001379 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001380 break;
1381 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001383 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001384 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001385 break;
1386 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001388
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001390 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001391 PyErr_SetString(PyExc_SystemError,
1392 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001393 break;
1394 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001396 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001398
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 case RETURN_VALUE:
1400 retval = POP();
1401 why = WHY_RETURN;
1402 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001403
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001404 case EXEC_STMT:
1405 w = POP();
1406 v = POP();
1407 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001408 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 Py_DECREF(u);
1410 Py_DECREF(v);
1411 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001412 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001413
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 case POP_BLOCK:
1415 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 while (STACK_LEVEL() > b->b_level) {
1418 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 }
1421 }
1422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 case END_FINALLY:
1425 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 if (PyInt_Check(v)) {
1427 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001428 if (why == WHY_RETURN ||
1429 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 retval = POP();
1431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001434 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001437 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 else if (v != Py_None) {
1440 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 "'finally' pops bad exception");
1442 why = WHY_EXCEPTION;
1443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001446
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001448 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001450 w = POP();
1451 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 Py_DECREF(u);
1454 Py_DECREF(v);
1455 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001457
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 case STORE_NAME:
1459 w = GETNAMEV(oparg);
1460 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001461 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001462 PyErr_Format(PyExc_SystemError,
1463 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001464 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001465 break;
1466 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 err = PyDict_SetItem(x, w, v);
1468 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001470
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001472 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001473 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001474 PyErr_Format(PyExc_SystemError,
1475 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001476 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001477 break;
1478 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001480 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001481 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001483
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001484 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001486 if (PyTuple_Check(v)) {
1487 if (PyTuple_Size(v) != oparg) {
1488 PyErr_SetString(PyExc_ValueError,
1489 "unpack tuple of wrong size");
1490 why = WHY_EXCEPTION;
1491 }
1492 else {
1493 for (; --oparg >= 0; ) {
1494 w = PyTuple_GET_ITEM(v, oparg);
1495 Py_INCREF(w);
1496 PUSH(w);
1497 }
1498 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001500 else if (PyList_Check(v)) {
1501 if (PyList_Size(v) != oparg) {
1502 PyErr_SetString(PyExc_ValueError,
1503 "unpack list of wrong size");
1504 why = WHY_EXCEPTION;
1505 }
1506 else {
1507 for (; --oparg >= 0; ) {
1508 w = PyList_GET_ITEM(v, oparg);
1509 Py_INCREF(w);
1510 PUSH(w);
1511 }
1512 }
1513 }
1514 else if (PySequence_Check(v)) {
1515 if (unpack_sequence(v, oparg,
1516 stack_pointer + oparg))
1517 stack_pointer += oparg;
1518 else
1519 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 }
1521 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001522 PyErr_SetString(PyExc_TypeError,
1523 "unpack non-sequence");
1524 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001530 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 v = POP();
1532 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1534 Py_DECREF(v);
1535 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001537
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001539 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001541 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1542 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001546 case STORE_GLOBAL:
1547 w = GETNAMEV(oparg);
1548 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 err = PyDict_SetItem(f->f_globals, w, v);
1550 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001551 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001552
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001553 case DELETE_GLOBAL:
1554 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001556 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001557 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001558 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case LOAD_CONST:
1561 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 PUSH(x);
1564 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001565
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001567 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001569 PyErr_Format(PyExc_SystemError,
1570 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001571 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 break;
1573 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001580 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001581 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001582 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 break;
1584 }
1585 }
1586 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 PUSH(x);
1589 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001590
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001592 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001597 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001598 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001599 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 break;
1601 }
1602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 PUSH(x);
1605 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606
Guido van Rossum9bfef441993-03-29 10:43:31 +00001607 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001609 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001610 format_exc_check_arg(
1611 PyExc_UnboundLocalError,
1612 UNBOUNDLOCAL_ERROR_MSG,
1613 PyTuple_GetItem(co->co_varnames, oparg)
1614 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001615 break;
1616 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001618 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001619 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001620 break;
1621
1622 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001623 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001624 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001625 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001626
1627 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001628 x = GETLOCAL(oparg);
1629 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001630 format_exc_check_arg(
1631 PyExc_UnboundLocalError,
1632 UNBOUNDLOCAL_ERROR_MSG,
1633 PyTuple_GetItem(co->co_varnames, oparg)
1634 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001635 break;
1636 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001637 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001638 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001639
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001640 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001641 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001642 Py_INCREF(x);
1643 PUSH(x);
1644 break;
1645
1646 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001647 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001648 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001649 if (w == NULL) {
1650 if (oparg < f->f_ncells)
1651 v = PyTuple_GetItem(co->co_cellvars,
1652 oparg);
1653 else
1654 v = PyTuple_GetItem(
1655 co->co_freevars,
1656 oparg - f->f_ncells);
1657
1658 format_exc_check_arg(
1659 PyExc_UnboundLocalError,
1660 UNBOUNDLOCAL_ERROR_MSG,
1661 v);
1662 err = -1;
1663 break;
1664 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001665 Py_INCREF(w);
1666 PUSH(w);
1667 break;
1668
1669 case STORE_DEREF:
1670 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001671 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001672 PyCell_Set(x, w);
1673 continue;
1674
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 if (x != NULL) {
1678 for (; --oparg >= 0;) {
1679 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 }
1682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 }
1685 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001686
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 if (x != NULL) {
1690 for (; --oparg >= 0;) {
1691 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001692 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 }
1694 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001695 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 }
1697 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001698
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001702 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001704
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001706 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 x = PyObject_GetAttr(v, w);
1709 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001711 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001713
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 case COMPARE_OP:
1715 w = POP();
1716 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001717 if (PyInt_Check(v) && PyInt_Check(w)) {
1718 /* INLINE: cmp(int, int) */
1719 register long a, b;
1720 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001721 a = PyInt_AS_LONG(v);
1722 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001723 switch (oparg) {
1724 case LT: res = a < b; break;
1725 case LE: res = a <= b; break;
1726 case EQ: res = a == b; break;
1727 case NE: res = a != b; break;
1728 case GT: res = a > b; break;
1729 case GE: res = a >= b; break;
1730 case IS: res = v == w; break;
1731 case IS_NOT: res = v != w; break;
1732 default: goto slow_compare;
1733 }
1734 x = res ? Py_True : Py_False;
1735 Py_INCREF(x);
1736 }
1737 else {
1738 slow_compare:
1739 x = cmp_outcome(oparg, v, w);
1740 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 Py_DECREF(v);
1742 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001744 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001746
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001748 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001750 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001752 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753 break;
1754 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001755 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001757 w,
1758 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001759 f->f_locals == NULL ?
1760 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001761 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001763 if (w == NULL) {
1764 x = NULL;
1765 break;
1766 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 x = PyEval_CallObject(x, w);
1768 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001769 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001770 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001772
Thomas Wouters52152252000-08-17 22:55:00 +00001773 case IMPORT_STAR:
1774 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001775 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001776 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001777 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001778 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001779 break;
1780 }
Thomas Wouters52152252000-08-17 22:55:00 +00001781 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001783 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001784 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001786
Thomas Wouters52152252000-08-17 22:55:00 +00001787 case IMPORT_FROM:
1788 w = GETNAMEV(oparg);
1789 v = TOP();
1790 x = import_from(v, w);
1791 PUSH(x);
1792 if (x != NULL) continue;
1793 break;
1794
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 case JUMP_FORWARD:
1796 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001798
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001801 if (err > 0)
1802 err = 0;
1803 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001805 else
1806 break;
1807 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001808
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001811 if (err > 0) {
1812 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001814 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001815 else if (err == 0)
1816 ;
1817 else
1818 break;
1819 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001820
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 case JUMP_ABSOLUTE:
1822 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001823 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001824
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 case FOR_LOOP:
1826 /* for v in s: ...
1827 On entry: stack contains s, i.
1828 On exit: stack contains s, i+1, s[i];
1829 but if loop exhausted:
1830 s, i are popped, and we jump */
1831 w = POP(); /* Loop index */
1832 v = POP(); /* Sequence object */
1833 u = loop_subscript(v, w);
1834 if (u != NULL) {
1835 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001838 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 }
1842 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 Py_DECREF(v);
1844 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001845 /* A NULL can mean "s exhausted"
1846 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001849 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001851 continue;
1852 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 }
1854 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001855
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 case SETUP_LOOP:
1857 case SETUP_EXCEPT:
1858 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001860 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001861 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001864#ifdef LLTRACE
1865 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001866 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001867#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001868 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 if (f->f_trace == NULL)
1870 continue;
1871 /* Trace each line of code reached */
1872 f->f_lasti = INSTR_OFFSET();
1873 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001876
1877 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001878 {
1879 int na = oparg & 0xff;
1880 int nk = (oparg>>8) & 0xff;
1881 int n = na + 2 * nk;
1882 PyObject **pfunc = stack_pointer - n - 1;
1883 PyObject *func = *pfunc;
1884 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1885
1886 /* Always dispatch PyCFunction first, because
1887 these are presumed to be the most frequent
1888 callable object.
1889 */
1890 if (PyCFunction_Check(func)) {
1891 if (PyCFunction_GET_FLAGS(func) == 0) {
1892 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001893 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001894 } else {
1895 x = do_call(func, &stack_pointer,
1896 na, nk);
1897 }
1898 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001899 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001900 && PyMethod_GET_SELF(func) != NULL) {
1901 /* optimize access to bound methods */
1902 PyObject *self = PyMethod_GET_SELF(func);
1903 Py_INCREF(self);
1904 func = PyMethod_GET_FUNCTION(func);
1905 Py_INCREF(func);
1906 Py_DECREF(*pfunc);
1907 *pfunc = self;
1908 na++;
1909 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001910 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001911 Py_INCREF(func);
1912 if (PyFunction_Check(func)) {
1913 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001914 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001915 } else {
1916 x = do_call(func, &stack_pointer,
1917 na, nk);
1918 }
1919 Py_DECREF(func);
1920 }
1921
1922 while (stack_pointer > pfunc) {
1923 w = POP();
1924 Py_DECREF(w);
1925 }
1926 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001927 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001928 continue;
1929 break;
1930 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001931
Jeremy Hylton76901512000-03-28 23:49:17 +00001932 case CALL_FUNCTION_VAR:
1933 case CALL_FUNCTION_KW:
1934 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001935 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001936 int na = oparg & 0xff;
1937 int nk = (oparg>>8) & 0xff;
1938 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001939 int n = na + 2 * nk;
1940 PyObject **pfunc, *func;
1941 if (flags & CALL_FLAG_VAR)
1942 n++;
1943 if (flags & CALL_FLAG_KW)
1944 n++;
1945 pfunc = stack_pointer - n - 1;
1946 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001947 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001948
Guido van Rossumac7be682001-01-17 15:42:30 +00001949 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001950 && PyMethod_GET_SELF(func) != NULL) {
1951 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001952 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001953 func = PyMethod_GET_FUNCTION(func);
1954 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001955 Py_DECREF(*pfunc);
1956 *pfunc = self;
1957 na++;
1958 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001959 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001960 Py_INCREF(func);
1961 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001962 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001963
Jeremy Hylton76901512000-03-28 23:49:17 +00001964 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001965 w = POP();
1966 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001967 }
1968 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001969 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001970 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001971 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001972 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001973
Guido van Rossum681d79a1995-07-18 14:51:37 +00001974 case MAKE_FUNCTION:
1975 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001976 x = PyFunction_New(v, f->f_globals);
1977 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001978 /* XXX Maybe this should be a separate opcode? */
1979 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001980 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001981 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001982 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001983 x = NULL;
1984 break;
1985 }
1986 while (--oparg >= 0) {
1987 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001989 }
1990 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001992 }
1993 PUSH(x);
1994 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001995
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001996 case MAKE_CLOSURE:
1997 {
1998 int nfree;
1999 v = POP(); /* code object */
2000 x = PyFunction_New(v, f->f_globals);
2001 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2002 Py_DECREF(v);
2003 /* XXX Maybe this should be a separate opcode? */
2004 if (x != NULL && nfree > 0) {
2005 v = PyTuple_New(nfree);
2006 if (v == NULL) {
2007 Py_DECREF(x);
2008 x = NULL;
2009 break;
2010 }
2011 while (--nfree >= 0) {
2012 w = POP();
2013 PyTuple_SET_ITEM(v, nfree, w);
2014 }
2015 err = PyFunction_SetClosure(x, v);
2016 Py_DECREF(v);
2017 }
2018 if (x != NULL && oparg > 0) {
2019 v = PyTuple_New(oparg);
2020 if (v == NULL) {
2021 Py_DECREF(x);
2022 x = NULL;
2023 break;
2024 }
2025 while (--oparg >= 0) {
2026 w = POP();
2027 PyTuple_SET_ITEM(v, oparg, w);
2028 }
2029 err = PyFunction_SetDefaults(x, v);
2030 Py_DECREF(v);
2031 }
2032 PUSH(x);
2033 break;
2034 }
2035
Guido van Rossum8861b741996-07-30 16:49:37 +00002036 case BUILD_SLICE:
2037 if (oparg == 3)
2038 w = POP();
2039 else
2040 w = NULL;
2041 v = POP();
2042 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002043 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 Py_DECREF(u);
2045 Py_DECREF(v);
2046 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002047 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002048 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002049 break;
2050
Fred Drakeef8ace32000-08-24 00:32:09 +00002051 case EXTENDED_ARG:
2052 opcode = NEXTOP();
2053 oparg = oparg<<16 | NEXTARG();
2054 goto dispatch_opcode;
2055 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002056
Guido van Rossum374a9221991-04-04 10:40:29 +00002057 default:
2058 fprintf(stderr,
2059 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002060 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002062 why = WHY_EXCEPTION;
2063 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002064
2065#ifdef CASE_TOO_BIG
2066 }
2067#endif
2068
Guido van Rossum374a9221991-04-04 10:40:29 +00002069 } /* switch */
2070
2071 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002072
Guido van Rossum374a9221991-04-04 10:40:29 +00002073 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002074
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 if (err == 0 && x != NULL) {
2077#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002078 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002080 fprintf(stderr,
2081 "XXX undetected error\n");
2082 else
2083#endif
2084 continue; /* Normal, fast path */
2085 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 err = 0;
2089 }
2090
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002092
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002095 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002096 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 why = WHY_EXCEPTION;
2098 }
2099 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002100#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002102 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002104 fprintf(stderr,
2105 "XXX undetected error (why=%d)\n",
2106 why);
2107 why = WHY_EXCEPTION;
2108 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002109 }
2110#endif
2111
2112 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002113
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002115 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002117 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002119
Guido van Rossume59214e1994-08-30 08:01:59 +00002120 if (f->f_trace)
2121 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002122 if (tstate->sys_profilefunc)
2123 call_exc_trace(&tstate->sys_profilefunc,
2124 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002125 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002126
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002128
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 if (why == WHY_RERAISE)
2130 why = WHY_EXCEPTION;
2131
2132 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002133
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002136
2137 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2138 /* For a continue inside a try block,
2139 don't pop the block for the loop. */
2140 PyFrame_BlockSetup(f, b->b_type, b->b_level,
2141 b->b_handler);
2142 why = WHY_NOT;
2143 JUMPTO(PyInt_AS_LONG(retval));
2144 Py_DECREF(retval);
2145 break;
2146 }
2147
Guido van Rossum374a9221991-04-04 10:40:29 +00002148 while (STACK_LEVEL() > b->b_level) {
2149 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 }
2152 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2153 why = WHY_NOT;
2154 JUMPTO(b->b_handler);
2155 break;
2156 }
2157 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002158 (b->b_type == SETUP_EXCEPT &&
2159 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyObject *exc, *val, *tb;
2162 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 val = Py_None;
2165 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 /* Make the raw exception data
2168 available to the handler,
2169 so a program can emulate the
2170 Python main loop. Don't do
2171 this for 'finally'. */
2172 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002173 PyErr_NormalizeException(
2174 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 set_exc_info(tstate,
2176 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 PUSH(val);
2180 PUSH(exc);
2181 }
2182 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002183 if (why == WHY_RETURN ||
2184 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 PUSH(v);
2188 }
2189 why = WHY_NOT;
2190 JUMPTO(b->b_handler);
2191 break;
2192 }
2193 } /* unwind stack */
2194
2195 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002196
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 if (why != WHY_NOT)
2198 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002199
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 while (!EMPTY()) {
2205 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002208
Guido van Rossum96a42c81992-01-12 02:29:51 +00002209 if (why != WHY_RETURN)
2210 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002211
Guido van Rossume59214e1994-08-30 08:01:59 +00002212 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002213 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002214 if (call_trace(&f->f_trace, &f->f_trace, f,
2215 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002218 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002219 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002220 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002221 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002222
Guido van Rossuma027efa1997-05-05 20:56:21 +00002223 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2224 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002225 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002227 retval = NULL;
2228 why = WHY_EXCEPTION;
2229 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002230 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002231
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 reset_exc_info(tstate);
2233
2234 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002235
2236 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002237
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239
Guido van Rossuma027efa1997-05-05 20:56:21 +00002240 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002242
Guido van Rossum96a42c81992-01-12 02:29:51 +00002243 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002244}
2245
Guido van Rossuma027efa1997-05-05 20:56:21 +00002246static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002247set_exc_info(PyThreadState *tstate,
2248 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002249{
2250 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002251 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002252
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253 frame = tstate->frame;
2254 if (frame->f_exc_type == NULL) {
2255 /* This frame didn't catch an exception before */
2256 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002257 if (tstate->exc_type == NULL) {
2258 Py_INCREF(Py_None);
2259 tstate->exc_type = Py_None;
2260 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002261 tmp_type = frame->f_exc_type;
2262 tmp_value = frame->f_exc_value;
2263 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002264 Py_XINCREF(tstate->exc_type);
2265 Py_XINCREF(tstate->exc_value);
2266 Py_XINCREF(tstate->exc_traceback);
2267 frame->f_exc_type = tstate->exc_type;
2268 frame->f_exc_value = tstate->exc_value;
2269 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002270 Py_XDECREF(tmp_type);
2271 Py_XDECREF(tmp_value);
2272 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002273 }
2274 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002275 tmp_type = tstate->exc_type;
2276 tmp_value = tstate->exc_value;
2277 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002278 Py_XINCREF(type);
2279 Py_XINCREF(value);
2280 Py_XINCREF(tb);
2281 tstate->exc_type = type;
2282 tstate->exc_value = value;
2283 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002284 Py_XDECREF(tmp_type);
2285 Py_XDECREF(tmp_value);
2286 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002287 /* For b/w compatibility */
2288 PySys_SetObject("exc_type", type);
2289 PySys_SetObject("exc_value", value);
2290 PySys_SetObject("exc_traceback", tb);
2291}
2292
2293static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002294reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002295{
2296 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002297 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002298 frame = tstate->frame;
2299 if (frame->f_exc_type != NULL) {
2300 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002301 tmp_type = tstate->exc_type;
2302 tmp_value = tstate->exc_value;
2303 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002304 Py_XINCREF(frame->f_exc_type);
2305 Py_XINCREF(frame->f_exc_value);
2306 Py_XINCREF(frame->f_exc_traceback);
2307 tstate->exc_type = frame->f_exc_type;
2308 tstate->exc_value = frame->f_exc_value;
2309 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002310 Py_XDECREF(tmp_type);
2311 Py_XDECREF(tmp_value);
2312 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002313 /* For b/w compatibility */
2314 PySys_SetObject("exc_type", frame->f_exc_type);
2315 PySys_SetObject("exc_value", frame->f_exc_value);
2316 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2317 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002318 tmp_type = frame->f_exc_type;
2319 tmp_value = frame->f_exc_value;
2320 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002321 frame->f_exc_type = NULL;
2322 frame->f_exc_value = NULL;
2323 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002324 Py_XDECREF(tmp_type);
2325 Py_XDECREF(tmp_value);
2326 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002327}
2328
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002329/* Logic for the raise statement (too complicated for inlining).
2330 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002331static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002333{
Guido van Rossumd295f121998-04-09 21:39:57 +00002334 if (type == NULL) {
2335 /* Reraise */
2336 PyThreadState *tstate = PyThreadState_Get();
2337 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2338 value = tstate->exc_value;
2339 tb = tstate->exc_traceback;
2340 Py_XINCREF(type);
2341 Py_XINCREF(value);
2342 Py_XINCREF(tb);
2343 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002344
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002345 /* We support the following forms of raise:
2346 raise <class>, <classinstance>
2347 raise <class>, <argument tuple>
2348 raise <class>, None
2349 raise <class>, <argument>
2350 raise <classinstance>, None
2351 raise <string>, <object>
2352 raise <string>, None
2353
2354 An omitted second argument is the same as None.
2355
2356 In addition, raise <tuple>, <anything> is the same as
2357 raising the tuple's first item (and it better have one!);
2358 this rule is applied recursively.
2359
2360 Finally, an optional third argument can be supplied, which
2361 gives the traceback to be substituted (useful when
2362 re-raising an exception after examining it). */
2363
2364 /* First, check the traceback argument, replacing None with
2365 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 if (tb == Py_None) {
2367 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002368 tb = NULL;
2369 }
2370 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002372 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002373 goto raise_error;
2374 }
2375
2376 /* Next, replace a missing value with None */
2377 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002378 value = Py_None;
2379 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002380 }
2381
2382 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2384 PyObject *tmp = type;
2385 type = PyTuple_GET_ITEM(type, 0);
2386 Py_INCREF(type);
2387 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002388 }
2389
Barry Warsaw4249f541997-08-22 21:26:19 +00002390 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002391 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002392
2393 else if (PyClass_Check(type))
2394 PyErr_NormalizeException(&type, &value, &tb);
2395
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002397 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 if (value != Py_None) {
2399 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002400 "instance exception may not have a separate value");
2401 goto raise_error;
2402 }
2403 else {
2404 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002406 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2408 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002409 }
2410 }
2411 else {
2412 /* Not something you can raise. You get an exception
2413 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002415 "exceptions must be strings, classes, or instances");
2416 goto raise_error;
2417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002419 if (tb == NULL)
2420 return WHY_EXCEPTION;
2421 else
2422 return WHY_RERAISE;
2423 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002424 Py_XDECREF(value);
2425 Py_XDECREF(type);
2426 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002427 return WHY_EXCEPTION;
2428}
2429
Barry Warsawe42b18f1997-08-25 22:13:04 +00002430static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002431unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002432{
2433 int i;
2434 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002435
Barry Warsawe42b18f1997-08-25 22:13:04 +00002436 for (i = 0; i < argcnt; i++) {
2437 if (! (w = PySequence_GetItem(v, i))) {
2438 if (PyErr_ExceptionMatches(PyExc_IndexError))
2439 PyErr_SetString(PyExc_ValueError,
2440 "unpack sequence of wrong size");
2441 goto finally;
2442 }
2443 *--sp = w;
2444 }
2445 /* we better get an IndexError now */
2446 if (PySequence_GetItem(v, i) == NULL) {
2447 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2448 PyErr_Clear();
2449 return 1;
2450 }
2451 /* some other exception occurred. fall through to finally */
2452 }
2453 else
2454 PyErr_SetString(PyExc_ValueError,
2455 "unpack sequence of wrong size");
2456 /* fall through */
2457finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002458 for (; i > 0; i--, sp++)
2459 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002460
2461 return 0;
2462}
2463
2464
Guido van Rossum96a42c81992-01-12 02:29:51 +00002465#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002467prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 if (PyObject_Print(v, stdout, 0) != 0)
2471 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002473 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002475#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002477static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002478call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002479{
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002481 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002483 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002484 value = Py_None;
2485 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002486 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002488 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002490 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002491 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002492 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002493 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002494 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002495 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002496 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 Py_XDECREF(type);
2498 Py_XDECREF(value);
2499 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002500 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002501}
2502
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002503/* PyObject **p_trace: in/out; may not be NULL;
2504 may not point to NULL variable initially
2505 PyObject **p_newtrace: in/out; may be NULL;
2506 may point to NULL variable;
2507 may be same variable as p_newtrace */
2508
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002509static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002510call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2511 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002512{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002513 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyObject *args, *what;
2515 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002516
Guido van Rossuma027efa1997-05-05 20:56:21 +00002517 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002518 /* Don't do recursive traces */
2519 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002521 *p_newtrace = NULL;
2522 }
2523 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002524 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002525
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002527 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002528 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002529 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002530 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002531 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 Py_INCREF(f);
2533 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2534 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002535 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002536 arg = Py_None;
2537 Py_INCREF(arg);
2538 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002539 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002540 PyFrame_FastToLocals(f);
2541 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2542 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002544 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002545 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002546 if (res == NULL) {
2547 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 PyTraceBack_Here(f);
2549 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002550 *p_trace = NULL;
2551 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002552 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002553 *p_newtrace = NULL;
2554 }
Barry Warsawf6202631999-09-08 16:26:33 +00002555 /* to be extra double plus sure we don't get recursive
2556 * calls inf either tracefunc or profilefunc gets an
2557 * exception, zap the global variables.
2558 */
2559 Py_XDECREF(tstate->sys_tracefunc);
2560 tstate->sys_tracefunc = NULL;
2561 Py_XDECREF(tstate->sys_profilefunc);
2562 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002563 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002564 }
2565 else {
2566 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002567 Py_XDECREF(*p_newtrace);
2568 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002569 *p_newtrace = NULL;
2570 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002572 *p_newtrace = res;
2573 }
2574 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002575 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002576 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002577 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002578}
2579
Guido van Rossumb209a111997-04-29 18:18:01 +00002580PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002582{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002583 PyThreadState *tstate = PyThreadState_Get();
2584 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002585 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002586 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002587 else
2588 return current_frame->f_builtins;
2589}
2590
Guido van Rossumb209a111997-04-29 18:18:01 +00002591PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002593{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002595 if (current_frame == NULL)
2596 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002598 return current_frame->f_locals;
2599}
2600
Guido van Rossumb209a111997-04-29 18:18:01 +00002601PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002604 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605 if (current_frame == NULL)
2606 return NULL;
2607 else
2608 return current_frame->f_globals;
2609}
2610
Guido van Rossumb209a111997-04-29 18:18:01 +00002611PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002613{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002614 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002616}
2617
Guido van Rossum6135a871995-01-09 17:53:26 +00002618int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002619PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002620{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002622 return current_frame == NULL ? 0 : current_frame->f_restricted;
2623}
2624
Guido van Rossumbe270261997-05-22 22:26:18 +00002625int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002626Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627{
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002629 if (f == NULL)
2630 return 0;
2631 if (!PyFile_SoftSpace(f, 0))
2632 return 0;
2633 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634}
2635
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636
Guido van Rossum681d79a1995-07-18 14:51:37 +00002637/* External interface to call any callable object.
2638 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002639
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002640#undef PyEval_CallObject
2641/* for backward compatibility: export this interface */
2642
Guido van Rossumb209a111997-04-29 18:18:01 +00002643PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002644PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002645{
Guido van Rossumb209a111997-04-29 18:18:01 +00002646 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002647}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002648#define PyEval_CallObject(func,arg) \
2649 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002650
Guido van Rossumb209a111997-04-29 18:18:01 +00002651PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002652PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002653{
Jeremy Hylton52820442001-01-03 23:52:36 +00002654 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002655
2656 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 arg = PyTuple_New(0);
2658 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002659 PyErr_SetString(PyExc_TypeError,
2660 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002661 return NULL;
2662 }
2663 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002665
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002667 PyErr_SetString(PyExc_TypeError,
2668 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002669 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002670 return NULL;
2671 }
2672
Jeremy Hylton52820442001-01-03 23:52:36 +00002673 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002674 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002675 return result;
2676}
2677
2678/* How often is each kind of object called? The answer depends on the
2679 program. An instrumented call_object() was used to run the Python
2680 regression test suite. The results were:
2681 4200000 PyCFunctions
2682 390000 fast_function() calls
2683 94000 other functions
2684 480000 all functions (sum of prev two)
2685 150000 methods
2686 100000 classes
2687
2688 Tests on other bodies of code show that PyCFunctions are still
2689 most common, but not by such a large margin.
2690*/
2691
2692static PyObject *
2693call_object(PyObject *func, PyObject *arg, PyObject *kw)
2694{
2695 ternaryfunc call;
2696 PyObject *result;
2697
2698 if (PyMethod_Check(func))
2699 result = call_method(func, arg, kw);
2700 else if (PyFunction_Check(func))
2701 result = call_eval_code2(func, arg, kw);
2702 else if (PyCFunction_Check(func))
2703 result = call_cfunction(func, arg, kw);
2704 else if (PyClass_Check(func))
2705 result = PyInstance_New(func, arg, kw);
2706 else if (PyInstance_Check(func))
2707 result = call_instance(func, arg, kw);
2708 else if ((call = func->ob_type->tp_call) != NULL)
2709 result = (*call)(func, arg, kw);
2710 else {
2711 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2712 PyString_AS_STRING(PyObject_Repr(func)));
2713 return NULL;
2714 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 if (result == NULL && !PyErr_Occurred())
2716 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002717 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002718
Guido van Rossume59214e1994-08-30 08:01:59 +00002719 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002720}
2721
Guido van Rossumb209a111997-04-29 18:18:01 +00002722static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002723call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724{
Jeremy Hylton52820442001-01-03 23:52:36 +00002725 PyCFunctionObject* f = (PyCFunctionObject*)func;
2726 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2727 PyObject *self = PyCFunction_GET_SELF(func);
2728 int flags = PyCFunction_GET_FLAGS(func);
2729
Jeremy Hylton52820442001-01-03 23:52:36 +00002730 if (flags & METH_KEYWORDS) {
Fred Drake1a7aab72001-01-04 22:33:02 +00002731 if (kw == NULL) {
2732 static PyObject *dict = NULL;
2733 if (dict == NULL) {
2734 dict = PyDict_New();
2735 if (dict == NULL)
2736 return NULL;
2737 }
2738 kw = dict;
2739 Py_INCREF(dict);
2740 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002741 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002743 if (kw != NULL && PyDict_Size(kw) != 0) {
2744 PyErr_Format(PyExc_TypeError,
2745 "%.200s() takes no keyword arguments",
2746 f->m_ml->ml_name);
2747 return NULL;
2748 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002749 if (flags & METH_VARARGS) {
2750 return (*meth)(self, arg);
2751 }
2752 if (!(flags & METH_VARARGS)) {
2753 /* the really old style */
2754 int size = PyTuple_GET_SIZE(arg);
2755 if (size == 1)
2756 arg = PyTuple_GET_ITEM(arg, 0);
2757 else if (size == 0)
2758 arg = NULL;
2759 return (*meth)(self, arg);
2760 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002761 /* should never get here ??? */
2762 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002763 return NULL;
2764}
2765
Guido van Rossumb209a111997-04-29 18:18:01 +00002766static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002767call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768{
Jeremy Hylton52820442001-01-03 23:52:36 +00002769 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2770 if (call == NULL) {
2771 PyInstanceObject *inst = (PyInstanceObject*) func;
2772 PyErr_Clear();
2773 PyErr_Format(PyExc_AttributeError,
2774 "%.200s instance has no __call__ method",
2775 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002776 return NULL;
2777 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002778 res = call_object(call, arg, kw);
2779 Py_DECREF(call);
2780 return res;
2781}
2782
2783static PyObject *
2784call_method(PyObject *func, PyObject *arg, PyObject *kw)
2785{
2786 PyObject *self = PyMethod_GET_SELF(func);
2787 PyObject *class = PyMethod_GET_CLASS(func);
2788 PyObject *result;
2789
2790 func = PyMethod_GET_FUNCTION(func);
2791 if (self == NULL) {
2792 /* Unbound methods must be called with an instance of
2793 the class (or a derived class) as first argument */
2794 if (PyTuple_Size(arg) >= 1)
2795 self = PyTuple_GET_ITEM(arg, 0);
2796 if (!(self != NULL && PyInstance_Check(self)
2797 && PyClass_IsSubclass((PyObject *)
2798 (((PyInstanceObject *)self)->in_class),
2799 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002800 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2801 PyErr_Format(PyExc_TypeError,
2802 "unbound method %s%smust be "
2803 "called with instance as first argument",
2804 fn ? PyString_AsString(fn) : "",
2805 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 return NULL;
2807 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002808 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002809 } else {
2810 int argcount = PyTuple_Size(arg);
2811 PyObject *newarg = PyTuple_New(argcount + 1);
2812 int i;
2813 if (newarg == NULL)
2814 return NULL;
2815 Py_INCREF(self);
2816 PyTuple_SET_ITEM(newarg, 0, self);
2817 for (i = 0; i < argcount; i++) {
2818 PyObject *v = PyTuple_GET_ITEM(arg, i);
2819 Py_XINCREF(v);
2820 PyTuple_SET_ITEM(newarg, i+1, v);
2821 }
2822 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002824 result = call_object(func, arg, kw);
2825 Py_DECREF(arg);
2826 return result;
2827}
2828
2829static PyObject *
2830call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2831{
2832 PyObject *result;
2833 PyObject *argdefs;
2834 PyObject **d, **k;
2835 int nk, nd;
2836
2837 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2839 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2840 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002841 }
2842 else {
2843 d = NULL;
2844 nd = 0;
2845 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002846
Guido van Rossum681d79a1995-07-18 14:51:37 +00002847 if (kw != NULL) {
2848 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002849 nk = PyDict_Size(kw);
2850 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002851 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002852 PyErr_NoMemory();
2853 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002854 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002855 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002856 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002857 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002858 i += 2;
2859 nk = i/2;
2860 /* XXX This is broken if the caller deletes dict items! */
2861 }
2862 else {
2863 k = NULL;
2864 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002865 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002866
Guido van Rossum681d79a1995-07-18 14:51:37 +00002867 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002868 (PyCodeObject *)PyFunction_GET_CODE(func),
2869 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002870 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002871 k, nk, d, nd,
2872 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002873
Guido van Rossumb18618d2000-05-03 23:44:39 +00002874 if (k != NULL)
2875 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002876
Guido van Rossum681d79a1995-07-18 14:51:37 +00002877 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878}
2879
Jeremy Hylton52820442001-01-03 23:52:36 +00002880#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2881
2882/* The two fast_xxx() functions optimize calls for which no argument
2883 tuple is necessary; the objects are passed directly from the stack.
2884 fast_cfunction() is called for METH_OLDARGS functions.
2885 fast_function() is for functions with no special argument handling.
2886*/
2887
2888static PyObject *
2889fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2890{
2891 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2892 PyObject *self = PyCFunction_GET_SELF(func);
2893
2894 if (na == 0)
2895 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002896 else if (na == 1) {
2897 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002898 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002899 Py_DECREF(arg);
2900 return result;
2901 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002902 PyObject *args = load_args(pp_stack, na);
2903 PyObject *result = (*meth)(self, args);
2904 Py_DECREF(args);
2905 return result;
2906 }
2907}
2908
2909static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002910fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002911{
2912 PyObject *co = PyFunction_GET_CODE(func);
2913 PyObject *globals = PyFunction_GET_GLOBALS(func);
2914 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002915 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002916 PyObject **d = NULL;
2917 int nd = 0;
2918
2919 if (argdefs != NULL) {
2920 d = &PyTuple_GET_ITEM(argdefs, 0);
2921 nd = ((PyTupleObject *)argdefs)->ob_size;
2922 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002923 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002924 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002925 (*pp_stack)-2*nk, nk, d, nd,
2926 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002927}
2928
2929static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002930update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2931 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002932{
2933 PyObject *kwdict = NULL;
2934 if (orig_kwdict == NULL)
2935 kwdict = PyDict_New();
2936 else {
2937 kwdict = PyDict_Copy(orig_kwdict);
2938 Py_DECREF(orig_kwdict);
2939 }
2940 if (kwdict == NULL)
2941 return NULL;
2942 while (--nk >= 0) {
2943 int err;
2944 PyObject *value = EXT_POP(*pp_stack);
2945 PyObject *key = EXT_POP(*pp_stack);
2946 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002947 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002948 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002949 "%.200s%s got multiple values "
2950 "for keyword argument '%.400s'",
2951 fn ? PyString_AsString(fn) : "function",
2952 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002953 Py_DECREF(key);
2954 Py_DECREF(value);
2955 Py_DECREF(kwdict);
2956 return NULL;
2957 }
2958 err = PyDict_SetItem(kwdict, key, value);
2959 Py_DECREF(key);
2960 Py_DECREF(value);
2961 if (err) {
2962 Py_DECREF(kwdict);
2963 return NULL;
2964 }
2965 }
2966 return kwdict;
2967}
2968
2969static PyObject *
2970update_star_args(int nstack, int nstar, PyObject *stararg,
2971 PyObject ***pp_stack)
2972{
2973 PyObject *callargs, *w;
2974
2975 callargs = PyTuple_New(nstack + nstar);
2976 if (callargs == NULL) {
2977 return NULL;
2978 }
2979 if (nstar) {
2980 int i;
2981 for (i = 0; i < nstar; i++) {
2982 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2983 Py_INCREF(a);
2984 PyTuple_SET_ITEM(callargs, nstack + i, a);
2985 }
2986 }
2987 while (--nstack >= 0) {
2988 w = EXT_POP(*pp_stack);
2989 PyTuple_SET_ITEM(callargs, nstack, w);
2990 }
2991 return callargs;
2992}
2993
2994static PyObject *
2995load_args(PyObject ***pp_stack, int na)
2996{
2997 PyObject *args = PyTuple_New(na);
2998 PyObject *w;
2999
3000 if (args == NULL)
3001 return NULL;
3002 while (--na >= 0) {
3003 w = EXT_POP(*pp_stack);
3004 PyTuple_SET_ITEM(args, na, w);
3005 }
3006 return args;
3007}
3008
3009static PyObject *
3010do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3011{
3012 PyObject *callargs = NULL;
3013 PyObject *kwdict = NULL;
3014 PyObject *result = NULL;
3015
3016 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003017 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003018 if (kwdict == NULL)
3019 goto call_fail;
3020 }
3021 callargs = load_args(pp_stack, na);
3022 if (callargs == NULL)
3023 goto call_fail;
3024 result = call_object(func, callargs, kwdict);
3025 call_fail:
3026 Py_XDECREF(callargs);
3027 Py_XDECREF(kwdict);
3028 return result;
3029}
3030
3031static PyObject *
3032ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3033{
3034 int nstar = 0;
3035 PyObject *callargs = NULL;
3036 PyObject *stararg = NULL;
3037 PyObject *kwdict = NULL;
3038 PyObject *result = NULL;
3039
3040 if (flags & CALL_FLAG_KW) {
3041 kwdict = EXT_POP(*pp_stack);
3042 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003043 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3044 PyErr_Format(PyExc_TypeError,
3045 "%s%s argument after ** must be a dictionary",
3046 fn ? PyString_AsString(fn) : "function",
3047 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003048 goto ext_call_fail;
3049 }
3050 }
3051 if (flags & CALL_FLAG_VAR) {
3052 stararg = EXT_POP(*pp_stack);
3053 if (!PyTuple_Check(stararg)) {
3054 PyObject *t = NULL;
3055 t = PySequence_Tuple(stararg);
3056 if (t == NULL) {
3057 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003058 PyObject* fn =
3059 ((PyFunctionObject*) func)->func_name;
3060 PyErr_Format(PyExc_TypeError,
3061 "%s%s argument after * must be a sequence",
3062 fn ? PyString_AsString(fn) : "function",
3063 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003064 }
3065 goto ext_call_fail;
3066 }
3067 Py_DECREF(stararg);
3068 stararg = t;
3069 }
3070 nstar = PyTuple_GET_SIZE(stararg);
3071 }
3072 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003073 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003074 if (kwdict == NULL)
3075 goto ext_call_fail;
3076 }
3077 callargs = update_star_args(na, nstar, stararg, pp_stack);
3078 if (callargs == NULL)
3079 goto ext_call_fail;
3080 result = call_object(func, callargs, kwdict);
3081 ext_call_fail:
3082 Py_XDECREF(callargs);
3083 Py_XDECREF(kwdict);
3084 Py_XDECREF(stararg);
3085 return result;
3086}
3087
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003088#define SLICE_ERROR_MSG \
3089 "standard sequence type does not support step size other than one"
3090
Guido van Rossumb209a111997-04-29 18:18:01 +00003091static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003092loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093{
Guido van Rossumb209a111997-04-29 18:18:01 +00003094 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003095 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003096 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003097 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 return NULL;
3099 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003100 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003101 v = (*sq->sq_item)(v, i);
3102 if (v)
3103 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003104 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003105 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003106 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107}
3108
Guido van Rossum20c6add2000-05-08 14:06:50 +00003109/* Extract a slice index from a PyInt or PyLong, the index is bound to
3110 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3111 and error. Returns 1 on success.*/
3112
3113int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003114_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115{
3116 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003117 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003118 if (PyInt_Check(v)) {
3119 x = PyInt_AsLong(v);
3120 } else if (PyLong_Check(v)) {
3121 x = PyLong_AsLong(v);
3122 if (x==-1 && PyErr_Occurred()) {
3123 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003124 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003125
Guido van Rossumac7be682001-01-17 15:42:30 +00003126 if (!PyErr_ExceptionMatches(
3127 PyExc_OverflowError)) {
3128 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003129 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003130 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003131 }
3132
Guido van Rossumac7be682001-01-17 15:42:30 +00003133 /* Clear the OverflowError */
3134 PyErr_Clear();
3135
3136 /* It's an overflow error, so we need to
3137 check the sign of the long integer,
3138 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003139 the error. */
3140
3141 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003142 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003143 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003144
3145 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003146 cmp = PyObject_RichCompareBool(v, long_zero,
3147 Py_GT);
3148 Py_DECREF(long_zero);
3149 if (cmp < 0)
3150 return 0;
3151 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003152 x = INT_MAX;
3153 else
3154 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003155 }
3156 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003157 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003158 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003159 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003160 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003161 /* Truncate -- very long indices are truncated anyway */
3162 if (x > INT_MAX)
3163 x = INT_MAX;
3164 else if (x < -INT_MAX)
3165 x = 0;
3166 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003168 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169}
3170
Guido van Rossumb209a111997-04-29 18:18:01 +00003171static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003174 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003175 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003177 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003178 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003179 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003181
3182static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003183assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3184 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003185{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003186 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003187 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003188 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003189 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003190 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003191 if (x == NULL)
3192 return PySequence_DelSlice(u, ilow, ihigh);
3193 else
3194 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195}
3196
Guido van Rossumb209a111997-04-29 18:18:01 +00003197static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003198cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199{
Guido van Rossumac7be682001-01-17 15:42:30 +00003200 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003202 case IS:
3203 case IS_NOT:
3204 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003205 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003206 res = !res;
3207 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 case IN:
3209 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003210 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003211 if (res < 0)
3212 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003213 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003214 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215 break;
3216 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003217 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 break;
3219 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003220 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003222 v = res ? Py_True : Py_False;
3223 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 return v;
3225}
3226
Thomas Wouters52152252000-08-17 22:55:00 +00003227static PyObject *
3228import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003229{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003230 PyObject *x;
3231
3232 x = PyObject_GetAttr(v, name);
3233 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003234 PyErr_Format(PyExc_ImportError,
3235 "cannot import name %.230s",
3236 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003237 }
Thomas Wouters52152252000-08-17 22:55:00 +00003238 return x;
3239}
Guido van Rossumac7be682001-01-17 15:42:30 +00003240
Thomas Wouters52152252000-08-17 22:55:00 +00003241static int
3242import_all_from(PyObject *locals, PyObject *v)
3243{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003244 PyObject *all = PyObject_GetAttrString(v, "__all__");
3245 PyObject *dict, *name, *value;
3246 int skip_leading_underscores = 0;
3247 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003248
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003249 if (all == NULL) {
3250 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3251 return -1; /* Unexpected error */
3252 PyErr_Clear();
3253 dict = PyObject_GetAttrString(v, "__dict__");
3254 if (dict == NULL) {
3255 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3256 return -1;
3257 PyErr_SetString(PyExc_ImportError,
3258 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003259 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003260 }
3261 all = PyMapping_Keys(dict);
3262 Py_DECREF(dict);
3263 if (all == NULL)
3264 return -1;
3265 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003266 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003267
3268 for (pos = 0, err = 0; ; pos++) {
3269 name = PySequence_GetItem(all, pos);
3270 if (name == NULL) {
3271 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3272 err = -1;
3273 else
3274 PyErr_Clear();
3275 break;
3276 }
3277 if (skip_leading_underscores &&
3278 PyString_Check(name) &&
3279 PyString_AS_STRING(name)[0] == '_')
3280 {
3281 Py_DECREF(name);
3282 continue;
3283 }
3284 value = PyObject_GetAttr(v, name);
3285 if (value == NULL)
3286 err = -1;
3287 else
3288 err = PyDict_SetItem(locals, name, value);
3289 Py_DECREF(name);
3290 Py_XDECREF(value);
3291 if (err != 0)
3292 break;
3293 }
3294 Py_DECREF(all);
3295 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003296}
3297
Guido van Rossumb209a111997-04-29 18:18:01 +00003298static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003299build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003300{
Guido van Rossumcd649651997-08-22 16:56:16 +00003301 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003302 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003303 PyErr_SetString(PyExc_SystemError,
3304 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003305 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003306 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003307 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003308 PyErr_SetString(PyExc_SystemError,
3309 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003310 return NULL;
3311 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003312 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003313 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003314 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003315 return NULL;
3316 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003317 n = PyTuple_Size(bases);
3318 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003319 PyObject *base = PyTuple_GET_ITEM(bases, i);
3320 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003321 /* Call the base's *type*, if it is callable.
3322 This code is a hook for Donald Beaudry's
3323 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003324 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003325 since its types are not callable.
3326 Ditto: call the bases's *class*, if it has
3327 one. This makes the same thing possible
3328 without writing C code. A true meta-object
3329 protocol! */
3330 PyObject *basetype = (PyObject *)base->ob_type;
3331 PyObject *callable = NULL;
3332 if (PyCallable_Check(basetype))
3333 callable = basetype;
3334 else
3335 callable = PyObject_GetAttrString(
3336 base, "__class__");
3337 if (callable) {
3338 PyObject *args;
3339 PyObject *newclass = NULL;
3340 args = Py_BuildValue(
3341 "(OOO)", name, bases, methods);
3342 if (args != NULL) {
3343 newclass = PyEval_CallObject(
3344 callable, args);
3345 Py_DECREF(args);
3346 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003347 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003348 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003349 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003350 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003351 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003352 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003353 "base is not a class object");
3354 return NULL;
3355 }
3356 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003357 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003358}
3359
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003360static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003361exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3362 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003363{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003364 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003365 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003366 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003367
Guido van Rossumb209a111997-04-29 18:18:01 +00003368 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3369 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003370 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003371 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003372 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003373 locals = PyTuple_GetItem(prog, 2);
3374 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003375 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003376 if (globals == Py_None) {
3377 globals = PyEval_GetGlobals();
3378 if (locals == Py_None) {
3379 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003380 plain = 1;
3381 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003382 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003383 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003384 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003385 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003386 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003387 !PyCode_Check(prog) &&
3388 !PyFile_Check(prog)) {
3389 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003390 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003391 return -1;
3392 }
Fred Drake661ea262000-10-24 19:57:45 +00003393 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003394 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003395 "exec: arg 2 must be a dictionary or None");
3396 return -1;
3397 }
3398 if (!PyDict_Check(locals)) {
3399 PyErr_SetString(PyExc_TypeError,
3400 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003401 return -1;
3402 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003403 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003404 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003405 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003406 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003407 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003408 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003409 FILE *fp = PyFile_AsFile(prog);
3410 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003411 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3412 }
3413 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003414 char *str;
3415 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003416 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003417 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003418 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003419 if (plain)
3420 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003421 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003422 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003423 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003424 return 0;
3425}
Guido van Rossum24c13741995-02-14 09:42:43 +00003426
Guido van Rossumac7be682001-01-17 15:42:30 +00003427static void
Paul Prescode68140d2000-08-30 20:25:01 +00003428format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3429{
3430 char *obj_str;
3431
3432 if (!obj)
3433 return;
3434
3435 obj_str = PyString_AsString(obj);
3436 if (!obj_str)
3437 return;
3438
3439 PyErr_Format(exc, format_str, obj_str);
3440}
Guido van Rossum950361c1997-01-24 13:49:28 +00003441
3442#ifdef DYNAMIC_EXECUTION_PROFILE
3443
3444PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003445getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003446{
3447 int i;
3448 PyObject *l = PyList_New(256);
3449 if (l == NULL) return NULL;
3450 for (i = 0; i < 256; i++) {
3451 PyObject *x = PyInt_FromLong(a[i]);
3452 if (x == NULL) {
3453 Py_DECREF(l);
3454 return NULL;
3455 }
3456 PyList_SetItem(l, i, x);
3457 }
3458 for (i = 0; i < 256; i++)
3459 a[i] = 0;
3460 return l;
3461}
3462
3463PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003464_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003465{
3466#ifndef DXPAIRS
3467 return getarray(dxp);
3468#else
3469 int i;
3470 PyObject *l = PyList_New(257);
3471 if (l == NULL) return NULL;
3472 for (i = 0; i < 257; i++) {
3473 PyObject *x = getarray(dxpairs[i]);
3474 if (x == NULL) {
3475 Py_DECREF(l);
3476 return NULL;
3477 }
3478 PyList_SetItem(l, i, x);
3479 }
3480 return l;
3481#endif
3482}
3483
3484#endif