blob: 09055723474987c126e0a524b189f1ab426daea7 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Execute compiled code */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003
Guido van Rossum681d79a1995-07-18 14:51:37 +00004/* XXX TO DO:
5 XXX how to pass arguments to call_trace?
Guido van Rossum681d79a1995-07-18 14:51:37 +00006 XXX speed up searching for keywords by using a dictionary
Guido van Rossum681d79a1995-07-18 14:51:37 +00007 XXX document it!
8 */
9
Guido van Rossumb209a111997-04-29 18:18:01 +000010#include "Python.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum10dc2e81990-11-18 17:27:39 +000012#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "frameobject.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000014#include "eval.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000015#include "opcode.h"
16
Jack Jansencbf630f2000-07-11 21:59:16 +000017#ifdef macintosh
18#include "macglue.h"
19#endif
20
Guido van Rossumc6004111993-11-05 10:22:19 +000021#include <ctype.h>
22
Guido van Rossum04691fc1992-08-12 15:35:34 +000023/* Turn this on if your compiler chokes on the big switch: */
Guido van Rossum1ae940a1995-01-02 19:04:15 +000024/* #define CASE_TOO_BIG 1 */
Guido van Rossum04691fc1992-08-12 15:35:34 +000025
Guido van Rossum408027e1996-12-30 16:17:54 +000026#ifdef Py_DEBUG
Guido van Rossum96a42c81992-01-12 02:29:51 +000027/* For debugging the interpreter: */
28#define LLTRACE 1 /* Low-level trace feature */
29#define CHECKEXC 1 /* Double-check exception checking */
Guido van Rossum10dc2e81990-11-18 17:27:39 +000030#endif
31
Jeremy Hylton52820442001-01-03 23:52:36 +000032typedef PyObject *(*callproc)(PyObject *, PyObject *, PyObject *);
Guido van Rossum5b722181993-03-30 17:46:03 +000033
Guido van Rossum374a9221991-04-04 10:40:29 +000034/* Forward declarations */
Guido van Rossum374a9221991-04-04 10:40:29 +000035
Tim Petersdbd9ba62000-07-09 03:09:57 +000036static PyObject *eval_code2(PyCodeObject *,
37 PyObject *, PyObject *,
38 PyObject **, int,
39 PyObject **, int,
Jeremy Hylton64949cb2001-01-25 20:06:59 +000040 PyObject **, int,
41 PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000042
43static PyObject *call_object(PyObject *, PyObject *, PyObject *);
44static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
45static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
46static PyObject *call_method(PyObject *, PyObject *, PyObject *);
47static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
48static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
49static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
50static PyObject *do_call(PyObject *, PyObject ***, int, int);
51static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000052static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000053static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000054static PyObject *load_args(PyObject ***, int);
55#define CALL_FLAG_VAR 1
56#define CALL_FLAG_KW 2
57
Guido van Rossum0a066c01992-03-27 17:29:15 +000058#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000059static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000060#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
62static int call_trace(PyObject **, PyObject **,
63 PyFrameObject *, char *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static PyObject *loop_subscript(PyObject *, PyObject *);
65static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
66static int assign_slice(PyObject *, PyObject *,
67 PyObject *, PyObject *);
68static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000069static PyObject *import_from(PyObject *, PyObject *);
70static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000071static PyObject *build_class(PyObject *, PyObject *, PyObject *);
72static int exec_statement(PyFrameObject *,
73 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
75static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000076static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000077
Paul Prescode68140d2000-08-30 20:25:01 +000078#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000079 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000080#define GLOBAL_NAME_ERROR_MSG \
81 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000082#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000083 "local variable '%.200s' referenced before assignment"
Guido van Rossum374a9221991-04-04 10:40:29 +000084
Guido van Rossum950361c1997-01-24 13:49:28 +000085/* Dynamic execution profile */
86#ifdef DYNAMIC_EXECUTION_PROFILE
87#ifdef DXPAIRS
88static long dxpairs[257][256];
89#define dxp dxpairs[256]
90#else
91static long dxp[256];
92#endif
93#endif
94
Guido van Rossume59214e1994-08-30 08:01:59 +000095#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +000096
Guido van Rossum2571cc81999-04-07 16:07:23 +000097#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +000098#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +000099#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000100#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000101
Guido van Rossuma027efa1997-05-05 20:56:21 +0000102extern int _PyThread_Started; /* Flag for Py_Exit */
103
Guido van Rossum65d5b571998-12-21 19:32:43 +0000104static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000105static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000106
107void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000108PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000109{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000110 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000111 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000113 interpreter_lock = PyThread_allocate_lock();
114 PyThread_acquire_lock(interpreter_lock, 1);
115 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000116}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000117
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000118void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000119PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000120{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000121 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122}
123
124void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000125PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000127 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000128}
129
130void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000131PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000132{
133 if (tstate == NULL)
134 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000135 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000136 if (PyThreadState_Swap(tstate) != NULL)
137 Py_FatalError(
138 "PyEval_AcquireThread: non-NULL old thread state");
139}
140
141void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000142PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000143{
144 if (tstate == NULL)
145 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
146 if (PyThreadState_Swap(NULL) != tstate)
147 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000148 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000149}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000150
151/* This function is called from PyOS_AfterFork to ensure that newly
152 created child processes don't hold locks referring to threads which
153 are not running in the child process. (This could also be done using
154 pthread_atfork mechanism, at least for the pthreads implementation.) */
155
156void
157PyEval_ReInitThreads(void)
158{
159 if (!interpreter_lock)
160 return;
161 /*XXX Can't use PyThread_free_lock here because it does too
162 much error-checking. Doing this cleanly would require
163 adding a new function to each thread_*.h. Instead, just
164 create a new lock and waste a little bit of memory */
165 interpreter_lock = PyThread_allocate_lock();
166 PyThread_acquire_lock(interpreter_lock, 1);
167 main_thread = PyThread_get_thread_ident();
168}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000169#endif
170
Guido van Rossumff4949e1992-08-05 19:58:53 +0000171/* Functions save_thread and restore_thread are always defined so
172 dynamically loaded modules needn't be compiled separately for use
173 with and without threads: */
174
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000175PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000176PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000177{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000178 PyThreadState *tstate = PyThreadState_Swap(NULL);
179 if (tstate == NULL)
180 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000181#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000182 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000183 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000184#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000185 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000186}
187
188void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000189PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000190{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000191 if (tstate == NULL)
192 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000193#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000195 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000196 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000197 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198 }
199#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000200 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000201}
202
203
Guido van Rossuma9672091994-09-14 13:31:22 +0000204/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
205 signal handlers or Mac I/O completion routines) can schedule calls
206 to a function to be called synchronously.
207 The synchronous function is called with one void* argument.
208 It should return 0 for success or -1 for failure -- failure should
209 be accompanied by an exception.
210
211 If registry succeeds, the registry function returns 0; if it fails
212 (e.g. due to too many pending calls) it returns -1 (without setting
213 an exception condition).
214
215 Note that because registry may occur from within signal handlers,
216 or other asynchronous events, calling malloc() is unsafe!
217
218#ifdef WITH_THREAD
219 Any thread can schedule pending calls, but only the main thread
220 will execute them.
221#endif
222
223 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
224 There are two possible race conditions:
225 (1) nested asynchronous registry calls;
226 (2) registry calls made while pending calls are being processed.
227 While (1) is very unlikely, (2) is a real possibility.
228 The current code is safe against (2), but not against (1).
229 The safety against (2) is derived from the fact that only one
230 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000231
Guido van Rossuma027efa1997-05-05 20:56:21 +0000232 XXX Darn! With the advent of thread state, we should have an array
233 of pending calls per thread in the thread state! Later...
234*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000235
Guido van Rossuma9672091994-09-14 13:31:22 +0000236#define NPENDINGCALLS 32
237static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000238 int (*func)(void *);
239 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000240} pendingcalls[NPENDINGCALLS];
241static volatile int pendingfirst = 0;
242static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000243static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000244
245int
Thomas Wouters334fb892000-07-25 12:56:38 +0000246Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000247{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000248 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000249 int i, j;
250 /* XXX Begin critical section */
251 /* XXX If you want this to be safe against nested
252 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000253 if (busy)
254 return -1;
255 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000256 i = pendinglast;
257 j = (i + 1) % NPENDINGCALLS;
258 if (j == pendingfirst)
259 return -1; /* Queue full */
260 pendingcalls[i].func = func;
261 pendingcalls[i].arg = arg;
262 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000263 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000264 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000265 /* XXX End critical section */
266 return 0;
267}
268
Guido van Rossum180d7b41994-09-29 09:45:57 +0000269int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000270Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000271{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000272 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000273#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000274 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000275 return 0;
276#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000278 return 0;
279 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000280 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000281 for (;;) {
282 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000283 int (*func)(void *);
284 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000285 i = pendingfirst;
286 if (i == pendinglast)
287 break; /* Queue empty */
288 func = pendingcalls[i].func;
289 arg = pendingcalls[i].arg;
290 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000291 if (func(arg) < 0) {
292 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000293 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000294 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000295 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000296 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000297 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000298 return 0;
299}
300
301
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000302/* The interpreter's recursion limit */
303
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000304static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000305
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000306int
307Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000308{
309 return recursion_limit;
310}
311
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000312void
313Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000314{
315 recursion_limit = new_limit;
316}
317
Guido van Rossum374a9221991-04-04 10:40:29 +0000318/* Status code for main loop (reason for stack unwind) */
319
320enum why_code {
321 WHY_NOT, /* No error */
322 WHY_EXCEPTION, /* Exception occurred */
323 WHY_RERAISE, /* Exception re-raised by 'finally' */
324 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000325 WHY_BREAK, /* 'break' statement */
Thomas Woutersfc93b0a2001-02-16 11:52:31 +0000326 WHY_CONTINUE /* 'continue' statement */
Guido van Rossum374a9221991-04-04 10:40:29 +0000327};
328
Tim Petersdbd9ba62000-07-09 03:09:57 +0000329static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
330static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000331
Guido van Rossum374a9221991-04-04 10:40:29 +0000332
Guido van Rossumb209a111997-04-29 18:18:01 +0000333PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000335{
336 return eval_code2(co,
337 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000338 (PyObject **)NULL, 0,
339 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000340 (PyObject **)NULL, 0,
341 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000342}
343
344
345/* Interpreter main loop */
346
Guido van Rossumb209a111997-04-29 18:18:01 +0000347static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000348eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
349 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 PyObject **defs, int defcount, PyObject *closure)
Guido van Rossum374a9221991-04-04 10:40:29 +0000351{
Guido van Rossum950361c1997-01-24 13:49:28 +0000352#ifdef DXPAIRS
353 int lastopcode = 0;
354#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000355 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000356 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000357 register int opcode=0; /* Current opcode */
358 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000359 register enum why_code why; /* Reason for block stack unwind */
360 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000361 register PyObject *x; /* Result object -- NULL if error */
362 register PyObject *v; /* Temporary objects popped off stack */
363 register PyObject *w;
364 register PyObject *u;
365 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000366 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000367 register PyFrameObject *f; /* Current frame */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000368 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000369 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000370 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000371 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000372#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000373 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000374#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000375#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000377 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000378#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000379
380/* Code access macros */
381
382#define GETCONST(i) Getconst(f, i)
383#define GETNAME(i) Getname(f, i)
384#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000385#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000386#define NEXTOP() (*next_instr++)
387#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000388#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000389#define JUMPBY(x) (next_instr += (x))
390
391/* Stack manipulation macros */
392
393#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
394#define EMPTY() (STACK_LEVEL() == 0)
395#define TOP() (stack_pointer[-1])
396#define BASIC_PUSH(v) (*stack_pointer++ = (v))
397#define BASIC_POP() (*--stack_pointer)
398
Guido van Rossum96a42c81992-01-12 02:29:51 +0000399#ifdef LLTRACE
400#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
401#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000402#else
403#define PUSH(v) BASIC_PUSH(v)
404#define POP() BASIC_POP()
405#endif
406
Guido van Rossum681d79a1995-07-18 14:51:37 +0000407/* Local variable macros */
408
409#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000410#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000411 GETLOCAL(i) = value; } while (0)
412
Guido van Rossuma027efa1997-05-05 20:56:21 +0000413/* Start of code */
414
Guido van Rossum8861b741996-07-30 16:49:37 +0000415#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000416 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000417 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000418 return NULL;
419 }
420#endif
421
Guido van Rossum681d79a1995-07-18 14:51:37 +0000422 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000423 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000424 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000425 }
426
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000427#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000428 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000429#endif
430
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000431 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000432 co, /*code*/
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000433 globals, locals);
Guido van Rossum374a9221991-04-04 10:40:29 +0000434 if (f == NULL)
435 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436
Guido van Rossuma027efa1997-05-05 20:56:21 +0000437 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000438 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000439 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000440
441 if (co->co_argcount > 0 ||
442 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
443 int i;
444 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000445 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000446 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000447 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000448 if (kwdict == NULL)
449 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000450 i = co->co_argcount;
451 if (co->co_flags & CO_VARARGS)
452 i++;
453 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000454 }
455 if (argcount > co->co_argcount) {
456 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000457 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000458 "%.200s() takes %s %d "
459 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000460 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000461 defcount ? "at most" : "exactly",
462 co->co_argcount,
463 kwcount ? "non-keyword " : "",
464 co->co_argcount == 1 ? "" : "s",
465 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000466 goto fail;
467 }
468 n = co->co_argcount;
469 }
470 for (i = 0; i < n; i++) {
471 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000472 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000473 SETLOCAL(i, x);
474 }
475 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000476 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000477 if (u == NULL)
478 goto fail;
479 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 for (i = n; i < argcount; i++) {
481 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000482 Py_INCREF(x);
483 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000485 }
486 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 PyObject *keyword = kws[2*i];
488 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000489 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000490 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000491 PyErr_Format(PyExc_TypeError,
492 "%.200s() keywords must be strings",
493 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000494 goto fail;
495 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000496 /* XXX slow -- speed up using dictionary? */
497 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000498 PyObject *nm = PyTuple_GET_ITEM(
499 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000500 int cmp = PyObject_RichCompareBool(
501 keyword, nm, Py_EQ);
502 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000504 else if (cmp < 0)
505 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000507 /* Check errors from Compare */
508 if (PyErr_Occurred())
509 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 if (j >= co->co_argcount) {
511 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000512 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000513 "%.200s() got an unexpected "
514 "keyword argument '%.400s'",
515 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000516 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517 goto fail;
518 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000519 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 }
521 else {
522 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000523 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000524 "%.200s() got multiple "
525 "values for keyword "
526 "argument '%.400s'",
527 PyString_AsString(co->co_name),
528 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000529 goto fail;
530 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000531 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000532 SETLOCAL(j, value);
533 }
534 }
535 if (argcount < co->co_argcount) {
536 int m = co->co_argcount - defcount;
537 for (i = argcount; i < m; i++) {
538 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000539 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000540 "%.200s() takes %s %d "
541 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000542 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000543 ((co->co_flags & CO_VARARGS) ||
544 defcount) ? "at least"
545 : "exactly",
546 m, kwcount ? "non-keyword " : "",
547 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000548 goto fail;
549 }
550 }
551 if (n > m)
552 i = n - m;
553 else
554 i = 0;
555 for (; i < defcount; i++) {
556 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000557 PyObject *def = defs[i];
558 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000559 SETLOCAL(m+i, def);
560 }
561 }
562 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000563 }
564 else {
565 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000566 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000567 "%.200s() takes no arguments (%d given)",
568 PyString_AsString(co->co_name),
569 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000570 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000571 }
572 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000573 /* Allocate and initialize storage for cell vars, and copy free
574 vars into frame. This isn't too efficient right now. */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000575 if (f->f_ncells) {
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000576 int i = 0, j = 0, nargs, found;
577 char *cellname, *argname;
578 PyObject *c;
579
580 nargs = co->co_argcount;
581 if (co->co_flags & CO_VARARGS)
582 nargs++;
583 if (co->co_flags & CO_VARKEYWORDS)
584 nargs++;
585
586 /* Check for cells that shadow args */
587 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
588 cellname = PyString_AS_STRING(
589 PyTuple_GET_ITEM(co->co_cellvars, i));
590 found = 0;
591 while (j < nargs) {
592 argname = PyString_AS_STRING(
593 PyTuple_GET_ITEM(co->co_varnames, j));
594 if (strcmp(cellname, argname) == 0) {
595 c = PyCell_New(GETLOCAL(j));
596 if (c == NULL)
597 goto fail;
598 GETLOCAL(f->f_nlocals + i) = c;
599 found = 1;
600 break;
601 }
602 j++;
603 }
604 if (found == 0) {
605 c = PyCell_New(NULL);
606 if (c == NULL)
607 goto fail;
608 SETLOCAL(f->f_nlocals + i, c);
609 }
610 }
611 /* Initialize any that are left */
612 while (i < f->f_ncells) {
613 c = PyCell_New(NULL);
614 if (c == NULL)
615 goto fail;
616 SETLOCAL(f->f_nlocals + i, c);
617 i++;
618 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000619 }
620 if (f->f_nfreevars) {
621 int i;
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000622 for (i = 0; i < f->f_nfreevars; ++i) {
623 PyObject *o = PyTuple_GET_ITEM(closure, i);
624 Py_INCREF(o);
625 freevars[f->f_ncells + i] = o;
626 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000627 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000628
Guido van Rossuma027efa1997-05-05 20:56:21 +0000629 if (tstate->sys_tracefunc != NULL) {
630 /* tstate->sys_tracefunc, if defined, is a function that
631 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000632 Its return value, if not None, is a function that
633 will be called at the start of each executed line
634 of code. (Actually, the function must return
635 itself in order to continue tracing.)
636 The trace functions are called with three arguments:
637 a pointer to the current frame, a string indicating
638 why the function is called, and an argument which
639 depends on the situation. The global trace function
640 (sys.trace) is also called whenever an exception
641 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000642 if (call_trace(&tstate->sys_tracefunc,
643 &f->f_trace, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000644 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000645 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000646 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000647 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000648 }
649
Guido van Rossuma027efa1997-05-05 20:56:21 +0000650 if (tstate->sys_profilefunc != NULL) {
651 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000652 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000653 if (call_trace(&tstate->sys_profilefunc,
654 (PyObject**)0, f, "call",
Guido van Rossumb209a111997-04-29 18:18:01 +0000655 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000656 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000657 }
658 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000659
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000660 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000661 --tstate->recursion_depth;
662 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000663 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000664 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000665 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000666 return NULL;
667 }
668
Guido van Rossumd076c731998-10-07 19:42:25 +0000669 _PyCode_GETCODEPTR(co, &first_instr);
670 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000671 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000672
Guido van Rossum374a9221991-04-04 10:40:29 +0000673 why = WHY_NOT;
674 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000675 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000676 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000677
Guido van Rossum374a9221991-04-04 10:40:29 +0000678 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000679 /* Do periodic things. Doing this every time through
680 the loop would add too much overhead, so we do it
681 only every Nth instruction. We also do it if
682 ``things_to_do'' is set, i.e. when an asynchronous
683 event needs attention (e.g. a signal handler or
684 async I/O handler); see Py_AddPendingCall() and
685 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossuma027efa1997-05-05 20:56:21 +0000687 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000688 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000689 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000690 if (Py_MakePendingCalls() < 0) {
691 why = WHY_EXCEPTION;
692 goto on_error;
693 }
694 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000695#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000696 /* If we have true signals, the signal handler
697 will call Py_AddPendingCall() so we don't
698 have to call sigcheck(). On the Mac and
699 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000700 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000701 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000702 goto on_error;
703 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000704#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000705
Guido van Rossume59214e1994-08-30 08:01:59 +0000706#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000707 if (interpreter_lock) {
708 /* Give another thread a chance */
709
Guido van Rossum25ce5661997-08-02 03:10:38 +0000710 if (PyThreadState_Swap(NULL) != tstate)
711 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000712 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000713
714 /* Other threads may run now */
715
Guido van Rossum65d5b571998-12-21 19:32:43 +0000716 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000717 if (PyThreadState_Swap(tstate) != NULL)
718 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000719 }
720#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000721 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000724
Guido van Rossum408027e1996-12-30 16:17:54 +0000725#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000726 f->f_lasti = INSTR_OFFSET();
727#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Guido van Rossum374a9221991-04-04 10:40:29 +0000729 opcode = NEXTOP();
730 if (HAS_ARG(opcode))
731 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000732 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000733#ifdef DYNAMIC_EXECUTION_PROFILE
734#ifdef DXPAIRS
735 dxpairs[lastopcode][opcode]++;
736 lastopcode = opcode;
737#endif
738 dxp[opcode]++;
739#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000740
Guido van Rossum96a42c81992-01-12 02:29:51 +0000741#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000742 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000743
Guido van Rossum96a42c81992-01-12 02:29:51 +0000744 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000745 if (HAS_ARG(opcode)) {
746 printf("%d: %d, %d\n",
747 (int) (INSTR_OFFSET() - 3),
748 opcode, oparg);
749 }
750 else {
751 printf("%d: %d\n",
752 (int) (INSTR_OFFSET() - 1), opcode);
753 }
754 }
755#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000757
Guido van Rossum374a9221991-04-04 10:40:29 +0000758 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000759
Guido van Rossum374a9221991-04-04 10:40:29 +0000760 /* BEWARE!
761 It is essential that any operation that fails sets either
762 x to NULL, err to nonzero, or why to anything but WHY_NOT,
763 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000764
Guido van Rossum374a9221991-04-04 10:40:29 +0000765 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000766
Guido van Rossum374a9221991-04-04 10:40:29 +0000767 case POP_TOP:
768 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000769 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000770 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000771
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 case ROT_TWO:
773 v = POP();
774 w = POP();
775 PUSH(v);
776 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000777 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000778
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 case ROT_THREE:
780 v = POP();
781 w = POP();
782 x = POP();
783 PUSH(v);
784 PUSH(x);
785 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000786 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000787
Thomas Wouters434d0822000-08-24 20:11:32 +0000788 case ROT_FOUR:
789 u = POP();
790 v = POP();
791 w = POP();
792 x = POP();
793 PUSH(u);
794 PUSH(x);
795 PUSH(w);
796 PUSH(v);
797 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000798
Guido van Rossum374a9221991-04-04 10:40:29 +0000799 case DUP_TOP:
800 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000801 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000802 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000803 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000804
Thomas Wouters434d0822000-08-24 20:11:32 +0000805 case DUP_TOPX:
806 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000807 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000808 x = TOP();
809 Py_INCREF(x);
810 PUSH(x);
811 continue;
812 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000813 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000814 Py_INCREF(x);
815 w = TOP();
816 Py_INCREF(w);
817 PUSH(x);
818 PUSH(w);
819 PUSH(x);
820 continue;
821 case 3:
822 x = POP();
823 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000824 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000825 Py_INCREF(w);
826 v = TOP();
827 Py_INCREF(v);
828 PUSH(w);
829 PUSH(x);
830 PUSH(v);
831 PUSH(w);
832 PUSH(x);
833 continue;
834 case 4:
835 x = POP();
836 Py_INCREF(x);
837 w = POP();
838 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000839 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000840 Py_INCREF(v);
841 u = TOP();
842 Py_INCREF(u);
843 PUSH(v);
844 PUSH(w);
845 PUSH(x);
846 PUSH(u);
847 PUSH(v);
848 PUSH(w);
849 PUSH(x);
850 continue;
851 case 5:
852 x = POP();
853 Py_INCREF(x);
854 w = POP();
855 Py_INCREF(w);
856 v = POP();
857 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000858 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000859 Py_INCREF(u);
860 t = TOP();
861 Py_INCREF(t);
862 PUSH(u);
863 PUSH(v);
864 PUSH(w);
865 PUSH(x);
866 PUSH(t);
867 PUSH(u);
868 PUSH(v);
869 PUSH(w);
870 PUSH(x);
871 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000872 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000873 Py_FatalError("invalid argument to DUP_TOPX"
874 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000875 }
Tim Peters35ba6892000-10-11 07:04:49 +0000876 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000877
Guido van Rossum374a9221991-04-04 10:40:29 +0000878 case UNARY_POSITIVE:
879 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000880 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000881 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000882 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000883 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000884 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000885
Guido van Rossum374a9221991-04-04 10:40:29 +0000886 case UNARY_NEGATIVE:
887 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000888 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000889 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000890 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000891 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000893
Guido van Rossum374a9221991-04-04 10:40:29 +0000894 case UNARY_NOT:
895 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000896 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000897 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000898 if (err == 0) {
899 Py_INCREF(Py_True);
900 PUSH(Py_True);
901 continue;
902 }
903 else if (err > 0) {
904 Py_INCREF(Py_False);
905 PUSH(Py_False);
906 err = 0;
907 continue;
908 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000909 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000910
Guido van Rossum374a9221991-04-04 10:40:29 +0000911 case UNARY_CONVERT:
912 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000913 x = PyObject_Repr(v);
914 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000915 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000916 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000917 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000918
Guido van Rossum7928cd71991-10-24 14:59:31 +0000919 case UNARY_INVERT:
920 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000921 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000922 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000923 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000924 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000925 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000926
Guido van Rossum50564e81996-01-12 01:13:16 +0000927 case BINARY_POWER:
928 w = POP();
929 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000930 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000931 Py_DECREF(v);
932 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000933 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000934 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000935 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000936
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 case BINARY_MULTIPLY:
938 w = POP();
939 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000940 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000941 Py_DECREF(v);
942 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000943 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000944 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000945 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000946
Guido van Rossum374a9221991-04-04 10:40:29 +0000947 case BINARY_DIVIDE:
948 w = POP();
949 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000950 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000951 Py_DECREF(v);
952 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000953 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000954 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000955 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000956
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 case BINARY_MODULO:
958 w = POP();
959 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000960 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000961 Py_DECREF(v);
962 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000963 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000964 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000965 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000966
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 case BINARY_ADD:
968 w = POP();
969 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000970 if (PyInt_Check(v) && PyInt_Check(w)) {
971 /* INLINE: int + int */
972 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000973 a = PyInt_AS_LONG(v);
974 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000975 i = a + b;
976 if ((i^a) < 0 && (i^b) < 0) {
977 PyErr_SetString(PyExc_OverflowError,
978 "integer addition");
979 x = NULL;
980 }
981 else
982 x = PyInt_FromLong(i);
983 }
984 else
985 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000986 Py_DECREF(v);
987 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000988 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000989 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000990 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000991
Guido van Rossum374a9221991-04-04 10:40:29 +0000992 case BINARY_SUBTRACT:
993 w = POP();
994 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000995 if (PyInt_Check(v) && PyInt_Check(w)) {
996 /* INLINE: int - int */
997 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000998 a = PyInt_AS_LONG(v);
999 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001000 i = a - b;
1001 if ((i^a) < 0 && (i^~b) < 0) {
1002 PyErr_SetString(PyExc_OverflowError,
1003 "integer subtraction");
1004 x = NULL;
1005 }
1006 else
1007 x = PyInt_FromLong(i);
1008 }
1009 else
1010 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001011 Py_DECREF(v);
1012 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001013 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001014 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001015 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001016
Guido van Rossum374a9221991-04-04 10:40:29 +00001017 case BINARY_SUBSCR:
1018 w = POP();
1019 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001020 if (PyList_Check(v) && PyInt_Check(w)) {
1021 /* INLINE: list[int] */
1022 long i = PyInt_AsLong(w);
1023 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001024 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001025 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001026 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001027 PyErr_SetString(PyExc_IndexError,
1028 "list index out of range");
1029 x = NULL;
1030 }
1031 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001032 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001033 Py_INCREF(x);
1034 }
1035 }
1036 else
1037 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001038 Py_DECREF(v);
1039 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001040 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001041 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001042 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001043
Guido van Rossum7928cd71991-10-24 14:59:31 +00001044 case BINARY_LSHIFT:
1045 w = POP();
1046 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001047 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001048 Py_DECREF(v);
1049 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001050 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001051 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001052 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001053
Guido van Rossum7928cd71991-10-24 14:59:31 +00001054 case BINARY_RSHIFT:
1055 w = POP();
1056 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001057 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001058 Py_DECREF(v);
1059 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001060 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001061 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001062 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001063
Guido van Rossum7928cd71991-10-24 14:59:31 +00001064 case BINARY_AND:
1065 w = POP();
1066 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001067 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001068 Py_DECREF(v);
1069 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001070 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001071 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001072 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001073
Guido van Rossum7928cd71991-10-24 14:59:31 +00001074 case BINARY_XOR:
1075 w = POP();
1076 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001077 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001078 Py_DECREF(v);
1079 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001080 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001081 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001082 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001083
Guido van Rossum7928cd71991-10-24 14:59:31 +00001084 case BINARY_OR:
1085 w = POP();
1086 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001087 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001088 Py_DECREF(v);
1089 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001090 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001091 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001092 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001093
1094 case INPLACE_POWER:
1095 w = POP();
1096 v = POP();
1097 x = PyNumber_InPlacePower(v, w, Py_None);
1098 Py_DECREF(v);
1099 Py_DECREF(w);
1100 PUSH(x);
1101 if (x != NULL) continue;
1102 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001103
Thomas Wouters434d0822000-08-24 20:11:32 +00001104 case INPLACE_MULTIPLY:
1105 w = POP();
1106 v = POP();
1107 x = PyNumber_InPlaceMultiply(v, w);
1108 Py_DECREF(v);
1109 Py_DECREF(w);
1110 PUSH(x);
1111 if (x != NULL) continue;
1112 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001113
Thomas Wouters434d0822000-08-24 20:11:32 +00001114 case INPLACE_DIVIDE:
1115 w = POP();
1116 v = POP();
1117 x = PyNumber_InPlaceDivide(v, w);
1118 Py_DECREF(v);
1119 Py_DECREF(w);
1120 PUSH(x);
1121 if (x != NULL) continue;
1122 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001123
Thomas Wouters434d0822000-08-24 20:11:32 +00001124 case INPLACE_MODULO:
1125 w = POP();
1126 v = POP();
1127 x = PyNumber_InPlaceRemainder(v, w);
1128 Py_DECREF(v);
1129 Py_DECREF(w);
1130 PUSH(x);
1131 if (x != NULL) continue;
1132 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001133
Thomas Wouters434d0822000-08-24 20:11:32 +00001134 case INPLACE_ADD:
1135 w = POP();
1136 v = POP();
1137 if (PyInt_Check(v) && PyInt_Check(w)) {
1138 /* INLINE: int + int */
1139 register long a, b, i;
1140 a = PyInt_AS_LONG(v);
1141 b = PyInt_AS_LONG(w);
1142 i = a + b;
1143 if ((i^a) < 0 && (i^b) < 0) {
1144 PyErr_SetString(PyExc_OverflowError,
1145 "integer addition");
1146 x = NULL;
1147 }
1148 else
1149 x = PyInt_FromLong(i);
1150 }
1151 else
1152 x = PyNumber_InPlaceAdd(v, w);
1153 Py_DECREF(v);
1154 Py_DECREF(w);
1155 PUSH(x);
1156 if (x != NULL) continue;
1157 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001158
Thomas Wouters434d0822000-08-24 20:11:32 +00001159 case INPLACE_SUBTRACT:
1160 w = POP();
1161 v = POP();
1162 if (PyInt_Check(v) && PyInt_Check(w)) {
1163 /* INLINE: int - int */
1164 register long a, b, i;
1165 a = PyInt_AS_LONG(v);
1166 b = PyInt_AS_LONG(w);
1167 i = a - b;
1168 if ((i^a) < 0 && (i^~b) < 0) {
1169 PyErr_SetString(PyExc_OverflowError,
1170 "integer subtraction");
1171 x = NULL;
1172 }
1173 else
1174 x = PyInt_FromLong(i);
1175 }
1176 else
1177 x = PyNumber_InPlaceSubtract(v, w);
1178 Py_DECREF(v);
1179 Py_DECREF(w);
1180 PUSH(x);
1181 if (x != NULL) continue;
1182 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001183
Thomas Wouters434d0822000-08-24 20:11:32 +00001184 case INPLACE_LSHIFT:
1185 w = POP();
1186 v = POP();
1187 x = PyNumber_InPlaceLshift(v, w);
1188 Py_DECREF(v);
1189 Py_DECREF(w);
1190 PUSH(x);
1191 if (x != NULL) continue;
1192 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001193
Thomas Wouters434d0822000-08-24 20:11:32 +00001194 case INPLACE_RSHIFT:
1195 w = POP();
1196 v = POP();
1197 x = PyNumber_InPlaceRshift(v, w);
1198 Py_DECREF(v);
1199 Py_DECREF(w);
1200 PUSH(x);
1201 if (x != NULL) continue;
1202 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001203
Thomas Wouters434d0822000-08-24 20:11:32 +00001204 case INPLACE_AND:
1205 w = POP();
1206 v = POP();
1207 x = PyNumber_InPlaceAnd(v, w);
1208 Py_DECREF(v);
1209 Py_DECREF(w);
1210 PUSH(x);
1211 if (x != NULL) continue;
1212 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001213
Thomas Wouters434d0822000-08-24 20:11:32 +00001214 case INPLACE_XOR:
1215 w = POP();
1216 v = POP();
1217 x = PyNumber_InPlaceXor(v, w);
1218 Py_DECREF(v);
1219 Py_DECREF(w);
1220 PUSH(x);
1221 if (x != NULL) continue;
1222 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001223
Thomas Wouters434d0822000-08-24 20:11:32 +00001224 case INPLACE_OR:
1225 w = POP();
1226 v = POP();
1227 x = PyNumber_InPlaceOr(v, w);
1228 Py_DECREF(v);
1229 Py_DECREF(w);
1230 PUSH(x);
1231 if (x != NULL) continue;
1232 break;
1233
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 case SLICE+0:
1235 case SLICE+1:
1236 case SLICE+2:
1237 case SLICE+3:
1238 if ((opcode-SLICE) & 2)
1239 w = POP();
1240 else
1241 w = NULL;
1242 if ((opcode-SLICE) & 1)
1243 v = POP();
1244 else
1245 v = NULL;
1246 u = POP();
1247 x = apply_slice(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 Rossum374a9221991-04-04 10:40:29 +00001251 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001252 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001253 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001254
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 case STORE_SLICE+0:
1256 case STORE_SLICE+1:
1257 case STORE_SLICE+2:
1258 case STORE_SLICE+3:
1259 if ((opcode-STORE_SLICE) & 2)
1260 w = POP();
1261 else
1262 w = NULL;
1263 if ((opcode-STORE_SLICE) & 1)
1264 v = POP();
1265 else
1266 v = NULL;
1267 u = POP();
1268 t = POP();
1269 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001270 Py_DECREF(t);
1271 Py_DECREF(u);
1272 Py_XDECREF(v);
1273 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001274 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001275 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001276
Guido van Rossum374a9221991-04-04 10:40:29 +00001277 case DELETE_SLICE+0:
1278 case DELETE_SLICE+1:
1279 case DELETE_SLICE+2:
1280 case DELETE_SLICE+3:
1281 if ((opcode-DELETE_SLICE) & 2)
1282 w = POP();
1283 else
1284 w = NULL;
1285 if ((opcode-DELETE_SLICE) & 1)
1286 v = POP();
1287 else
1288 v = NULL;
1289 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001290 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001292 Py_DECREF(u);
1293 Py_XDECREF(v);
1294 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001295 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001296 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001297
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 case STORE_SUBSCR:
1299 w = POP();
1300 v = POP();
1301 u = POP();
1302 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001303 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 Py_DECREF(u);
1305 Py_DECREF(v);
1306 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001307 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001308 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001309
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 case DELETE_SUBSCR:
1311 w = POP();
1312 v = POP();
1313 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001314 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001315 Py_DECREF(v);
1316 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001317 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001319
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 case PRINT_EXPR:
1321 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001322 w = PySys_GetObject("displayhook");
1323 if (w == NULL) {
1324 PyErr_SetString(PyExc_RuntimeError,
1325 "lost sys.displayhook");
1326 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001327 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001328 }
1329 if (err == 0) {
1330 x = Py_BuildValue("(O)", v);
1331 if (x == NULL)
1332 err = -1;
1333 }
1334 if (err == 0) {
1335 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001336 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001337 if (w == NULL)
1338 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001339 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001340 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001341 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001342 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001343
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001344 case PRINT_ITEM_TO:
1345 w = stream = POP();
1346 /* fall through to PRINT_ITEM */
1347
Guido van Rossum374a9221991-04-04 10:40:29 +00001348 case PRINT_ITEM:
1349 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001350 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001351 w = PySys_GetObject("stdout");
1352 if (w == NULL) {
1353 PyErr_SetString(PyExc_RuntimeError,
1354 "lost sys.stdout");
1355 err = -1;
1356 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001357 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001358 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001359 err = PyFile_WriteString(" ", w);
1360 if (err == 0)
1361 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001362 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001363 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001364 char *s = PyString_AsString(v);
1365 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001366 if (len > 0 &&
1367 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001368 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001369 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001370 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001371 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001372 Py_XDECREF(stream);
1373 stream = NULL;
1374 if (err == 0)
1375 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001376 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001377
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001378 case PRINT_NEWLINE_TO:
1379 w = stream = POP();
1380 /* fall through to PRINT_NEWLINE */
1381
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001383 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001384 w = PySys_GetObject("stdout");
1385 if (w == NULL)
1386 PyErr_SetString(PyExc_RuntimeError,
1387 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001388 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001389 if (w != NULL) {
1390 err = PyFile_WriteString("\n", w);
1391 if (err == 0)
1392 PyFile_SoftSpace(w, 0);
1393 }
1394 Py_XDECREF(stream);
1395 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001397
Thomas Wouters434d0822000-08-24 20:11:32 +00001398
1399#ifdef CASE_TOO_BIG
1400 default: switch (opcode) {
1401#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 case BREAK_LOOP:
1403 why = WHY_BREAK;
1404 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001405
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001406 case CONTINUE_LOOP:
1407 retval = PyInt_FromLong(oparg);
1408 why = WHY_CONTINUE;
1409 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001410
Guido van Rossumf10570b1995-07-07 22:53:21 +00001411 case RAISE_VARARGS:
1412 u = v = w = NULL;
1413 switch (oparg) {
1414 case 3:
1415 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001416 /* Fallthrough */
1417 case 2:
1418 v = POP(); /* value */
1419 /* Fallthrough */
1420 case 1:
1421 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001422 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001423 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001424 break;
1425 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001426 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001427 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001428 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001429 break;
1430 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001431 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001432
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001435 PyErr_SetString(PyExc_SystemError,
1436 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 break;
1438 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001439 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001440 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001441 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001442
Guido van Rossum374a9221991-04-04 10:40:29 +00001443 case RETURN_VALUE:
1444 retval = POP();
1445 why = WHY_RETURN;
1446 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001447
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001448 case EXEC_STMT:
1449 w = POP();
1450 v = POP();
1451 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001452 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 Py_DECREF(u);
1454 Py_DECREF(v);
1455 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001456 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001457
Guido van Rossum374a9221991-04-04 10:40:29 +00001458 case POP_BLOCK:
1459 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001460 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001461 while (STACK_LEVEL() > b->b_level) {
1462 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001463 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001464 }
1465 }
1466 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001467
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 case END_FINALLY:
1469 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001470 if (PyInt_Check(v)) {
1471 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001472 if (why == WHY_RETURN ||
1473 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001474 retval = POP();
1475 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001476 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001477 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001478 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001479 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001480 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001481 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001483 else if (v != Py_None) {
1484 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001485 "'finally' pops bad exception");
1486 why = WHY_EXCEPTION;
1487 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001488 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001490
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001492 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001493 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001494 w = POP();
1495 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 Py_DECREF(u);
1498 Py_DECREF(v);
1499 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001501
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 case STORE_NAME:
1503 w = GETNAMEV(oparg);
1504 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001505 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001506 PyErr_Format(PyExc_SystemError,
1507 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001508 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001509 break;
1510 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 err = PyDict_SetItem(x, w, v);
1512 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001516 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001517 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001518 PyErr_Format(PyExc_SystemError,
1519 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001520 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001521 break;
1522 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001523 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001524 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001525 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001526 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001527
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001528 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001530 if (PyTuple_Check(v)) {
1531 if (PyTuple_Size(v) != oparg) {
1532 PyErr_SetString(PyExc_ValueError,
1533 "unpack tuple of wrong size");
1534 why = WHY_EXCEPTION;
1535 }
1536 else {
1537 for (; --oparg >= 0; ) {
1538 w = PyTuple_GET_ITEM(v, oparg);
1539 Py_INCREF(w);
1540 PUSH(w);
1541 }
1542 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001544 else if (PyList_Check(v)) {
1545 if (PyList_Size(v) != oparg) {
1546 PyErr_SetString(PyExc_ValueError,
1547 "unpack list of wrong size");
1548 why = WHY_EXCEPTION;
1549 }
1550 else {
1551 for (; --oparg >= 0; ) {
1552 w = PyList_GET_ITEM(v, oparg);
1553 Py_INCREF(w);
1554 PUSH(w);
1555 }
1556 }
1557 }
1558 else if (PySequence_Check(v)) {
1559 if (unpack_sequence(v, oparg,
1560 stack_pointer + oparg))
1561 stack_pointer += oparg;
1562 else
1563 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001564 }
1565 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001566 PyErr_SetString(PyExc_TypeError,
1567 "unpack non-sequence");
1568 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001572
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001574 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001575 v = POP();
1576 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001577 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1578 Py_DECREF(v);
1579 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001580 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001581
Guido van Rossum374a9221991-04-04 10:40:29 +00001582 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001583 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001584 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001585 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1586 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001587 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001588 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001589
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001590 case STORE_GLOBAL:
1591 w = GETNAMEV(oparg);
1592 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001593 err = PyDict_SetItem(f->f_globals, w, v);
1594 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001595 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001596
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001597 case DELETE_GLOBAL:
1598 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001599 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001600 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001601 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001602 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001603
Guido van Rossum374a9221991-04-04 10:40:29 +00001604 case LOAD_CONST:
1605 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001606 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001607 PUSH(x);
1608 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001609
Guido van Rossum374a9221991-04-04 10:40:29 +00001610 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001611 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001612 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001613 PyErr_Format(PyExc_SystemError,
1614 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001615 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001616 break;
1617 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001618 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001619 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001622 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001623 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001624 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001625 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001626 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001627 break;
1628 }
1629 }
1630 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001631 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001632 PUSH(x);
1633 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001634
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001636 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001637 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001638 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001639 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001640 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001641 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001642 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001643 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001644 break;
1645 }
1646 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001647 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 PUSH(x);
1649 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001650
Guido van Rossum9bfef441993-03-29 10:43:31 +00001651 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001652 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001653 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001654 format_exc_check_arg(
1655 PyExc_UnboundLocalError,
1656 UNBOUNDLOCAL_ERROR_MSG,
1657 PyTuple_GetItem(co->co_varnames, oparg)
1658 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001659 break;
1660 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001662 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001663 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001664 break;
1665
1666 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001667 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001668 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001669 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001670
1671 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001672 x = GETLOCAL(oparg);
1673 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001674 format_exc_check_arg(
1675 PyExc_UnboundLocalError,
1676 UNBOUNDLOCAL_ERROR_MSG,
1677 PyTuple_GetItem(co->co_varnames, oparg)
1678 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001679 break;
1680 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001681 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001682 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001683
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001684 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001685 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001686 Py_INCREF(x);
1687 PUSH(x);
1688 break;
1689
1690 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001691 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001692 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001693 if (w == NULL) {
1694 if (oparg < f->f_ncells)
1695 v = PyTuple_GetItem(co->co_cellvars,
1696 oparg);
1697 else
1698 v = PyTuple_GetItem(
1699 co->co_freevars,
1700 oparg - f->f_ncells);
1701
1702 format_exc_check_arg(
1703 PyExc_UnboundLocalError,
1704 UNBOUNDLOCAL_ERROR_MSG,
1705 v);
1706 err = -1;
1707 break;
1708 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001709 PUSH(w);
1710 break;
1711
1712 case STORE_DEREF:
1713 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001714 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001715 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001716 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001717 continue;
1718
Guido van Rossum374a9221991-04-04 10:40:29 +00001719 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001720 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001721 if (x != NULL) {
1722 for (; --oparg >= 0;) {
1723 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001724 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001725 }
1726 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001727 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 }
1729 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001730
Guido van Rossum374a9221991-04-04 10:40:29 +00001731 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001733 if (x != NULL) {
1734 for (; --oparg >= 0;) {
1735 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001736 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 }
1738 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001739 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001740 }
1741 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001742
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001744 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001745 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001746 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001747 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001748
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001750 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001752 x = PyObject_GetAttr(v, w);
1753 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001754 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001755 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001756 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001757
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 case COMPARE_OP:
1759 w = POP();
1760 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001761 if (PyInt_Check(v) && PyInt_Check(w)) {
1762 /* INLINE: cmp(int, int) */
1763 register long a, b;
1764 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001765 a = PyInt_AS_LONG(v);
1766 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001767 switch (oparg) {
1768 case LT: res = a < b; break;
1769 case LE: res = a <= b; break;
1770 case EQ: res = a == b; break;
1771 case NE: res = a != b; break;
1772 case GT: res = a > b; break;
1773 case GE: res = a >= b; break;
1774 case IS: res = v == w; break;
1775 case IS_NOT: res = v != w; break;
1776 default: goto slow_compare;
1777 }
1778 x = res ? Py_True : Py_False;
1779 Py_INCREF(x);
1780 }
1781 else {
1782 slow_compare:
1783 x = cmp_outcome(oparg, v, w);
1784 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001785 Py_DECREF(v);
1786 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001787 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001788 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001789 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001790
Guido van Rossum374a9221991-04-04 10:40:29 +00001791 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001792 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001793 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001794 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001795 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001796 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001797 break;
1798 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001799 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001800 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001801 w,
1802 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001803 f->f_locals == NULL ?
1804 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001805 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001806 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001807 if (w == NULL) {
1808 x = NULL;
1809 break;
1810 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001811 x = PyEval_CallObject(x, w);
1812 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001813 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001814 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001815 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001816
Thomas Wouters52152252000-08-17 22:55:00 +00001817 case IMPORT_STAR:
1818 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001819 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001820 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001821 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001822 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001823 break;
1824 }
Thomas Wouters52152252000-08-17 22:55:00 +00001825 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001826 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001827 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001828 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001829 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001830
Thomas Wouters52152252000-08-17 22:55:00 +00001831 case IMPORT_FROM:
1832 w = GETNAMEV(oparg);
1833 v = TOP();
1834 x = import_from(v, w);
1835 PUSH(x);
1836 if (x != NULL) continue;
1837 break;
1838
Guido van Rossum374a9221991-04-04 10:40:29 +00001839 case JUMP_FORWARD:
1840 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001841 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001842
Guido van Rossum374a9221991-04-04 10:40:29 +00001843 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001845 if (err > 0)
1846 err = 0;
1847 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001849 else
1850 break;
1851 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001852
Guido van Rossum374a9221991-04-04 10:40:29 +00001853 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001854 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001855 if (err > 0) {
1856 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001858 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001859 else if (err == 0)
1860 ;
1861 else
1862 break;
1863 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001864
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 case JUMP_ABSOLUTE:
1866 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001867 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001868
Guido van Rossum374a9221991-04-04 10:40:29 +00001869 case FOR_LOOP:
1870 /* for v in s: ...
1871 On entry: stack contains s, i.
1872 On exit: stack contains s, i+1, s[i];
1873 but if loop exhausted:
1874 s, i are popped, and we jump */
1875 w = POP(); /* Loop index */
1876 v = POP(); /* Sequence object */
1877 u = loop_subscript(v, w);
1878 if (u != NULL) {
1879 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001880 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001881 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001882 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001883 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001884 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001885 }
1886 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001887 Py_DECREF(v);
1888 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001889 /* A NULL can mean "s exhausted"
1890 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001891 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001892 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001893 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001894 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001895 continue;
1896 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001897 }
1898 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001899
Guido van Rossum374a9221991-04-04 10:40:29 +00001900 case SETUP_LOOP:
1901 case SETUP_EXCEPT:
1902 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001903 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001904 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001905 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001906
Guido van Rossum374a9221991-04-04 10:40:29 +00001907 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001908#ifdef LLTRACE
1909 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001910 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001911#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001912 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001913 if (f->f_trace == NULL)
1914 continue;
1915 /* Trace each line of code reached */
1916 f->f_lasti = INSTR_OFFSET();
1917 err = call_trace(&f->f_trace, &f->f_trace,
Guido van Rossumb209a111997-04-29 18:18:01 +00001918 f, "line", Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001919 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001920
1921 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001922 {
1923 int na = oparg & 0xff;
1924 int nk = (oparg>>8) & 0xff;
1925 int n = na + 2 * nk;
1926 PyObject **pfunc = stack_pointer - n - 1;
1927 PyObject *func = *pfunc;
1928 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1929
1930 /* Always dispatch PyCFunction first, because
1931 these are presumed to be the most frequent
1932 callable object.
1933 */
1934 if (PyCFunction_Check(func)) {
1935 if (PyCFunction_GET_FLAGS(func) == 0) {
1936 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001937 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001938 } else {
1939 x = do_call(func, &stack_pointer,
1940 na, nk);
1941 }
1942 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001943 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001944 && PyMethod_GET_SELF(func) != NULL) {
1945 /* optimize access to bound methods */
1946 PyObject *self = PyMethod_GET_SELF(func);
1947 Py_INCREF(self);
1948 func = PyMethod_GET_FUNCTION(func);
1949 Py_INCREF(func);
1950 Py_DECREF(*pfunc);
1951 *pfunc = self;
1952 na++;
1953 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001954 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001955 Py_INCREF(func);
1956 if (PyFunction_Check(func)) {
1957 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001958 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001959 } else {
1960 x = do_call(func, &stack_pointer,
1961 na, nk);
1962 }
1963 Py_DECREF(func);
1964 }
1965
1966 while (stack_pointer > pfunc) {
1967 w = POP();
1968 Py_DECREF(w);
1969 }
1970 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001971 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001972 continue;
1973 break;
1974 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001975
Jeremy Hylton76901512000-03-28 23:49:17 +00001976 case CALL_FUNCTION_VAR:
1977 case CALL_FUNCTION_KW:
1978 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001979 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001980 int na = oparg & 0xff;
1981 int nk = (oparg>>8) & 0xff;
1982 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001983 int n = na + 2 * nk;
1984 PyObject **pfunc, *func;
1985 if (flags & CALL_FLAG_VAR)
1986 n++;
1987 if (flags & CALL_FLAG_KW)
1988 n++;
1989 pfunc = stack_pointer - n - 1;
1990 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001991 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001992
Guido van Rossumac7be682001-01-17 15:42:30 +00001993 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001994 && PyMethod_GET_SELF(func) != NULL) {
1995 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001996 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001997 func = PyMethod_GET_FUNCTION(func);
1998 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001999 Py_DECREF(*pfunc);
2000 *pfunc = self;
2001 na++;
2002 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002003 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002004 Py_INCREF(func);
2005 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002006 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002007
Jeremy Hylton76901512000-03-28 23:49:17 +00002008 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002009 w = POP();
2010 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002011 }
2012 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002013 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002014 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002015 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002016 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002017
Guido van Rossum681d79a1995-07-18 14:51:37 +00002018 case MAKE_FUNCTION:
2019 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002020 x = PyFunction_New(v, f->f_globals);
2021 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002022 /* XXX Maybe this should be a separate opcode? */
2023 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002024 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002025 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002026 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002027 x = NULL;
2028 break;
2029 }
2030 while (--oparg >= 0) {
2031 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002032 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002033 }
2034 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002035 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002036 }
2037 PUSH(x);
2038 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002039
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002040 case MAKE_CLOSURE:
2041 {
2042 int nfree;
2043 v = POP(); /* code object */
2044 x = PyFunction_New(v, f->f_globals);
2045 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2046 Py_DECREF(v);
2047 /* XXX Maybe this should be a separate opcode? */
2048 if (x != NULL && nfree > 0) {
2049 v = PyTuple_New(nfree);
2050 if (v == NULL) {
2051 Py_DECREF(x);
2052 x = NULL;
2053 break;
2054 }
2055 while (--nfree >= 0) {
2056 w = POP();
2057 PyTuple_SET_ITEM(v, nfree, w);
2058 }
2059 err = PyFunction_SetClosure(x, v);
2060 Py_DECREF(v);
2061 }
2062 if (x != NULL && oparg > 0) {
2063 v = PyTuple_New(oparg);
2064 if (v == NULL) {
2065 Py_DECREF(x);
2066 x = NULL;
2067 break;
2068 }
2069 while (--oparg >= 0) {
2070 w = POP();
2071 PyTuple_SET_ITEM(v, oparg, w);
2072 }
2073 err = PyFunction_SetDefaults(x, v);
2074 Py_DECREF(v);
2075 }
2076 PUSH(x);
2077 break;
2078 }
2079
Guido van Rossum8861b741996-07-30 16:49:37 +00002080 case BUILD_SLICE:
2081 if (oparg == 3)
2082 w = POP();
2083 else
2084 w = NULL;
2085 v = POP();
2086 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002087 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002088 Py_DECREF(u);
2089 Py_DECREF(v);
2090 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002091 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002092 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002093 break;
2094
Fred Drakeef8ace32000-08-24 00:32:09 +00002095 case EXTENDED_ARG:
2096 opcode = NEXTOP();
2097 oparg = oparg<<16 | NEXTARG();
2098 goto dispatch_opcode;
2099 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002100
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 default:
2102 fprintf(stderr,
2103 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002104 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002105 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002106 why = WHY_EXCEPTION;
2107 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002108
2109#ifdef CASE_TOO_BIG
2110 }
2111#endif
2112
Guido van Rossum374a9221991-04-04 10:40:29 +00002113 } /* switch */
2114
2115 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002116
Guido van Rossum374a9221991-04-04 10:40:29 +00002117 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002118
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002120 if (err == 0 && x != NULL) {
2121#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002122 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002124 fprintf(stderr,
2125 "XXX undetected error\n");
2126 else
2127#endif
2128 continue; /* Normal, fast path */
2129 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002130 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 err = 0;
2133 }
2134
Guido van Rossum374a9221991-04-04 10:40:29 +00002135 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002136
Guido van Rossum374a9221991-04-04 10:40:29 +00002137 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002138 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002139 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002140 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002141 why = WHY_EXCEPTION;
2142 }
2143 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002144#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002145 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002146 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002147 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002148 fprintf(stderr,
2149 "XXX undetected error (why=%d)\n",
2150 why);
2151 why = WHY_EXCEPTION;
2152 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 }
2154#endif
2155
2156 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002157
Guido van Rossum374a9221991-04-04 10:40:29 +00002158 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002159 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002160 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002161 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002162 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002163
Guido van Rossume59214e1994-08-30 08:01:59 +00002164 if (f->f_trace)
2165 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002166 if (tstate->sys_profilefunc)
2167 call_exc_trace(&tstate->sys_profilefunc,
2168 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002169 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002170
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002172
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 if (why == WHY_RERAISE)
2174 why = WHY_EXCEPTION;
2175
2176 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002177
Guido van Rossum374a9221991-04-04 10:40:29 +00002178 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002179 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002180
2181 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2182 /* For a continue inside a try block,
2183 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002184 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002185 b->b_handler);
2186 why = WHY_NOT;
2187 JUMPTO(PyInt_AS_LONG(retval));
2188 Py_DECREF(retval);
2189 break;
2190 }
2191
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 while (STACK_LEVEL() > b->b_level) {
2193 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002194 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002195 }
2196 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2197 why = WHY_NOT;
2198 JUMPTO(b->b_handler);
2199 break;
2200 }
2201 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002202 (b->b_type == SETUP_EXCEPT &&
2203 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002204 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002205 PyObject *exc, *val, *tb;
2206 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002207 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002208 val = Py_None;
2209 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002211 /* Make the raw exception data
2212 available to the handler,
2213 so a program can emulate the
2214 Python main loop. Don't do
2215 this for 'finally'. */
2216 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002217 PyErr_NormalizeException(
2218 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002219 set_exc_info(tstate,
2220 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002221 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002222 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002223 PUSH(val);
2224 PUSH(exc);
2225 }
2226 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002227 if (why == WHY_RETURN ||
2228 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002229 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002230 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002231 PUSH(v);
2232 }
2233 why = WHY_NOT;
2234 JUMPTO(b->b_handler);
2235 break;
2236 }
2237 } /* unwind stack */
2238
2239 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002240
Guido van Rossum374a9221991-04-04 10:40:29 +00002241 if (why != WHY_NOT)
2242 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002243
Guido van Rossum374a9221991-04-04 10:40:29 +00002244 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002245
Guido van Rossum374a9221991-04-04 10:40:29 +00002246 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002247
Guido van Rossum374a9221991-04-04 10:40:29 +00002248 while (!EMPTY()) {
2249 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002250 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002251 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002252
Guido van Rossum96a42c81992-01-12 02:29:51 +00002253 if (why != WHY_RETURN)
2254 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002255
Guido van Rossume59214e1994-08-30 08:01:59 +00002256 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002257 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002258 if (call_trace(&f->f_trace, &f->f_trace, f,
2259 "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002260 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002261 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002262 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002263 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002264 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002265 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002266
Guido van Rossuma027efa1997-05-05 20:56:21 +00002267 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2268 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002269 f, "return", retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002270 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002271 retval = NULL;
2272 why = WHY_EXCEPTION;
2273 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002274 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002275
Guido van Rossuma027efa1997-05-05 20:56:21 +00002276 reset_exc_info(tstate);
2277
2278 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002279
2280 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002281
Guido van Rossum374a9221991-04-04 10:40:29 +00002282 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002283
Guido van Rossuma027efa1997-05-05 20:56:21 +00002284 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002285 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002286
Guido van Rossum96a42c81992-01-12 02:29:51 +00002287 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002288}
2289
Guido van Rossuma027efa1997-05-05 20:56:21 +00002290static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002291set_exc_info(PyThreadState *tstate,
2292 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002293{
2294 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002295 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002296
Guido van Rossuma027efa1997-05-05 20:56:21 +00002297 frame = tstate->frame;
2298 if (frame->f_exc_type == NULL) {
2299 /* This frame didn't catch an exception before */
2300 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002301 if (tstate->exc_type == NULL) {
2302 Py_INCREF(Py_None);
2303 tstate->exc_type = Py_None;
2304 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002305 tmp_type = frame->f_exc_type;
2306 tmp_value = frame->f_exc_value;
2307 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002308 Py_XINCREF(tstate->exc_type);
2309 Py_XINCREF(tstate->exc_value);
2310 Py_XINCREF(tstate->exc_traceback);
2311 frame->f_exc_type = tstate->exc_type;
2312 frame->f_exc_value = tstate->exc_value;
2313 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002314 Py_XDECREF(tmp_type);
2315 Py_XDECREF(tmp_value);
2316 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002317 }
2318 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002319 tmp_type = tstate->exc_type;
2320 tmp_value = tstate->exc_value;
2321 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002322 Py_XINCREF(type);
2323 Py_XINCREF(value);
2324 Py_XINCREF(tb);
2325 tstate->exc_type = type;
2326 tstate->exc_value = value;
2327 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002328 Py_XDECREF(tmp_type);
2329 Py_XDECREF(tmp_value);
2330 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002331 /* For b/w compatibility */
2332 PySys_SetObject("exc_type", type);
2333 PySys_SetObject("exc_value", value);
2334 PySys_SetObject("exc_traceback", tb);
2335}
2336
2337static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002338reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002339{
2340 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002341 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002342 frame = tstate->frame;
2343 if (frame->f_exc_type != NULL) {
2344 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002345 tmp_type = tstate->exc_type;
2346 tmp_value = tstate->exc_value;
2347 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002348 Py_XINCREF(frame->f_exc_type);
2349 Py_XINCREF(frame->f_exc_value);
2350 Py_XINCREF(frame->f_exc_traceback);
2351 tstate->exc_type = frame->f_exc_type;
2352 tstate->exc_value = frame->f_exc_value;
2353 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002354 Py_XDECREF(tmp_type);
2355 Py_XDECREF(tmp_value);
2356 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002357 /* For b/w compatibility */
2358 PySys_SetObject("exc_type", frame->f_exc_type);
2359 PySys_SetObject("exc_value", frame->f_exc_value);
2360 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2361 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002362 tmp_type = frame->f_exc_type;
2363 tmp_value = frame->f_exc_value;
2364 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002365 frame->f_exc_type = NULL;
2366 frame->f_exc_value = NULL;
2367 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002368 Py_XDECREF(tmp_type);
2369 Py_XDECREF(tmp_value);
2370 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002371}
2372
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002373/* Logic for the raise statement (too complicated for inlining).
2374 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002375static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002376do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002377{
Guido van Rossumd295f121998-04-09 21:39:57 +00002378 if (type == NULL) {
2379 /* Reraise */
2380 PyThreadState *tstate = PyThreadState_Get();
2381 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2382 value = tstate->exc_value;
2383 tb = tstate->exc_traceback;
2384 Py_XINCREF(type);
2385 Py_XINCREF(value);
2386 Py_XINCREF(tb);
2387 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002388
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002389 /* We support the following forms of raise:
2390 raise <class>, <classinstance>
2391 raise <class>, <argument tuple>
2392 raise <class>, None
2393 raise <class>, <argument>
2394 raise <classinstance>, None
2395 raise <string>, <object>
2396 raise <string>, None
2397
2398 An omitted second argument is the same as None.
2399
2400 In addition, raise <tuple>, <anything> is the same as
2401 raising the tuple's first item (and it better have one!);
2402 this rule is applied recursively.
2403
2404 Finally, an optional third argument can be supplied, which
2405 gives the traceback to be substituted (useful when
2406 re-raising an exception after examining it). */
2407
2408 /* First, check the traceback argument, replacing None with
2409 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002410 if (tb == Py_None) {
2411 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002412 tb = NULL;
2413 }
2414 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002415 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002416 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002417 goto raise_error;
2418 }
2419
2420 /* Next, replace a missing value with None */
2421 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002422 value = Py_None;
2423 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002424 }
2425
2426 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002427 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2428 PyObject *tmp = type;
2429 type = PyTuple_GET_ITEM(type, 0);
2430 Py_INCREF(type);
2431 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002432 }
2433
Barry Warsaw4249f541997-08-22 21:26:19 +00002434 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002435 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002436
2437 else if (PyClass_Check(type))
2438 PyErr_NormalizeException(&type, &value, &tb);
2439
Guido van Rossumb209a111997-04-29 18:18:01 +00002440 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002441 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002442 if (value != Py_None) {
2443 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002444 "instance exception may not have a separate value");
2445 goto raise_error;
2446 }
2447 else {
2448 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002449 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002450 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002451 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2452 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002453 }
2454 }
2455 else {
2456 /* Not something you can raise. You get an exception
2457 anyway, just not what you specified :-) */
Guido van Rossumb209a111997-04-29 18:18:01 +00002458 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002459 "exceptions must be strings, classes, or instances");
2460 goto raise_error;
2461 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002462 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002463 if (tb == NULL)
2464 return WHY_EXCEPTION;
2465 else
2466 return WHY_RERAISE;
2467 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002468 Py_XDECREF(value);
2469 Py_XDECREF(type);
2470 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002471 return WHY_EXCEPTION;
2472}
2473
Barry Warsawe42b18f1997-08-25 22:13:04 +00002474static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002475unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002476{
2477 int i;
2478 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002479
Barry Warsawe42b18f1997-08-25 22:13:04 +00002480 for (i = 0; i < argcnt; i++) {
2481 if (! (w = PySequence_GetItem(v, i))) {
2482 if (PyErr_ExceptionMatches(PyExc_IndexError))
2483 PyErr_SetString(PyExc_ValueError,
2484 "unpack sequence of wrong size");
2485 goto finally;
2486 }
2487 *--sp = w;
2488 }
2489 /* we better get an IndexError now */
2490 if (PySequence_GetItem(v, i) == NULL) {
2491 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2492 PyErr_Clear();
2493 return 1;
2494 }
2495 /* some other exception occurred. fall through to finally */
2496 }
2497 else
2498 PyErr_SetString(PyExc_ValueError,
2499 "unpack sequence of wrong size");
2500 /* fall through */
2501finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002502 for (; i > 0; i--, sp++)
2503 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002504
2505 return 0;
2506}
2507
2508
Guido van Rossum96a42c81992-01-12 02:29:51 +00002509#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002510static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002511prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002512{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002513 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002514 if (PyObject_Print(v, stdout, 0) != 0)
2515 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002516 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002517 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002519#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002522call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002523{
Guido van Rossumb209a111997-04-29 18:18:01 +00002524 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002525 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002526 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002527 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002528 value = Py_None;
2529 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002530 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002531 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002532 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002533 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002534 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002535 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002536 err = call_trace(p_trace, p_newtrace, f, "exception", arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002537 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002538 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002539 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002540 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002541 Py_XDECREF(type);
2542 Py_XDECREF(value);
2543 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002544 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002545}
2546
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002547/* PyObject **p_trace: in/out; may not be NULL;
2548 may not point to NULL variable initially
2549 PyObject **p_newtrace: in/out; may be NULL;
2550 may point to NULL variable;
2551 may be same variable as p_newtrace */
2552
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002553static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002554call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
2555 char *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002556{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002558 PyObject *args, *what;
2559 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002560
Guido van Rossuma027efa1997-05-05 20:56:21 +00002561 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002562 /* Don't do recursive traces */
2563 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002564 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002565 *p_newtrace = NULL;
2566 }
2567 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002568 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002569
Guido van Rossumb209a111997-04-29 18:18:01 +00002570 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002571 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002572 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002573 what = PyString_FromString(msg);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002574 if (what == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002575 goto cleanup;
Guido van Rossumb209a111997-04-29 18:18:01 +00002576 Py_INCREF(f);
2577 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2578 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002579 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002580 arg = Py_None;
2581 Py_INCREF(arg);
2582 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002583 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 PyFrame_FastToLocals(f);
2585 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2586 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002588 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002589 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002590 if (res == NULL) {
2591 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002592 PyTraceBack_Here(f);
2593 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002594 *p_trace = NULL;
2595 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002596 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002597 *p_newtrace = NULL;
2598 }
Barry Warsawf6202631999-09-08 16:26:33 +00002599 /* to be extra double plus sure we don't get recursive
2600 * calls inf either tracefunc or profilefunc gets an
2601 * exception, zap the global variables.
2602 */
2603 Py_XDECREF(tstate->sys_tracefunc);
2604 tstate->sys_tracefunc = NULL;
2605 Py_XDECREF(tstate->sys_profilefunc);
2606 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002607 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002608 }
2609 else {
2610 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002611 Py_XDECREF(*p_newtrace);
2612 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002613 *p_newtrace = NULL;
2614 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002616 *p_newtrace = res;
2617 }
2618 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002620 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002621 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002622}
2623
Guido van Rossumb209a111997-04-29 18:18:01 +00002624PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002625PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002626{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002627 PyThreadState *tstate = PyThreadState_Get();
2628 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002629 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002630 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002631 else
2632 return current_frame->f_builtins;
2633}
2634
Guido van Rossumb209a111997-04-29 18:18:01 +00002635PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002636PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002637{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002638 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002639 if (current_frame == NULL)
2640 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002642 return current_frame->f_locals;
2643}
2644
Guido van Rossumb209a111997-04-29 18:18:01 +00002645PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002646PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002647{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002648 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002649 if (current_frame == NULL)
2650 return NULL;
2651 else
2652 return current_frame->f_globals;
2653}
2654
Guido van Rossumb209a111997-04-29 18:18:01 +00002655PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002656PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002657{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002658 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002659 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002660}
2661
Guido van Rossum6135a871995-01-09 17:53:26 +00002662int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002663PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002664{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002665 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002666 return current_frame == NULL ? 0 : current_frame->f_restricted;
2667}
2668
Guido van Rossumbe270261997-05-22 22:26:18 +00002669int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002670PyEval_GetNestedScopes(void)
2671{
2672 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2673 return current_frame == NULL ? 0 :
2674 current_frame->f_code->co_flags & CO_NESTED;
2675}
2676
2677int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002678Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679{
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002681 if (f == NULL)
2682 return 0;
2683 if (!PyFile_SoftSpace(f, 0))
2684 return 0;
2685 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002686}
2687
Guido van Rossum3f5da241990-12-20 15:06:42 +00002688
Guido van Rossum681d79a1995-07-18 14:51:37 +00002689/* External interface to call any callable object.
2690 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002691
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002692#undef PyEval_CallObject
2693/* for backward compatibility: export this interface */
2694
Guido van Rossumb209a111997-04-29 18:18:01 +00002695PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002696PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002697{
Guido van Rossumb209a111997-04-29 18:18:01 +00002698 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002699}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002700#define PyEval_CallObject(func,arg) \
2701 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002702
Guido van Rossumb209a111997-04-29 18:18:01 +00002703PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002704PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002705{
Jeremy Hylton52820442001-01-03 23:52:36 +00002706 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002707
2708 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002709 arg = PyTuple_New(0);
2710 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002711 PyErr_SetString(PyExc_TypeError,
2712 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002713 return NULL;
2714 }
2715 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002716 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002717
Guido van Rossumb209a111997-04-29 18:18:01 +00002718 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002719 PyErr_SetString(PyExc_TypeError,
2720 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002721 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002722 return NULL;
2723 }
2724
Jeremy Hylton52820442001-01-03 23:52:36 +00002725 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002726 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002727 return result;
2728}
2729
2730/* How often is each kind of object called? The answer depends on the
2731 program. An instrumented call_object() was used to run the Python
2732 regression test suite. The results were:
2733 4200000 PyCFunctions
2734 390000 fast_function() calls
2735 94000 other functions
2736 480000 all functions (sum of prev two)
2737 150000 methods
2738 100000 classes
2739
2740 Tests on other bodies of code show that PyCFunctions are still
2741 most common, but not by such a large margin.
2742*/
2743
2744static PyObject *
2745call_object(PyObject *func, PyObject *arg, PyObject *kw)
2746{
2747 ternaryfunc call;
2748 PyObject *result;
2749
2750 if (PyMethod_Check(func))
2751 result = call_method(func, arg, kw);
2752 else if (PyFunction_Check(func))
2753 result = call_eval_code2(func, arg, kw);
2754 else if (PyCFunction_Check(func))
2755 result = call_cfunction(func, arg, kw);
2756 else if (PyClass_Check(func))
2757 result = PyInstance_New(func, arg, kw);
2758 else if (PyInstance_Check(func))
2759 result = call_instance(func, arg, kw);
2760 else if ((call = func->ob_type->tp_call) != NULL)
2761 result = (*call)(func, arg, kw);
2762 else {
2763 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2764 PyString_AS_STRING(PyObject_Repr(func)));
2765 return NULL;
2766 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002767 if (result == NULL && !PyErr_Occurred())
2768 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002769 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002770
Guido van Rossume59214e1994-08-30 08:01:59 +00002771 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002772}
2773
Guido van Rossumb209a111997-04-29 18:18:01 +00002774static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002775call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776{
Jeremy Hylton52820442001-01-03 23:52:36 +00002777 PyCFunctionObject* f = (PyCFunctionObject*)func;
2778 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2779 PyObject *self = PyCFunction_GET_SELF(func);
2780 int flags = PyCFunction_GET_FLAGS(func);
2781
Jeremy Hylton52820442001-01-03 23:52:36 +00002782 if (flags & METH_KEYWORDS) {
2783 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002785 if (kw != NULL && PyDict_Size(kw) != 0) {
2786 PyErr_Format(PyExc_TypeError,
2787 "%.200s() takes no keyword arguments",
2788 f->m_ml->ml_name);
2789 return NULL;
2790 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002791 if (flags & METH_VARARGS) {
2792 return (*meth)(self, arg);
2793 }
2794 if (!(flags & METH_VARARGS)) {
2795 /* the really old style */
2796 int size = PyTuple_GET_SIZE(arg);
2797 if (size == 1)
2798 arg = PyTuple_GET_ITEM(arg, 0);
2799 else if (size == 0)
2800 arg = NULL;
2801 return (*meth)(self, arg);
2802 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002803 /* should never get here ??? */
2804 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805 return NULL;
2806}
2807
Guido van Rossumb209a111997-04-29 18:18:01 +00002808static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002809call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810{
Jeremy Hylton52820442001-01-03 23:52:36 +00002811 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2812 if (call == NULL) {
2813 PyInstanceObject *inst = (PyInstanceObject*) func;
2814 PyErr_Clear();
2815 PyErr_Format(PyExc_AttributeError,
2816 "%.200s instance has no __call__ method",
2817 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002818 return NULL;
2819 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002820 res = call_object(call, arg, kw);
2821 Py_DECREF(call);
2822 return res;
2823}
2824
2825static PyObject *
2826call_method(PyObject *func, PyObject *arg, PyObject *kw)
2827{
2828 PyObject *self = PyMethod_GET_SELF(func);
2829 PyObject *class = PyMethod_GET_CLASS(func);
2830 PyObject *result;
2831
2832 func = PyMethod_GET_FUNCTION(func);
2833 if (self == NULL) {
2834 /* Unbound methods must be called with an instance of
2835 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002836 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00002837 if (PyTuple_Size(arg) >= 1)
2838 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002839 if (self == NULL)
2840 ok = 0;
2841 else {
2842 ok = PyObject_IsInstance(self, class);
2843 if (ok < 0)
2844 return NULL;
2845 }
2846 if (!ok) {
2847 PyObject* fn = ((PyFunctionObject*) func)->func_name;
2848 PyErr_Format(PyExc_TypeError,
2849 "unbound method %s%smust be "
2850 "called with instance as first argument",
2851 fn ? PyString_AsString(fn) : "",
2852 fn ? "() " : "");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 return NULL;
2854 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002855 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002856 }
2857 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002858 int argcount = PyTuple_Size(arg);
2859 PyObject *newarg = PyTuple_New(argcount + 1);
2860 int i;
2861 if (newarg == NULL)
2862 return NULL;
2863 Py_INCREF(self);
2864 PyTuple_SET_ITEM(newarg, 0, self);
2865 for (i = 0; i < argcount; i++) {
2866 PyObject *v = PyTuple_GET_ITEM(arg, i);
2867 Py_XINCREF(v);
2868 PyTuple_SET_ITEM(newarg, i+1, v);
2869 }
2870 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002872 result = call_object(func, arg, kw);
2873 Py_DECREF(arg);
2874 return result;
2875}
2876
2877static PyObject *
2878call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2879{
2880 PyObject *result;
2881 PyObject *argdefs;
2882 PyObject **d, **k;
2883 int nk, nd;
2884
2885 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002886 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2887 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2888 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002889 }
2890 else {
2891 d = NULL;
2892 nd = 0;
2893 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002894
Guido van Rossum681d79a1995-07-18 14:51:37 +00002895 if (kw != NULL) {
2896 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002897 nk = PyDict_Size(kw);
2898 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002899 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002900 PyErr_NoMemory();
2901 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002902 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00002903 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00002904 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00002905 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00002906 i += 2;
2907 nk = i/2;
2908 /* XXX This is broken if the caller deletes dict items! */
2909 }
2910 else {
2911 k = NULL;
2912 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00002913 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002914
Guido van Rossum681d79a1995-07-18 14:51:37 +00002915 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00002916 (PyCodeObject *)PyFunction_GET_CODE(func),
2917 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00002918 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002919 k, nk, d, nd,
2920 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00002921
Guido van Rossumb18618d2000-05-03 23:44:39 +00002922 if (k != NULL)
2923 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00002924
Guido van Rossum681d79a1995-07-18 14:51:37 +00002925 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926}
2927
Jeremy Hylton52820442001-01-03 23:52:36 +00002928#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
2929
2930/* The two fast_xxx() functions optimize calls for which no argument
2931 tuple is necessary; the objects are passed directly from the stack.
2932 fast_cfunction() is called for METH_OLDARGS functions.
2933 fast_function() is for functions with no special argument handling.
2934*/
2935
2936static PyObject *
2937fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
2938{
2939 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2940 PyObject *self = PyCFunction_GET_SELF(func);
2941
2942 if (na == 0)
2943 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002944 else if (na == 1) {
2945 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00002946 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00002947 Py_DECREF(arg);
2948 return result;
2949 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002950 PyObject *args = load_args(pp_stack, na);
2951 PyObject *result = (*meth)(self, args);
2952 Py_DECREF(args);
2953 return result;
2954 }
2955}
2956
2957static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00002958fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00002959{
2960 PyObject *co = PyFunction_GET_CODE(func);
2961 PyObject *globals = PyFunction_GET_GLOBALS(func);
2962 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002963 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002964 PyObject **d = NULL;
2965 int nd = 0;
2966
2967 if (argdefs != NULL) {
2968 d = &PyTuple_GET_ITEM(argdefs, 0);
2969 nd = ((PyTupleObject *)argdefs)->ob_size;
2970 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002971 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00002972 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002973 (*pp_stack)-2*nk, nk, d, nd,
2974 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00002975}
2976
2977static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00002978update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
2979 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002980{
2981 PyObject *kwdict = NULL;
2982 if (orig_kwdict == NULL)
2983 kwdict = PyDict_New();
2984 else {
2985 kwdict = PyDict_Copy(orig_kwdict);
2986 Py_DECREF(orig_kwdict);
2987 }
2988 if (kwdict == NULL)
2989 return NULL;
2990 while (--nk >= 0) {
2991 int err;
2992 PyObject *value = EXT_POP(*pp_stack);
2993 PyObject *key = EXT_POP(*pp_stack);
2994 if (PyDict_GetItem(kwdict, key) != NULL) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00002995 PyObject* fn = ((PyFunctionObject*) func)->func_name;
Guido van Rossumac7be682001-01-17 15:42:30 +00002996 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00002997 "%.200s%s got multiple values "
2998 "for keyword argument '%.400s'",
2999 fn ? PyString_AsString(fn) : "function",
3000 fn ? "()" : "", PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003001 Py_DECREF(key);
3002 Py_DECREF(value);
3003 Py_DECREF(kwdict);
3004 return NULL;
3005 }
3006 err = PyDict_SetItem(kwdict, key, value);
3007 Py_DECREF(key);
3008 Py_DECREF(value);
3009 if (err) {
3010 Py_DECREF(kwdict);
3011 return NULL;
3012 }
3013 }
3014 return kwdict;
3015}
3016
3017static PyObject *
3018update_star_args(int nstack, int nstar, PyObject *stararg,
3019 PyObject ***pp_stack)
3020{
3021 PyObject *callargs, *w;
3022
3023 callargs = PyTuple_New(nstack + nstar);
3024 if (callargs == NULL) {
3025 return NULL;
3026 }
3027 if (nstar) {
3028 int i;
3029 for (i = 0; i < nstar; i++) {
3030 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3031 Py_INCREF(a);
3032 PyTuple_SET_ITEM(callargs, nstack + i, a);
3033 }
3034 }
3035 while (--nstack >= 0) {
3036 w = EXT_POP(*pp_stack);
3037 PyTuple_SET_ITEM(callargs, nstack, w);
3038 }
3039 return callargs;
3040}
3041
3042static PyObject *
3043load_args(PyObject ***pp_stack, int na)
3044{
3045 PyObject *args = PyTuple_New(na);
3046 PyObject *w;
3047
3048 if (args == NULL)
3049 return NULL;
3050 while (--na >= 0) {
3051 w = EXT_POP(*pp_stack);
3052 PyTuple_SET_ITEM(args, na, w);
3053 }
3054 return args;
3055}
3056
3057static PyObject *
3058do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3059{
3060 PyObject *callargs = NULL;
3061 PyObject *kwdict = NULL;
3062 PyObject *result = NULL;
3063
3064 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003065 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003066 if (kwdict == NULL)
3067 goto call_fail;
3068 }
3069 callargs = load_args(pp_stack, na);
3070 if (callargs == NULL)
3071 goto call_fail;
3072 result = call_object(func, callargs, kwdict);
3073 call_fail:
3074 Py_XDECREF(callargs);
3075 Py_XDECREF(kwdict);
3076 return result;
3077}
3078
3079static PyObject *
3080ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3081{
3082 int nstar = 0;
3083 PyObject *callargs = NULL;
3084 PyObject *stararg = NULL;
3085 PyObject *kwdict = NULL;
3086 PyObject *result = NULL;
3087
3088 if (flags & CALL_FLAG_KW) {
3089 kwdict = EXT_POP(*pp_stack);
3090 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003091 PyObject* fn = ((PyFunctionObject*) func)->func_name;
3092 PyErr_Format(PyExc_TypeError,
3093 "%s%s argument after ** must be a dictionary",
3094 fn ? PyString_AsString(fn) : "function",
3095 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003096 goto ext_call_fail;
3097 }
3098 }
3099 if (flags & CALL_FLAG_VAR) {
3100 stararg = EXT_POP(*pp_stack);
3101 if (!PyTuple_Check(stararg)) {
3102 PyObject *t = NULL;
3103 t = PySequence_Tuple(stararg);
3104 if (t == NULL) {
3105 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003106 PyObject* fn =
3107 ((PyFunctionObject*) func)->func_name;
3108 PyErr_Format(PyExc_TypeError,
3109 "%s%s argument after * must be a sequence",
3110 fn ? PyString_AsString(fn) : "function",
3111 fn ? "()" : "");
Jeremy Hylton52820442001-01-03 23:52:36 +00003112 }
3113 goto ext_call_fail;
3114 }
3115 Py_DECREF(stararg);
3116 stararg = t;
3117 }
3118 nstar = PyTuple_GET_SIZE(stararg);
3119 }
3120 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003121 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003122 if (kwdict == NULL)
3123 goto ext_call_fail;
3124 }
3125 callargs = update_star_args(na, nstar, stararg, pp_stack);
3126 if (callargs == NULL)
3127 goto ext_call_fail;
3128 result = call_object(func, callargs, kwdict);
3129 ext_call_fail:
3130 Py_XDECREF(callargs);
3131 Py_XDECREF(kwdict);
3132 Py_XDECREF(stararg);
3133 return result;
3134}
3135
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003136#define SLICE_ERROR_MSG \
3137 "standard sequence type does not support step size other than one"
3138
Guido van Rossumb209a111997-04-29 18:18:01 +00003139static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003140loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141{
Guido van Rossumb209a111997-04-29 18:18:01 +00003142 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003143 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003144 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003145 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146 return NULL;
3147 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003148 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003149 v = (*sq->sq_item)(v, i);
3150 if (v)
3151 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003152 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003153 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003154 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155}
3156
Guido van Rossum20c6add2000-05-08 14:06:50 +00003157/* Extract a slice index from a PyInt or PyLong, the index is bound to
3158 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3159 and error. Returns 1 on success.*/
3160
3161int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003162_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163{
3164 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003165 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003166 if (PyInt_Check(v)) {
3167 x = PyInt_AsLong(v);
3168 } else if (PyLong_Check(v)) {
3169 x = PyLong_AsLong(v);
3170 if (x==-1 && PyErr_Occurred()) {
3171 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003172 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003173
Guido van Rossumac7be682001-01-17 15:42:30 +00003174 if (!PyErr_ExceptionMatches(
3175 PyExc_OverflowError)) {
3176 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003177 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003178 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003179 }
3180
Guido van Rossumac7be682001-01-17 15:42:30 +00003181 /* Clear the OverflowError */
3182 PyErr_Clear();
3183
3184 /* It's an overflow error, so we need to
3185 check the sign of the long integer,
3186 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003187 the error. */
3188
3189 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003190 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003191 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003192
3193 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003194 cmp = PyObject_RichCompareBool(v, long_zero,
3195 Py_GT);
3196 Py_DECREF(long_zero);
3197 if (cmp < 0)
3198 return 0;
3199 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003200 x = INT_MAX;
3201 else
3202 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003203 }
3204 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003205 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003206 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003207 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003209 /* Truncate -- very long indices are truncated anyway */
3210 if (x > INT_MAX)
3211 x = INT_MAX;
3212 else if (x < -INT_MAX)
3213 x = 0;
3214 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003216 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217}
3218
Guido van Rossumb209a111997-04-29 18:18:01 +00003219static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003220apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003222 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003223 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003225 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003226 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003227 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003229
3230static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003231assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3232 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003233{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003234 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003235 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003236 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003237 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003238 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003239 if (x == NULL)
3240 return PySequence_DelSlice(u, ilow, ihigh);
3241 else
3242 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243}
3244
Guido van Rossumb209a111997-04-29 18:18:01 +00003245static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003246cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247{
Guido van Rossumac7be682001-01-17 15:42:30 +00003248 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003249 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003250 case IS:
3251 case IS_NOT:
3252 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003253 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003254 res = !res;
3255 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256 case IN:
3257 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003258 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003259 if (res < 0)
3260 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003261 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003262 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 break;
3264 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003265 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 break;
3267 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003268 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003269 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003270 v = res ? Py_True : Py_False;
3271 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272 return v;
3273}
3274
Thomas Wouters52152252000-08-17 22:55:00 +00003275static PyObject *
3276import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003277{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003278 PyObject *x;
3279
3280 x = PyObject_GetAttr(v, name);
3281 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003282 PyErr_Format(PyExc_ImportError,
3283 "cannot import name %.230s",
3284 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003285 }
Thomas Wouters52152252000-08-17 22:55:00 +00003286 return x;
3287}
Guido van Rossumac7be682001-01-17 15:42:30 +00003288
Thomas Wouters52152252000-08-17 22:55:00 +00003289static int
3290import_all_from(PyObject *locals, PyObject *v)
3291{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003292 PyObject *all = PyObject_GetAttrString(v, "__all__");
3293 PyObject *dict, *name, *value;
3294 int skip_leading_underscores = 0;
3295 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003296
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003297 if (all == NULL) {
3298 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3299 return -1; /* Unexpected error */
3300 PyErr_Clear();
3301 dict = PyObject_GetAttrString(v, "__dict__");
3302 if (dict == NULL) {
3303 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3304 return -1;
3305 PyErr_SetString(PyExc_ImportError,
3306 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003307 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003308 }
3309 all = PyMapping_Keys(dict);
3310 Py_DECREF(dict);
3311 if (all == NULL)
3312 return -1;
3313 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003314 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003315
3316 for (pos = 0, err = 0; ; pos++) {
3317 name = PySequence_GetItem(all, pos);
3318 if (name == NULL) {
3319 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3320 err = -1;
3321 else
3322 PyErr_Clear();
3323 break;
3324 }
3325 if (skip_leading_underscores &&
3326 PyString_Check(name) &&
3327 PyString_AS_STRING(name)[0] == '_')
3328 {
3329 Py_DECREF(name);
3330 continue;
3331 }
3332 value = PyObject_GetAttr(v, name);
3333 if (value == NULL)
3334 err = -1;
3335 else
3336 err = PyDict_SetItem(locals, name, value);
3337 Py_DECREF(name);
3338 Py_XDECREF(value);
3339 if (err != 0)
3340 break;
3341 }
3342 Py_DECREF(all);
3343 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003344}
3345
Guido van Rossumb209a111997-04-29 18:18:01 +00003346static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003347build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003348{
Guido van Rossumcd649651997-08-22 16:56:16 +00003349 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003350 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003351 PyErr_SetString(PyExc_SystemError,
3352 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003353 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003354 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003355 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003356 PyErr_SetString(PyExc_SystemError,
3357 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003358 return NULL;
3359 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003360 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003361 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003362 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003363 return NULL;
3364 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003365 n = PyTuple_Size(bases);
3366 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003367 PyObject *base = PyTuple_GET_ITEM(bases, i);
3368 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003369 /* Call the base's *type*, if it is callable.
3370 This code is a hook for Donald Beaudry's
3371 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003372 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003373 since its types are not callable.
3374 Ditto: call the bases's *class*, if it has
3375 one. This makes the same thing possible
3376 without writing C code. A true meta-object
3377 protocol! */
3378 PyObject *basetype = (PyObject *)base->ob_type;
3379 PyObject *callable = NULL;
3380 if (PyCallable_Check(basetype))
3381 callable = basetype;
3382 else
3383 callable = PyObject_GetAttrString(
3384 base, "__class__");
3385 if (callable) {
3386 PyObject *args;
3387 PyObject *newclass = NULL;
3388 args = Py_BuildValue(
3389 "(OOO)", name, bases, methods);
3390 if (args != NULL) {
3391 newclass = PyEval_CallObject(
3392 callable, args);
3393 Py_DECREF(args);
3394 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003395 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003396 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003397 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003398 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003399 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003400 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003401 "base is not a class object");
3402 return NULL;
3403 }
3404 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003405 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003406}
3407
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003408static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003409exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3410 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003411{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003412 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003413 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003414 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003415
Guido van Rossumb209a111997-04-29 18:18:01 +00003416 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3417 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003418 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003419 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003420 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003421 locals = PyTuple_GetItem(prog, 2);
3422 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003423 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003424 if (globals == Py_None) {
3425 globals = PyEval_GetGlobals();
3426 if (locals == Py_None) {
3427 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003428 plain = 1;
3429 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003430 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003431 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003432 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003433 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003434 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003435 !PyCode_Check(prog) &&
3436 !PyFile_Check(prog)) {
3437 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003438 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003439 return -1;
3440 }
Fred Drake661ea262000-10-24 19:57:45 +00003441 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003442 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003443 "exec: arg 2 must be a dictionary or None");
3444 return -1;
3445 }
3446 if (!PyDict_Check(locals)) {
3447 PyErr_SetString(PyExc_TypeError,
3448 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003449 return -1;
3450 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003451 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003452 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003453 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003454 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003455 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003456 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003457 FILE *fp = PyFile_AsFile(prog);
3458 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003459 if (PyEval_GetNestedScopes()) {
3460 PyCompilerFlags cf;
3461 cf.cf_nested_scopes = 1;
3462 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3463 locals, &cf);
3464 } else {
3465 v = PyRun_File(fp, name, Py_file_input, globals,
3466 locals);
3467 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003468 }
3469 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003470 char *str;
3471 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003472 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003473 if (PyEval_GetNestedScopes()) {
3474 PyCompilerFlags cf;
3475 cf.cf_nested_scopes = 1;
3476 v = PyRun_StringFlags(str, Py_file_input, globals,
3477 locals, &cf);
3478 } else
3479 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003480 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003481 if (plain)
3482 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003483 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003484 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003485 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003486 return 0;
3487}
Guido van Rossum24c13741995-02-14 09:42:43 +00003488
Guido van Rossumac7be682001-01-17 15:42:30 +00003489static void
Paul Prescode68140d2000-08-30 20:25:01 +00003490format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3491{
3492 char *obj_str;
3493
3494 if (!obj)
3495 return;
3496
3497 obj_str = PyString_AsString(obj);
3498 if (!obj_str)
3499 return;
3500
3501 PyErr_Format(exc, format_str, obj_str);
3502}
Guido van Rossum950361c1997-01-24 13:49:28 +00003503
3504#ifdef DYNAMIC_EXECUTION_PROFILE
3505
3506PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003507getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003508{
3509 int i;
3510 PyObject *l = PyList_New(256);
3511 if (l == NULL) return NULL;
3512 for (i = 0; i < 256; i++) {
3513 PyObject *x = PyInt_FromLong(a[i]);
3514 if (x == NULL) {
3515 Py_DECREF(l);
3516 return NULL;
3517 }
3518 PyList_SetItem(l, i, x);
3519 }
3520 for (i = 0; i < 256; i++)
3521 a[i] = 0;
3522 return l;
3523}
3524
3525PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003526_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003527{
3528#ifndef DXPAIRS
3529 return getarray(dxp);
3530#else
3531 int i;
3532 PyObject *l = PyList_New(257);
3533 if (l == NULL) return NULL;
3534 for (i = 0; i < 257; i++) {
3535 PyObject *x = getarray(dxpairs[i]);
3536 if (x == NULL) {
3537 Py_DECREF(l);
3538 return NULL;
3539 }
3540 PyList_SetItem(l, i, x);
3541 }
3542 return l;
3543#endif
3544}
3545
3546#endif