blob: cb5936de6160e1a451d0be24752da346f4e60a80 [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 */
Thomas Woutersfc93b0a2001-02-16 11:52:31 +0000326 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 Hylton30c9f392001-03-13 01:58:22 +0000433 globals, locals);
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;
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000581 for (i = 0; i < f->f_nfreevars; ++i) {
582 PyObject *o = PyTuple_GET_ITEM(closure, i);
583 Py_INCREF(o);
584 freevars[f->f_ncells + i] = o;
585 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000586 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000587
Guido van Rossuma027efa1997-05-05 20:56:21 +0000588 if (tstate->sys_tracefunc != NULL) {
589 /* tstate->sys_tracefunc, if defined, is a function that
590 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000591 Its return value, if not None, is a function that
592 will be called at the start of each executed line
593 of code. (Actually, the function must return
594 itself in order to continue tracing.)
595 The trace functions are called with three arguments:
596 a pointer to the current frame, a string indicating
597 why the function is called, and an argument which
598 depends on the situation. The global trace function
599 (sys.trace) is also called whenever an exception
600 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000601 if (call_trace(&tstate->sys_tracefunc,
602 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000603 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000604 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000605 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000606 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000607 }
608
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 if (tstate->sys_profilefunc != NULL) {
610 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000611 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000612 if (call_trace(&tstate->sys_profilefunc,
613 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000614 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000615 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000616 }
617 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000618
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000619 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 --tstate->recursion_depth;
621 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000622 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000623 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000624 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000625 return NULL;
626 }
627
Guido van Rossumd076c731998-10-07 19:42:25 +0000628 _PyCode_GETCODEPTR(co, &first_instr);
629 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000630 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000631
Guido van Rossum374a9221991-04-04 10:40:29 +0000632 why = WHY_NOT;
633 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000634 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000635 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000636
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000638 /* Do periodic things. Doing this every time through
639 the loop would add too much overhead, so we do it
640 only every Nth instruction. We also do it if
641 ``things_to_do'' is set, i.e. when an asynchronous
642 event needs attention (e.g. a signal handler or
643 async I/O handler); see Py_AddPendingCall() and
644 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000645
Guido van Rossuma027efa1997-05-05 20:56:21 +0000646 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000647 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000648 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000649 if (Py_MakePendingCalls() < 0) {
650 why = WHY_EXCEPTION;
651 goto on_error;
652 }
653 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000654#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000655 /* If we have true signals, the signal handler
656 will call Py_AddPendingCall() so we don't
657 have to call sigcheck(). On the Mac and
658 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000659 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000660 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 goto on_error;
662 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000663#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664
Guido van Rossume59214e1994-08-30 08:01:59 +0000665#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666 if (interpreter_lock) {
667 /* Give another thread a chance */
668
Guido van Rossum25ce5661997-08-02 03:10:38 +0000669 if (PyThreadState_Swap(NULL) != tstate)
670 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000671 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000672
673 /* Other threads may run now */
674
Guido van Rossum65d5b571998-12-21 19:32:43 +0000675 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000676 if (PyThreadState_Swap(tstate) != NULL)
677 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678 }
679#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000683
Guido van Rossum408027e1996-12-30 16:17:54 +0000684#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000685 f->f_lasti = INSTR_OFFSET();
686#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000687
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 opcode = NEXTOP();
689 if (HAS_ARG(opcode))
690 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000691 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000692#ifdef DYNAMIC_EXECUTION_PROFILE
693#ifdef DXPAIRS
694 dxpairs[lastopcode][opcode]++;
695 lastopcode = opcode;
696#endif
697 dxp[opcode]++;
698#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000699
Guido van Rossum96a42c81992-01-12 02:29:51 +0000700#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000702
Guido van Rossum96a42c81992-01-12 02:29:51 +0000703 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000704 if (HAS_ARG(opcode)) {
705 printf("%d: %d, %d\n",
706 (int) (INSTR_OFFSET() - 3),
707 opcode, oparg);
708 }
709 else {
710 printf("%d: %d\n",
711 (int) (INSTR_OFFSET() - 1), opcode);
712 }
713 }
714#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000716
Guido van Rossum374a9221991-04-04 10:40:29 +0000717 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000718
Guido van Rossum374a9221991-04-04 10:40:29 +0000719 /* BEWARE!
720 It is essential that any operation that fails sets either
721 x to NULL, err to nonzero, or why to anything but WHY_NOT,
722 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000723
Guido van Rossum374a9221991-04-04 10:40:29 +0000724 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000725
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 case POP_TOP:
727 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000728 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000729 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000730
Guido van Rossum374a9221991-04-04 10:40:29 +0000731 case ROT_TWO:
732 v = POP();
733 w = POP();
734 PUSH(v);
735 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000736 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000737
Guido van Rossum374a9221991-04-04 10:40:29 +0000738 case ROT_THREE:
739 v = POP();
740 w = POP();
741 x = POP();
742 PUSH(v);
743 PUSH(x);
744 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000745 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000746
Thomas Wouters434d0822000-08-24 20:11:32 +0000747 case ROT_FOUR:
748 u = POP();
749 v = POP();
750 w = POP();
751 x = POP();
752 PUSH(u);
753 PUSH(x);
754 PUSH(w);
755 PUSH(v);
756 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000757
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 case DUP_TOP:
759 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000760 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000761 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000762 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000763
Thomas Wouters434d0822000-08-24 20:11:32 +0000764 case DUP_TOPX:
765 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000766 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000767 x = TOP();
768 Py_INCREF(x);
769 PUSH(x);
770 continue;
771 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000772 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000773 Py_INCREF(x);
774 w = TOP();
775 Py_INCREF(w);
776 PUSH(x);
777 PUSH(w);
778 PUSH(x);
779 continue;
780 case 3:
781 x = POP();
782 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000783 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000784 Py_INCREF(w);
785 v = TOP();
786 Py_INCREF(v);
787 PUSH(w);
788 PUSH(x);
789 PUSH(v);
790 PUSH(w);
791 PUSH(x);
792 continue;
793 case 4:
794 x = POP();
795 Py_INCREF(x);
796 w = POP();
797 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000798 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000799 Py_INCREF(v);
800 u = TOP();
801 Py_INCREF(u);
802 PUSH(v);
803 PUSH(w);
804 PUSH(x);
805 PUSH(u);
806 PUSH(v);
807 PUSH(w);
808 PUSH(x);
809 continue;
810 case 5:
811 x = POP();
812 Py_INCREF(x);
813 w = POP();
814 Py_INCREF(w);
815 v = POP();
816 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000817 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000818 Py_INCREF(u);
819 t = TOP();
820 Py_INCREF(t);
821 PUSH(u);
822 PUSH(v);
823 PUSH(w);
824 PUSH(x);
825 PUSH(t);
826 PUSH(u);
827 PUSH(v);
828 PUSH(w);
829 PUSH(x);
830 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000832 Py_FatalError("invalid argument to DUP_TOPX"
833 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000834 }
Tim Peters35ba6892000-10-11 07:04:49 +0000835 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000836
Guido van Rossum374a9221991-04-04 10:40:29 +0000837 case UNARY_POSITIVE:
838 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000839 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000840 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000842 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000843 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000844
Guido van Rossum374a9221991-04-04 10:40:29 +0000845 case UNARY_NEGATIVE:
846 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000847 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000848 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000851 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000852
Guido van Rossum374a9221991-04-04 10:40:29 +0000853 case UNARY_NOT:
854 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000855 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000856 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000857 if (err == 0) {
858 Py_INCREF(Py_True);
859 PUSH(Py_True);
860 continue;
861 }
862 else if (err > 0) {
863 Py_INCREF(Py_False);
864 PUSH(Py_False);
865 err = 0;
866 continue;
867 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000868 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000869
Guido van Rossum374a9221991-04-04 10:40:29 +0000870 case UNARY_CONVERT:
871 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000872 x = PyObject_Repr(v);
873 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000874 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000875 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000876 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000877
Guido van Rossum7928cd71991-10-24 14:59:31 +0000878 case UNARY_INVERT:
879 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000880 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000881 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000882 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000883 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000884 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000885
Guido van Rossum50564e81996-01-12 01:13:16 +0000886 case BINARY_POWER:
887 w = POP();
888 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000889 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000890 Py_DECREF(v);
891 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000892 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000893 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000894 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000895
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 case BINARY_MULTIPLY:
897 w = POP();
898 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000899 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000900 Py_DECREF(v);
901 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000902 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000903 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000905
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 case BINARY_DIVIDE:
907 w = POP();
908 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000909 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000910 Py_DECREF(v);
911 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000915
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 case BINARY_MODULO:
917 w = POP();
918 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000919 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000920 Py_DECREF(v);
921 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000922 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000923 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000924 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000925
Guido van Rossum374a9221991-04-04 10:40:29 +0000926 case BINARY_ADD:
927 w = POP();
928 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000929 if (PyInt_Check(v) && PyInt_Check(w)) {
930 /* INLINE: int + int */
931 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000932 a = PyInt_AS_LONG(v);
933 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000934 i = a + b;
935 if ((i^a) < 0 && (i^b) < 0) {
936 PyErr_SetString(PyExc_OverflowError,
937 "integer addition");
938 x = NULL;
939 }
940 else
941 x = PyInt_FromLong(i);
942 }
943 else
944 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 Py_DECREF(v);
946 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000950
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 case BINARY_SUBTRACT:
952 w = POP();
953 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000954 if (PyInt_Check(v) && PyInt_Check(w)) {
955 /* INLINE: int - int */
956 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000957 a = PyInt_AS_LONG(v);
958 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000959 i = a - b;
960 if ((i^a) < 0 && (i^~b) < 0) {
961 PyErr_SetString(PyExc_OverflowError,
962 "integer subtraction");
963 x = NULL;
964 }
965 else
966 x = PyInt_FromLong(i);
967 }
968 else
969 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000970 Py_DECREF(v);
971 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000972 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000973 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000974 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000975
Guido van Rossum374a9221991-04-04 10:40:29 +0000976 case BINARY_SUBSCR:
977 w = POP();
978 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000979 if (PyList_Check(v) && PyInt_Check(w)) {
980 /* INLINE: list[int] */
981 long i = PyInt_AsLong(w);
982 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000983 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000984 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000985 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000986 PyErr_SetString(PyExc_IndexError,
987 "list index out of range");
988 x = NULL;
989 }
990 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000991 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000992 Py_INCREF(x);
993 }
994 }
995 else
996 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000997 Py_DECREF(v);
998 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000999 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001000 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001001 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001002
Guido van Rossum7928cd71991-10-24 14:59:31 +00001003 case BINARY_LSHIFT:
1004 w = POP();
1005 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001006 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001007 Py_DECREF(v);
1008 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001009 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001010 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001011 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001012
Guido van Rossum7928cd71991-10-24 14:59:31 +00001013 case BINARY_RSHIFT:
1014 w = POP();
1015 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001016 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001017 Py_DECREF(v);
1018 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001019 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001020 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001021 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001022
Guido van Rossum7928cd71991-10-24 14:59:31 +00001023 case BINARY_AND:
1024 w = POP();
1025 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001026 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001027 Py_DECREF(v);
1028 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001029 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001030 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001031 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001032
Guido van Rossum7928cd71991-10-24 14:59:31 +00001033 case BINARY_XOR:
1034 w = POP();
1035 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001036 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001037 Py_DECREF(v);
1038 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001039 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001040 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001041 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001042
Guido van Rossum7928cd71991-10-24 14:59:31 +00001043 case BINARY_OR:
1044 w = POP();
1045 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001046 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001047 Py_DECREF(v);
1048 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001049 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001050 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001051 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001052
1053 case INPLACE_POWER:
1054 w = POP();
1055 v = POP();
1056 x = PyNumber_InPlacePower(v, w, Py_None);
1057 Py_DECREF(v);
1058 Py_DECREF(w);
1059 PUSH(x);
1060 if (x != NULL) continue;
1061 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001062
Thomas Wouters434d0822000-08-24 20:11:32 +00001063 case INPLACE_MULTIPLY:
1064 w = POP();
1065 v = POP();
1066 x = PyNumber_InPlaceMultiply(v, w);
1067 Py_DECREF(v);
1068 Py_DECREF(w);
1069 PUSH(x);
1070 if (x != NULL) continue;
1071 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001072
Thomas Wouters434d0822000-08-24 20:11:32 +00001073 case INPLACE_DIVIDE:
1074 w = POP();
1075 v = POP();
1076 x = PyNumber_InPlaceDivide(v, w);
1077 Py_DECREF(v);
1078 Py_DECREF(w);
1079 PUSH(x);
1080 if (x != NULL) continue;
1081 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001082
Thomas Wouters434d0822000-08-24 20:11:32 +00001083 case INPLACE_MODULO:
1084 w = POP();
1085 v = POP();
1086 x = PyNumber_InPlaceRemainder(v, w);
1087 Py_DECREF(v);
1088 Py_DECREF(w);
1089 PUSH(x);
1090 if (x != NULL) continue;
1091 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001092
Thomas Wouters434d0822000-08-24 20:11:32 +00001093 case INPLACE_ADD:
1094 w = POP();
1095 v = POP();
1096 if (PyInt_Check(v) && PyInt_Check(w)) {
1097 /* INLINE: int + int */
1098 register long a, b, i;
1099 a = PyInt_AS_LONG(v);
1100 b = PyInt_AS_LONG(w);
1101 i = a + b;
1102 if ((i^a) < 0 && (i^b) < 0) {
1103 PyErr_SetString(PyExc_OverflowError,
1104 "integer addition");
1105 x = NULL;
1106 }
1107 else
1108 x = PyInt_FromLong(i);
1109 }
1110 else
1111 x = PyNumber_InPlaceAdd(v, w);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Thomas Wouters434d0822000-08-24 20:11:32 +00001118 case INPLACE_SUBTRACT:
1119 w = POP();
1120 v = POP();
1121 if (PyInt_Check(v) && PyInt_Check(w)) {
1122 /* INLINE: int - int */
1123 register long a, b, i;
1124 a = PyInt_AS_LONG(v);
1125 b = PyInt_AS_LONG(w);
1126 i = a - b;
1127 if ((i^a) < 0 && (i^~b) < 0) {
1128 PyErr_SetString(PyExc_OverflowError,
1129 "integer subtraction");
1130 x = NULL;
1131 }
1132 else
1133 x = PyInt_FromLong(i);
1134 }
1135 else
1136 x = PyNumber_InPlaceSubtract(v, w);
1137 Py_DECREF(v);
1138 Py_DECREF(w);
1139 PUSH(x);
1140 if (x != NULL) continue;
1141 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001142
Thomas Wouters434d0822000-08-24 20:11:32 +00001143 case INPLACE_LSHIFT:
1144 w = POP();
1145 v = POP();
1146 x = PyNumber_InPlaceLshift(v, w);
1147 Py_DECREF(v);
1148 Py_DECREF(w);
1149 PUSH(x);
1150 if (x != NULL) continue;
1151 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001152
Thomas Wouters434d0822000-08-24 20:11:32 +00001153 case INPLACE_RSHIFT:
1154 w = POP();
1155 v = POP();
1156 x = PyNumber_InPlaceRshift(v, w);
1157 Py_DECREF(v);
1158 Py_DECREF(w);
1159 PUSH(x);
1160 if (x != NULL) continue;
1161 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001162
Thomas Wouters434d0822000-08-24 20:11:32 +00001163 case INPLACE_AND:
1164 w = POP();
1165 v = POP();
1166 x = PyNumber_InPlaceAnd(v, w);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
1169 PUSH(x);
1170 if (x != NULL) continue;
1171 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001172
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 case INPLACE_XOR:
1174 w = POP();
1175 v = POP();
1176 x = PyNumber_InPlaceXor(v, w);
1177 Py_DECREF(v);
1178 Py_DECREF(w);
1179 PUSH(x);
1180 if (x != NULL) continue;
1181 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001182
Thomas Wouters434d0822000-08-24 20:11:32 +00001183 case INPLACE_OR:
1184 w = POP();
1185 v = POP();
1186 x = PyNumber_InPlaceOr(v, w);
1187 Py_DECREF(v);
1188 Py_DECREF(w);
1189 PUSH(x);
1190 if (x != NULL) continue;
1191 break;
1192
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 case SLICE+0:
1194 case SLICE+1:
1195 case SLICE+2:
1196 case SLICE+3:
1197 if ((opcode-SLICE) & 2)
1198 w = POP();
1199 else
1200 w = NULL;
1201 if ((opcode-SLICE) & 1)
1202 v = POP();
1203 else
1204 v = NULL;
1205 u = POP();
1206 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001207 Py_DECREF(u);
1208 Py_XDECREF(v);
1209 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001210 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001211 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001213
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 case STORE_SLICE+0:
1215 case STORE_SLICE+1:
1216 case STORE_SLICE+2:
1217 case STORE_SLICE+3:
1218 if ((opcode-STORE_SLICE) & 2)
1219 w = POP();
1220 else
1221 w = NULL;
1222 if ((opcode-STORE_SLICE) & 1)
1223 v = POP();
1224 else
1225 v = NULL;
1226 u = POP();
1227 t = POP();
1228 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001229 Py_DECREF(t);
1230 Py_DECREF(u);
1231 Py_XDECREF(v);
1232 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001233 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001235
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 case DELETE_SLICE+0:
1237 case DELETE_SLICE+1:
1238 case DELETE_SLICE+2:
1239 case DELETE_SLICE+3:
1240 if ((opcode-DELETE_SLICE) & 2)
1241 w = POP();
1242 else
1243 w = NULL;
1244 if ((opcode-DELETE_SLICE) & 1)
1245 v = POP();
1246 else
1247 v = NULL;
1248 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001249 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001250 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001251 Py_DECREF(u);
1252 Py_XDECREF(v);
1253 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001254 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001256
Guido van Rossum374a9221991-04-04 10:40:29 +00001257 case STORE_SUBSCR:
1258 w = POP();
1259 v = POP();
1260 u = POP();
1261 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001262 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001263 Py_DECREF(u);
1264 Py_DECREF(v);
1265 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001266 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001268
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 case DELETE_SUBSCR:
1270 w = POP();
1271 v = POP();
1272 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001273 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001274 Py_DECREF(v);
1275 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001276 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001278
Guido van Rossum374a9221991-04-04 10:40:29 +00001279 case PRINT_EXPR:
1280 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001281 w = PySys_GetObject("displayhook");
1282 if (w == NULL) {
1283 PyErr_SetString(PyExc_RuntimeError,
1284 "lost sys.displayhook");
1285 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001286 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001287 }
1288 if (err == 0) {
1289 x = Py_BuildValue("(O)", v);
1290 if (x == NULL)
1291 err = -1;
1292 }
1293 if (err == 0) {
1294 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001295 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001296 if (w == NULL)
1297 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001299 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001300 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001301 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001302
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001303 case PRINT_ITEM_TO:
1304 w = stream = POP();
1305 /* fall through to PRINT_ITEM */
1306
Guido van Rossum374a9221991-04-04 10:40:29 +00001307 case PRINT_ITEM:
1308 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001309 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001310 w = PySys_GetObject("stdout");
1311 if (w == NULL) {
1312 PyErr_SetString(PyExc_RuntimeError,
1313 "lost sys.stdout");
1314 err = -1;
1315 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001316 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001317 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001318 err = PyFile_WriteString(" ", w);
1319 if (err == 0)
1320 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001321 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001322 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001323 char *s = PyString_AsString(v);
1324 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001325 if (len > 0 &&
1326 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001327 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001328 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001329 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001330 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001331 Py_XDECREF(stream);
1332 stream = NULL;
1333 if (err == 0)
1334 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001335 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001336
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001337 case PRINT_NEWLINE_TO:
1338 w = stream = POP();
1339 /* fall through to PRINT_NEWLINE */
1340
Guido van Rossum374a9221991-04-04 10:40:29 +00001341 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001342 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001343 w = PySys_GetObject("stdout");
1344 if (w == NULL)
1345 PyErr_SetString(PyExc_RuntimeError,
1346 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001347 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001348 if (w != NULL) {
1349 err = PyFile_WriteString("\n", w);
1350 if (err == 0)
1351 PyFile_SoftSpace(w, 0);
1352 }
1353 Py_XDECREF(stream);
1354 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001356
Thomas Wouters434d0822000-08-24 20:11:32 +00001357
1358#ifdef CASE_TOO_BIG
1359 default: switch (opcode) {
1360#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001361 case BREAK_LOOP:
1362 why = WHY_BREAK;
1363 break;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001364
1365 case CONTINUE_LOOP:
1366 retval = PyInt_FromLong(oparg);
1367 why = WHY_CONTINUE;
1368 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001369
Guido van Rossumf10570b1995-07-07 22:53:21 +00001370 case RAISE_VARARGS:
1371 u = v = w = NULL;
1372 switch (oparg) {
1373 case 3:
1374 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001375 /* Fallthrough */
1376 case 2:
1377 v = POP(); /* value */
1378 /* Fallthrough */
1379 case 1:
1380 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001381 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001382 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001383 break;
1384 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001385 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001386 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001387 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001388 break;
1389 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001391
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001393 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001394 PyErr_SetString(PyExc_SystemError,
1395 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001396 break;
1397 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001398 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001399 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001401
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 case RETURN_VALUE:
1403 retval = POP();
1404 why = WHY_RETURN;
1405 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001406
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001407 case EXEC_STMT:
1408 w = POP();
1409 v = POP();
1410 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001411 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 Py_DECREF(u);
1413 Py_DECREF(v);
1414 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001415 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001416
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 case POP_BLOCK:
1418 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 while (STACK_LEVEL() > b->b_level) {
1421 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001423 }
1424 }
1425 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001426
Guido van Rossum374a9221991-04-04 10:40:29 +00001427 case END_FINALLY:
1428 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001429 if (PyInt_Check(v)) {
1430 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001431 if (why == WHY_RETURN ||
1432 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 retval = POP();
1434 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001437 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001438 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001439 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001440 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001442 else if (v != Py_None) {
1443 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001444 "'finally' pops bad exception");
1445 why = WHY_EXCEPTION;
1446 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001447 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001449
Guido van Rossum374a9221991-04-04 10:40:29 +00001450 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001451 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001453 w = POP();
1454 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001456 Py_DECREF(u);
1457 Py_DECREF(v);
1458 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001460
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 case STORE_NAME:
1462 w = GETNAMEV(oparg);
1463 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001464 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001465 PyErr_Format(PyExc_SystemError,
1466 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001467 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001468 break;
1469 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001470 err = PyDict_SetItem(x, w, v);
1471 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001473
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001475 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001476 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001477 PyErr_Format(PyExc_SystemError,
1478 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001479 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001480 break;
1481 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001482 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001483 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001484 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001486
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001487 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001489 if (PyTuple_Check(v)) {
1490 if (PyTuple_Size(v) != oparg) {
1491 PyErr_SetString(PyExc_ValueError,
1492 "unpack tuple of wrong size");
1493 why = WHY_EXCEPTION;
1494 }
1495 else {
1496 for (; --oparg >= 0; ) {
1497 w = PyTuple_GET_ITEM(v, oparg);
1498 Py_INCREF(w);
1499 PUSH(w);
1500 }
1501 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001503 else if (PyList_Check(v)) {
1504 if (PyList_Size(v) != oparg) {
1505 PyErr_SetString(PyExc_ValueError,
1506 "unpack list of wrong size");
1507 why = WHY_EXCEPTION;
1508 }
1509 else {
1510 for (; --oparg >= 0; ) {
1511 w = PyList_GET_ITEM(v, oparg);
1512 Py_INCREF(w);
1513 PUSH(w);
1514 }
1515 }
1516 }
1517 else if (PySequence_Check(v)) {
1518 if (unpack_sequence(v, oparg,
1519 stack_pointer + oparg))
1520 stack_pointer += oparg;
1521 else
1522 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001523 }
1524 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001525 PyErr_SetString(PyExc_TypeError,
1526 "unpack non-sequence");
1527 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001528 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001529 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001530 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001531
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001533 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001534 v = POP();
1535 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001536 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1537 Py_DECREF(v);
1538 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001539 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001540
Guido van Rossum374a9221991-04-04 10:40:29 +00001541 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001542 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001544 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1545 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001546 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001547 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001548
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001549 case STORE_GLOBAL:
1550 w = GETNAMEV(oparg);
1551 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001552 err = PyDict_SetItem(f->f_globals, w, v);
1553 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001554 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001555
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001556 case DELETE_GLOBAL:
1557 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001558 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001559 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001560 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001561 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001562
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 case LOAD_CONST:
1564 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001565 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 PUSH(x);
1567 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001568
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001570 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001571 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001572 PyErr_Format(PyExc_SystemError,
1573 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001574 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575 break;
1576 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001577 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001579 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001581 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001583 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001584 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001585 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001586 break;
1587 }
1588 }
1589 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001590 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 PUSH(x);
1592 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001593
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001595 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001596 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001597 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001598 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001599 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001600 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001601 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001602 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001603 break;
1604 }
1605 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 PUSH(x);
1608 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001609
Guido van Rossum9bfef441993-03-29 10:43:31 +00001610 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001611 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001612 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001613 format_exc_check_arg(
1614 PyExc_UnboundLocalError,
1615 UNBOUNDLOCAL_ERROR_MSG,
1616 PyTuple_GetItem(co->co_varnames, oparg)
1617 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001618 break;
1619 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001621 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001622 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001623 break;
1624
1625 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001626 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001627 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001628 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001629
1630 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001631 x = GETLOCAL(oparg);
1632 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001633 format_exc_check_arg(
1634 PyExc_UnboundLocalError,
1635 UNBOUNDLOCAL_ERROR_MSG,
1636 PyTuple_GetItem(co->co_varnames, oparg)
1637 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001638 break;
1639 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001640 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001641 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001642
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001643 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001644 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001645 Py_INCREF(x);
1646 PUSH(x);
1647 break;
1648
1649 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001650 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001651 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001652 if (w == NULL) {
1653 if (oparg < f->f_ncells)
1654 v = PyTuple_GetItem(co->co_cellvars,
1655 oparg);
1656 else
1657 v = PyTuple_GetItem(
1658 co->co_freevars,
1659 oparg - f->f_ncells);
1660
1661 format_exc_check_arg(
1662 PyExc_UnboundLocalError,
1663 UNBOUNDLOCAL_ERROR_MSG,
1664 v);
1665 err = -1;
1666 break;
1667 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001668 PUSH(w);
1669 break;
1670
1671 case STORE_DEREF:
1672 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001673 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001674 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001675 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001676 continue;
1677
Guido van Rossum374a9221991-04-04 10:40:29 +00001678 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001679 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 if (x != NULL) {
1681 for (; --oparg >= 0;) {
1682 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001683 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 }
1685 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001686 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 }
1688 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001689
Guido van Rossum374a9221991-04-04 10:40:29 +00001690 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001691 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001692 if (x != NULL) {
1693 for (; --oparg >= 0;) {
1694 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001695 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 }
1697 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001698 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 }
1700 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001701
Guido van Rossum374a9221991-04-04 10:40:29 +00001702 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001703 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001704 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001705 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001706 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001707
Guido van Rossum374a9221991-04-04 10:40:29 +00001708 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001709 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001711 x = PyObject_GetAttr(v, w);
1712 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001713 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001714 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001715 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001716
Guido van Rossum374a9221991-04-04 10:40:29 +00001717 case COMPARE_OP:
1718 w = POP();
1719 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001720 if (PyInt_Check(v) && PyInt_Check(w)) {
1721 /* INLINE: cmp(int, int) */
1722 register long a, b;
1723 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001724 a = PyInt_AS_LONG(v);
1725 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001726 switch (oparg) {
1727 case LT: res = a < b; break;
1728 case LE: res = a <= b; break;
1729 case EQ: res = a == b; break;
1730 case NE: res = a != b; break;
1731 case GT: res = a > b; break;
1732 case GE: res = a >= b; break;
1733 case IS: res = v == w; break;
1734 case IS_NOT: res = v != w; break;
1735 default: goto slow_compare;
1736 }
1737 x = res ? Py_True : Py_False;
1738 Py_INCREF(x);
1739 }
1740 else {
1741 slow_compare:
1742 x = cmp_outcome(oparg, v, w);
1743 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001744 Py_DECREF(v);
1745 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001747 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001748 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001749
Guido van Rossum374a9221991-04-04 10:40:29 +00001750 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001754 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001755 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001756 break;
1757 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001758 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001759 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001760 w,
1761 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001762 f->f_locals == NULL ?
1763 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001764 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001765 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 if (w == NULL) {
1767 x = NULL;
1768 break;
1769 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001770 x = PyEval_CallObject(x, w);
1771 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001775
Thomas Wouters52152252000-08-17 22:55:00 +00001776 case IMPORT_STAR:
1777 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001778 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001779 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001780 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001781 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001782 break;
1783 }
Thomas Wouters52152252000-08-17 22:55:00 +00001784 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001785 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001786 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001787 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001788 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001789
Thomas Wouters52152252000-08-17 22:55:00 +00001790 case IMPORT_FROM:
1791 w = GETNAMEV(oparg);
1792 v = TOP();
1793 x = import_from(v, w);
1794 PUSH(x);
1795 if (x != NULL) continue;
1796 break;
1797
Guido van Rossum374a9221991-04-04 10:40:29 +00001798 case JUMP_FORWARD:
1799 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001800 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001801
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001803 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001804 if (err > 0)
1805 err = 0;
1806 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001808 else
1809 break;
1810 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001811
Guido van Rossum374a9221991-04-04 10:40:29 +00001812 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001813 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001814 if (err > 0) {
1815 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001816 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001817 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001818 else if (err == 0)
1819 ;
1820 else
1821 break;
1822 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001823
Guido van Rossum374a9221991-04-04 10:40:29 +00001824 case JUMP_ABSOLUTE:
1825 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001826 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001827
Guido van Rossum374a9221991-04-04 10:40:29 +00001828 case FOR_LOOP:
1829 /* for v in s: ...
1830 On entry: stack contains s, i.
1831 On exit: stack contains s, i+1, s[i];
1832 but if loop exhausted:
1833 s, i are popped, and we jump */
1834 w = POP(); /* Loop index */
1835 v = POP(); /* Sequence object */
1836 u = loop_subscript(v, w);
1837 if (u != NULL) {
1838 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001841 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001843 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001844 }
1845 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001846 Py_DECREF(v);
1847 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 /* A NULL can mean "s exhausted"
1849 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001850 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001852 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001854 continue;
1855 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 }
1857 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001858
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 case SETUP_LOOP:
1860 case SETUP_EXCEPT:
1861 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001862 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001863 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001864 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001865
Guido van Rossum374a9221991-04-04 10:40:29 +00001866 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001867#ifdef LLTRACE
1868 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001869 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001870#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001871 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001872 if (f->f_trace == NULL)
1873 continue;
1874 /* Trace each line of code reached */
1875 f->f_lasti = INSTR_OFFSET();
1876 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001877 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001878 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001879
1880 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001881 {
1882 int na = oparg & 0xff;
1883 int nk = (oparg>>8) & 0xff;
1884 int n = na + 2 * nk;
1885 PyObject **pfunc = stack_pointer - n - 1;
1886 PyObject *func = *pfunc;
1887 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1888
1889 /* Always dispatch PyCFunction first, because
1890 these are presumed to be the most frequent
1891 callable object.
1892 */
1893 if (PyCFunction_Check(func)) {
1894 if (PyCFunction_GET_FLAGS(func) == 0) {
1895 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001896 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001897 } else {
1898 x = do_call(func, &stack_pointer,
1899 na, nk);
1900 }
1901 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001902 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001903 && PyMethod_GET_SELF(func) != NULL) {
1904 /* optimize access to bound methods */
1905 PyObject *self = PyMethod_GET_SELF(func);
1906 Py_INCREF(self);
1907 func = PyMethod_GET_FUNCTION(func);
1908 Py_INCREF(func);
1909 Py_DECREF(*pfunc);
1910 *pfunc = self;
1911 na++;
1912 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001913 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001914 Py_INCREF(func);
1915 if (PyFunction_Check(func)) {
1916 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001917 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001918 } else {
1919 x = do_call(func, &stack_pointer,
1920 na, nk);
1921 }
1922 Py_DECREF(func);
1923 }
1924
1925 while (stack_pointer > pfunc) {
1926 w = POP();
1927 Py_DECREF(w);
1928 }
1929 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001930 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001931 continue;
1932 break;
1933 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001934
Jeremy Hylton76901512000-03-28 23:49:17 +00001935 case CALL_FUNCTION_VAR:
1936 case CALL_FUNCTION_KW:
1937 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001938 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001939 int na = oparg & 0xff;
1940 int nk = (oparg>>8) & 0xff;
1941 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001942 int n = na + 2 * nk;
1943 PyObject **pfunc, *func;
1944 if (flags & CALL_FLAG_VAR)
1945 n++;
1946 if (flags & CALL_FLAG_KW)
1947 n++;
1948 pfunc = stack_pointer - n - 1;
1949 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001950 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001951
Guido van Rossumac7be682001-01-17 15:42:30 +00001952 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001953 && PyMethod_GET_SELF(func) != NULL) {
1954 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001955 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001956 func = PyMethod_GET_FUNCTION(func);
1957 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001958 Py_DECREF(*pfunc);
1959 *pfunc = self;
1960 na++;
1961 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001962 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001963 Py_INCREF(func);
1964 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001965 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001966
Jeremy Hylton76901512000-03-28 23:49:17 +00001967 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001968 w = POP();
1969 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001970 }
1971 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001972 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001973 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001974 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001975 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001976
Guido van Rossum681d79a1995-07-18 14:51:37 +00001977 case MAKE_FUNCTION:
1978 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001979 x = PyFunction_New(v, f->f_globals);
1980 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001981 /* XXX Maybe this should be a separate opcode? */
1982 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001983 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001984 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001985 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001986 x = NULL;
1987 break;
1988 }
1989 while (--oparg >= 0) {
1990 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001992 }
1993 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001995 }
1996 PUSH(x);
1997 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001998
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001999 case MAKE_CLOSURE:
2000 {
2001 int nfree;
2002 v = POP(); /* code object */
2003 x = PyFunction_New(v, f->f_globals);
2004 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2005 Py_DECREF(v);
2006 /* XXX Maybe this should be a separate opcode? */
2007 if (x != NULL && nfree > 0) {
2008 v = PyTuple_New(nfree);
2009 if (v == NULL) {
2010 Py_DECREF(x);
2011 x = NULL;
2012 break;
2013 }
2014 while (--nfree >= 0) {
2015 w = POP();
2016 PyTuple_SET_ITEM(v, nfree, w);
2017 }
2018 err = PyFunction_SetClosure(x, v);
2019 Py_DECREF(v);
2020 }
2021 if (x != NULL && oparg > 0) {
2022 v = PyTuple_New(oparg);
2023 if (v == NULL) {
2024 Py_DECREF(x);
2025 x = NULL;
2026 break;
2027 }
2028 while (--oparg >= 0) {
2029 w = POP();
2030 PyTuple_SET_ITEM(v, oparg, w);
2031 }
2032 err = PyFunction_SetDefaults(x, v);
2033 Py_DECREF(v);
2034 }
2035 PUSH(x);
2036 break;
2037 }
2038
Guido van Rossum8861b741996-07-30 16:49:37 +00002039 case BUILD_SLICE:
2040 if (oparg == 3)
2041 w = POP();
2042 else
2043 w = NULL;
2044 v = POP();
2045 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002046 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002047 Py_DECREF(u);
2048 Py_DECREF(v);
2049 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002050 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002051 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002052 break;
2053
Fred Drakeef8ace32000-08-24 00:32:09 +00002054 case EXTENDED_ARG:
2055 opcode = NEXTOP();
2056 oparg = oparg<<16 | NEXTARG();
2057 goto dispatch_opcode;
2058 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002059
Guido van Rossum374a9221991-04-04 10:40:29 +00002060 default:
2061 fprintf(stderr,
2062 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002063 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002064 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002065 why = WHY_EXCEPTION;
2066 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002067
2068#ifdef CASE_TOO_BIG
2069 }
2070#endif
2071
Guido van Rossum374a9221991-04-04 10:40:29 +00002072 } /* switch */
2073
2074 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002075
Guido van Rossum374a9221991-04-04 10:40:29 +00002076 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002077
Guido van Rossum374a9221991-04-04 10:40:29 +00002078 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002079 if (err == 0 && x != NULL) {
2080#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002081 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002082 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002083 fprintf(stderr,
2084 "XXX undetected error\n");
2085 else
2086#endif
2087 continue; /* Normal, fast path */
2088 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002089 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002090 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 err = 0;
2092 }
2093
Guido van Rossum374a9221991-04-04 10:40:29 +00002094 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002095
Guido van Rossum374a9221991-04-04 10:40:29 +00002096 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002097 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002098 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002099 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002100 why = WHY_EXCEPTION;
2101 }
2102 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002103#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002104 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002105 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002106 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002107 fprintf(stderr,
2108 "XXX undetected error (why=%d)\n",
2109 why);
2110 why = WHY_EXCEPTION;
2111 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002112 }
2113#endif
2114
2115 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002116
Guido van Rossum374a9221991-04-04 10:40:29 +00002117 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002118 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002120 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002121 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002122
Guido van Rossume59214e1994-08-30 08:01:59 +00002123 if (f->f_trace)
2124 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002125 if (tstate->sys_profilefunc)
2126 call_exc_trace(&tstate->sys_profilefunc,
2127 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002128 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002129
Guido van Rossum374a9221991-04-04 10:40:29 +00002130 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002131
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 if (why == WHY_RERAISE)
2133 why = WHY_EXCEPTION;
2134
2135 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002136
Guido van Rossum374a9221991-04-04 10:40:29 +00002137 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002139
2140 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2141 /* For a continue inside a try block,
2142 don't pop the block for the loop. */
2143 PyFrame_BlockSetup(f, b->b_type, b->b_level,
2144 b->b_handler);
2145 why = WHY_NOT;
2146 JUMPTO(PyInt_AS_LONG(retval));
2147 Py_DECREF(retval);
2148 break;
2149 }
2150
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 while (STACK_LEVEL() > b->b_level) {
2152 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002153 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002154 }
2155 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2156 why = WHY_NOT;
2157 JUMPTO(b->b_handler);
2158 break;
2159 }
2160 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002161 (b->b_type == SETUP_EXCEPT &&
2162 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 PyObject *exc, *val, *tb;
2165 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002167 val = Py_None;
2168 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002170 /* Make the raw exception data
2171 available to the handler,
2172 so a program can emulate the
2173 Python main loop. Don't do
2174 this for 'finally'. */
2175 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002176 PyErr_NormalizeException(
2177 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002178 set_exc_info(tstate,
2179 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002181 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 PUSH(val);
2183 PUSH(exc);
2184 }
2185 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002186 if (why == WHY_RETURN ||
2187 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002188 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002189 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 PUSH(v);
2191 }
2192 why = WHY_NOT;
2193 JUMPTO(b->b_handler);
2194 break;
2195 }
2196 } /* unwind stack */
2197
2198 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002199
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 if (why != WHY_NOT)
2201 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002202
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002204
Guido van Rossum374a9221991-04-04 10:40:29 +00002205 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002206
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 while (!EMPTY()) {
2208 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002209 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002211
Guido van Rossum96a42c81992-01-12 02:29:51 +00002212 if (why != WHY_RETURN)
2213 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002214
Guido van Rossume59214e1994-08-30 08:01:59 +00002215 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002216 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002217 if (call_trace(&f->f_trace, &f->f_trace, f,
2218 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002219 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002220 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002221 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002222 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002223 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002224 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002225
Guido van Rossuma027efa1997-05-05 20:56:21 +00002226 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2227 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002228 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002230 retval = NULL;
2231 why = WHY_EXCEPTION;
2232 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002233 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002234
Guido van Rossuma027efa1997-05-05 20:56:21 +00002235 reset_exc_info(tstate);
2236
2237 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002238
2239 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002240
Guido van Rossum374a9221991-04-04 10:40:29 +00002241 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002242
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002245
Guido van Rossum96a42c81992-01-12 02:29:51 +00002246 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002247}
2248
Guido van Rossuma027efa1997-05-05 20:56:21 +00002249static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002250set_exc_info(PyThreadState *tstate,
2251 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002252{
2253 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002254 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002255
Guido van Rossuma027efa1997-05-05 20:56:21 +00002256 frame = tstate->frame;
2257 if (frame->f_exc_type == NULL) {
2258 /* This frame didn't catch an exception before */
2259 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002260 if (tstate->exc_type == NULL) {
2261 Py_INCREF(Py_None);
2262 tstate->exc_type = Py_None;
2263 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002264 tmp_type = frame->f_exc_type;
2265 tmp_value = frame->f_exc_value;
2266 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002267 Py_XINCREF(tstate->exc_type);
2268 Py_XINCREF(tstate->exc_value);
2269 Py_XINCREF(tstate->exc_traceback);
2270 frame->f_exc_type = tstate->exc_type;
2271 frame->f_exc_value = tstate->exc_value;
2272 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002273 Py_XDECREF(tmp_type);
2274 Py_XDECREF(tmp_value);
2275 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002276 }
2277 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002278 tmp_type = tstate->exc_type;
2279 tmp_value = tstate->exc_value;
2280 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002281 Py_XINCREF(type);
2282 Py_XINCREF(value);
2283 Py_XINCREF(tb);
2284 tstate->exc_type = type;
2285 tstate->exc_value = value;
2286 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002287 Py_XDECREF(tmp_type);
2288 Py_XDECREF(tmp_value);
2289 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002290 /* For b/w compatibility */
2291 PySys_SetObject("exc_type", type);
2292 PySys_SetObject("exc_value", value);
2293 PySys_SetObject("exc_traceback", tb);
2294}
2295
2296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002297reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002298{
2299 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002300 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002301 frame = tstate->frame;
2302 if (frame->f_exc_type != NULL) {
2303 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002304 tmp_type = tstate->exc_type;
2305 tmp_value = tstate->exc_value;
2306 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002307 Py_XINCREF(frame->f_exc_type);
2308 Py_XINCREF(frame->f_exc_value);
2309 Py_XINCREF(frame->f_exc_traceback);
2310 tstate->exc_type = frame->f_exc_type;
2311 tstate->exc_value = frame->f_exc_value;
2312 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002313 Py_XDECREF(tmp_type);
2314 Py_XDECREF(tmp_value);
2315 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002316 /* For b/w compatibility */
2317 PySys_SetObject("exc_type", frame->f_exc_type);
2318 PySys_SetObject("exc_value", frame->f_exc_value);
2319 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2320 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002321 tmp_type = frame->f_exc_type;
2322 tmp_value = frame->f_exc_value;
2323 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002324 frame->f_exc_type = NULL;
2325 frame->f_exc_value = NULL;
2326 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002327 Py_XDECREF(tmp_type);
2328 Py_XDECREF(tmp_value);
2329 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002330}
2331
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002332/* Logic for the raise statement (too complicated for inlining).
2333 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002334static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002335do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002336{
Guido van Rossumd295f121998-04-09 21:39:57 +00002337 if (type == NULL) {
2338 /* Reraise */
2339 PyThreadState *tstate = PyThreadState_Get();
2340 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2341 value = tstate->exc_value;
2342 tb = tstate->exc_traceback;
2343 Py_XINCREF(type);
2344 Py_XINCREF(value);
2345 Py_XINCREF(tb);
2346 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002347
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002348 /* We support the following forms of raise:
2349 raise <class>, <classinstance>
2350 raise <class>, <argument tuple>
2351 raise <class>, None
2352 raise <class>, <argument>
2353 raise <classinstance>, None
2354 raise <string>, <object>
2355 raise <string>, None
2356
2357 An omitted second argument is the same as None.
2358
2359 In addition, raise <tuple>, <anything> is the same as
2360 raising the tuple's first item (and it better have one!);
2361 this rule is applied recursively.
2362
2363 Finally, an optional third argument can be supplied, which
2364 gives the traceback to be substituted (useful when
2365 re-raising an exception after examining it). */
2366
2367 /* First, check the traceback argument, replacing None with
2368 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002369 if (tb == Py_None) {
2370 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002371 tb = NULL;
2372 }
2373 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002374 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002375 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002376 goto raise_error;
2377 }
2378
2379 /* Next, replace a missing value with None */
2380 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002381 value = Py_None;
2382 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002383 }
2384
2385 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002386 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2387 PyObject *tmp = type;
2388 type = PyTuple_GET_ITEM(type, 0);
2389 Py_INCREF(type);
2390 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002391 }
2392
Barry Warsaw4249f541997-08-22 21:26:19 +00002393 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002394 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002395
2396 else if (PyClass_Check(type))
2397 PyErr_NormalizeException(&type, &value, &tb);
2398
Guido van Rossumb209a111997-04-29 18:18:01 +00002399 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002400 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002401 if (value != Py_None) {
2402 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002403 "instance exception may not have a separate value");
2404 goto raise_error;
2405 }
2406 else {
2407 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002408 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002409 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002410 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2411 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002412 }
2413 }
2414 else {
2415 /* Not something you can raise. You get an exception
2416 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002417 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002418 "exceptions must be strings, classes, or instances");
2419 goto raise_error;
2420 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002421 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002422 if (tb == NULL)
2423 return WHY_EXCEPTION;
2424 else
2425 return WHY_RERAISE;
2426 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 Py_XDECREF(value);
2428 Py_XDECREF(type);
2429 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002430 return WHY_EXCEPTION;
2431}
2432
Barry Warsawe42b18f1997-08-25 22:13:04 +00002433static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002434unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002435{
2436 int i;
2437 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002438
Barry Warsawe42b18f1997-08-25 22:13:04 +00002439 for (i = 0; i < argcnt; i++) {
2440 if (! (w = PySequence_GetItem(v, i))) {
2441 if (PyErr_ExceptionMatches(PyExc_IndexError))
2442 PyErr_SetString(PyExc_ValueError,
2443 "unpack sequence of wrong size");
2444 goto finally;
2445 }
2446 *--sp = w;
2447 }
2448 /* we better get an IndexError now */
2449 if (PySequence_GetItem(v, i) == NULL) {
2450 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2451 PyErr_Clear();
2452 return 1;
2453 }
2454 /* some other exception occurred. fall through to finally */
2455 }
2456 else
2457 PyErr_SetString(PyExc_ValueError,
2458 "unpack sequence of wrong size");
2459 /* fall through */
2460finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002461 for (; i > 0; i--, sp++)
2462 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002463
2464 return 0;
2465}
2466
2467
Guido van Rossum96a42c81992-01-12 02:29:51 +00002468#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002470prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002473 if (PyObject_Print(v, stdout, 0) != 0)
2474 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002475 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002476 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002478#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002480static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002481call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002482{
Guido van Rossumb209a111997-04-29 18:18:01 +00002483 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002484 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002485 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002486 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 value = Py_None;
2488 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002491 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002493 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002494 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002495 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002496 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002497 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002498 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002499 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002500 Py_XDECREF(type);
2501 Py_XDECREF(value);
2502 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002503 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002504}
2505
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002506/* PyObject **p_trace: in/out; may not be NULL;
2507 may not point to NULL variable initially
2508 PyObject **p_newtrace: in/out; may be NULL;
2509 may point to NULL variable;
2510 may be same variable as p_newtrace */
2511
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002512static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002513call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2514 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002515{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002516 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002517 PyObject *args, *what;
2518 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002519
Guido van Rossuma027efa1997-05-05 20:56:21 +00002520 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002521 /* Don't do recursive traces */
2522 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002523 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002524 *p_newtrace = NULL;
2525 }
2526 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002527 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002528
Guido van Rossumb209a111997-04-29 18:18:01 +00002529 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002530 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002531 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002533 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002534 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002535 Py_INCREF(f);
2536 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2537 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002538 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 arg = Py_None;
2540 Py_INCREF(arg);
2541 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002542 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002543 PyFrame_FastToLocals(f);
2544 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2545 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002546 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002547 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002549 if (res == NULL) {
2550 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002551 PyTraceBack_Here(f);
2552 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002553 *p_trace = NULL;
2554 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002555 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002556 *p_newtrace = NULL;
2557 }
Barry Warsawf6202631999-09-08 16:26:33 +00002558 /* to be extra double plus sure we don't get recursive
2559 * calls inf either tracefunc or profilefunc gets an
2560 * exception, zap the global variables.
2561 */
2562 Py_XDECREF(tstate->sys_tracefunc);
2563 tstate->sys_tracefunc = NULL;
2564 Py_XDECREF(tstate->sys_profilefunc);
2565 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002566 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002567 }
2568 else {
2569 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 Py_XDECREF(*p_newtrace);
2571 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002572 *p_newtrace = NULL;
2573 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002574 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002575 *p_newtrace = res;
2576 }
2577 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002578 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002579 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002580 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002581}
2582
Guido van Rossumb209a111997-04-29 18:18:01 +00002583PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002584PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002585{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002586 PyThreadState *tstate = PyThreadState_Get();
2587 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002588 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002589 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002590 else
2591 return current_frame->f_builtins;
2592}
2593
Guido van Rossumb209a111997-04-29 18:18:01 +00002594PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002595PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002596{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002597 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002598 if (current_frame == NULL)
2599 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002600 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002601 return current_frame->f_locals;
2602}
2603
Guido van Rossumb209a111997-04-29 18:18:01 +00002604PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002605PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002606{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002607 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002608 if (current_frame == NULL)
2609 return NULL;
2610 else
2611 return current_frame->f_globals;
2612}
2613
Guido van Rossumb209a111997-04-29 18:18:01 +00002614PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002615PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002616{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002617 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002618 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002619}
2620
Guido van Rossum6135a871995-01-09 17:53:26 +00002621int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002622PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002623{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002624 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002625 return current_frame == NULL ? 0 : current_frame->f_restricted;
2626}
2627
Guido van Rossumbe270261997-05-22 22:26:18 +00002628int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002632 if (f == NULL)
2633 return 0;
2634 if (!PyFile_SoftSpace(f, 0))
2635 return 0;
2636 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002637}
2638
Guido van Rossum3f5da241990-12-20 15:06:42 +00002639
Guido van Rossum681d79a1995-07-18 14:51:37 +00002640/* External interface to call any callable object.
2641 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002642
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002643#undef PyEval_CallObject
2644/* for backward compatibility: export this interface */
2645
Guido van Rossumb209a111997-04-29 18:18:01 +00002646PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002647PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002648{
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002650}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002651#define PyEval_CallObject(func,arg) \
2652 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002653
Guido van Rossumb209a111997-04-29 18:18:01 +00002654PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002655PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002656{
Jeremy Hylton52820442001-01-03 23:52:36 +00002657 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002658
2659 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002660 arg = PyTuple_New(0);
2661 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002662 PyErr_SetString(PyExc_TypeError,
2663 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002664 return NULL;
2665 }
2666 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002667 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002668
Guido van Rossumb209a111997-04-29 18:18:01 +00002669 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002670 PyErr_SetString(PyExc_TypeError,
2671 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002672 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002673 return NULL;
2674 }
2675
Jeremy Hylton52820442001-01-03 23:52:36 +00002676 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002677 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002678 return result;
2679}
2680
2681/* How often is each kind of object called? The answer depends on the
2682 program. An instrumented call_object() was used to run the Python
2683 regression test suite. The results were:
2684 4200000 PyCFunctions
2685 390000 fast_function() calls
2686 94000 other functions
2687 480000 all functions (sum of prev two)
2688 150000 methods
2689 100000 classes
2690
2691 Tests on other bodies of code show that PyCFunctions are still
2692 most common, but not by such a large margin.
2693*/
2694
2695static PyObject *
2696call_object(PyObject *func, PyObject *arg, PyObject *kw)
2697{
2698 ternaryfunc call;
2699 PyObject *result;
2700
2701 if (PyMethod_Check(func))
2702 result = call_method(func, arg, kw);
2703 else if (PyFunction_Check(func))
2704 result = call_eval_code2(func, arg, kw);
2705 else if (PyCFunction_Check(func))
2706 result = call_cfunction(func, arg, kw);
2707 else if (PyClass_Check(func))
2708 result = PyInstance_New(func, arg, kw);
2709 else if (PyInstance_Check(func))
2710 result = call_instance(func, arg, kw);
2711 else if ((call = func->ob_type->tp_call) != NULL)
2712 result = (*call)(func, arg, kw);
2713 else {
2714 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2715 PyString_AS_STRING(PyObject_Repr(func)));
2716 return NULL;
2717 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 if (result == NULL && !PyErr_Occurred())
2719 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002720 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002721
Guido van Rossume59214e1994-08-30 08:01:59 +00002722 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002723}
2724
Guido van Rossumb209a111997-04-29 18:18:01 +00002725static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002726call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727{
Jeremy Hylton52820442001-01-03 23:52:36 +00002728 PyCFunctionObject* f = (PyCFunctionObject*)func;
2729 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2730 PyObject *self = PyCFunction_GET_SELF(func);
2731 int flags = PyCFunction_GET_FLAGS(func);
2732
Jeremy Hylton52820442001-01-03 23:52:36 +00002733 if (flags & METH_KEYWORDS) {
2734 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002736 if (kw != NULL && PyDict_Size(kw) != 0) {
2737 PyErr_Format(PyExc_TypeError,
2738 "%.200s() takes no keyword arguments",
2739 f->m_ml->ml_name);
2740 return NULL;
2741 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002742 if (flags & METH_VARARGS) {
2743 return (*meth)(self, arg);
2744 }
2745 if (!(flags & METH_VARARGS)) {
2746 /* the really old style */
2747 int size = PyTuple_GET_SIZE(arg);
2748 if (size == 1)
2749 arg = PyTuple_GET_ITEM(arg, 0);
2750 else if (size == 0)
2751 arg = NULL;
2752 return (*meth)(self, arg);
2753 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002754 /* should never get here ??? */
2755 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 return NULL;
2757}
2758
Guido van Rossumb209a111997-04-29 18:18:01 +00002759static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002760call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761{
Jeremy Hylton52820442001-01-03 23:52:36 +00002762 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2763 if (call == NULL) {
2764 PyInstanceObject *inst = (PyInstanceObject*) func;
2765 PyErr_Clear();
2766 PyErr_Format(PyExc_AttributeError,
2767 "%.200s instance has no __call__ method",
2768 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769 return NULL;
2770 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002771 res = call_object(call, arg, kw);
2772 Py_DECREF(call);
2773 return res;
2774}
2775
2776static PyObject *
2777call_method(PyObject *func, PyObject *arg, PyObject *kw)
2778{
2779 PyObject *self = PyMethod_GET_SELF(func);
2780 PyObject *class = PyMethod_GET_CLASS(func);
2781 PyObject *result;
2782
2783 func = PyMethod_GET_FUNCTION(func);
2784 if (self == NULL) {
2785 /* Unbound methods must be called with an instance of
2786 the class (or a derived class) as first argument */
2787 if (PyTuple_Size(arg) >= 1)
2788 self = PyTuple_GET_ITEM(arg, 0);
2789 if (!(self != NULL && PyInstance_Check(self)
2790 && PyClass_IsSubclass((PyObject *)
2791 (((PyInstanceObject *)self)->in_class),
2792 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002793 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2794 PyErr_Format(PyExc_TypeError,
2795 "unbound method %s%smust be "
2796 "called with instance as first argument",
2797 fn ? PyString_AsString(fn) : "",
2798 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799 return NULL;
2800 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002801 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002802 } else {
2803 int argcount = PyTuple_Size(arg);
2804 PyObject *newarg = PyTuple_New(argcount + 1);
2805 int i;
2806 if (newarg == NULL)
2807 return NULL;
2808 Py_INCREF(self);
2809 PyTuple_SET_ITEM(newarg, 0, self);
2810 for (i = 0; i < argcount; i++) {
2811 PyObject *v = PyTuple_GET_ITEM(arg, i);
2812 Py_XINCREF(v);
2813 PyTuple_SET_ITEM(newarg, i+1, v);
2814 }
2815 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002817 result = call_object(func, arg, kw);
2818 Py_DECREF(arg);
2819 return result;
2820}
2821
2822static PyObject *
2823call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2824{
2825 PyObject *result;
2826 PyObject *argdefs;
2827 PyObject **d, **k;
2828 int nk, nd;
2829
2830 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002831 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2832 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2833 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002834 }
2835 else {
2836 d = NULL;
2837 nd = 0;
2838 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002839
Guido van Rossum681d79a1995-07-18 14:51:37 +00002840 if (kw != NULL) {
2841 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 nk = PyDict_Size(kw);
2843 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002844 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002845 PyErr_NoMemory();
2846 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002847 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002848 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002849 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002850 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002851 i += 2;
2852 nk = i/2;
2853 /* XXX This is broken if the caller deletes dict items! */
2854 }
2855 else {
2856 k = NULL;
2857 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002858 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002859
Guido van Rossum681d79a1995-07-18 14:51:37 +00002860 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002861 (PyCodeObject *)PyFunction_GET_CODE(func),
2862 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002863 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002864 k, nk, d, nd,
2865 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002866
Guido van Rossumb18618d2000-05-03 23:44:39 +00002867 if (k != NULL)
2868 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002869
Guido van Rossum681d79a1995-07-18 14:51:37 +00002870 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871}
2872
Jeremy Hylton52820442001-01-03 23:52:36 +00002873#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2874
2875/* The two fast_xxx() functions optimize calls for which no argument
2876 tuple is necessary; the objects are passed directly from the stack.
2877 fast_cfunction() is called for METH_OLDARGS functions.
2878 fast_function() is for functions with no special argument handling.
2879*/
2880
2881static PyObject *
2882fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2883{
2884 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2885 PyObject *self = PyCFunction_GET_SELF(func);
2886
2887 if (na == 0)
2888 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002889 else if (na == 1) {
2890 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002891 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002892 Py_DECREF(arg);
2893 return result;
2894 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002895 PyObject *args = load_args(pp_stack, na);
2896 PyObject *result = (*meth)(self, args);
2897 Py_DECREF(args);
2898 return result;
2899 }
2900}
2901
2902static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002903fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002904{
2905 PyObject *co = PyFunction_GET_CODE(func);
2906 PyObject *globals = PyFunction_GET_GLOBALS(func);
2907 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002908 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002909 PyObject **d = NULL;
2910 int nd = 0;
2911
2912 if (argdefs != NULL) {
2913 d = &PyTuple_GET_ITEM(argdefs, 0);
2914 nd = ((PyTupleObject *)argdefs)->ob_size;
2915 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002916 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002917 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002918 (*pp_stack)-2*nk, nk, d, nd,
2919 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002920}
2921
2922static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002923update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2924 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002925{
2926 PyObject *kwdict = NULL;
2927 if (orig_kwdict == NULL)
2928 kwdict = PyDict_New();
2929 else {
2930 kwdict = PyDict_Copy(orig_kwdict);
2931 Py_DECREF(orig_kwdict);
2932 }
2933 if (kwdict == NULL)
2934 return NULL;
2935 while (--nk >= 0) {
2936 int err;
2937 PyObject *value = EXT_POP(*pp_stack);
2938 PyObject *key = EXT_POP(*pp_stack);
2939 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002940 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002941 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002942 "%.200s%s got multiple values "
2943 "for keyword argument '%.400s'",
2944 fn ? PyString_AsString(fn) : "function",
2945 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002946 Py_DECREF(key);
2947 Py_DECREF(value);
2948 Py_DECREF(kwdict);
2949 return NULL;
2950 }
2951 err = PyDict_SetItem(kwdict, key, value);
2952 Py_DECREF(key);
2953 Py_DECREF(value);
2954 if (err) {
2955 Py_DECREF(kwdict);
2956 return NULL;
2957 }
2958 }
2959 return kwdict;
2960}
2961
2962static PyObject *
2963update_star_args(int nstack, int nstar, PyObject *stararg,
2964 PyObject ***pp_stack)
2965{
2966 PyObject *callargs, *w;
2967
2968 callargs = PyTuple_New(nstack + nstar);
2969 if (callargs == NULL) {
2970 return NULL;
2971 }
2972 if (nstar) {
2973 int i;
2974 for (i = 0; i < nstar; i++) {
2975 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2976 Py_INCREF(a);
2977 PyTuple_SET_ITEM(callargs, nstack + i, a);
2978 }
2979 }
2980 while (--nstack >= 0) {
2981 w = EXT_POP(*pp_stack);
2982 PyTuple_SET_ITEM(callargs, nstack, w);
2983 }
2984 return callargs;
2985}
2986
2987static PyObject *
2988load_args(PyObject ***pp_stack, int na)
2989{
2990 PyObject *args = PyTuple_New(na);
2991 PyObject *w;
2992
2993 if (args == NULL)
2994 return NULL;
2995 while (--na >= 0) {
2996 w = EXT_POP(*pp_stack);
2997 PyTuple_SET_ITEM(args, na, w);
2998 }
2999 return args;
3000}
3001
3002static PyObject *
3003do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3004{
3005 PyObject *callargs = NULL;
3006 PyObject *kwdict = NULL;
3007 PyObject *result = NULL;
3008
3009 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003010 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003011 if (kwdict == NULL)
3012 goto call_fail;
3013 }
3014 callargs = load_args(pp_stack, na);
3015 if (callargs == NULL)
3016 goto call_fail;
3017 result = call_object(func, callargs, kwdict);
3018 call_fail:
3019 Py_XDECREF(callargs);
3020 Py_XDECREF(kwdict);
3021 return result;
3022}
3023
3024static PyObject *
3025ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3026{
3027 int nstar = 0;
3028 PyObject *callargs = NULL;
3029 PyObject *stararg = NULL;
3030 PyObject *kwdict = NULL;
3031 PyObject *result = NULL;
3032
3033 if (flags & CALL_FLAG_KW) {
3034 kwdict = EXT_POP(*pp_stack);
3035 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003036 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3037 PyErr_Format(PyExc_TypeError,
3038 "%s%s argument after ** must be a dictionary",
3039 fn ? PyString_AsString(fn) : "function",
3040 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003041 goto ext_call_fail;
3042 }
3043 }
3044 if (flags & CALL_FLAG_VAR) {
3045 stararg = EXT_POP(*pp_stack);
3046 if (!PyTuple_Check(stararg)) {
3047 PyObject *t = NULL;
3048 t = PySequence_Tuple(stararg);
3049 if (t == NULL) {
3050 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003051 PyObject* fn =
3052 ((PyFunctionObject*) func)->func_name;
3053 PyErr_Format(PyExc_TypeError,
3054 "%s%s argument after * must be a sequence",
3055 fn ? PyString_AsString(fn) : "function",
3056 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003057 }
3058 goto ext_call_fail;
3059 }
3060 Py_DECREF(stararg);
3061 stararg = t;
3062 }
3063 nstar = PyTuple_GET_SIZE(stararg);
3064 }
3065 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003066 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003067 if (kwdict == NULL)
3068 goto ext_call_fail;
3069 }
3070 callargs = update_star_args(na, nstar, stararg, pp_stack);
3071 if (callargs == NULL)
3072 goto ext_call_fail;
3073 result = call_object(func, callargs, kwdict);
3074 ext_call_fail:
3075 Py_XDECREF(callargs);
3076 Py_XDECREF(kwdict);
3077 Py_XDECREF(stararg);
3078 return result;
3079}
3080
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003081#define SLICE_ERROR_MSG \
3082 "standard sequence type does not support step size other than one"
3083
Guido van Rossumb209a111997-04-29 18:18:01 +00003084static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003085loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086{
Guido van Rossumb209a111997-04-29 18:18:01 +00003087 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003088 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003089 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003090 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 return NULL;
3092 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003093 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003094 v = (*sq->sq_item)(v, i);
3095 if (v)
3096 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003097 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003098 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003099 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100}
3101
Guido van Rossum20c6add2000-05-08 14:06:50 +00003102/* Extract a slice index from a PyInt or PyLong, the index is bound to
3103 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3104 and error. Returns 1 on success.*/
3105
3106int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003107_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108{
3109 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003110 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003111 if (PyInt_Check(v)) {
3112 x = PyInt_AsLong(v);
3113 } else if (PyLong_Check(v)) {
3114 x = PyLong_AsLong(v);
3115 if (x==-1 && PyErr_Occurred()) {
3116 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003117 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003118
Guido van Rossumac7be682001-01-17 15:42:30 +00003119 if (!PyErr_ExceptionMatches(
3120 PyExc_OverflowError)) {
3121 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003122 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003123 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003124 }
3125
Guido van Rossumac7be682001-01-17 15:42:30 +00003126 /* Clear the OverflowError */
3127 PyErr_Clear();
3128
3129 /* It's an overflow error, so we need to
3130 check the sign of the long integer,
3131 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003132 the error. */
3133
3134 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003135 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003136 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003137
3138 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003139 cmp = PyObject_RichCompareBool(v, long_zero,
3140 Py_GT);
3141 Py_DECREF(long_zero);
3142 if (cmp < 0)
3143 return 0;
3144 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003145 x = INT_MAX;
3146 else
3147 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003148 }
3149 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003150 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003151 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003152 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003154 /* Truncate -- very long indices are truncated anyway */
3155 if (x > INT_MAX)
3156 x = INT_MAX;
3157 else if (x < -INT_MAX)
3158 x = 0;
3159 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003160 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003161 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162}
3163
Guido van Rossumb209a111997-04-29 18:18:01 +00003164static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003165apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003167 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003168 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003170 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003171 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003172 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003174
3175static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003176assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3177 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003179 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003180 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003181 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003182 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003183 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003184 if (x == NULL)
3185 return PySequence_DelSlice(u, ilow, ihigh);
3186 else
3187 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188}
3189
Guido van Rossumb209a111997-04-29 18:18:01 +00003190static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003191cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192{
Guido van Rossumac7be682001-01-17 15:42:30 +00003193 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003194 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003195 case IS:
3196 case IS_NOT:
3197 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003198 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003199 res = !res;
3200 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201 case IN:
3202 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003203 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003204 if (res < 0)
3205 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003206 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003207 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 break;
3209 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003210 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211 break;
3212 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003213 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003215 v = res ? Py_True : Py_False;
3216 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 return v;
3218}
3219
Thomas Wouters52152252000-08-17 22:55:00 +00003220static PyObject *
3221import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003222{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003223 PyObject *x;
3224
3225 x = PyObject_GetAttr(v, name);
3226 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003227 PyErr_Format(PyExc_ImportError,
3228 "cannot import name %.230s",
3229 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003230 }
Thomas Wouters52152252000-08-17 22:55:00 +00003231 return x;
3232}
Guido van Rossumac7be682001-01-17 15:42:30 +00003233
Thomas Wouters52152252000-08-17 22:55:00 +00003234static int
3235import_all_from(PyObject *locals, PyObject *v)
3236{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003237 PyObject *all = PyObject_GetAttrString(v, "__all__");
3238 PyObject *dict, *name, *value;
3239 int skip_leading_underscores = 0;
3240 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003241
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003242 if (all == NULL) {
3243 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3244 return -1; /* Unexpected error */
3245 PyErr_Clear();
3246 dict = PyObject_GetAttrString(v, "__dict__");
3247 if (dict == NULL) {
3248 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3249 return -1;
3250 PyErr_SetString(PyExc_ImportError,
3251 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003252 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003253 }
3254 all = PyMapping_Keys(dict);
3255 Py_DECREF(dict);
3256 if (all == NULL)
3257 return -1;
3258 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003259 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003260
3261 for (pos = 0, err = 0; ; pos++) {
3262 name = PySequence_GetItem(all, pos);
3263 if (name == NULL) {
3264 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3265 err = -1;
3266 else
3267 PyErr_Clear();
3268 break;
3269 }
3270 if (skip_leading_underscores &&
3271 PyString_Check(name) &&
3272 PyString_AS_STRING(name)[0] == '_')
3273 {
3274 Py_DECREF(name);
3275 continue;
3276 }
3277 value = PyObject_GetAttr(v, name);
3278 if (value == NULL)
3279 err = -1;
3280 else
3281 err = PyDict_SetItem(locals, name, value);
3282 Py_DECREF(name);
3283 Py_XDECREF(value);
3284 if (err != 0)
3285 break;
3286 }
3287 Py_DECREF(all);
3288 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003289}
3290
Guido van Rossumb209a111997-04-29 18:18:01 +00003291static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003292build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003293{
Guido van Rossumcd649651997-08-22 16:56:16 +00003294 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003295 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003296 PyErr_SetString(PyExc_SystemError,
3297 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003298 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003299 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003300 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003301 PyErr_SetString(PyExc_SystemError,
3302 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003303 return NULL;
3304 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003305 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003306 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003307 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003308 return NULL;
3309 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003310 n = PyTuple_Size(bases);
3311 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003312 PyObject *base = PyTuple_GET_ITEM(bases, i);
3313 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003314 /* Call the base's *type*, if it is callable.
3315 This code is a hook for Donald Beaudry's
3316 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003317 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003318 since its types are not callable.
3319 Ditto: call the bases's *class*, if it has
3320 one. This makes the same thing possible
3321 without writing C code. A true meta-object
3322 protocol! */
3323 PyObject *basetype = (PyObject *)base->ob_type;
3324 PyObject *callable = NULL;
3325 if (PyCallable_Check(basetype))
3326 callable = basetype;
3327 else
3328 callable = PyObject_GetAttrString(
3329 base, "__class__");
3330 if (callable) {
3331 PyObject *args;
3332 PyObject *newclass = NULL;
3333 args = Py_BuildValue(
3334 "(OOO)", name, bases, methods);
3335 if (args != NULL) {
3336 newclass = PyEval_CallObject(
3337 callable, args);
3338 Py_DECREF(args);
3339 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003340 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003341 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003342 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003343 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003344 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003345 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003346 "base is not a class object");
3347 return NULL;
3348 }
3349 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003350 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003351}
3352
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003353static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003354exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3355 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003356{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003357 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003358 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003359 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003360
Guido van Rossumb209a111997-04-29 18:18:01 +00003361 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3362 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003363 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003364 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003365 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003366 locals = PyTuple_GetItem(prog, 2);
3367 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003368 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003369 if (globals == Py_None) {
3370 globals = PyEval_GetGlobals();
3371 if (locals == Py_None) {
3372 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003373 plain = 1;
3374 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003375 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003376 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003377 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003378 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003379 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003380 !PyCode_Check(prog) &&
3381 !PyFile_Check(prog)) {
3382 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003383 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003384 return -1;
3385 }
Fred Drake661ea262000-10-24 19:57:45 +00003386 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003387 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003388 "exec: arg 2 must be a dictionary or None");
3389 return -1;
3390 }
3391 if (!PyDict_Check(locals)) {
3392 PyErr_SetString(PyExc_TypeError,
3393 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003394 return -1;
3395 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003396 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003397 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003398 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003399 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003400 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003401 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003402 FILE *fp = PyFile_AsFile(prog);
3403 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003404 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3405 }
3406 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003407 char *str;
3408 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003409 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003410 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003411 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003412 if (plain)
3413 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003414 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003415 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003416 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003417 return 0;
3418}
Guido van Rossum24c13741995-02-14 09:42:43 +00003419
Guido van Rossumac7be682001-01-17 15:42:30 +00003420static void
Paul Prescode68140d2000-08-30 20:25:01 +00003421format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3422{
3423 char *obj_str;
3424
3425 if (!obj)
3426 return;
3427
3428 obj_str = PyString_AsString(obj);
3429 if (!obj_str)
3430 return;
3431
3432 PyErr_Format(exc, format_str, obj_str);
3433}
Guido van Rossum950361c1997-01-24 13:49:28 +00003434
3435#ifdef DYNAMIC_EXECUTION_PROFILE
3436
3437PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003438getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003439{
3440 int i;
3441 PyObject *l = PyList_New(256);
3442 if (l == NULL) return NULL;
3443 for (i = 0; i < 256; i++) {
3444 PyObject *x = PyInt_FromLong(a[i]);
3445 if (x == NULL) {
3446 Py_DECREF(l);
3447 return NULL;
3448 }
3449 PyList_SetItem(l, i, x);
3450 }
3451 for (i = 0; i < 256; i++)
3452 a[i] = 0;
3453 return l;
3454}
3455
3456PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003458{
3459#ifndef DXPAIRS
3460 return getarray(dxp);
3461#else
3462 int i;
3463 PyObject *l = PyList_New(257);
3464 if (l == NULL) return NULL;
3465 for (i = 0; i < 257; i++) {
3466 PyObject *x = getarray(dxpairs[i]);
3467 if (x == NULL) {
3468 Py_DECREF(l);
3469 return NULL;
3470 }
3471 PyList_SetItem(l, i, x);
3472 }
3473 return l;
3474#endif
3475}
3476
3477#endif