blob: 8f449a1e08fc2f96dbef7497caeb2350b646c1c9 [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 Hylton64949cb2001-01-25 20:06:59 +0000433 globals, locals, closure);
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 if (f == NULL)
435 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000438 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000439 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440
441 if (co->co_argcount > 0 ||
442 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
443 int i;
444 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 if (kwdict == NULL)
449 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000450 i = co->co_argcount;
451 if (co->co_flags & CO_VARARGS)
452 i++;
453 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000454 }
455 if (argcount > co->co_argcount) {
456 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000457 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000458 "%.200s() takes %s %d "
459 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000460 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000461 defcount ? "at most" : "exactly",
462 co->co_argcount,
463 kwcount ? "non-keyword " : "",
464 co->co_argcount == 1 ? "" : "s",
465 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 goto fail;
467 }
468 n = co->co_argcount;
469 }
470 for (i = 0; i < n; i++) {
471 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000472 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 SETLOCAL(i, x);
474 }
475 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000476 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000477 if (u == NULL)
478 goto fail;
479 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 for (i = n; i < argcount; i++) {
481 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000482 Py_INCREF(x);
483 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 }
486 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 PyObject *keyword = kws[2*i];
488 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000490 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000491 PyErr_Format(PyExc_TypeError,
492 "%.200s() keywords must be strings",
493 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000494 goto fail;
495 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 /* XXX slow -- speed up using dictionary? */
497 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000498 PyObject *nm = PyTuple_GET_ITEM(
499 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000500 int cmp = PyObject_RichCompareBool(
501 keyword, nm, Py_EQ);
502 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000504 else if (cmp < 0)
505 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000507 /* Check errors from Compare */
508 if (PyErr_Occurred())
509 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 if (j >= co->co_argcount) {
511 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000512 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000513 "%.200s() got an unexpected "
514 "keyword argument '%.400s'",
515 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000516 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517 goto fail;
518 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000519 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 }
521 else {
522 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000523 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000524 "%.200s() got multiple "
525 "values for keyword "
526 "argument '%.400s'",
527 PyString_AsString(co->co_name),
528 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 goto fail;
530 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000531 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 SETLOCAL(j, value);
533 }
534 }
535 if (argcount < co->co_argcount) {
536 int m = co->co_argcount - defcount;
537 for (i = argcount; i < m; i++) {
538 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000539 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000540 "%.200s() takes %s %d "
541 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000542 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000543 ((co->co_flags & CO_VARARGS) ||
544 defcount) ? "at least"
545 : "exactly",
546 m, kwcount ? "non-keyword " : "",
547 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000548 goto fail;
549 }
550 }
551 if (n > m)
552 i = n - m;
553 else
554 i = 0;
555 for (; i < defcount; i++) {
556 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000557 PyObject *def = defs[i];
558 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559 SETLOCAL(m+i, def);
560 }
561 }
562 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000563 }
564 else {
565 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000566 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000567 "%.200s() takes no arguments (%d given)",
568 PyString_AsString(co->co_name),
569 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000571 }
572 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000573 /* Allocate storage for cell vars and copy free vars into frame */
574 if (f->f_ncells) {
575 int i;
576 for (i = 0; i < f->f_ncells; ++i)
577 freevars[i] = PyCell_New(NULL);
578 }
579 if (f->f_nfreevars) {
580 int i;
581 for (i = 0; i < f->f_nfreevars; ++i)
582 freevars[f->f_ncells + i] = PyTuple_GET_ITEM(closure, i);
583 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000584
Guido van Rossuma027efa1997-05-05 20:56:21 +0000585 if (tstate->sys_tracefunc != NULL) {
586 /* tstate->sys_tracefunc, if defined, is a function that
587 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000588 Its return value, if not None, is a function that
589 will be called at the start of each executed line
590 of code. (Actually, the function must return
591 itself in order to continue tracing.)
592 The trace functions are called with three arguments:
593 a pointer to the current frame, a string indicating
594 why the function is called, and an argument which
595 depends on the situation. The global trace function
596 (sys.trace) is also called whenever an exception
597 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000598 if (call_trace(&tstate->sys_tracefunc,
599 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000600 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000601 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000602 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000603 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000604 }
605
Guido van Rossuma027efa1997-05-05 20:56:21 +0000606 if (tstate->sys_profilefunc != NULL) {
607 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000608 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000609 if (call_trace(&tstate->sys_profilefunc,
610 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000611 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000612 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000613 }
614 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000615
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000616 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000617 --tstate->recursion_depth;
618 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000619 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000621 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000622 return NULL;
623 }
624
Guido van Rossumd076c731998-10-07 19:42:25 +0000625 _PyCode_GETCODEPTR(co, &first_instr);
626 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000627 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000628
Guido van Rossum374a9221991-04-04 10:40:29 +0000629 why = WHY_NOT;
630 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000631 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000632 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000633
Guido van Rossum374a9221991-04-04 10:40:29 +0000634 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000635 /* Do periodic things. Doing this every time through
636 the loop would add too much overhead, so we do it
637 only every Nth instruction. We also do it if
638 ``things_to_do'' is set, i.e. when an asynchronous
639 event needs attention (e.g. a signal handler or
640 async I/O handler); see Py_AddPendingCall() and
641 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000642
Guido van Rossuma027efa1997-05-05 20:56:21 +0000643 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000644 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000645 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000646 if (Py_MakePendingCalls() < 0) {
647 why = WHY_EXCEPTION;
648 goto on_error;
649 }
650 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000651#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000652 /* If we have true signals, the signal handler
653 will call Py_AddPendingCall() so we don't
654 have to call sigcheck(). On the Mac and
655 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000656 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000657 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 goto on_error;
659 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000660#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000661
Guido van Rossume59214e1994-08-30 08:01:59 +0000662#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663 if (interpreter_lock) {
664 /* Give another thread a chance */
665
Guido van Rossum25ce5661997-08-02 03:10:38 +0000666 if (PyThreadState_Swap(NULL) != tstate)
667 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000668 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669
670 /* Other threads may run now */
671
Guido van Rossum65d5b571998-12-21 19:32:43 +0000672 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000673 if (PyThreadState_Swap(tstate) != NULL)
674 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000675 }
676#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000677 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000678
Guido van Rossum374a9221991-04-04 10:40:29 +0000679 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000680
Guido van Rossum408027e1996-12-30 16:17:54 +0000681#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000682 f->f_lasti = INSTR_OFFSET();
683#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000684
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 opcode = NEXTOP();
686 if (HAS_ARG(opcode))
687 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000688 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000689#ifdef DYNAMIC_EXECUTION_PROFILE
690#ifdef DXPAIRS
691 dxpairs[lastopcode][opcode]++;
692 lastopcode = opcode;
693#endif
694 dxp[opcode]++;
695#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000696
Guido van Rossum96a42c81992-01-12 02:29:51 +0000697#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000698 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000699
Guido van Rossum96a42c81992-01-12 02:29:51 +0000700 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 if (HAS_ARG(opcode)) {
702 printf("%d: %d, %d\n",
703 (int) (INSTR_OFFSET() - 3),
704 opcode, oparg);
705 }
706 else {
707 printf("%d: %d\n",
708 (int) (INSTR_OFFSET() - 1), opcode);
709 }
710 }
711#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000712 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000713
Guido van Rossum374a9221991-04-04 10:40:29 +0000714 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000715
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 /* BEWARE!
717 It is essential that any operation that fails sets either
718 x to NULL, err to nonzero, or why to anything but WHY_NOT,
719 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000720
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 case POP_TOP:
724 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000725 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000726 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000727
Guido van Rossum374a9221991-04-04 10:40:29 +0000728 case ROT_TWO:
729 v = POP();
730 w = POP();
731 PUSH(v);
732 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000733 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000734
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 case ROT_THREE:
736 v = POP();
737 w = POP();
738 x = POP();
739 PUSH(v);
740 PUSH(x);
741 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000742 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000743
Thomas Wouters434d0822000-08-24 20:11:32 +0000744 case ROT_FOUR:
745 u = POP();
746 v = POP();
747 w = POP();
748 x = POP();
749 PUSH(u);
750 PUSH(x);
751 PUSH(w);
752 PUSH(v);
753 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000754
Guido van Rossum374a9221991-04-04 10:40:29 +0000755 case DUP_TOP:
756 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000757 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000759 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000760
Thomas Wouters434d0822000-08-24 20:11:32 +0000761 case DUP_TOPX:
762 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000764 x = TOP();
765 Py_INCREF(x);
766 PUSH(x);
767 continue;
768 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000769 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000770 Py_INCREF(x);
771 w = TOP();
772 Py_INCREF(w);
773 PUSH(x);
774 PUSH(w);
775 PUSH(x);
776 continue;
777 case 3:
778 x = POP();
779 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000780 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000781 Py_INCREF(w);
782 v = TOP();
783 Py_INCREF(v);
784 PUSH(w);
785 PUSH(x);
786 PUSH(v);
787 PUSH(w);
788 PUSH(x);
789 continue;
790 case 4:
791 x = POP();
792 Py_INCREF(x);
793 w = POP();
794 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000795 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000796 Py_INCREF(v);
797 u = TOP();
798 Py_INCREF(u);
799 PUSH(v);
800 PUSH(w);
801 PUSH(x);
802 PUSH(u);
803 PUSH(v);
804 PUSH(w);
805 PUSH(x);
806 continue;
807 case 5:
808 x = POP();
809 Py_INCREF(x);
810 w = POP();
811 Py_INCREF(w);
812 v = POP();
813 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000814 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000815 Py_INCREF(u);
816 t = TOP();
817 Py_INCREF(t);
818 PUSH(u);
819 PUSH(v);
820 PUSH(w);
821 PUSH(x);
822 PUSH(t);
823 PUSH(u);
824 PUSH(v);
825 PUSH(w);
826 PUSH(x);
827 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000828 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000829 Py_FatalError("invalid argument to DUP_TOPX"
830 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000831 }
Tim Peters35ba6892000-10-11 07:04:49 +0000832 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000833
Guido van Rossum374a9221991-04-04 10:40:29 +0000834 case UNARY_POSITIVE:
835 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000836 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000838 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000839 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000840 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000841
Guido van Rossum374a9221991-04-04 10:40:29 +0000842 case UNARY_NEGATIVE:
843 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000844 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000845 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000846 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000847 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000848 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000849
Guido van Rossum374a9221991-04-04 10:40:29 +0000850 case UNARY_NOT:
851 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000852 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000853 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 if (err == 0) {
855 Py_INCREF(Py_True);
856 PUSH(Py_True);
857 continue;
858 }
859 else if (err > 0) {
860 Py_INCREF(Py_False);
861 PUSH(Py_False);
862 err = 0;
863 continue;
864 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000865 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000866
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 case UNARY_CONVERT:
868 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000869 x = PyObject_Repr(v);
870 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000872 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000874
Guido van Rossum7928cd71991-10-24 14:59:31 +0000875 case UNARY_INVERT:
876 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000877 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000878 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000881 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000882
Guido van Rossum50564e81996-01-12 01:13:16 +0000883 case BINARY_POWER:
884 w = POP();
885 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000886 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000887 Py_DECREF(v);
888 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000889 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000890 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000891 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000892
Guido van Rossum374a9221991-04-04 10:40:29 +0000893 case BINARY_MULTIPLY:
894 w = POP();
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
898 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000899 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000900 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000901 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000902
Guido van Rossum374a9221991-04-04 10:40:29 +0000903 case BINARY_DIVIDE:
904 w = POP();
905 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000906 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000907 Py_DECREF(v);
908 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000910 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000912
Guido van Rossum374a9221991-04-04 10:40:29 +0000913 case BINARY_MODULO:
914 w = POP();
915 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000916 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000917 Py_DECREF(v);
918 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000919 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000920 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000921 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000922
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 case BINARY_ADD:
924 w = POP();
925 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000926 if (PyInt_Check(v) && PyInt_Check(w)) {
927 /* INLINE: int + int */
928 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000929 a = PyInt_AS_LONG(v);
930 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000931 i = a + b;
932 if ((i^a) < 0 && (i^b) < 0) {
933 PyErr_SetString(PyExc_OverflowError,
934 "integer addition");
935 x = NULL;
936 }
937 else
938 x = PyInt_FromLong(i);
939 }
940 else
941 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000942 Py_DECREF(v);
943 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000944 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000945 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000946 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000947
Guido van Rossum374a9221991-04-04 10:40:29 +0000948 case BINARY_SUBTRACT:
949 w = POP();
950 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000951 if (PyInt_Check(v) && PyInt_Check(w)) {
952 /* INLINE: int - int */
953 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000954 a = PyInt_AS_LONG(v);
955 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000956 i = a - b;
957 if ((i^a) < 0 && (i^~b) < 0) {
958 PyErr_SetString(PyExc_OverflowError,
959 "integer subtraction");
960 x = NULL;
961 }
962 else
963 x = PyInt_FromLong(i);
964 }
965 else
966 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000967 Py_DECREF(v);
968 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000970 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000972
Guido van Rossum374a9221991-04-04 10:40:29 +0000973 case BINARY_SUBSCR:
974 w = POP();
975 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000976 if (PyList_Check(v) && PyInt_Check(w)) {
977 /* INLINE: list[int] */
978 long i = PyInt_AsLong(w);
979 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000980 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000981 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000982 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000983 PyErr_SetString(PyExc_IndexError,
984 "list index out of range");
985 x = NULL;
986 }
987 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000988 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000989 Py_INCREF(x);
990 }
991 }
992 else
993 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000994 Py_DECREF(v);
995 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000996 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000997 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000998 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000999
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 case BINARY_LSHIFT:
1001 w = POP();
1002 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001003 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001006 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001007 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001009
Guido van Rossum7928cd71991-10-24 14:59:31 +00001010 case BINARY_RSHIFT:
1011 w = POP();
1012 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001013 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001014 Py_DECREF(v);
1015 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001016 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001017 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001018 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001019
Guido van Rossum7928cd71991-10-24 14:59:31 +00001020 case BINARY_AND:
1021 w = POP();
1022 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001023 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001024 Py_DECREF(v);
1025 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001026 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001027 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001028 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001029
Guido van Rossum7928cd71991-10-24 14:59:31 +00001030 case BINARY_XOR:
1031 w = POP();
1032 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001033 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001034 Py_DECREF(v);
1035 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001036 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001037 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001038 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001039
Guido van Rossum7928cd71991-10-24 14:59:31 +00001040 case BINARY_OR:
1041 w = POP();
1042 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001043 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001044 Py_DECREF(v);
1045 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001046 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001047 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001048 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001049
1050 case INPLACE_POWER:
1051 w = POP();
1052 v = POP();
1053 x = PyNumber_InPlacePower(v, w, Py_None);
1054 Py_DECREF(v);
1055 Py_DECREF(w);
1056 PUSH(x);
1057 if (x != NULL) continue;
1058 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001059
Thomas Wouters434d0822000-08-24 20:11:32 +00001060 case INPLACE_MULTIPLY:
1061 w = POP();
1062 v = POP();
1063 x = PyNumber_InPlaceMultiply(v, w);
1064 Py_DECREF(v);
1065 Py_DECREF(w);
1066 PUSH(x);
1067 if (x != NULL) continue;
1068 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001069
Thomas Wouters434d0822000-08-24 20:11:32 +00001070 case INPLACE_DIVIDE:
1071 w = POP();
1072 v = POP();
1073 x = PyNumber_InPlaceDivide(v, w);
1074 Py_DECREF(v);
1075 Py_DECREF(w);
1076 PUSH(x);
1077 if (x != NULL) continue;
1078 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001079
Thomas Wouters434d0822000-08-24 20:11:32 +00001080 case INPLACE_MODULO:
1081 w = POP();
1082 v = POP();
1083 x = PyNumber_InPlaceRemainder(v, w);
1084 Py_DECREF(v);
1085 Py_DECREF(w);
1086 PUSH(x);
1087 if (x != NULL) continue;
1088 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001089
Thomas Wouters434d0822000-08-24 20:11:32 +00001090 case INPLACE_ADD:
1091 w = POP();
1092 v = POP();
1093 if (PyInt_Check(v) && PyInt_Check(w)) {
1094 /* INLINE: int + int */
1095 register long a, b, i;
1096 a = PyInt_AS_LONG(v);
1097 b = PyInt_AS_LONG(w);
1098 i = a + b;
1099 if ((i^a) < 0 && (i^b) < 0) {
1100 PyErr_SetString(PyExc_OverflowError,
1101 "integer addition");
1102 x = NULL;
1103 }
1104 else
1105 x = PyInt_FromLong(i);
1106 }
1107 else
1108 x = PyNumber_InPlaceAdd(v, w);
1109 Py_DECREF(v);
1110 Py_DECREF(w);
1111 PUSH(x);
1112 if (x != NULL) continue;
1113 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001114
Thomas Wouters434d0822000-08-24 20:11:32 +00001115 case INPLACE_SUBTRACT:
1116 w = POP();
1117 v = POP();
1118 if (PyInt_Check(v) && PyInt_Check(w)) {
1119 /* INLINE: int - int */
1120 register long a, b, i;
1121 a = PyInt_AS_LONG(v);
1122 b = PyInt_AS_LONG(w);
1123 i = a - b;
1124 if ((i^a) < 0 && (i^~b) < 0) {
1125 PyErr_SetString(PyExc_OverflowError,
1126 "integer subtraction");
1127 x = NULL;
1128 }
1129 else
1130 x = PyInt_FromLong(i);
1131 }
1132 else
1133 x = PyNumber_InPlaceSubtract(v, w);
1134 Py_DECREF(v);
1135 Py_DECREF(w);
1136 PUSH(x);
1137 if (x != NULL) continue;
1138 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001139
Thomas Wouters434d0822000-08-24 20:11:32 +00001140 case INPLACE_LSHIFT:
1141 w = POP();
1142 v = POP();
1143 x = PyNumber_InPlaceLshift(v, w);
1144 Py_DECREF(v);
1145 Py_DECREF(w);
1146 PUSH(x);
1147 if (x != NULL) continue;
1148 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001149
Thomas Wouters434d0822000-08-24 20:11:32 +00001150 case INPLACE_RSHIFT:
1151 w = POP();
1152 v = POP();
1153 x = PyNumber_InPlaceRshift(v, w);
1154 Py_DECREF(v);
1155 Py_DECREF(w);
1156 PUSH(x);
1157 if (x != NULL) continue;
1158 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001159
Thomas Wouters434d0822000-08-24 20:11:32 +00001160 case INPLACE_AND:
1161 w = POP();
1162 v = POP();
1163 x = PyNumber_InPlaceAnd(v, w);
1164 Py_DECREF(v);
1165 Py_DECREF(w);
1166 PUSH(x);
1167 if (x != NULL) continue;
1168 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001169
Thomas Wouters434d0822000-08-24 20:11:32 +00001170 case INPLACE_XOR:
1171 w = POP();
1172 v = POP();
1173 x = PyNumber_InPlaceXor(v, w);
1174 Py_DECREF(v);
1175 Py_DECREF(w);
1176 PUSH(x);
1177 if (x != NULL) continue;
1178 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001179
Thomas Wouters434d0822000-08-24 20:11:32 +00001180 case INPLACE_OR:
1181 w = POP();
1182 v = POP();
1183 x = PyNumber_InPlaceOr(v, w);
1184 Py_DECREF(v);
1185 Py_DECREF(w);
1186 PUSH(x);
1187 if (x != NULL) continue;
1188 break;
1189
Guido van Rossum374a9221991-04-04 10:40:29 +00001190 case SLICE+0:
1191 case SLICE+1:
1192 case SLICE+2:
1193 case SLICE+3:
1194 if ((opcode-SLICE) & 2)
1195 w = POP();
1196 else
1197 w = NULL;
1198 if ((opcode-SLICE) & 1)
1199 v = POP();
1200 else
1201 v = NULL;
1202 u = POP();
1203 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001204 Py_DECREF(u);
1205 Py_XDECREF(v);
1206 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001208 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001209 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001210
Guido van Rossum374a9221991-04-04 10:40:29 +00001211 case STORE_SLICE+0:
1212 case STORE_SLICE+1:
1213 case STORE_SLICE+2:
1214 case STORE_SLICE+3:
1215 if ((opcode-STORE_SLICE) & 2)
1216 w = POP();
1217 else
1218 w = NULL;
1219 if ((opcode-STORE_SLICE) & 1)
1220 v = POP();
1221 else
1222 v = NULL;
1223 u = POP();
1224 t = POP();
1225 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001226 Py_DECREF(t);
1227 Py_DECREF(u);
1228 Py_XDECREF(v);
1229 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001230 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001231 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001232
Guido van Rossum374a9221991-04-04 10:40:29 +00001233 case DELETE_SLICE+0:
1234 case DELETE_SLICE+1:
1235 case DELETE_SLICE+2:
1236 case DELETE_SLICE+3:
1237 if ((opcode-DELETE_SLICE) & 2)
1238 w = POP();
1239 else
1240 w = NULL;
1241 if ((opcode-DELETE_SLICE) & 1)
1242 v = POP();
1243 else
1244 v = NULL;
1245 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001246 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001247 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001248 Py_DECREF(u);
1249 Py_XDECREF(v);
1250 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001251 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001252 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001253
Guido van Rossum374a9221991-04-04 10:40:29 +00001254 case STORE_SUBSCR:
1255 w = POP();
1256 v = POP();
1257 u = POP();
1258 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001259 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001260 Py_DECREF(u);
1261 Py_DECREF(v);
1262 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001263 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001265
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 case DELETE_SUBSCR:
1267 w = POP();
1268 v = POP();
1269 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001270 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001271 Py_DECREF(v);
1272 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001273 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001274 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001275
Guido van Rossum374a9221991-04-04 10:40:29 +00001276 case PRINT_EXPR:
1277 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001278 w = PySys_GetObject("displayhook");
1279 if (w == NULL) {
1280 PyErr_SetString(PyExc_RuntimeError,
1281 "lost sys.displayhook");
1282 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001283 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001284 }
1285 if (err == 0) {
1286 x = Py_BuildValue("(O)", v);
1287 if (x == NULL)
1288 err = -1;
1289 }
1290 if (err == 0) {
1291 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001292 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001293 if (w == NULL)
1294 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001295 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001296 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001297 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001299
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001300 case PRINT_ITEM_TO:
1301 w = stream = POP();
1302 /* fall through to PRINT_ITEM */
1303
Guido van Rossum374a9221991-04-04 10:40:29 +00001304 case PRINT_ITEM:
1305 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001306 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001307 w = PySys_GetObject("stdout");
1308 if (w == NULL) {
1309 PyErr_SetString(PyExc_RuntimeError,
1310 "lost sys.stdout");
1311 err = -1;
1312 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001313 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001314 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001315 err = PyFile_WriteString(" ", w);
1316 if (err == 0)
1317 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001319 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001320 char *s = PyString_AsString(v);
1321 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001322 if (len > 0 &&
1323 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001324 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001325 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001327 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001328 Py_XDECREF(stream);
1329 stream = NULL;
1330 if (err == 0)
1331 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001333
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001334 case PRINT_NEWLINE_TO:
1335 w = stream = POP();
1336 /* fall through to PRINT_NEWLINE */
1337
Guido van Rossum374a9221991-04-04 10:40:29 +00001338 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001339 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001340 w = PySys_GetObject("stdout");
1341 if (w == NULL)
1342 PyErr_SetString(PyExc_RuntimeError,
1343 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001344 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001345 if (w != NULL) {
1346 err = PyFile_WriteString("\n", w);
1347 if (err == 0)
1348 PyFile_SoftSpace(w, 0);
1349 }
1350 Py_XDECREF(stream);
1351 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001352 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001353
Thomas Wouters434d0822000-08-24 20:11:32 +00001354
1355#ifdef CASE_TOO_BIG
1356 default: switch (opcode) {
1357#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001358 case BREAK_LOOP:
1359 why = WHY_BREAK;
1360 break;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001361
1362 case CONTINUE_LOOP:
1363 retval = PyInt_FromLong(oparg);
1364 why = WHY_CONTINUE;
1365 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001366
Guido van Rossumf10570b1995-07-07 22:53:21 +00001367 case RAISE_VARARGS:
1368 u = v = w = NULL;
1369 switch (oparg) {
1370 case 3:
1371 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001372 /* Fallthrough */
1373 case 2:
1374 v = POP(); /* value */
1375 /* Fallthrough */
1376 case 1:
1377 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001378 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001379 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001380 break;
1381 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001382 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001383 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001384 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001385 break;
1386 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001387 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001388
Guido van Rossum374a9221991-04-04 10:40:29 +00001389 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001390 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001391 PyErr_SetString(PyExc_SystemError,
1392 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001393 break;
1394 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001396 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001397 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001398
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 case RETURN_VALUE:
1400 retval = POP();
1401 why = WHY_RETURN;
1402 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001403
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001404 case EXEC_STMT:
1405 w = POP();
1406 v = POP();
1407 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001408 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 Py_DECREF(u);
1410 Py_DECREF(v);
1411 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001412 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001413
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 case POP_BLOCK:
1415 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001417 while (STACK_LEVEL() > b->b_level) {
1418 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001419 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001420 }
1421 }
1422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 case END_FINALLY:
1425 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 if (PyInt_Check(v)) {
1427 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001428 if (why == WHY_RETURN ||
1429 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001430 retval = POP();
1431 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001432 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001434 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001435 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001436 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001437 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 else if (v != Py_None) {
1440 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 "'finally' pops bad exception");
1442 why = WHY_EXCEPTION;
1443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001446
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001448 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001449 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001450 w = POP();
1451 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001452 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 Py_DECREF(u);
1454 Py_DECREF(v);
1455 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001456 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001457
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 case STORE_NAME:
1459 w = GETNAMEV(oparg);
1460 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001461 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001462 PyErr_Format(PyExc_SystemError,
1463 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001464 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001465 break;
1466 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 err = PyDict_SetItem(x, w, v);
1468 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001469 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001470
Guido van Rossum374a9221991-04-04 10:40:29 +00001471 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001472 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001473 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001474 PyErr_Format(PyExc_SystemError,
1475 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001476 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001477 break;
1478 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001480 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001481 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001483
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001484 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001486 if (PyTuple_Check(v)) {
1487 if (PyTuple_Size(v) != oparg) {
1488 PyErr_SetString(PyExc_ValueError,
1489 "unpack tuple of wrong size");
1490 why = WHY_EXCEPTION;
1491 }
1492 else {
1493 for (; --oparg >= 0; ) {
1494 w = PyTuple_GET_ITEM(v, oparg);
1495 Py_INCREF(w);
1496 PUSH(w);
1497 }
1498 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001500 else if (PyList_Check(v)) {
1501 if (PyList_Size(v) != oparg) {
1502 PyErr_SetString(PyExc_ValueError,
1503 "unpack list of wrong size");
1504 why = WHY_EXCEPTION;
1505 }
1506 else {
1507 for (; --oparg >= 0; ) {
1508 w = PyList_GET_ITEM(v, oparg);
1509 Py_INCREF(w);
1510 PUSH(w);
1511 }
1512 }
1513 }
1514 else if (PySequence_Check(v)) {
1515 if (unpack_sequence(v, oparg,
1516 stack_pointer + oparg))
1517 stack_pointer += oparg;
1518 else
1519 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001520 }
1521 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001522 PyErr_SetString(PyExc_TypeError,
1523 "unpack non-sequence");
1524 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001525 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001530 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001531 v = POP();
1532 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001533 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1534 Py_DECREF(v);
1535 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001536 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001537
Guido van Rossum374a9221991-04-04 10:40:29 +00001538 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001539 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001541 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1542 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001545
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001546 case STORE_GLOBAL:
1547 w = GETNAMEV(oparg);
1548 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001549 err = PyDict_SetItem(f->f_globals, w, v);
1550 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001551 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001552
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001553 case DELETE_GLOBAL:
1554 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001556 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001557 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001558 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case LOAD_CONST:
1561 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 PUSH(x);
1564 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001565
Guido van Rossum374a9221991-04-04 10:40:29 +00001566 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001567 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001568 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001569 PyErr_Format(PyExc_SystemError,
1570 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001571 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001572 break;
1573 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001574 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001576 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001578 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001579 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001580 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001581 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001582 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 break;
1584 }
1585 }
1586 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 PUSH(x);
1589 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001590
Guido van Rossum374a9221991-04-04 10:40:29 +00001591 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001592 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001595 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001597 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001598 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001599 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001600 break;
1601 }
1602 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001603 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 PUSH(x);
1605 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606
Guido van Rossum9bfef441993-03-29 10:43:31 +00001607 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001608 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001609 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001610 format_exc_check_arg(
1611 PyExc_UnboundLocalError,
1612 UNBOUNDLOCAL_ERROR_MSG,
1613 PyTuple_GetItem(co->co_varnames, oparg)
1614 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001615 break;
1616 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001617 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001618 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001619 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001620 break;
1621
1622 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001623 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001624 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001625 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001626
1627 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001628 x = GETLOCAL(oparg);
1629 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001630 format_exc_check_arg(
1631 PyExc_UnboundLocalError,
1632 UNBOUNDLOCAL_ERROR_MSG,
1633 PyTuple_GetItem(co->co_varnames, oparg)
1634 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001635 break;
1636 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001637 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001638 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001639
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001640 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001641 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001642 Py_INCREF(x);
1643 PUSH(x);
1644 break;
1645
1646 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001647 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001648 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001649 if (w == NULL) {
1650 if (oparg < f->f_ncells)
1651 v = PyTuple_GetItem(co->co_cellvars,
1652 oparg);
1653 else
1654 v = PyTuple_GetItem(
1655 co->co_freevars,
1656 oparg - f->f_ncells);
1657
1658 format_exc_check_arg(
1659 PyExc_UnboundLocalError,
1660 UNBOUNDLOCAL_ERROR_MSG,
1661 v);
1662 err = -1;
1663 break;
1664 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001665 Py_INCREF(w);
1666 PUSH(w);
1667 break;
1668
1669 case STORE_DEREF:
1670 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001671 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001672 PyCell_Set(x, w);
1673 continue;
1674
Guido van Rossum374a9221991-04-04 10:40:29 +00001675 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001676 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 if (x != NULL) {
1678 for (; --oparg >= 0;) {
1679 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001680 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001681 }
1682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 }
1685 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001686
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001688 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001689 if (x != NULL) {
1690 for (; --oparg >= 0;) {
1691 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001692 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 }
1694 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001695 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001696 }
1697 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001698
Guido van Rossum374a9221991-04-04 10:40:29 +00001699 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001700 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001701 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001702 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001703 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001704
Guido van Rossum374a9221991-04-04 10:40:29 +00001705 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001706 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001707 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001708 x = PyObject_GetAttr(v, w);
1709 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001710 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001711 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001712 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001713
Guido van Rossum374a9221991-04-04 10:40:29 +00001714 case COMPARE_OP:
1715 w = POP();
1716 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001717 if (PyInt_Check(v) && PyInt_Check(w)) {
1718 /* INLINE: cmp(int, int) */
1719 register long a, b;
1720 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001721 a = PyInt_AS_LONG(v);
1722 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001723 switch (oparg) {
1724 case LT: res = a < b; break;
1725 case LE: res = a <= b; break;
1726 case EQ: res = a == b; break;
1727 case NE: res = a != b; break;
1728 case GT: res = a > b; break;
1729 case GE: res = a >= b; break;
1730 case IS: res = v == w; break;
1731 case IS_NOT: res = v != w; break;
1732 default: goto slow_compare;
1733 }
1734 x = res ? Py_True : Py_False;
1735 Py_INCREF(x);
1736 }
1737 else {
1738 slow_compare:
1739 x = cmp_outcome(oparg, v, w);
1740 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001741 Py_DECREF(v);
1742 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001744 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001746
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001748 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001749 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001750 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001751 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001752 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753 break;
1754 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001755 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001757 w,
1758 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001759 f->f_locals == NULL ?
1760 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001761 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001763 if (w == NULL) {
1764 x = NULL;
1765 break;
1766 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001767 x = PyEval_CallObject(x, w);
1768 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001769 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001770 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001771 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001772
Thomas Wouters52152252000-08-17 22:55:00 +00001773 case IMPORT_STAR:
1774 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001775 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001776 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001777 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001778 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001779 break;
1780 }
Thomas Wouters52152252000-08-17 22:55:00 +00001781 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001782 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001783 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001784 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001786
Thomas Wouters52152252000-08-17 22:55:00 +00001787 case IMPORT_FROM:
1788 w = GETNAMEV(oparg);
1789 v = TOP();
1790 x = import_from(v, w);
1791 PUSH(x);
1792 if (x != NULL) continue;
1793 break;
1794
Guido van Rossum374a9221991-04-04 10:40:29 +00001795 case JUMP_FORWARD:
1796 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001798
Guido van Rossum374a9221991-04-04 10:40:29 +00001799 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001801 if (err > 0)
1802 err = 0;
1803 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001804 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001805 else
1806 break;
1807 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001808
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001810 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001811 if (err > 0) {
1812 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001813 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001814 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001815 else if (err == 0)
1816 ;
1817 else
1818 break;
1819 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001820
Guido van Rossum374a9221991-04-04 10:40:29 +00001821 case JUMP_ABSOLUTE:
1822 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001823 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001824
Guido van Rossum374a9221991-04-04 10:40:29 +00001825 case FOR_LOOP:
1826 /* for v in s: ...
1827 On entry: stack contains s, i.
1828 On exit: stack contains s, i+1, s[i];
1829 but if loop exhausted:
1830 s, i are popped, and we jump */
1831 w = POP(); /* Loop index */
1832 v = POP(); /* Sequence object */
1833 u = loop_subscript(v, w);
1834 if (u != NULL) {
1835 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001836 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001837 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001838 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001841 }
1842 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001843 Py_DECREF(v);
1844 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001845 /* A NULL can mean "s exhausted"
1846 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001849 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001851 continue;
1852 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 }
1854 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001855
Guido van Rossum374a9221991-04-04 10:40:29 +00001856 case SETUP_LOOP:
1857 case SETUP_EXCEPT:
1858 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001859 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001860 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001861 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001862
Guido van Rossum374a9221991-04-04 10:40:29 +00001863 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001864#ifdef LLTRACE
1865 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001866 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001867#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001868 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001869 if (f->f_trace == NULL)
1870 continue;
1871 /* Trace each line of code reached */
1872 f->f_lasti = INSTR_OFFSET();
1873 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001874 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001876
1877 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001878 {
1879 int na = oparg & 0xff;
1880 int nk = (oparg>>8) & 0xff;
1881 int n = na + 2 * nk;
1882 PyObject **pfunc = stack_pointer - n - 1;
1883 PyObject *func = *pfunc;
1884 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1885
1886 /* Always dispatch PyCFunction first, because
1887 these are presumed to be the most frequent
1888 callable object.
1889 */
1890 if (PyCFunction_Check(func)) {
1891 if (PyCFunction_GET_FLAGS(func) == 0) {
1892 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001893 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001894 } else {
1895 x = do_call(func, &stack_pointer,
1896 na, nk);
1897 }
1898 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001899 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001900 && PyMethod_GET_SELF(func) != NULL) {
1901 /* optimize access to bound methods */
1902 PyObject *self = PyMethod_GET_SELF(func);
1903 Py_INCREF(self);
1904 func = PyMethod_GET_FUNCTION(func);
1905 Py_INCREF(func);
1906 Py_DECREF(*pfunc);
1907 *pfunc = self;
1908 na++;
1909 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001910 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001911 Py_INCREF(func);
1912 if (PyFunction_Check(func)) {
1913 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001914 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001915 } else {
1916 x = do_call(func, &stack_pointer,
1917 na, nk);
1918 }
1919 Py_DECREF(func);
1920 }
1921
1922 while (stack_pointer > pfunc) {
1923 w = POP();
1924 Py_DECREF(w);
1925 }
1926 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001927 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001928 continue;
1929 break;
1930 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001931
Jeremy Hylton76901512000-03-28 23:49:17 +00001932 case CALL_FUNCTION_VAR:
1933 case CALL_FUNCTION_KW:
1934 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001935 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001936 int na = oparg & 0xff;
1937 int nk = (oparg>>8) & 0xff;
1938 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001939 int n = na + 2 * nk;
1940 PyObject **pfunc, *func;
1941 if (flags & CALL_FLAG_VAR)
1942 n++;
1943 if (flags & CALL_FLAG_KW)
1944 n++;
1945 pfunc = stack_pointer - n - 1;
1946 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001947 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001948
Guido van Rossumac7be682001-01-17 15:42:30 +00001949 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001950 && PyMethod_GET_SELF(func) != NULL) {
1951 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001952 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001953 func = PyMethod_GET_FUNCTION(func);
1954 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001955 Py_DECREF(*pfunc);
1956 *pfunc = self;
1957 na++;
1958 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001959 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001960 Py_INCREF(func);
1961 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001962 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001963
Jeremy Hylton76901512000-03-28 23:49:17 +00001964 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001965 w = POP();
1966 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001967 }
1968 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001969 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001970 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001971 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001972 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001973
Guido van Rossum681d79a1995-07-18 14:51:37 +00001974 case MAKE_FUNCTION:
1975 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001976 x = PyFunction_New(v, f->f_globals);
1977 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001978 /* XXX Maybe this should be a separate opcode? */
1979 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001980 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001981 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001982 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001983 x = NULL;
1984 break;
1985 }
1986 while (--oparg >= 0) {
1987 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001989 }
1990 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001991 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001992 }
1993 PUSH(x);
1994 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00001995
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001996 case MAKE_CLOSURE:
1997 {
1998 int nfree;
1999 v = POP(); /* code object */
2000 x = PyFunction_New(v, f->f_globals);
2001 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2002 Py_DECREF(v);
2003 /* XXX Maybe this should be a separate opcode? */
2004 if (x != NULL && nfree > 0) {
2005 v = PyTuple_New(nfree);
2006 if (v == NULL) {
2007 Py_DECREF(x);
2008 x = NULL;
2009 break;
2010 }
2011 while (--nfree >= 0) {
2012 w = POP();
2013 PyTuple_SET_ITEM(v, nfree, w);
2014 }
2015 err = PyFunction_SetClosure(x, v);
2016 Py_DECREF(v);
2017 }
2018 if (x != NULL && oparg > 0) {
2019 v = PyTuple_New(oparg);
2020 if (v == NULL) {
2021 Py_DECREF(x);
2022 x = NULL;
2023 break;
2024 }
2025 while (--oparg >= 0) {
2026 w = POP();
2027 PyTuple_SET_ITEM(v, oparg, w);
2028 }
2029 err = PyFunction_SetDefaults(x, v);
2030 Py_DECREF(v);
2031 }
2032 PUSH(x);
2033 break;
2034 }
2035
Guido van Rossum8861b741996-07-30 16:49:37 +00002036 case BUILD_SLICE:
2037 if (oparg == 3)
2038 w = POP();
2039 else
2040 w = NULL;
2041 v = POP();
2042 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002043 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002044 Py_DECREF(u);
2045 Py_DECREF(v);
2046 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002047 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002048 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002049 break;
2050
Fred Drakeef8ace32000-08-24 00:32:09 +00002051 case EXTENDED_ARG:
2052 opcode = NEXTOP();
2053 oparg = oparg<<16 | NEXTARG();
2054 goto dispatch_opcode;
2055 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002056
Guido van Rossum374a9221991-04-04 10:40:29 +00002057 default:
2058 fprintf(stderr,
2059 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002060 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002061 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002062 why = WHY_EXCEPTION;
2063 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002064
2065#ifdef CASE_TOO_BIG
2066 }
2067#endif
2068
Guido van Rossum374a9221991-04-04 10:40:29 +00002069 } /* switch */
2070
2071 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002072
Guido van Rossum374a9221991-04-04 10:40:29 +00002073 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002074
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 if (err == 0 && x != NULL) {
2077#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002078 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002079 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002080 fprintf(stderr,
2081 "XXX undetected error\n");
2082 else
2083#endif
2084 continue; /* Normal, fast path */
2085 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002087 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 err = 0;
2089 }
2090
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002092
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002094 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002095 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002096 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002097 why = WHY_EXCEPTION;
2098 }
2099 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002100#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002102 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002103 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002104 fprintf(stderr,
2105 "XXX undetected error (why=%d)\n",
2106 why);
2107 why = WHY_EXCEPTION;
2108 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002109 }
2110#endif
2111
2112 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002113
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002115 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002116 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002117 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002118 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002119
Guido van Rossume59214e1994-08-30 08:01:59 +00002120 if (f->f_trace)
2121 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002122 if (tstate->sys_profilefunc)
2123 call_exc_trace(&tstate->sys_profilefunc,
2124 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002125 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002126
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002128
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 if (why == WHY_RERAISE)
2130 why = WHY_EXCEPTION;
2131
2132 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002133
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002135 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002136
2137 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2138 /* For a continue inside a try block,
2139 don't pop the block for the loop. */
2140 PyFrame_BlockSetup(f, b->b_type, b->b_level,
2141 b->b_handler);
2142 why = WHY_NOT;
2143 JUMPTO(PyInt_AS_LONG(retval));
2144 Py_DECREF(retval);
2145 break;
2146 }
2147
Guido van Rossum374a9221991-04-04 10:40:29 +00002148 while (STACK_LEVEL() > b->b_level) {
2149 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002150 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 }
2152 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2153 why = WHY_NOT;
2154 JUMPTO(b->b_handler);
2155 break;
2156 }
2157 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002158 (b->b_type == SETUP_EXCEPT &&
2159 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002161 PyObject *exc, *val, *tb;
2162 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002164 val = Py_None;
2165 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002166 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 /* Make the raw exception data
2168 available to the handler,
2169 so a program can emulate the
2170 Python main loop. Don't do
2171 this for 'finally'. */
2172 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002173 PyErr_NormalizeException(
2174 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002175 set_exc_info(tstate,
2176 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002177 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002178 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 PUSH(val);
2180 PUSH(exc);
2181 }
2182 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002183 if (why == WHY_RETURN ||
2184 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002186 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 PUSH(v);
2188 }
2189 why = WHY_NOT;
2190 JUMPTO(b->b_handler);
2191 break;
2192 }
2193 } /* unwind stack */
2194
2195 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002196
Guido van Rossum374a9221991-04-04 10:40:29 +00002197 if (why != WHY_NOT)
2198 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002199
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002203
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 while (!EMPTY()) {
2205 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002206 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002208
Guido van Rossum96a42c81992-01-12 02:29:51 +00002209 if (why != WHY_RETURN)
2210 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002211
Guido van Rossume59214e1994-08-30 08:01:59 +00002212 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002213 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002214 if (call_trace(&f->f_trace, &f->f_trace, f,
2215 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002216 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002218 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002219 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002220 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002221 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002222
Guido van Rossuma027efa1997-05-05 20:56:21 +00002223 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2224 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002225 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002226 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002227 retval = NULL;
2228 why = WHY_EXCEPTION;
2229 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002230 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002231
Guido van Rossuma027efa1997-05-05 20:56:21 +00002232 reset_exc_info(tstate);
2233
2234 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002235
2236 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002237
Guido van Rossum374a9221991-04-04 10:40:29 +00002238 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002239
Guido van Rossuma027efa1997-05-05 20:56:21 +00002240 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002241 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002242
Guido van Rossum96a42c81992-01-12 02:29:51 +00002243 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002244}
2245
Guido van Rossuma027efa1997-05-05 20:56:21 +00002246static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002247set_exc_info(PyThreadState *tstate,
2248 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002249{
2250 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002251 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002252
Guido van Rossuma027efa1997-05-05 20:56:21 +00002253 frame = tstate->frame;
2254 if (frame->f_exc_type == NULL) {
2255 /* This frame didn't catch an exception before */
2256 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002257 if (tstate->exc_type == NULL) {
2258 Py_INCREF(Py_None);
2259 tstate->exc_type = Py_None;
2260 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002261 tmp_type = frame->f_exc_type;
2262 tmp_value = frame->f_exc_value;
2263 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002264 Py_XINCREF(tstate->exc_type);
2265 Py_XINCREF(tstate->exc_value);
2266 Py_XINCREF(tstate->exc_traceback);
2267 frame->f_exc_type = tstate->exc_type;
2268 frame->f_exc_value = tstate->exc_value;
2269 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002270 Py_XDECREF(tmp_type);
2271 Py_XDECREF(tmp_value);
2272 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002273 }
2274 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002275 tmp_type = tstate->exc_type;
2276 tmp_value = tstate->exc_value;
2277 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002278 Py_XINCREF(type);
2279 Py_XINCREF(value);
2280 Py_XINCREF(tb);
2281 tstate->exc_type = type;
2282 tstate->exc_value = value;
2283 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002284 Py_XDECREF(tmp_type);
2285 Py_XDECREF(tmp_value);
2286 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002287 /* For b/w compatibility */
2288 PySys_SetObject("exc_type", type);
2289 PySys_SetObject("exc_value", value);
2290 PySys_SetObject("exc_traceback", tb);
2291}
2292
2293static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002294reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002295{
2296 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002297 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002298 frame = tstate->frame;
2299 if (frame->f_exc_type != NULL) {
2300 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002301 tmp_type = tstate->exc_type;
2302 tmp_value = tstate->exc_value;
2303 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002304 Py_XINCREF(frame->f_exc_type);
2305 Py_XINCREF(frame->f_exc_value);
2306 Py_XINCREF(frame->f_exc_traceback);
2307 tstate->exc_type = frame->f_exc_type;
2308 tstate->exc_value = frame->f_exc_value;
2309 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002310 Py_XDECREF(tmp_type);
2311 Py_XDECREF(tmp_value);
2312 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002313 /* For b/w compatibility */
2314 PySys_SetObject("exc_type", frame->f_exc_type);
2315 PySys_SetObject("exc_value", frame->f_exc_value);
2316 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2317 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002318 tmp_type = frame->f_exc_type;
2319 tmp_value = frame->f_exc_value;
2320 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002321 frame->f_exc_type = NULL;
2322 frame->f_exc_value = NULL;
2323 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002324 Py_XDECREF(tmp_type);
2325 Py_XDECREF(tmp_value);
2326 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002327}
2328
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002329/* Logic for the raise statement (too complicated for inlining).
2330 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002331static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002333{
Guido van Rossumd295f121998-04-09 21:39:57 +00002334 if (type == NULL) {
2335 /* Reraise */
2336 PyThreadState *tstate = PyThreadState_Get();
2337 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2338 value = tstate->exc_value;
2339 tb = tstate->exc_traceback;
2340 Py_XINCREF(type);
2341 Py_XINCREF(value);
2342 Py_XINCREF(tb);
2343 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002344
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002345 /* We support the following forms of raise:
2346 raise <class>, <classinstance>
2347 raise <class>, <argument tuple>
2348 raise <class>, None
2349 raise <class>, <argument>
2350 raise <classinstance>, None
2351 raise <string>, <object>
2352 raise <string>, None
2353
2354 An omitted second argument is the same as None.
2355
2356 In addition, raise <tuple>, <anything> is the same as
2357 raising the tuple's first item (and it better have one!);
2358 this rule is applied recursively.
2359
2360 Finally, an optional third argument can be supplied, which
2361 gives the traceback to be substituted (useful when
2362 re-raising an exception after examining it). */
2363
2364 /* First, check the traceback argument, replacing None with
2365 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002366 if (tb == Py_None) {
2367 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002368 tb = NULL;
2369 }
2370 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002371 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002372 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002373 goto raise_error;
2374 }
2375
2376 /* Next, replace a missing value with None */
2377 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002378 value = Py_None;
2379 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002380 }
2381
2382 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002383 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2384 PyObject *tmp = type;
2385 type = PyTuple_GET_ITEM(type, 0);
2386 Py_INCREF(type);
2387 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002388 }
2389
Barry Warsaw4249f541997-08-22 21:26:19 +00002390 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002391 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002392
2393 else if (PyClass_Check(type))
2394 PyErr_NormalizeException(&type, &value, &tb);
2395
Guido van Rossumb209a111997-04-29 18:18:01 +00002396 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002397 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002398 if (value != Py_None) {
2399 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002400 "instance exception may not have a separate value");
2401 goto raise_error;
2402 }
2403 else {
2404 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002405 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002406 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002407 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2408 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002409 }
2410 }
2411 else {
2412 /* Not something you can raise. You get an exception
2413 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002414 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002415 "exceptions must be strings, classes, or instances");
2416 goto raise_error;
2417 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002418 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002419 if (tb == NULL)
2420 return WHY_EXCEPTION;
2421 else
2422 return WHY_RERAISE;
2423 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002424 Py_XDECREF(value);
2425 Py_XDECREF(type);
2426 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002427 return WHY_EXCEPTION;
2428}
2429
Barry Warsawe42b18f1997-08-25 22:13:04 +00002430static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002431unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002432{
2433 int i;
2434 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002435
Barry Warsawe42b18f1997-08-25 22:13:04 +00002436 for (i = 0; i < argcnt; i++) {
2437 if (! (w = PySequence_GetItem(v, i))) {
2438 if (PyErr_ExceptionMatches(PyExc_IndexError))
2439 PyErr_SetString(PyExc_ValueError,
2440 "unpack sequence of wrong size");
2441 goto finally;
2442 }
2443 *--sp = w;
2444 }
2445 /* we better get an IndexError now */
2446 if (PySequence_GetItem(v, i) == NULL) {
2447 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2448 PyErr_Clear();
2449 return 1;
2450 }
2451 /* some other exception occurred. fall through to finally */
2452 }
2453 else
2454 PyErr_SetString(PyExc_ValueError,
2455 "unpack sequence of wrong size");
2456 /* fall through */
2457finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002458 for (; i > 0; i--, sp++)
2459 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002460
2461 return 0;
2462}
2463
2464
Guido van Rossum96a42c81992-01-12 02:29:51 +00002465#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002466static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002467prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002468{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002469 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002470 if (PyObject_Print(v, stdout, 0) != 0)
2471 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002472 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002473 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002475#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002477static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002478call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002479{
Guido van Rossumb209a111997-04-29 18:18:01 +00002480 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002481 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002482 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002483 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002484 value = Py_None;
2485 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002486 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002487 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002488 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002489 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002490 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002491 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002492 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002493 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002494 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002495 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002496 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002497 Py_XDECREF(type);
2498 Py_XDECREF(value);
2499 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002500 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002501}
2502
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002503/* PyObject **p_trace: in/out; may not be NULL;
2504 may not point to NULL variable initially
2505 PyObject **p_newtrace: in/out; may be NULL;
2506 may point to NULL variable;
2507 may be same variable as p_newtrace */
2508
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002509static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002510call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2511 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002512{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002513 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 PyObject *args, *what;
2515 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002516
Guido van Rossuma027efa1997-05-05 20:56:21 +00002517 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002518 /* Don't do recursive traces */
2519 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002520 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002521 *p_newtrace = NULL;
2522 }
2523 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002524 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002525
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002527 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002528 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002529 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002530 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002531 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002532 Py_INCREF(f);
2533 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2534 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002535 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002536 arg = Py_None;
2537 Py_INCREF(arg);
2538 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002539 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002540 PyFrame_FastToLocals(f);
2541 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2542 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002543 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002544 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002545 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002546 if (res == NULL) {
2547 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002548 PyTraceBack_Here(f);
2549 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002550 *p_trace = NULL;
2551 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002552 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002553 *p_newtrace = NULL;
2554 }
Barry Warsawf6202631999-09-08 16:26:33 +00002555 /* to be extra double plus sure we don't get recursive
2556 * calls inf either tracefunc or profilefunc gets an
2557 * exception, zap the global variables.
2558 */
2559 Py_XDECREF(tstate->sys_tracefunc);
2560 tstate->sys_tracefunc = NULL;
2561 Py_XDECREF(tstate->sys_profilefunc);
2562 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002563 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002564 }
2565 else {
2566 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002567 Py_XDECREF(*p_newtrace);
2568 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002569 *p_newtrace = NULL;
2570 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002571 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002572 *p_newtrace = res;
2573 }
2574 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002575 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002576 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002577 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002578}
2579
Guido van Rossumb209a111997-04-29 18:18:01 +00002580PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002582{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002583 PyThreadState *tstate = PyThreadState_Get();
2584 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002585 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002586 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002587 else
2588 return current_frame->f_builtins;
2589}
2590
Guido van Rossumb209a111997-04-29 18:18:01 +00002591PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002593{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002594 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002595 if (current_frame == NULL)
2596 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002597 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002598 return current_frame->f_locals;
2599}
2600
Guido van Rossumb209a111997-04-29 18:18:01 +00002601PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002603{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002604 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002605 if (current_frame == NULL)
2606 return NULL;
2607 else
2608 return current_frame->f_globals;
2609}
2610
Guido van Rossumb209a111997-04-29 18:18:01 +00002611PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002613{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002614 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002616}
2617
Guido van Rossum6135a871995-01-09 17:53:26 +00002618int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002619PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002620{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002621 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002622 return current_frame == NULL ? 0 : current_frame->f_restricted;
2623}
2624
Guido van Rossumbe270261997-05-22 22:26:18 +00002625int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002626Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002627{
Guido van Rossumb209a111997-04-29 18:18:01 +00002628 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002629 if (f == NULL)
2630 return 0;
2631 if (!PyFile_SoftSpace(f, 0))
2632 return 0;
2633 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634}
2635
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636
Guido van Rossum681d79a1995-07-18 14:51:37 +00002637/* External interface to call any callable object.
2638 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002639
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002640#undef PyEval_CallObject
2641/* for backward compatibility: export this interface */
2642
Guido van Rossumb209a111997-04-29 18:18:01 +00002643PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002644PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002645{
Guido van Rossumb209a111997-04-29 18:18:01 +00002646 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002647}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002648#define PyEval_CallObject(func,arg) \
2649 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002650
Guido van Rossumb209a111997-04-29 18:18:01 +00002651PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002652PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002653{
Jeremy Hylton52820442001-01-03 23:52:36 +00002654 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002655
2656 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 arg = PyTuple_New(0);
2658 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002659 PyErr_SetString(PyExc_TypeError,
2660 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002661 return NULL;
2662 }
2663 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002665
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002667 PyErr_SetString(PyExc_TypeError,
2668 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002669 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002670 return NULL;
2671 }
2672
Jeremy Hylton52820442001-01-03 23:52:36 +00002673 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002674 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002675 return result;
2676}
2677
2678/* How often is each kind of object called? The answer depends on the
2679 program. An instrumented call_object() was used to run the Python
2680 regression test suite. The results were:
2681 4200000 PyCFunctions
2682 390000 fast_function() calls
2683 94000 other functions
2684 480000 all functions (sum of prev two)
2685 150000 methods
2686 100000 classes
2687
2688 Tests on other bodies of code show that PyCFunctions are still
2689 most common, but not by such a large margin.
2690*/
2691
2692static PyObject *
2693call_object(PyObject *func, PyObject *arg, PyObject *kw)
2694{
2695 ternaryfunc call;
2696 PyObject *result;
2697
2698 if (PyMethod_Check(func))
2699 result = call_method(func, arg, kw);
2700 else if (PyFunction_Check(func))
2701 result = call_eval_code2(func, arg, kw);
2702 else if (PyCFunction_Check(func))
2703 result = call_cfunction(func, arg, kw);
2704 else if (PyClass_Check(func))
2705 result = PyInstance_New(func, arg, kw);
2706 else if (PyInstance_Check(func))
2707 result = call_instance(func, arg, kw);
2708 else if ((call = func->ob_type->tp_call) != NULL)
2709 result = (*call)(func, arg, kw);
2710 else {
2711 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2712 PyString_AS_STRING(PyObject_Repr(func)));
2713 return NULL;
2714 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002715 if (result == NULL && !PyErr_Occurred())
2716 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002717 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002718
Guido van Rossume59214e1994-08-30 08:01:59 +00002719 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002720}
2721
Guido van Rossumb209a111997-04-29 18:18:01 +00002722static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002723call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724{
Jeremy Hylton52820442001-01-03 23:52:36 +00002725 PyCFunctionObject* f = (PyCFunctionObject*)func;
2726 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2727 PyObject *self = PyCFunction_GET_SELF(func);
2728 int flags = PyCFunction_GET_FLAGS(func);
2729
Jeremy Hylton52820442001-01-03 23:52:36 +00002730 if (flags & METH_KEYWORDS) {
2731 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002732 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002733 if (kw != NULL && PyDict_Size(kw) != 0) {
2734 PyErr_Format(PyExc_TypeError,
2735 "%.200s() takes no keyword arguments",
2736 f->m_ml->ml_name);
2737 return NULL;
2738 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002739 if (flags & METH_VARARGS) {
2740 return (*meth)(self, arg);
2741 }
2742 if (!(flags & METH_VARARGS)) {
2743 /* the really old style */
2744 int size = PyTuple_GET_SIZE(arg);
2745 if (size == 1)
2746 arg = PyTuple_GET_ITEM(arg, 0);
2747 else if (size == 0)
2748 arg = NULL;
2749 return (*meth)(self, arg);
2750 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002751 /* should never get here ??? */
2752 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753 return NULL;
2754}
2755
Guido van Rossumb209a111997-04-29 18:18:01 +00002756static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002757call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758{
Jeremy Hylton52820442001-01-03 23:52:36 +00002759 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2760 if (call == NULL) {
2761 PyInstanceObject *inst = (PyInstanceObject*) func;
2762 PyErr_Clear();
2763 PyErr_Format(PyExc_AttributeError,
2764 "%.200s instance has no __call__ method",
2765 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002766 return NULL;
2767 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002768 res = call_object(call, arg, kw);
2769 Py_DECREF(call);
2770 return res;
2771}
2772
2773static PyObject *
2774call_method(PyObject *func, PyObject *arg, PyObject *kw)
2775{
2776 PyObject *self = PyMethod_GET_SELF(func);
2777 PyObject *class = PyMethod_GET_CLASS(func);
2778 PyObject *result;
2779
2780 func = PyMethod_GET_FUNCTION(func);
2781 if (self == NULL) {
2782 /* Unbound methods must be called with an instance of
2783 the class (or a derived class) as first argument */
2784 if (PyTuple_Size(arg) >= 1)
2785 self = PyTuple_GET_ITEM(arg, 0);
2786 if (!(self != NULL && PyInstance_Check(self)
2787 && PyClass_IsSubclass((PyObject *)
2788 (((PyInstanceObject *)self)->in_class),
2789 class))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002790 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2791 PyErr_Format(PyExc_TypeError,
2792 "unbound method %s%smust be "
2793 "called with instance as first argument",
2794 fn ? PyString_AsString(fn) : "",
2795 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796 return NULL;
2797 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002798 Py_INCREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002799 } else {
2800 int argcount = PyTuple_Size(arg);
2801 PyObject *newarg = PyTuple_New(argcount + 1);
2802 int i;
2803 if (newarg == NULL)
2804 return NULL;
2805 Py_INCREF(self);
2806 PyTuple_SET_ITEM(newarg, 0, self);
2807 for (i = 0; i < argcount; i++) {
2808 PyObject *v = PyTuple_GET_ITEM(arg, i);
2809 Py_XINCREF(v);
2810 PyTuple_SET_ITEM(newarg, i+1, v);
2811 }
2812 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002814 result = call_object(func, arg, kw);
2815 Py_DECREF(arg);
2816 return result;
2817}
2818
2819static PyObject *
2820call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2821{
2822 PyObject *result;
2823 PyObject *argdefs;
2824 PyObject **d, **k;
2825 int nk, nd;
2826
2827 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002828 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2829 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2830 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002831 }
2832 else {
2833 d = NULL;
2834 nd = 0;
2835 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002836
Guido van Rossum681d79a1995-07-18 14:51:37 +00002837 if (kw != NULL) {
2838 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002839 nk = PyDict_Size(kw);
2840 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002841 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 PyErr_NoMemory();
2843 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002844 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002845 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002846 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002847 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002848 i += 2;
2849 nk = i/2;
2850 /* XXX This is broken if the caller deletes dict items! */
2851 }
2852 else {
2853 k = NULL;
2854 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002855 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002856
Guido van Rossum681d79a1995-07-18 14:51:37 +00002857 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002858 (PyCodeObject *)PyFunction_GET_CODE(func),
2859 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002860 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002861 k, nk, d, nd,
2862 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002863
Guido van Rossumb18618d2000-05-03 23:44:39 +00002864 if (k != NULL)
2865 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002866
Guido van Rossum681d79a1995-07-18 14:51:37 +00002867 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868}
2869
Jeremy Hylton52820442001-01-03 23:52:36 +00002870#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2871
2872/* The two fast_xxx() functions optimize calls for which no argument
2873 tuple is necessary; the objects are passed directly from the stack.
2874 fast_cfunction() is called for METH_OLDARGS functions.
2875 fast_function() is for functions with no special argument handling.
2876*/
2877
2878static PyObject *
2879fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2880{
2881 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2882 PyObject *self = PyCFunction_GET_SELF(func);
2883
2884 if (na == 0)
2885 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002886 else if (na == 1) {
2887 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002888 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002889 Py_DECREF(arg);
2890 return result;
2891 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002892 PyObject *args = load_args(pp_stack, na);
2893 PyObject *result = (*meth)(self, args);
2894 Py_DECREF(args);
2895 return result;
2896 }
2897}
2898
2899static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002900fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002901{
2902 PyObject *co = PyFunction_GET_CODE(func);
2903 PyObject *globals = PyFunction_GET_GLOBALS(func);
2904 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002905 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002906 PyObject **d = NULL;
2907 int nd = 0;
2908
2909 if (argdefs != NULL) {
2910 d = &PyTuple_GET_ITEM(argdefs, 0);
2911 nd = ((PyTupleObject *)argdefs)->ob_size;
2912 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002913 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002914 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002915 (*pp_stack)-2*nk, nk, d, nd,
2916 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002917}
2918
2919static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002920update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2921 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002922{
2923 PyObject *kwdict = NULL;
2924 if (orig_kwdict == NULL)
2925 kwdict = PyDict_New();
2926 else {
2927 kwdict = PyDict_Copy(orig_kwdict);
2928 Py_DECREF(orig_kwdict);
2929 }
2930 if (kwdict == NULL)
2931 return NULL;
2932 while (--nk >= 0) {
2933 int err;
2934 PyObject *value = EXT_POP(*pp_stack);
2935 PyObject *key = EXT_POP(*pp_stack);
2936 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002937 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002938 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002939 "%.200s%s got multiple values "
2940 "for keyword argument '%.400s'",
2941 fn ? PyString_AsString(fn) : "function",
2942 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00002943 Py_DECREF(key);
2944 Py_DECREF(value);
2945 Py_DECREF(kwdict);
2946 return NULL;
2947 }
2948 err = PyDict_SetItem(kwdict, key, value);
2949 Py_DECREF(key);
2950 Py_DECREF(value);
2951 if (err) {
2952 Py_DECREF(kwdict);
2953 return NULL;
2954 }
2955 }
2956 return kwdict;
2957}
2958
2959static PyObject *
2960update_star_args(int nstack, int nstar, PyObject *stararg,
2961 PyObject ***pp_stack)
2962{
2963 PyObject *callargs, *w;
2964
2965 callargs = PyTuple_New(nstack + nstar);
2966 if (callargs == NULL) {
2967 return NULL;
2968 }
2969 if (nstar) {
2970 int i;
2971 for (i = 0; i < nstar; i++) {
2972 PyObject *a = PyTuple_GET_ITEM(stararg, i);
2973 Py_INCREF(a);
2974 PyTuple_SET_ITEM(callargs, nstack + i, a);
2975 }
2976 }
2977 while (--nstack >= 0) {
2978 w = EXT_POP(*pp_stack);
2979 PyTuple_SET_ITEM(callargs, nstack, w);
2980 }
2981 return callargs;
2982}
2983
2984static PyObject *
2985load_args(PyObject ***pp_stack, int na)
2986{
2987 PyObject *args = PyTuple_New(na);
2988 PyObject *w;
2989
2990 if (args == NULL)
2991 return NULL;
2992 while (--na >= 0) {
2993 w = EXT_POP(*pp_stack);
2994 PyTuple_SET_ITEM(args, na, w);
2995 }
2996 return args;
2997}
2998
2999static PyObject *
3000do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3001{
3002 PyObject *callargs = NULL;
3003 PyObject *kwdict = NULL;
3004 PyObject *result = NULL;
3005
3006 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003007 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003008 if (kwdict == NULL)
3009 goto call_fail;
3010 }
3011 callargs = load_args(pp_stack, na);
3012 if (callargs == NULL)
3013 goto call_fail;
3014 result = call_object(func, callargs, kwdict);
3015 call_fail:
3016 Py_XDECREF(callargs);
3017 Py_XDECREF(kwdict);
3018 return result;
3019}
3020
3021static PyObject *
3022ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3023{
3024 int nstar = 0;
3025 PyObject *callargs = NULL;
3026 PyObject *stararg = NULL;
3027 PyObject *kwdict = NULL;
3028 PyObject *result = NULL;
3029
3030 if (flags & CALL_FLAG_KW) {
3031 kwdict = EXT_POP(*pp_stack);
3032 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003033 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3034 PyErr_Format(PyExc_TypeError,
3035 "%s%s argument after ** must be a dictionary",
3036 fn ? PyString_AsString(fn) : "function",
3037 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003038 goto ext_call_fail;
3039 }
3040 }
3041 if (flags & CALL_FLAG_VAR) {
3042 stararg = EXT_POP(*pp_stack);
3043 if (!PyTuple_Check(stararg)) {
3044 PyObject *t = NULL;
3045 t = PySequence_Tuple(stararg);
3046 if (t == NULL) {
3047 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003048 PyObject* fn =
3049 ((PyFunctionObject*) func)->func_name;
3050 PyErr_Format(PyExc_TypeError,
3051 "%s%s argument after * must be a sequence",
3052 fn ? PyString_AsString(fn) : "function",
3053 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003054 }
3055 goto ext_call_fail;
3056 }
3057 Py_DECREF(stararg);
3058 stararg = t;
3059 }
3060 nstar = PyTuple_GET_SIZE(stararg);
3061 }
3062 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003063 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003064 if (kwdict == NULL)
3065 goto ext_call_fail;
3066 }
3067 callargs = update_star_args(na, nstar, stararg, pp_stack);
3068 if (callargs == NULL)
3069 goto ext_call_fail;
3070 result = call_object(func, callargs, kwdict);
3071 ext_call_fail:
3072 Py_XDECREF(callargs);
3073 Py_XDECREF(kwdict);
3074 Py_XDECREF(stararg);
3075 return result;
3076}
3077
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003078#define SLICE_ERROR_MSG \
3079 "standard sequence type does not support step size other than one"
3080
Guido van Rossumb209a111997-04-29 18:18:01 +00003081static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003082loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083{
Guido van Rossumb209a111997-04-29 18:18:01 +00003084 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003085 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003086 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003087 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 return NULL;
3089 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003090 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003091 v = (*sq->sq_item)(v, i);
3092 if (v)
3093 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003094 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003095 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003096 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003097}
3098
Guido van Rossum20c6add2000-05-08 14:06:50 +00003099/* Extract a slice index from a PyInt or PyLong, the index is bound to
3100 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3101 and error. Returns 1 on success.*/
3102
3103int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003104_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105{
3106 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003107 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003108 if (PyInt_Check(v)) {
3109 x = PyInt_AsLong(v);
3110 } else if (PyLong_Check(v)) {
3111 x = PyLong_AsLong(v);
3112 if (x==-1 && PyErr_Occurred()) {
3113 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003114 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003115
Guido van Rossumac7be682001-01-17 15:42:30 +00003116 if (!PyErr_ExceptionMatches(
3117 PyExc_OverflowError)) {
3118 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003119 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003120 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003121 }
3122
Guido van Rossumac7be682001-01-17 15:42:30 +00003123 /* Clear the OverflowError */
3124 PyErr_Clear();
3125
3126 /* It's an overflow error, so we need to
3127 check the sign of the long integer,
3128 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003129 the error. */
3130
3131 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003132 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003133 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003134
3135 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003136 cmp = PyObject_RichCompareBool(v, long_zero,
3137 Py_GT);
3138 Py_DECREF(long_zero);
3139 if (cmp < 0)
3140 return 0;
3141 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003142 x = INT_MAX;
3143 else
3144 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003145 }
3146 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003147 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003148 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003149 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003151 /* Truncate -- very long indices are truncated anyway */
3152 if (x > INT_MAX)
3153 x = INT_MAX;
3154 else if (x < -INT_MAX)
3155 x = 0;
3156 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003158 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159}
3160
Guido van Rossumb209a111997-04-29 18:18:01 +00003161static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003162apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003164 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003165 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003167 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003168 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003169 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003170}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003171
3172static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003173assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3174 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003175{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003176 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003177 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003178 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003179 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003180 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003181 if (x == NULL)
3182 return PySequence_DelSlice(u, ilow, ihigh);
3183 else
3184 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003185}
3186
Guido van Rossumb209a111997-04-29 18:18:01 +00003187static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003188cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189{
Guido van Rossumac7be682001-01-17 15:42:30 +00003190 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003191 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003192 case IS:
3193 case IS_NOT:
3194 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003195 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003196 res = !res;
3197 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003198 case IN:
3199 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003200 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003201 if (res < 0)
3202 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003203 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003204 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205 break;
3206 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003207 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 break;
3209 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003210 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003212 v = res ? Py_True : Py_False;
3213 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214 return v;
3215}
3216
Thomas Wouters52152252000-08-17 22:55:00 +00003217static PyObject *
3218import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003219{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003220 PyObject *x;
3221
3222 x = PyObject_GetAttr(v, name);
3223 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003224 PyErr_Format(PyExc_ImportError,
3225 "cannot import name %.230s",
3226 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003227 }
Thomas Wouters52152252000-08-17 22:55:00 +00003228 return x;
3229}
Guido van Rossumac7be682001-01-17 15:42:30 +00003230
Thomas Wouters52152252000-08-17 22:55:00 +00003231static int
3232import_all_from(PyObject *locals, PyObject *v)
3233{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003234 PyObject *all = PyObject_GetAttrString(v, "__all__");
3235 PyObject *dict, *name, *value;
3236 int skip_leading_underscores = 0;
3237 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003238
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003239 if (all == NULL) {
3240 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3241 return -1; /* Unexpected error */
3242 PyErr_Clear();
3243 dict = PyObject_GetAttrString(v, "__dict__");
3244 if (dict == NULL) {
3245 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3246 return -1;
3247 PyErr_SetString(PyExc_ImportError,
3248 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003249 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003250 }
3251 all = PyMapping_Keys(dict);
3252 Py_DECREF(dict);
3253 if (all == NULL)
3254 return -1;
3255 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003256 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003257
3258 for (pos = 0, err = 0; ; pos++) {
3259 name = PySequence_GetItem(all, pos);
3260 if (name == NULL) {
3261 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3262 err = -1;
3263 else
3264 PyErr_Clear();
3265 break;
3266 }
3267 if (skip_leading_underscores &&
3268 PyString_Check(name) &&
3269 PyString_AS_STRING(name)[0] == '_')
3270 {
3271 Py_DECREF(name);
3272 continue;
3273 }
3274 value = PyObject_GetAttr(v, name);
3275 if (value == NULL)
3276 err = -1;
3277 else
3278 err = PyDict_SetItem(locals, name, value);
3279 Py_DECREF(name);
3280 Py_XDECREF(value);
3281 if (err != 0)
3282 break;
3283 }
3284 Py_DECREF(all);
3285 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003286}
3287
Guido van Rossumb209a111997-04-29 18:18:01 +00003288static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003289build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003290{
Guido van Rossumcd649651997-08-22 16:56:16 +00003291 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003292 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003293 PyErr_SetString(PyExc_SystemError,
3294 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003295 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003296 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003297 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003298 PyErr_SetString(PyExc_SystemError,
3299 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003300 return NULL;
3301 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003302 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003303 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003304 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003305 return NULL;
3306 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003307 n = PyTuple_Size(bases);
3308 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003309 PyObject *base = PyTuple_GET_ITEM(bases, i);
3310 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003311 /* Call the base's *type*, if it is callable.
3312 This code is a hook for Donald Beaudry's
3313 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003314 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003315 since its types are not callable.
3316 Ditto: call the bases's *class*, if it has
3317 one. This makes the same thing possible
3318 without writing C code. A true meta-object
3319 protocol! */
3320 PyObject *basetype = (PyObject *)base->ob_type;
3321 PyObject *callable = NULL;
3322 if (PyCallable_Check(basetype))
3323 callable = basetype;
3324 else
3325 callable = PyObject_GetAttrString(
3326 base, "__class__");
3327 if (callable) {
3328 PyObject *args;
3329 PyObject *newclass = NULL;
3330 args = Py_BuildValue(
3331 "(OOO)", name, bases, methods);
3332 if (args != NULL) {
3333 newclass = PyEval_CallObject(
3334 callable, args);
3335 Py_DECREF(args);
3336 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003337 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003338 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003339 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003340 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003341 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003342 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003343 "base is not a class object");
3344 return NULL;
3345 }
3346 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003347 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003348}
3349
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003350static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003351exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3352 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003353{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003354 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003355 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003356 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003357
Guido van Rossumb209a111997-04-29 18:18:01 +00003358 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3359 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003360 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003361 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003362 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003363 locals = PyTuple_GetItem(prog, 2);
3364 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003365 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003366 if (globals == Py_None) {
3367 globals = PyEval_GetGlobals();
3368 if (locals == Py_None) {
3369 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003370 plain = 1;
3371 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003372 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003373 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003374 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003375 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003376 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003377 !PyCode_Check(prog) &&
3378 !PyFile_Check(prog)) {
3379 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003380 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003381 return -1;
3382 }
Fred Drake661ea262000-10-24 19:57:45 +00003383 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003384 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003385 "exec: arg 2 must be a dictionary or None");
3386 return -1;
3387 }
3388 if (!PyDict_Check(locals)) {
3389 PyErr_SetString(PyExc_TypeError,
3390 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003391 return -1;
3392 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003393 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003394 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003395 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003396 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003397 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003398 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003399 FILE *fp = PyFile_AsFile(prog);
3400 char *name = PyString_AsString(PyFile_Name(prog));
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003401 v = PyRun_File(fp, name, Py_file_input, globals, locals);
3402 }
3403 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003404 char *str;
3405 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003406 return -1;
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003407 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003408 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003409 if (plain)
3410 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003411 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003412 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003413 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003414 return 0;
3415}
Guido van Rossum24c13741995-02-14 09:42:43 +00003416
Guido van Rossumac7be682001-01-17 15:42:30 +00003417static void
Paul Prescode68140d2000-08-30 20:25:01 +00003418format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3419{
3420 char *obj_str;
3421
3422 if (!obj)
3423 return;
3424
3425 obj_str = PyString_AsString(obj);
3426 if (!obj_str)
3427 return;
3428
3429 PyErr_Format(exc, format_str, obj_str);
3430}
Guido van Rossum950361c1997-01-24 13:49:28 +00003431
3432#ifdef DYNAMIC_EXECUTION_PROFILE
3433
3434PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003435getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003436{
3437 int i;
3438 PyObject *l = PyList_New(256);
3439 if (l == NULL) return NULL;
3440 for (i = 0; i < 256; i++) {
3441 PyObject *x = PyInt_FromLong(a[i]);
3442 if (x == NULL) {
3443 Py_DECREF(l);
3444 return NULL;
3445 }
3446 PyList_SetItem(l, i, x);
3447 }
3448 for (i = 0; i < 256; i++)
3449 a[i] = 0;
3450 return l;
3451}
3452
3453PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003454_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003455{
3456#ifndef DXPAIRS
3457 return getarray(dxp);
3458#else
3459 int i;
3460 PyObject *l = PyList_New(257);
3461 if (l == NULL) return NULL;
3462 for (i = 0; i < 257; i++) {
3463 PyObject *x = getarray(dxpairs[i]);
3464 if (x == NULL) {
3465 Py_DECREF(l);
3466 return NULL;
3467 }
3468 PyList_SetItem(l, i, x);
3469 }
3470 return l;
3471#endif
3472}
3473
3474#endif