blob: 264ba30a759f37e2a2488aaa2a965ea2c4ec0b7d [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);
1649 Py_INCREF(w);
1650 PUSH(w);
1651 break;
1652
1653 case STORE_DEREF:
1654 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001655 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001656 PyCell_Set(x, w);
1657 continue;
1658
Guido van Rossum374a9221991-04-04 10:40:29 +00001659 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001660 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001661 if (x != NULL) {
1662 for (; --oparg >= 0;) {
1663 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001664 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 }
1666 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001667 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 }
1669 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001670
Guido van Rossum374a9221991-04-04 10:40:29 +00001671 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001672 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001673 if (x != NULL) {
1674 for (; --oparg >= 0;) {
1675 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001676 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 }
1678 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001679 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 }
1681 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001682
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001684 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001686 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001688
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001690 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001692 x = PyObject_GetAttr(v, w);
1693 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001694 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001695 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001697
Guido van Rossum374a9221991-04-04 10:40:29 +00001698 case COMPARE_OP:
1699 w = POP();
1700 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001701 if (PyInt_Check(v) && PyInt_Check(w)) {
1702 /* INLINE: cmp(int, int) */
1703 register long a, b;
1704 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001705 a = PyInt_AS_LONG(v);
1706 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001707 switch (oparg) {
1708 case LT: res = a < b; break;
1709 case LE: res = a <= b; break;
1710 case EQ: res = a == b; break;
1711 case NE: res = a != b; break;
1712 case GT: res = a > b; break;
1713 case GE: res = a >= b; break;
1714 case IS: res = v == w; break;
1715 case IS_NOT: res = v != w; break;
1716 default: goto slow_compare;
1717 }
1718 x = res ? Py_True : Py_False;
1719 Py_INCREF(x);
1720 }
1721 else {
1722 slow_compare:
1723 x = cmp_outcome(oparg, v, w);
1724 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001725 Py_DECREF(v);
1726 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001727 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001728 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001729 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001730
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001733 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001734 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001736 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001737 break;
1738 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001739 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001740 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001741 w,
1742 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001743 f->f_locals == NULL ?
1744 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001745 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001746 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001747 if (w == NULL) {
1748 x = NULL;
1749 break;
1750 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 x = PyEval_CallObject(x, w);
1752 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001753 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001754 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001756
Thomas Wouters52152252000-08-17 22:55:00 +00001757 case IMPORT_STAR:
1758 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001760 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001761 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001762 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001763 break;
1764 }
Thomas Wouters52152252000-08-17 22:55:00 +00001765 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001766 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001767 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001768 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001770
Thomas Wouters52152252000-08-17 22:55:00 +00001771 case IMPORT_FROM:
1772 w = GETNAMEV(oparg);
1773 v = TOP();
1774 x = import_from(v, w);
1775 PUSH(x);
1776 if (x != NULL) continue;
1777 break;
1778
Guido van Rossum374a9221991-04-04 10:40:29 +00001779 case JUMP_FORWARD:
1780 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001781 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001782
Guido van Rossum374a9221991-04-04 10:40:29 +00001783 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001784 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001785 if (err > 0)
1786 err = 0;
1787 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001789 else
1790 break;
1791 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001792
Guido van Rossum374a9221991-04-04 10:40:29 +00001793 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001794 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001795 if (err > 0) {
1796 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001797 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001798 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001799 else if (err == 0)
1800 ;
1801 else
1802 break;
1803 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001804
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 case JUMP_ABSOLUTE:
1806 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001807 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001808
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 case FOR_LOOP:
1810 /* for v in s: ...
1811 On entry: stack contains s, i.
1812 On exit: stack contains s, i+1, s[i];
1813 but if loop exhausted:
1814 s, i are popped, and we jump */
1815 w = POP(); /* Loop index */
1816 v = POP(); /* Sequence object */
1817 u = loop_subscript(v, w);
1818 if (u != NULL) {
1819 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001820 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001822 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001823 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001824 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 }
1826 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001827 Py_DECREF(v);
1828 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 /* A NULL can mean "s exhausted"
1830 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001831 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001832 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001833 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001834 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001835 continue;
1836 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 }
1838 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001839
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 case SETUP_LOOP:
1841 case SETUP_EXCEPT:
1842 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001844 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001845 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001846
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001848#ifdef LLTRACE
1849 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001850 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001851#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001852 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001853 if (f->f_trace == NULL)
1854 continue;
1855 /* Trace each line of code reached */
1856 f->f_lasti = INSTR_OFFSET();
1857 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001858 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001860
1861 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001862 {
1863 int na = oparg & 0xff;
1864 int nk = (oparg>>8) & 0xff;
1865 int n = na + 2 * nk;
1866 PyObject **pfunc = stack_pointer - n - 1;
1867 PyObject *func = *pfunc;
1868 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1869
1870 /* Always dispatch PyCFunction first, because
1871 these are presumed to be the most frequent
1872 callable object.
1873 */
1874 if (PyCFunction_Check(func)) {
1875 if (PyCFunction_GET_FLAGS(func) == 0) {
1876 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001877 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001878 } else {
1879 x = do_call(func, &stack_pointer,
1880 na, nk);
1881 }
1882 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001883 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001884 && PyMethod_GET_SELF(func) != NULL) {
1885 /* optimize access to bound methods */
1886 PyObject *self = PyMethod_GET_SELF(func);
1887 Py_INCREF(self);
1888 func = PyMethod_GET_FUNCTION(func);
1889 Py_INCREF(func);
1890 Py_DECREF(*pfunc);
1891 *pfunc = self;
1892 na++;
1893 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001894 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001895 Py_INCREF(func);
1896 if (PyFunction_Check(func)) {
1897 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001898 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001899 } else {
1900 x = do_call(func, &stack_pointer,
1901 na, nk);
1902 }
1903 Py_DECREF(func);
1904 }
1905
1906 while (stack_pointer > pfunc) {
1907 w = POP();
1908 Py_DECREF(w);
1909 }
1910 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001911 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001912 continue;
1913 break;
1914 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001915
Jeremy Hylton76901512000-03-28 23:49:17 +00001916 case CALL_FUNCTION_VAR:
1917 case CALL_FUNCTION_KW:
1918 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001919 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001920 int na = oparg & 0xff;
1921 int nk = (oparg>>8) & 0xff;
1922 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001923 int n = na + 2 * nk;
1924 PyObject **pfunc, *func;
1925 if (flags & CALL_FLAG_VAR)
1926 n++;
1927 if (flags & CALL_FLAG_KW)
1928 n++;
1929 pfunc = stack_pointer - n - 1;
1930 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001931 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001932
Guido van Rossumac7be682001-01-17 15:42:30 +00001933 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001934 && PyMethod_GET_SELF(func) != NULL) {
1935 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001936 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001937 func = PyMethod_GET_FUNCTION(func);
1938 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001939 Py_DECREF(*pfunc);
1940 *pfunc = self;
1941 na++;
1942 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001943 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001944 Py_INCREF(func);
1945 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001946 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001947
Jeremy Hylton76901512000-03-28 23:49:17 +00001948 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001949 w = POP();
1950 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001951 }
1952 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001953 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001954 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001955 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001956 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001957
Guido van Rossum681d79a1995-07-18 14:51:37 +00001958 case MAKE_FUNCTION:
1959 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001960 x = PyFunction_New(v, f->f_globals);
1961 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001962 /* XXX Maybe this should be a separate opcode? */
1963 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001964 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001965 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001966 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001967 x = NULL;
1968 break;
1969 }
1970 while (--oparg >= 0) {
1971 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001972 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001973 }
1974 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001975 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001976 }
1977 PUSH(x);
1978 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001979
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001980 case MAKE_CLOSURE:
1981 {
1982 int nfree;
1983 v = POP(); /* code object */
1984 x = PyFunction_New(v, f->f_globals);
1985 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
1986 Py_DECREF(v);
1987 /* XXX Maybe this should be a separate opcode? */
1988 if (x != NULL && nfree > 0) {
1989 v = PyTuple_New(nfree);
1990 if (v == NULL) {
1991 Py_DECREF(x);
1992 x = NULL;
1993 break;
1994 }
1995 while (--nfree >= 0) {
1996 w = POP();
1997 PyTuple_SET_ITEM(v, nfree, w);
1998 }
1999 err = PyFunction_SetClosure(x, v);
2000 Py_DECREF(v);
2001 }
2002 if (x != NULL && oparg > 0) {
2003 v = PyTuple_New(oparg);
2004 if (v == NULL) {
2005 Py_DECREF(x);
2006 x = NULL;
2007 break;
2008 }
2009 while (--oparg >= 0) {
2010 w = POP();
2011 PyTuple_SET_ITEM(v, oparg, w);
2012 }
2013 err = PyFunction_SetDefaults(x, v);
2014 Py_DECREF(v);
2015 }
2016 PUSH(x);
2017 break;
2018 }
2019
Guido van Rossum8861b741996-07-30 16:49:37 +00002020 case BUILD_SLICE:
2021 if (oparg == 3)
2022 w = POP();
2023 else
2024 w = NULL;
2025 v = POP();
2026 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002027 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002028 Py_DECREF(u);
2029 Py_DECREF(v);
2030 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002031 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002032 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002033 break;
2034
Fred Drakeef8ace32000-08-24 00:32:09 +00002035 case EXTENDED_ARG:
2036 opcode = NEXTOP();
2037 oparg = oparg<<16 | NEXTARG();
2038 goto dispatch_opcode;
2039 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002040
Guido van Rossum374a9221991-04-04 10:40:29 +00002041 default:
2042 fprintf(stderr,
2043 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002044 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002045 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002046 why = WHY_EXCEPTION;
2047 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002048
2049#ifdef CASE_TOO_BIG
2050 }
2051#endif
2052
Guido van Rossum374a9221991-04-04 10:40:29 +00002053 } /* switch */
2054
2055 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002056
Guido van Rossum374a9221991-04-04 10:40:29 +00002057 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002058
Guido van Rossum374a9221991-04-04 10:40:29 +00002059 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002060 if (err == 0 && x != NULL) {
2061#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002062 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002063 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002064 fprintf(stderr,
2065 "XXX undetected error\n");
2066 else
2067#endif
2068 continue; /* Normal, fast path */
2069 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002070 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 err = 0;
2073 }
2074
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002076
Guido van Rossum374a9221991-04-04 10:40:29 +00002077 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002078 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002079 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002080 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002081 why = WHY_EXCEPTION;
2082 }
2083 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002084#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002085 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002086 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002088 fprintf(stderr,
2089 "XXX undetected error (why=%d)\n",
2090 why);
2091 why = WHY_EXCEPTION;
2092 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 }
2094#endif
2095
2096 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002097
Guido van Rossum374a9221991-04-04 10:40:29 +00002098 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002099 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002100 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002101 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002102 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002103
Guido van Rossume59214e1994-08-30 08:01:59 +00002104 if (f->f_trace)
2105 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002106 if (tstate->sys_profilefunc)
2107 call_exc_trace(&tstate->sys_profilefunc,
2108 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002109 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002110
Guido van Rossum374a9221991-04-04 10:40:29 +00002111 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002112
Guido van Rossum374a9221991-04-04 10:40:29 +00002113 if (why == WHY_RERAISE)
2114 why = WHY_EXCEPTION;
2115
2116 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002117
Guido van Rossum374a9221991-04-04 10:40:29 +00002118 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002119 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002120
2121 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2122 /* For a continue inside a try block,
2123 don't pop the block for the loop. */
2124 PyFrame_BlockSetup(f, b->b_type, b->b_level,
2125 b->b_handler);
2126 why = WHY_NOT;
2127 JUMPTO(PyInt_AS_LONG(retval));
2128 Py_DECREF(retval);
2129 break;
2130 }
2131
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 while (STACK_LEVEL() > b->b_level) {
2133 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002134 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 }
2136 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2137 why = WHY_NOT;
2138 JUMPTO(b->b_handler);
2139 break;
2140 }
2141 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002142 (b->b_type == SETUP_EXCEPT &&
2143 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002144 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002145 PyObject *exc, *val, *tb;
2146 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002147 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 val = Py_None;
2149 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002150 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 /* Make the raw exception data
2152 available to the handler,
2153 so a program can emulate the
2154 Python main loop. Don't do
2155 this for 'finally'. */
2156 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002157 PyErr_NormalizeException(
2158 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002159 set_exc_info(tstate,
2160 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002162 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 PUSH(val);
2164 PUSH(exc);
2165 }
2166 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002167 if (why == WHY_RETURN ||
2168 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002170 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 PUSH(v);
2172 }
2173 why = WHY_NOT;
2174 JUMPTO(b->b_handler);
2175 break;
2176 }
2177 } /* unwind stack */
2178
2179 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002180
Guido van Rossum374a9221991-04-04 10:40:29 +00002181 if (why != WHY_NOT)
2182 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002183
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002185
Guido van Rossum374a9221991-04-04 10:40:29 +00002186 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002187
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 while (!EMPTY()) {
2189 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002190 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002192
Guido van Rossum96a42c81992-01-12 02:29:51 +00002193 if (why != WHY_RETURN)
2194 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002195
Guido van Rossume59214e1994-08-30 08:01:59 +00002196 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002197 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002198 if (call_trace(&f->f_trace, &f->f_trace, f,
2199 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002200 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002201 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002202 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002203 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002204 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002205 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002206
Guido van Rossuma027efa1997-05-05 20:56:21 +00002207 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2208 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002209 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002210 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002211 retval = NULL;
2212 why = WHY_EXCEPTION;
2213 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002214 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002215
Guido van Rossuma027efa1997-05-05 20:56:21 +00002216 reset_exc_info(tstate);
2217
2218 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002219
2220 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002221
Guido van Rossum374a9221991-04-04 10:40:29 +00002222 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002223
Guido van Rossuma027efa1997-05-05 20:56:21 +00002224 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002226
Guido van Rossum96a42c81992-01-12 02:29:51 +00002227 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002228}
2229
Guido van Rossuma027efa1997-05-05 20:56:21 +00002230static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002231set_exc_info(PyThreadState *tstate,
2232 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002233{
2234 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002235 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002236
Guido van Rossuma027efa1997-05-05 20:56:21 +00002237 frame = tstate->frame;
2238 if (frame->f_exc_type == NULL) {
2239 /* This frame didn't catch an exception before */
2240 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002241 if (tstate->exc_type == NULL) {
2242 Py_INCREF(Py_None);
2243 tstate->exc_type = Py_None;
2244 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002245 tmp_type = frame->f_exc_type;
2246 tmp_value = frame->f_exc_value;
2247 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002248 Py_XINCREF(tstate->exc_type);
2249 Py_XINCREF(tstate->exc_value);
2250 Py_XINCREF(tstate->exc_traceback);
2251 frame->f_exc_type = tstate->exc_type;
2252 frame->f_exc_value = tstate->exc_value;
2253 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002254 Py_XDECREF(tmp_type);
2255 Py_XDECREF(tmp_value);
2256 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002257 }
2258 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002259 tmp_type = tstate->exc_type;
2260 tmp_value = tstate->exc_value;
2261 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002262 Py_XINCREF(type);
2263 Py_XINCREF(value);
2264 Py_XINCREF(tb);
2265 tstate->exc_type = type;
2266 tstate->exc_value = value;
2267 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002268 Py_XDECREF(tmp_type);
2269 Py_XDECREF(tmp_value);
2270 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002271 /* For b/w compatibility */
2272 PySys_SetObject("exc_type", type);
2273 PySys_SetObject("exc_value", value);
2274 PySys_SetObject("exc_traceback", tb);
2275}
2276
2277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002278reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002279{
2280 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002281 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002282 frame = tstate->frame;
2283 if (frame->f_exc_type != NULL) {
2284 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002285 tmp_type = tstate->exc_type;
2286 tmp_value = tstate->exc_value;
2287 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002288 Py_XINCREF(frame->f_exc_type);
2289 Py_XINCREF(frame->f_exc_value);
2290 Py_XINCREF(frame->f_exc_traceback);
2291 tstate->exc_type = frame->f_exc_type;
2292 tstate->exc_value = frame->f_exc_value;
2293 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002294 Py_XDECREF(tmp_type);
2295 Py_XDECREF(tmp_value);
2296 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002297 /* For b/w compatibility */
2298 PySys_SetObject("exc_type", frame->f_exc_type);
2299 PySys_SetObject("exc_value", frame->f_exc_value);
2300 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2301 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002302 tmp_type = frame->f_exc_type;
2303 tmp_value = frame->f_exc_value;
2304 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002305 frame->f_exc_type = NULL;
2306 frame->f_exc_value = NULL;
2307 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002308 Py_XDECREF(tmp_type);
2309 Py_XDECREF(tmp_value);
2310 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002311}
2312
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002313/* Logic for the raise statement (too complicated for inlining).
2314 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002315static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002316do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002317{
Guido van Rossumd295f121998-04-09 21:39:57 +00002318 if (type == NULL) {
2319 /* Reraise */
2320 PyThreadState *tstate = PyThreadState_Get();
2321 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2322 value = tstate->exc_value;
2323 tb = tstate->exc_traceback;
2324 Py_XINCREF(type);
2325 Py_XINCREF(value);
2326 Py_XINCREF(tb);
2327 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002328
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002329 /* We support the following forms of raise:
2330 raise <class>, <classinstance>
2331 raise <class>, <argument tuple>
2332 raise <class>, None
2333 raise <class>, <argument>
2334 raise <classinstance>, None
2335 raise <string>, <object>
2336 raise <string>, None
2337
2338 An omitted second argument is the same as None.
2339
2340 In addition, raise <tuple>, <anything> is the same as
2341 raising the tuple's first item (and it better have one!);
2342 this rule is applied recursively.
2343
2344 Finally, an optional third argument can be supplied, which
2345 gives the traceback to be substituted (useful when
2346 re-raising an exception after examining it). */
2347
2348 /* First, check the traceback argument, replacing None with
2349 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002350 if (tb == Py_None) {
2351 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002352 tb = NULL;
2353 }
2354 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002355 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002356 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002357 goto raise_error;
2358 }
2359
2360 /* Next, replace a missing value with None */
2361 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002362 value = Py_None;
2363 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002364 }
2365
2366 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002367 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2368 PyObject *tmp = type;
2369 type = PyTuple_GET_ITEM(type, 0);
2370 Py_INCREF(type);
2371 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002372 }
2373
Barry Warsaw4249f541997-08-22 21:26:19 +00002374 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002375 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002376
2377 else if (PyClass_Check(type))
2378 PyErr_NormalizeException(&type, &value, &tb);
2379
Guido van Rossumb209a111997-04-29 18:18:01 +00002380 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002381 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002382 if (value != Py_None) {
2383 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002384 "instance exception may not have a separate value");
2385 goto raise_error;
2386 }
2387 else {
2388 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002389 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002390 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002391 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2392 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002393 }
2394 }
2395 else {
2396 /* Not something you can raise. You get an exception
2397 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002399 "exceptions must be strings, classes, or instances");
2400 goto raise_error;
2401 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002402 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002403 if (tb == NULL)
2404 return WHY_EXCEPTION;
2405 else
2406 return WHY_RERAISE;
2407 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 Py_XDECREF(value);
2409 Py_XDECREF(type);
2410 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002411 return WHY_EXCEPTION;
2412}
2413
Barry Warsawe42b18f1997-08-25 22:13:04 +00002414static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002415unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002416{
2417 int i;
2418 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002419
Barry Warsawe42b18f1997-08-25 22:13:04 +00002420 for (i = 0; i < argcnt; i++) {
2421 if (! (w = PySequence_GetItem(v, i))) {
2422 if (PyErr_ExceptionMatches(PyExc_IndexError))
2423 PyErr_SetString(PyExc_ValueError,
2424 "unpack sequence of wrong size");
2425 goto finally;
2426 }
2427 *--sp = w;
2428 }
2429 /* we better get an IndexError now */
2430 if (PySequence_GetItem(v, i) == NULL) {
2431 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2432 PyErr_Clear();
2433 return 1;
2434 }
2435 /* some other exception occurred. fall through to finally */
2436 }
2437 else
2438 PyErr_SetString(PyExc_ValueError,
2439 "unpack sequence of wrong size");
2440 /* fall through */
2441finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002442 for (; i > 0; i--, sp++)
2443 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002444
2445 return 0;
2446}
2447
2448
Guido van Rossum96a42c81992-01-12 02:29:51 +00002449#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002450static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002451prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002453 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002454 if (PyObject_Print(v, stdout, 0) != 0)
2455 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002456 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002457 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002459#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002461static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002462call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002463{
Guido van Rossumb209a111997-04-29 18:18:01 +00002464 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002465 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002466 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002467 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 value = Py_None;
2469 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002470 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002471 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002472 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002473 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002474 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002475 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002476 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002478 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002479 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002480 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002481 Py_XDECREF(type);
2482 Py_XDECREF(value);
2483 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002484 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002485}
2486
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002487/* PyObject **p_trace: in/out; may not be NULL;
2488 may not point to NULL variable initially
2489 PyObject **p_newtrace: in/out; may be NULL;
2490 may point to NULL variable;
2491 may be same variable as p_newtrace */
2492
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002493static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002494call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2495 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002496{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002497 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 PyObject *args, *what;
2499 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002500
Guido van Rossuma027efa1997-05-05 20:56:21 +00002501 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002502 /* Don't do recursive traces */
2503 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002504 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002505 *p_newtrace = NULL;
2506 }
2507 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002508 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002509
Guido van Rossumb209a111997-04-29 18:18:01 +00002510 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002511 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002512 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002514 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002515 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002516 Py_INCREF(f);
2517 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2518 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002519 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 arg = Py_None;
2521 Py_INCREF(arg);
2522 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002523 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002524 PyFrame_FastToLocals(f);
2525 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2526 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002527 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002528 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002529 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002530 if (res == NULL) {
2531 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 PyTraceBack_Here(f);
2533 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002534 *p_trace = NULL;
2535 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002536 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002537 *p_newtrace = NULL;
2538 }
Barry Warsawf6202631999-09-08 16:26:33 +00002539 /* to be extra double plus sure we don't get recursive
2540 * calls inf either tracefunc or profilefunc gets an
2541 * exception, zap the global variables.
2542 */
2543 Py_XDECREF(tstate->sys_tracefunc);
2544 tstate->sys_tracefunc = NULL;
2545 Py_XDECREF(tstate->sys_profilefunc);
2546 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002547 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002548 }
2549 else {
2550 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002551 Py_XDECREF(*p_newtrace);
2552 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002553 *p_newtrace = NULL;
2554 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002555 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002556 *p_newtrace = res;
2557 }
2558 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002559 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002560 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002561 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002562}
2563
Guido van Rossumb209a111997-04-29 18:18:01 +00002564PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002566{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002567 PyThreadState *tstate = PyThreadState_Get();
2568 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002569 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002570 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002571 else
2572 return current_frame->f_builtins;
2573}
2574
Guido van Rossumb209a111997-04-29 18:18:01 +00002575PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002576PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002577{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002578 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002579 if (current_frame == NULL)
2580 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002581 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002582 return current_frame->f_locals;
2583}
2584
Guido van Rossumb209a111997-04-29 18:18:01 +00002585PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002586PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002587{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002588 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002589 if (current_frame == NULL)
2590 return NULL;
2591 else
2592 return current_frame->f_globals;
2593}
2594
Guido van Rossumb209a111997-04-29 18:18:01 +00002595PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002596PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002597{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002598 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002599 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002600}
2601
Guido van Rossum6135a871995-01-09 17:53:26 +00002602int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002603PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002604{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002605 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002606 return current_frame == NULL ? 0 : current_frame->f_restricted;
2607}
2608
Guido van Rossumbe270261997-05-22 22:26:18 +00002609int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611{
Guido van Rossumb209a111997-04-29 18:18:01 +00002612 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002613 if (f == NULL)
2614 return 0;
2615 if (!PyFile_SoftSpace(f, 0))
2616 return 0;
2617 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618}
2619
Guido van Rossum3f5da241990-12-20 15:06:42 +00002620
Guido van Rossum681d79a1995-07-18 14:51:37 +00002621/* External interface to call any callable object.
2622 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002623
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002624#undef PyEval_CallObject
2625/* for backward compatibility: export this interface */
2626
Guido van Rossumb209a111997-04-29 18:18:01 +00002627PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002628PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002629{
Guido van Rossumb209a111997-04-29 18:18:01 +00002630 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002631}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002632#define PyEval_CallObject(func,arg) \
2633 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002634
Guido van Rossumb209a111997-04-29 18:18:01 +00002635PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002636PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002637{
Jeremy Hylton52820442001-01-03 23:52:36 +00002638 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002639
2640 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 arg = PyTuple_New(0);
2642 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002643 PyErr_SetString(PyExc_TypeError,
2644 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002645 return NULL;
2646 }
2647 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002648 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002649
Guido van Rossumb209a111997-04-29 18:18:01 +00002650 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002651 PyErr_SetString(PyExc_TypeError,
2652 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002653 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002654 return NULL;
2655 }
2656
Jeremy Hylton52820442001-01-03 23:52:36 +00002657 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002659 return result;
2660}
2661
2662/* How often is each kind of object called? The answer depends on the
2663 program. An instrumented call_object() was used to run the Python
2664 regression test suite. The results were:
2665 4200000 PyCFunctions
2666 390000 fast_function() calls
2667 94000 other functions
2668 480000 all functions (sum of prev two)
2669 150000 methods
2670 100000 classes
2671
2672 Tests on other bodies of code show that PyCFunctions are still
2673 most common, but not by such a large margin.
2674*/
2675
2676static PyObject *
2677call_object(PyObject *func, PyObject *arg, PyObject *kw)
2678{
2679 ternaryfunc call;
2680 PyObject *result;
2681
2682 if (PyMethod_Check(func))
2683 result = call_method(func, arg, kw);
2684 else if (PyFunction_Check(func))
2685 result = call_eval_code2(func, arg, kw);
2686 else if (PyCFunction_Check(func))
2687 result = call_cfunction(func, arg, kw);
2688 else if (PyClass_Check(func))
2689 result = PyInstance_New(func, arg, kw);
2690 else if (PyInstance_Check(func))
2691 result = call_instance(func, arg, kw);
2692 else if ((call = func->ob_type->tp_call) != NULL)
2693 result = (*call)(func, arg, kw);
2694 else {
2695 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2696 PyString_AS_STRING(PyObject_Repr(func)));
2697 return NULL;
2698 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002699 if (result == NULL && !PyErr_Occurred())
2700 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002701 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002702
Guido van Rossume59214e1994-08-30 08:01:59 +00002703 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002704}
2705
Guido van Rossumb209a111997-04-29 18:18:01 +00002706static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002707call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708{
Jeremy Hylton52820442001-01-03 23:52:36 +00002709 PyCFunctionObject* f = (PyCFunctionObject*)func;
2710 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2711 PyObject *self = PyCFunction_GET_SELF(func);
2712 int flags = PyCFunction_GET_FLAGS(func);
2713
Jeremy Hylton52820442001-01-03 23:52:36 +00002714 if (flags & METH_KEYWORDS) {
Fred Drake1a7aab72001-01-04 22:33:02 +00002715 if (kw == NULL) {
2716 static PyObject *dict = NULL;
2717 if (dict == NULL) {
2718 dict = PyDict_New();
2719 if (dict == NULL)
2720 return NULL;
2721 }
2722 kw = dict;
2723 Py_INCREF(dict);
2724 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002725 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002727 if (kw != NULL && PyDict_Size(kw) != 0) {
2728 PyErr_Format(PyExc_TypeError,
2729 "%.200s() takes no keyword arguments",
2730 f->m_ml->ml_name);
2731 return NULL;
2732 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002733 if (flags & METH_VARARGS) {
2734 return (*meth)(self, arg);
2735 }
2736 if (!(flags & METH_VARARGS)) {
2737 /* the really old style */
2738 int size = PyTuple_GET_SIZE(arg);
2739 if (size == 1)
2740 arg = PyTuple_GET_ITEM(arg, 0);
2741 else if (size == 0)
2742 arg = NULL;
2743 return (*meth)(self, arg);
2744 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002745 /* should never get here ??? */
2746 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 return NULL;
2748}
2749
Guido van Rossumb209a111997-04-29 18:18:01 +00002750static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002751call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752{
Jeremy Hylton52820442001-01-03 23:52:36 +00002753 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2754 if (call == NULL) {
2755 PyInstanceObject *inst = (PyInstanceObject*) func;
2756 PyErr_Clear();
2757 PyErr_Format(PyExc_AttributeError,
2758 "%.200s instance has no __call__ method",
2759 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002760 return NULL;
2761 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002762 res = call_object(call, arg, kw);
2763 Py_DECREF(call);
2764 return res;
2765}
2766
2767static PyObject *
2768call_method(PyObject *func, PyObject *arg, PyObject *kw)
2769{
2770 PyObject *self = PyMethod_GET_SELF(func);
2771 PyObject *class = PyMethod_GET_CLASS(func);
2772 PyObject *result;
2773
2774 func = PyMethod_GET_FUNCTION(func);
2775 if (self == NULL) {
2776 /* Unbound methods must be called with an instance of
2777 the class (or a derived class) as first argument */
2778 if (PyTuple_Size(arg) >= 1)
2779 self = PyTuple_GET_ITEM(arg, 0);
2780 if (!(self != NULL && PyInstance_Check(self)
2781 && PyClass_IsSubclass((PyObject *)
2782 (((PyInstanceObject *)self)->in_class),
2783 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002784 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2785 PyErr_Format(PyExc_TypeError,
2786 "unbound method %s%smust be "
2787 "called with instance as first argument",
2788 fn ? PyString_AsString(fn) : "",
2789 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002790 return NULL;
2791 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002792 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002793 } else {
2794 int argcount = PyTuple_Size(arg);
2795 PyObject *newarg = PyTuple_New(argcount + 1);
2796 int i;
2797 if (newarg == NULL)
2798 return NULL;
2799 Py_INCREF(self);
2800 PyTuple_SET_ITEM(newarg, 0, self);
2801 for (i = 0; i < argcount; i++) {
2802 PyObject *v = PyTuple_GET_ITEM(arg, i);
2803 Py_XINCREF(v);
2804 PyTuple_SET_ITEM(newarg, i+1, v);
2805 }
2806 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002808 result = call_object(func, arg, kw);
2809 Py_DECREF(arg);
2810 return result;
2811}
2812
2813static PyObject *
2814call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2815{
2816 PyObject *result;
2817 PyObject *argdefs;
2818 PyObject **d, **k;
2819 int nk, nd;
2820
2821 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002822 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2823 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2824 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002825 }
2826 else {
2827 d = NULL;
2828 nd = 0;
2829 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002830
Guido van Rossum681d79a1995-07-18 14:51:37 +00002831 if (kw != NULL) {
2832 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002833 nk = PyDict_Size(kw);
2834 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002835 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002836 PyErr_NoMemory();
2837 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002838 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002839 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002840 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002841 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002842 i += 2;
2843 nk = i/2;
2844 /* XXX This is broken if the caller deletes dict items! */
2845 }
2846 else {
2847 k = NULL;
2848 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002849 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002850
Guido van Rossum681d79a1995-07-18 14:51:37 +00002851 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002852 (PyCodeObject *)PyFunction_GET_CODE(func),
2853 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002854 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002855 k, nk, d, nd,
2856 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002857
Guido van Rossumb18618d2000-05-03 23:44:39 +00002858 if (k != NULL)
2859 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002860
Guido van Rossum681d79a1995-07-18 14:51:37 +00002861 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862}
2863
Jeremy Hylton52820442001-01-03 23:52:36 +00002864#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2865
2866/* The two fast_xxx() functions optimize calls for which no argument
2867 tuple is necessary; the objects are passed directly from the stack.
2868 fast_cfunction() is called for METH_OLDARGS functions.
2869 fast_function() is for functions with no special argument handling.
2870*/
2871
2872static PyObject *
2873fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2874{
2875 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2876 PyObject *self = PyCFunction_GET_SELF(func);
2877
2878 if (na == 0)
2879 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002880 else if (na == 1) {
2881 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002882 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002883 Py_DECREF(arg);
2884 return result;
2885 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002886 PyObject *args = load_args(pp_stack, na);
2887 PyObject *result = (*meth)(self, args);
2888 Py_DECREF(args);
2889 return result;
2890 }
2891}
2892
2893static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002894fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002895{
2896 PyObject *co = PyFunction_GET_CODE(func);
2897 PyObject *globals = PyFunction_GET_GLOBALS(func);
2898 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002899 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002900 PyObject **d = NULL;
2901 int nd = 0;
2902
2903 if (argdefs != NULL) {
2904 d = &PyTuple_GET_ITEM(argdefs, 0);
2905 nd = ((PyTupleObject *)argdefs)->ob_size;
2906 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002907 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002908 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002909 (*pp_stack)-2*nk, nk, d, nd,
2910 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002911}
2912
2913static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002914update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2915 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002916{
2917 PyObject *kwdict = NULL;
2918 if (orig_kwdict == NULL)
2919 kwdict = PyDict_New();
2920 else {
2921 kwdict = PyDict_Copy(orig_kwdict);
2922 Py_DECREF(orig_kwdict);
2923 }
2924 if (kwdict == NULL)
2925 return NULL;
2926 while (--nk >= 0) {
2927 int err;
2928 PyObject *value = EXT_POP(*pp_stack);
2929 PyObject *key = EXT_POP(*pp_stack);
2930 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002931 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002932 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002933 "%.200s%s got multiple values "
2934 "for keyword argument '%.400s'",
2935 fn ? PyString_AsString(fn) : "function",
2936 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002937 Py_DECREF(key);
2938 Py_DECREF(value);
2939 Py_DECREF(kwdict);
2940 return NULL;
2941 }
2942 err = PyDict_SetItem(kwdict, key, value);
2943 Py_DECREF(key);
2944 Py_DECREF(value);
2945 if (err) {
2946 Py_DECREF(kwdict);
2947 return NULL;
2948 }
2949 }
2950 return kwdict;
2951}
2952
2953static PyObject *
2954update_star_args(int nstack, int nstar, PyObject *stararg,
2955 PyObject ***pp_stack)
2956{
2957 PyObject *callargs, *w;
2958
2959 callargs = PyTuple_New(nstack + nstar);
2960 if (callargs == NULL) {
2961 return NULL;
2962 }
2963 if (nstar) {
2964 int i;
2965 for (i = 0; i < nstar; i++) {
2966 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2967 Py_INCREF(a);
2968 PyTuple_SET_ITEM(callargs, nstack + i, a);
2969 }
2970 }
2971 while (--nstack >= 0) {
2972 w = EXT_POP(*pp_stack);
2973 PyTuple_SET_ITEM(callargs, nstack, w);
2974 }
2975 return callargs;
2976}
2977
2978static PyObject *
2979load_args(PyObject ***pp_stack, int na)
2980{
2981 PyObject *args = PyTuple_New(na);
2982 PyObject *w;
2983
2984 if (args == NULL)
2985 return NULL;
2986 while (--na >= 0) {
2987 w = EXT_POP(*pp_stack);
2988 PyTuple_SET_ITEM(args, na, w);
2989 }
2990 return args;
2991}
2992
2993static PyObject *
2994do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
2995{
2996 PyObject *callargs = NULL;
2997 PyObject *kwdict = NULL;
2998 PyObject *result = NULL;
2999
3000 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003001 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003002 if (kwdict == NULL)
3003 goto call_fail;
3004 }
3005 callargs = load_args(pp_stack, na);
3006 if (callargs == NULL)
3007 goto call_fail;
3008 result = call_object(func, callargs, kwdict);
3009 call_fail:
3010 Py_XDECREF(callargs);
3011 Py_XDECREF(kwdict);
3012 return result;
3013}
3014
3015static PyObject *
3016ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3017{
3018 int nstar = 0;
3019 PyObject *callargs = NULL;
3020 PyObject *stararg = NULL;
3021 PyObject *kwdict = NULL;
3022 PyObject *result = NULL;
3023
3024 if (flags & CALL_FLAG_KW) {
3025 kwdict = EXT_POP(*pp_stack);
3026 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003027 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3028 PyErr_Format(PyExc_TypeError,
3029 "%s%s argument after ** must be a dictionary",
3030 fn ? PyString_AsString(fn) : "function",
3031 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003032 goto ext_call_fail;
3033 }
3034 }
3035 if (flags & CALL_FLAG_VAR) {
3036 stararg = EXT_POP(*pp_stack);
3037 if (!PyTuple_Check(stararg)) {
3038 PyObject *t = NULL;
3039 t = PySequence_Tuple(stararg);
3040 if (t == NULL) {
3041 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003042 PyObject* fn =
3043 ((PyFunctionObject*) func)->func_name;
3044 PyErr_Format(PyExc_TypeError,
3045 "%s%s argument after * must be a sequence",
3046 fn ? PyString_AsString(fn) : "function",
3047 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003048 }
3049 goto ext_call_fail;
3050 }
3051 Py_DECREF(stararg);
3052 stararg = t;
3053 }
3054 nstar = PyTuple_GET_SIZE(stararg);
3055 }
3056 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003057 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003058 if (kwdict == NULL)
3059 goto ext_call_fail;
3060 }
3061 callargs = update_star_args(na, nstar, stararg, pp_stack);
3062 if (callargs == NULL)
3063 goto ext_call_fail;
3064 result = call_object(func, callargs, kwdict);
3065 ext_call_fail:
3066 Py_XDECREF(callargs);
3067 Py_XDECREF(kwdict);
3068 Py_XDECREF(stararg);
3069 return result;
3070}
3071
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003072#define SLICE_ERROR_MSG \
3073 "standard sequence type does not support step size other than one"
3074
Guido van Rossumb209a111997-04-29 18:18:01 +00003075static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003076loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077{
Guido van Rossumb209a111997-04-29 18:18:01 +00003078 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003079 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003080 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003081 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 return NULL;
3083 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003084 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003085 v = (*sq->sq_item)(v, i);
3086 if (v)
3087 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003088 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003089 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003090 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091}
3092
Guido van Rossum20c6add2000-05-08 14:06:50 +00003093/* Extract a slice index from a PyInt or PyLong, the index is bound to
3094 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3095 and error. Returns 1 on success.*/
3096
3097int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003098_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099{
3100 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003101 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003102 if (PyInt_Check(v)) {
3103 x = PyInt_AsLong(v);
3104 } else if (PyLong_Check(v)) {
3105 x = PyLong_AsLong(v);
3106 if (x==-1 && PyErr_Occurred()) {
3107 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003108 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003109
Guido van Rossumac7be682001-01-17 15:42:30 +00003110 if (!PyErr_ExceptionMatches(
3111 PyExc_OverflowError)) {
3112 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003113 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003114 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003115 }
3116
Guido van Rossumac7be682001-01-17 15:42:30 +00003117 /* Clear the OverflowError */
3118 PyErr_Clear();
3119
3120 /* It's an overflow error, so we need to
3121 check the sign of the long integer,
3122 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003123 the error. */
3124
3125 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003126 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003127 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003128
3129 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003130 cmp = PyObject_RichCompareBool(v, long_zero,
3131 Py_GT);
3132 Py_DECREF(long_zero);
3133 if (cmp < 0)
3134 return 0;
3135 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003136 x = INT_MAX;
3137 else
3138 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003139 }
3140 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003141 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003142 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003143 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003145 /* Truncate -- very long indices are truncated anyway */
3146 if (x > INT_MAX)
3147 x = INT_MAX;
3148 else if (x < -INT_MAX)
3149 x = 0;
3150 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003152 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153}
3154
Guido van Rossumb209a111997-04-29 18:18:01 +00003155static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003156apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003158 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003159 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003160 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003161 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003162 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003163 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003165
3166static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003167assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3168 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003170 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003171 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003172 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003173 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003174 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003175 if (x == NULL)
3176 return PySequence_DelSlice(u, ilow, ihigh);
3177 else
3178 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003179}
3180
Guido van Rossumb209a111997-04-29 18:18:01 +00003181static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003182cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183{
Guido van Rossumac7be682001-01-17 15:42:30 +00003184 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003185 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003186 case IS:
3187 case IS_NOT:
3188 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003189 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003190 res = !res;
3191 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192 case IN:
3193 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003194 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003195 if (res < 0)
3196 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003197 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003198 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 break;
3200 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003201 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 break;
3203 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003204 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003206 v = res ? Py_True : Py_False;
3207 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 return v;
3209}
3210
Thomas Wouters52152252000-08-17 22:55:00 +00003211static PyObject *
3212import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003213{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003214 PyObject *x;
3215
3216 x = PyObject_GetAttr(v, name);
3217 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003218 PyErr_Format(PyExc_ImportError,
3219 "cannot import name %.230s",
3220 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003221 }
Thomas Wouters52152252000-08-17 22:55:00 +00003222 return x;
3223}
Guido van Rossumac7be682001-01-17 15:42:30 +00003224
Thomas Wouters52152252000-08-17 22:55:00 +00003225static int
3226import_all_from(PyObject *locals, PyObject *v)
3227{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003228 PyObject *all = PyObject_GetAttrString(v, "__all__");
3229 PyObject *dict, *name, *value;
3230 int skip_leading_underscores = 0;
3231 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003232
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003233 if (all == NULL) {
3234 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3235 return -1; /* Unexpected error */
3236 PyErr_Clear();
3237 dict = PyObject_GetAttrString(v, "__dict__");
3238 if (dict == NULL) {
3239 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3240 return -1;
3241 PyErr_SetString(PyExc_ImportError,
3242 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003243 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003244 }
3245 all = PyMapping_Keys(dict);
3246 Py_DECREF(dict);
3247 if (all == NULL)
3248 return -1;
3249 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003250 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003251
3252 for (pos = 0, err = 0; ; pos++) {
3253 name = PySequence_GetItem(all, pos);
3254 if (name == NULL) {
3255 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3256 err = -1;
3257 else
3258 PyErr_Clear();
3259 break;
3260 }
3261 if (skip_leading_underscores &&
3262 PyString_Check(name) &&
3263 PyString_AS_STRING(name)[0] == '_')
3264 {
3265 Py_DECREF(name);
3266 continue;
3267 }
3268 value = PyObject_GetAttr(v, name);
3269 if (value == NULL)
3270 err = -1;
3271 else
3272 err = PyDict_SetItem(locals, name, value);
3273 Py_DECREF(name);
3274 Py_XDECREF(value);
3275 if (err != 0)
3276 break;
3277 }
3278 Py_DECREF(all);
3279 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003280}
3281
Guido van Rossumb209a111997-04-29 18:18:01 +00003282static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003283build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003284{
Guido van Rossumcd649651997-08-22 16:56:16 +00003285 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003286 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003287 PyErr_SetString(PyExc_SystemError,
3288 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003289 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003290 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003291 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003292 PyErr_SetString(PyExc_SystemError,
3293 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003294 return NULL;
3295 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003296 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003297 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003298 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003299 return NULL;
3300 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003301 n = PyTuple_Size(bases);
3302 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003303 PyObject *base = PyTuple_GET_ITEM(bases, i);
3304 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003305 /* Call the base's *type*, if it is callable.
3306 This code is a hook for Donald Beaudry's
3307 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003308 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003309 since its types are not callable.
3310 Ditto: call the bases's *class*, if it has
3311 one. This makes the same thing possible
3312 without writing C code. A true meta-object
3313 protocol! */
3314 PyObject *basetype = (PyObject *)base->ob_type;
3315 PyObject *callable = NULL;
3316 if (PyCallable_Check(basetype))
3317 callable = basetype;
3318 else
3319 callable = PyObject_GetAttrString(
3320 base, "__class__");
3321 if (callable) {
3322 PyObject *args;
3323 PyObject *newclass = NULL;
3324 args = Py_BuildValue(
3325 "(OOO)", name, bases, methods);
3326 if (args != NULL) {
3327 newclass = PyEval_CallObject(
3328 callable, args);
3329 Py_DECREF(args);
3330 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003331 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003332 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003333 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003334 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003335 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003336 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003337 "base is not a class object");
3338 return NULL;
3339 }
3340 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003341 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003342}
3343
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003344static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3346 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003347{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003348 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003349 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003350 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003351
Guido van Rossumb209a111997-04-29 18:18:01 +00003352 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3353 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003354 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003355 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003356 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003357 locals = PyTuple_GetItem(prog, 2);
3358 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003359 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003360 if (globals == Py_None) {
3361 globals = PyEval_GetGlobals();
3362 if (locals == Py_None) {
3363 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003364 plain = 1;
3365 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003366 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003367 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003368 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003369 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003370 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003371 !PyCode_Check(prog) &&
3372 !PyFile_Check(prog)) {
3373 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003374 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003375 return -1;
3376 }
Fred Drake661ea262000-10-24 19:57:45 +00003377 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003378 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003379 "exec: arg 2 must be a dictionary or None");
3380 return -1;
3381 }
3382 if (!PyDict_Check(locals)) {
3383 PyErr_SetString(PyExc_TypeError,
3384 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003385 return -1;
3386 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003387 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003388 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003389 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003390 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003391 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003392 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003393 FILE *fp = PyFile_AsFile(prog);
3394 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003395 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3396 }
3397 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003398 char *str;
3399 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003400 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003401 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003402 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003403 if (plain)
3404 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003405 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003406 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003407 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003408 return 0;
3409}
Guido van Rossum24c13741995-02-14 09:42:43 +00003410
Guido van Rossumac7be682001-01-17 15:42:30 +00003411static void
Paul Prescode68140d2000-08-30 20:25:01 +00003412format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3413{
3414 char *obj_str;
3415
3416 if (!obj)
3417 return;
3418
3419 obj_str = PyString_AsString(obj);
3420 if (!obj_str)
3421 return;
3422
3423 PyErr_Format(exc, format_str, obj_str);
3424}
Guido van Rossum950361c1997-01-24 13:49:28 +00003425
3426#ifdef DYNAMIC_EXECUTION_PROFILE
3427
3428PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003429getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003430{
3431 int i;
3432 PyObject *l = PyList_New(256);
3433 if (l == NULL) return NULL;
3434 for (i = 0; i < 256; i++) {
3435 PyObject *x = PyInt_FromLong(a[i]);
3436 if (x == NULL) {
3437 Py_DECREF(l);
3438 return NULL;
3439 }
3440 PyList_SetItem(l, i, x);
3441 }
3442 for (i = 0; i < 256; i++)
3443 a[i] = 0;
3444 return l;
3445}
3446
3447PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003448_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003449{
3450#ifndef DXPAIRS
3451 return getarray(dxp);
3452#else
3453 int i;
3454 PyObject *l = PyList_New(257);
3455 if (l == NULL) return NULL;
3456 for (i = 0; i < 257; i++) {
3457 PyObject *x = getarray(dxpairs[i]);
3458 if (x == NULL) {
3459 Py_DECREF(l);
3460 return NULL;
3461 }
3462 PyList_SetItem(l, i, x);
3463 }
3464 return l;
3465#endif
3466}
3467
3468#endif