blob: ceecdb15efa7582b26d3c45c7322ea7dd7cdf63d [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
Jeremy Hylton512a2372001-04-11 13:52:29 +000043static char *get_func_name(PyObject *);
44static char *get_func_desc(PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000045static PyObject *call_object(PyObject *, PyObject *, PyObject *);
46static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
47static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
48static PyObject *call_method(PyObject *, PyObject *, PyObject *);
49static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
50static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
51static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
52static PyObject *do_call(PyObject *, PyObject ***, int, int);
53static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000054static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000055static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000056static PyObject *load_args(PyObject ***, int);
57#define CALL_FLAG_VAR 1
58#define CALL_FLAG_KW 2
59
Guido van Rossum0a066c01992-03-27 17:29:15 +000060#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000061static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000062#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000063static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
64static int call_trace(PyObject **, PyObject **,
Fred Drake904aa7b2001-06-08 04:33:09 +000065 PyFrameObject *, char *, PyObject **, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000066static PyObject *loop_subscript(PyObject *, PyObject *);
67static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
68static int assign_slice(PyObject *, PyObject *,
69 PyObject *, PyObject *);
70static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000071static PyObject *import_from(PyObject *, PyObject *);
72static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000073static PyObject *build_class(PyObject *, PyObject *, PyObject *);
74static int exec_statement(PyFrameObject *,
75 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000076static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
77static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000078static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000079
Paul Prescode68140d2000-08-30 20:25:01 +000080#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000081 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082#define GLOBAL_NAME_ERROR_MSG \
83 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000084#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000085 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000086#define UNBOUNDFREE_ERROR_MSG \
87 "free variable '%.200s' referenced before assignment" \
88 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000089
Guido van Rossum950361c1997-01-24 13:49:28 +000090/* Dynamic execution profile */
91#ifdef DYNAMIC_EXECUTION_PROFILE
92#ifdef DXPAIRS
93static long dxpairs[257][256];
94#define dxp dxpairs[256]
95#else
96static long dxp[256];
97#endif
98#endif
99
Fred Drake904aa7b2001-06-08 04:33:09 +0000100/* Cached interned string objects used for calling the profile and
101 * trace functions.
102 */
103static PyObject *str_call = NULL;
104static PyObject *str_exception = NULL;
105static PyObject *str_line = NULL;
106static PyObject *str_return = NULL;
107
108
Guido van Rossume59214e1994-08-30 08:01:59 +0000109#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000110
Guido van Rossum2571cc81999-04-07 16:07:23 +0000111#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000112#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000113#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000114#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000115
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116extern int _PyThread_Started; /* Flag for Py_Exit */
117
Guido van Rossum65d5b571998-12-21 19:32:43 +0000118static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000119static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000120
121void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000122PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000123{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000124 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000125 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000126 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000127 interpreter_lock = PyThread_allocate_lock();
128 PyThread_acquire_lock(interpreter_lock, 1);
129 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000130}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000131
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000132void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000133PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000134{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000135 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136}
137
138void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000139PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000140{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000141 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000142}
143
144void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000145PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000146{
147 if (tstate == NULL)
148 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000149 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000150 if (PyThreadState_Swap(tstate) != NULL)
151 Py_FatalError(
152 "PyEval_AcquireThread: non-NULL old thread state");
153}
154
155void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000156PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000157{
158 if (tstate == NULL)
159 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
160 if (PyThreadState_Swap(NULL) != tstate)
161 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000162 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000163}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000164
165/* This function is called from PyOS_AfterFork to ensure that newly
166 created child processes don't hold locks referring to threads which
167 are not running in the child process. (This could also be done using
168 pthread_atfork mechanism, at least for the pthreads implementation.) */
169
170void
171PyEval_ReInitThreads(void)
172{
173 if (!interpreter_lock)
174 return;
175 /*XXX Can't use PyThread_free_lock here because it does too
176 much error-checking. Doing this cleanly would require
177 adding a new function to each thread_*.h. Instead, just
178 create a new lock and waste a little bit of memory */
179 interpreter_lock = PyThread_allocate_lock();
180 PyThread_acquire_lock(interpreter_lock, 1);
181 main_thread = PyThread_get_thread_ident();
182}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000183#endif
184
Guido van Rossumff4949e1992-08-05 19:58:53 +0000185/* Functions save_thread and restore_thread are always defined so
186 dynamically loaded modules needn't be compiled separately for use
187 with and without threads: */
188
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000189PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000190PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000191{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000192 PyThreadState *tstate = PyThreadState_Swap(NULL);
193 if (tstate == NULL)
194 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000195#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000196 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000197 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000199 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200}
201
202void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000203PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000204{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000205 if (tstate == NULL)
206 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000207#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000208 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000209 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000210 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000211 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000212 }
213#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000214 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000215}
216
217
Guido van Rossuma9672091994-09-14 13:31:22 +0000218/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
219 signal handlers or Mac I/O completion routines) can schedule calls
220 to a function to be called synchronously.
221 The synchronous function is called with one void* argument.
222 It should return 0 for success or -1 for failure -- failure should
223 be accompanied by an exception.
224
225 If registry succeeds, the registry function returns 0; if it fails
226 (e.g. due to too many pending calls) it returns -1 (without setting
227 an exception condition).
228
229 Note that because registry may occur from within signal handlers,
230 or other asynchronous events, calling malloc() is unsafe!
231
232#ifdef WITH_THREAD
233 Any thread can schedule pending calls, but only the main thread
234 will execute them.
235#endif
236
237 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
238 There are two possible race conditions:
239 (1) nested asynchronous registry calls;
240 (2) registry calls made while pending calls are being processed.
241 While (1) is very unlikely, (2) is a real possibility.
242 The current code is safe against (2), but not against (1).
243 The safety against (2) is derived from the fact that only one
244 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000245
Guido van Rossuma027efa1997-05-05 20:56:21 +0000246 XXX Darn! With the advent of thread state, we should have an array
247 of pending calls per thread in the thread state! Later...
248*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000249
Guido van Rossuma9672091994-09-14 13:31:22 +0000250#define NPENDINGCALLS 32
251static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000252 int (*func)(void *);
253 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000254} pendingcalls[NPENDINGCALLS];
255static volatile int pendingfirst = 0;
256static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000257static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000258
259int
Thomas Wouters334fb892000-07-25 12:56:38 +0000260Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000261{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000262 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000263 int i, j;
264 /* XXX Begin critical section */
265 /* XXX If you want this to be safe against nested
266 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000267 if (busy)
268 return -1;
269 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000270 i = pendinglast;
271 j = (i + 1) % NPENDINGCALLS;
272 if (j == pendingfirst)
273 return -1; /* Queue full */
274 pendingcalls[i].func = func;
275 pendingcalls[i].arg = arg;
276 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000277 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000278 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000279 /* XXX End critical section */
280 return 0;
281}
282
Guido van Rossum180d7b41994-09-29 09:45:57 +0000283int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000284Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000285{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000286 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000287#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000288 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000289 return 0;
290#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000291 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000292 return 0;
293 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000294 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000295 for (;;) {
296 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000297 int (*func)(void *);
298 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000299 i = pendingfirst;
300 if (i == pendinglast)
301 break; /* Queue empty */
302 func = pendingcalls[i].func;
303 arg = pendingcalls[i].arg;
304 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000305 if (func(arg) < 0) {
306 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000307 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000308 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000309 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000310 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000311 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000312 return 0;
313}
314
315
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000316/* The interpreter's recursion limit */
317
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000318static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000319
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000320int
321Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000322{
323 return recursion_limit;
324}
325
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000326void
327Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000328{
329 recursion_limit = new_limit;
330}
331
Guido van Rossum374a9221991-04-04 10:40:29 +0000332/* Status code for main loop (reason for stack unwind) */
333
334enum why_code {
335 WHY_NOT, /* No error */
336 WHY_EXCEPTION, /* Exception occurred */
337 WHY_RERAISE, /* Exception re-raised by 'finally' */
338 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000339 WHY_BREAK, /* 'break' statement */
Thomas Woutersfc93b0a2001-02-16 11:52:31 +0000340 WHY_CONTINUE /* 'continue' statement */
Guido van Rossum374a9221991-04-04 10:40:29 +0000341};
342
Tim Petersdbd9ba62000-07-09 03:09:57 +0000343static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
344static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000345
Guido van Rossum374a9221991-04-04 10:40:29 +0000346
Guido van Rossumb209a111997-04-29 18:18:01 +0000347PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000348PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000349{
350 return eval_code2(co,
351 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000352 (PyObject **)NULL, 0,
353 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000354 (PyObject **)NULL, 0,
355 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000356}
357
358
359/* Interpreter main loop */
360
Guido van Rossumb209a111997-04-29 18:18:01 +0000361static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000362eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
363 PyObject **args, int argcount, PyObject **kws, int kwcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000364 PyObject **defs, int defcount, PyObject *closure)
Guido van Rossum374a9221991-04-04 10:40:29 +0000365{
Guido van Rossum950361c1997-01-24 13:49:28 +0000366#ifdef DXPAIRS
367 int lastopcode = 0;
368#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000369 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000370 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000371 register int opcode=0; /* Current opcode */
372 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000373 register enum why_code why; /* Reason for block stack unwind */
374 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000375 register PyObject *x; /* Result object -- NULL if error */
376 register PyObject *v; /* Temporary objects popped off stack */
377 register PyObject *w;
378 register PyObject *u;
379 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000380 register PyObject *stream = NULL; /* for PRINT opcodes */
Guido van Rossumb209a111997-04-29 18:18:01 +0000381 register PyFrameObject *f; /* Current frame */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000382 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000383 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000384 PyThreadState *tstate = PyThreadState_GET();
Guido van Rossumd076c731998-10-07 19:42:25 +0000385 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000386#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000387 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000388#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000389#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000390 /* Make it easier to find out where we are with a debugger */
Guido van Rossumb209a111997-04-29 18:18:01 +0000391 char *filename = PyString_AsString(co->co_filename);
Guido van Rossum99bec951992-09-03 20:29:45 +0000392#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000393
394/* Code access macros */
395
396#define GETCONST(i) Getconst(f, i)
397#define GETNAME(i) Getname(f, i)
398#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000399#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000400#define NEXTOP() (*next_instr++)
401#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000402#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000403#define JUMPBY(x) (next_instr += (x))
404
405/* Stack manipulation macros */
406
407#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
408#define EMPTY() (STACK_LEVEL() == 0)
409#define TOP() (stack_pointer[-1])
410#define BASIC_PUSH(v) (*stack_pointer++ = (v))
411#define BASIC_POP() (*--stack_pointer)
412
Guido van Rossum96a42c81992-01-12 02:29:51 +0000413#ifdef LLTRACE
414#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
415#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000416#else
417#define PUSH(v) BASIC_PUSH(v)
418#define POP() BASIC_POP()
419#endif
420
Guido van Rossum681d79a1995-07-18 14:51:37 +0000421/* Local variable macros */
422
423#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000424#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000425 GETLOCAL(i) = value; } while (0)
426
Guido van Rossuma027efa1997-05-05 20:56:21 +0000427/* Start of code */
428
Guido van Rossum8861b741996-07-30 16:49:37 +0000429#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000430 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000431 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000432 return NULL;
433 }
434#endif
435
Guido van Rossum681d79a1995-07-18 14:51:37 +0000436 if (globals == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000437 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
Guido van Rossum6135a871995-01-09 17:53:26 +0000438 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000439 }
440
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000441#ifdef LLTRACE
Guido van Rossumb209a111997-04-29 18:18:01 +0000442 lltrace = PyDict_GetItemString(globals, "__lltrace__") != NULL;
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000443#endif
444
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000445 f = PyFrame_New(tstate, /*back*/
Guido van Rossum374a9221991-04-04 10:40:29 +0000446 co, /*code*/
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000447 globals, locals);
Guido van Rossum374a9221991-04-04 10:40:29 +0000448 if (f == NULL)
449 return NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000450
Guido van Rossuma027efa1997-05-05 20:56:21 +0000451 tstate->frame = f;
Guido van Rossumdeb0c5e1997-01-27 23:42:36 +0000452 fastlocals = f->f_localsplus;
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000453 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000454
455 if (co->co_argcount > 0 ||
456 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
457 int i;
458 int n = argcount;
Guido van Rossumb209a111997-04-29 18:18:01 +0000459 PyObject *kwdict = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000460 if (co->co_flags & CO_VARKEYWORDS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000461 kwdict = PyDict_New();
Guido van Rossum681d79a1995-07-18 14:51:37 +0000462 if (kwdict == NULL)
463 goto fail;
Guido van Rossum8c5df061997-01-24 04:19:24 +0000464 i = co->co_argcount;
465 if (co->co_flags & CO_VARARGS)
466 i++;
467 SETLOCAL(i, kwdict);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000468 }
469 if (argcount > co->co_argcount) {
470 if (!(co->co_flags & CO_VARARGS)) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000471 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000472 "%.200s() takes %s %d "
473 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000474 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000475 defcount ? "at most" : "exactly",
476 co->co_argcount,
477 kwcount ? "non-keyword " : "",
478 co->co_argcount == 1 ? "" : "s",
479 argcount);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000480 goto fail;
481 }
482 n = co->co_argcount;
483 }
484 for (i = 0; i < n; i++) {
485 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000486 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000487 SETLOCAL(i, x);
488 }
489 if (co->co_flags & CO_VARARGS) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000490 u = PyTuple_New(argcount - n);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000491 if (u == NULL)
492 goto fail;
493 SETLOCAL(co->co_argcount, u);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000494 for (i = n; i < argcount; i++) {
495 x = args[i];
Guido van Rossumb209a111997-04-29 18:18:01 +0000496 Py_INCREF(x);
497 PyTuple_SET_ITEM(u, i-n, x);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000498 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000499 }
500 for (i = 0; i < kwcount; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000501 PyObject *keyword = kws[2*i];
502 PyObject *value = kws[2*i + 1];
Guido van Rossum681d79a1995-07-18 14:51:37 +0000503 int j;
Guido van Rossum25da5be1999-10-26 00:12:20 +0000504 if (keyword == NULL || !PyString_Check(keyword)) {
Ka-Ping Yee20579702001-01-15 22:14:16 +0000505 PyErr_Format(PyExc_TypeError,
506 "%.200s() keywords must be strings",
507 PyString_AsString(co->co_name));
Guido van Rossum25da5be1999-10-26 00:12:20 +0000508 goto fail;
509 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510 /* XXX slow -- speed up using dictionary? */
511 for (j = 0; j < co->co_argcount; j++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000512 PyObject *nm = PyTuple_GET_ITEM(
513 co->co_varnames, j);
Guido van Rossumac7be682001-01-17 15:42:30 +0000514 int cmp = PyObject_RichCompareBool(
515 keyword, nm, Py_EQ);
516 if (cmp > 0)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000517 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000518 else if (cmp < 0)
519 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000520 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000521 /* Check errors from Compare */
522 if (PyErr_Occurred())
523 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000524 if (j >= co->co_argcount) {
525 if (kwdict == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000526 PyErr_Format(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000527 "%.200s() got an unexpected "
528 "keyword argument '%.400s'",
529 PyString_AsString(co->co_name),
Jeremy Hylton76901512000-03-28 23:49:17 +0000530 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000531 goto fail;
532 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000533 PyDict_SetItem(kwdict, keyword, value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000534 }
535 else {
536 if (GETLOCAL(j) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000537 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000538 "%.200s() got multiple "
539 "values for keyword "
540 "argument '%.400s'",
541 PyString_AsString(co->co_name),
542 PyString_AsString(keyword));
Guido van Rossum681d79a1995-07-18 14:51:37 +0000543 goto fail;
544 }
Guido van Rossumb209a111997-04-29 18:18:01 +0000545 Py_INCREF(value);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000546 SETLOCAL(j, value);
547 }
548 }
549 if (argcount < co->co_argcount) {
550 int m = co->co_argcount - defcount;
551 for (i = argcount; i < m; i++) {
552 if (GETLOCAL(i) == NULL) {
Guido van Rossumdf9db1e1997-11-19 16:05:40 +0000553 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000554 "%.200s() takes %s %d "
555 "%sargument%s (%d given)",
Fred Drake661ea262000-10-24 19:57:45 +0000556 PyString_AsString(co->co_name),
Ka-Ping Yee20579702001-01-15 22:14:16 +0000557 ((co->co_flags & CO_VARARGS) ||
558 defcount) ? "at least"
559 : "exactly",
560 m, kwcount ? "non-keyword " : "",
561 m == 1 ? "" : "s", i);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000562 goto fail;
563 }
564 }
565 if (n > m)
566 i = n - m;
567 else
568 i = 0;
569 for (; i < defcount; i++) {
570 if (GETLOCAL(m+i) == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000571 PyObject *def = defs[i];
572 Py_INCREF(def);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573 SETLOCAL(m+i, def);
574 }
575 }
576 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000577 }
578 else {
579 if (argcount > 0 || kwcount > 0) {
Fred Drake661ea262000-10-24 19:57:45 +0000580 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +0000581 "%.200s() takes no arguments (%d given)",
582 PyString_AsString(co->co_name),
583 argcount + kwcount);
Guido van Rossum8c5df061997-01-24 04:19:24 +0000584 goto fail;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000585 }
586 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000587 /* Allocate and initialize storage for cell vars, and copy free
588 vars into frame. This isn't too efficient right now. */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000589 if (f->f_ncells) {
Jeremy Hylton220ae7c2001-03-21 16:43:47 +0000590 int i = 0, j = 0, nargs, found;
591 char *cellname, *argname;
592 PyObject *c;
593
594 nargs = co->co_argcount;
595 if (co->co_flags & CO_VARARGS)
596 nargs++;
597 if (co->co_flags & CO_VARKEYWORDS)
598 nargs++;
599
600 /* Check for cells that shadow args */
601 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
602 cellname = PyString_AS_STRING(
603 PyTuple_GET_ITEM(co->co_cellvars, i));
604 found = 0;
605 while (j < nargs) {
606 argname = PyString_AS_STRING(
607 PyTuple_GET_ITEM(co->co_varnames, j));
608 if (strcmp(cellname, argname) == 0) {
609 c = PyCell_New(GETLOCAL(j));
610 if (c == NULL)
611 goto fail;
612 GETLOCAL(f->f_nlocals + i) = c;
613 found = 1;
614 break;
615 }
616 j++;
617 }
618 if (found == 0) {
619 c = PyCell_New(NULL);
620 if (c == NULL)
621 goto fail;
622 SETLOCAL(f->f_nlocals + i, c);
623 }
624 }
625 /* Initialize any that are left */
626 while (i < f->f_ncells) {
627 c = PyCell_New(NULL);
628 if (c == NULL)
629 goto fail;
630 SETLOCAL(f->f_nlocals + i, c);
631 i++;
632 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000633 }
634 if (f->f_nfreevars) {
635 int i;
Jeremy Hylton30c9f392001-03-13 01:58:22 +0000636 for (i = 0; i < f->f_nfreevars; ++i) {
637 PyObject *o = PyTuple_GET_ITEM(closure, i);
638 Py_INCREF(o);
639 freevars[f->f_ncells + i] = o;
640 }
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000641 }
Guido van Rossum681d79a1995-07-18 14:51:37 +0000642
Guido van Rossuma027efa1997-05-05 20:56:21 +0000643 if (tstate->sys_tracefunc != NULL) {
644 /* tstate->sys_tracefunc, if defined, is a function that
645 will be called on *every* entry to a code block.
Guido van Rossum96a42c81992-01-12 02:29:51 +0000646 Its return value, if not None, is a function that
647 will be called at the start of each executed line
648 of code. (Actually, the function must return
649 itself in order to continue tracing.)
650 The trace functions are called with three arguments:
651 a pointer to the current frame, a string indicating
652 why the function is called, and an argument which
653 depends on the situation. The global trace function
654 (sys.trace) is also called whenever an exception
655 is detected. */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000656 if (call_trace(&tstate->sys_tracefunc,
Fred Drake904aa7b2001-06-08 04:33:09 +0000657 &f->f_trace, f, "call", &str_call,
Guido van Rossumb209a111997-04-29 18:18:01 +0000658 Py_None/*XXX how to compute arguments now?*/)) {
Guido van Rossum96a42c81992-01-12 02:29:51 +0000659 /* Trace function raised an error */
Guido van Rossum8c5df061997-01-24 04:19:24 +0000660 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000661 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000662 }
663
Guido van Rossuma027efa1997-05-05 20:56:21 +0000664 if (tstate->sys_profilefunc != NULL) {
665 /* Similar for sys_profilefunc, except it needn't return
Guido van Rossum9c8d70d1992-03-23 18:19:28 +0000666 itself and isn't called for "line" events */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000667 if (call_trace(&tstate->sys_profilefunc,
Fred Drake904aa7b2001-06-08 04:33:09 +0000668 (PyObject**)0, f, "call", &str_call,
Guido van Rossumb209a111997-04-29 18:18:01 +0000669 Py_None/*XXX*/)) {
Guido van Rossum8c5df061997-01-24 04:19:24 +0000670 goto fail;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000671 }
672 }
Guido van Rossume59214e1994-08-30 08:01:59 +0000673
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000674 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000675 --tstate->recursion_depth;
676 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000677 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000678 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +0000679 Py_DECREF(f);
Guido van Rossum8861b741996-07-30 16:49:37 +0000680 return NULL;
681 }
682
Guido van Rossumd076c731998-10-07 19:42:25 +0000683 _PyCode_GETCODEPTR(co, &first_instr);
684 next_instr = first_instr;
Guido van Rossum374a9221991-04-04 10:40:29 +0000685 stack_pointer = f->f_valuestack;
Guido van Rossumac7be682001-01-17 15:42:30 +0000686
Guido van Rossum374a9221991-04-04 10:40:29 +0000687 why = WHY_NOT;
688 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000689 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000690 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000691
Guido van Rossum374a9221991-04-04 10:40:29 +0000692 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000693 /* Do periodic things. Doing this every time through
694 the loop would add too much overhead, so we do it
695 only every Nth instruction. We also do it if
696 ``things_to_do'' is set, i.e. when an asynchronous
697 event needs attention (e.g. a signal handler or
698 async I/O handler); see Py_AddPendingCall() and
699 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000700
Guido van Rossuma027efa1997-05-05 20:56:21 +0000701 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000702 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000703 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000704 if (Py_MakePendingCalls() < 0) {
705 why = WHY_EXCEPTION;
706 goto on_error;
707 }
708 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000709#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000710 /* If we have true signals, the signal handler
711 will call Py_AddPendingCall() so we don't
712 have to call sigcheck(). On the Mac and
713 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000714 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000716 goto on_error;
717 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000718#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000719
Guido van Rossume59214e1994-08-30 08:01:59 +0000720#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000721 if (interpreter_lock) {
722 /* Give another thread a chance */
723
Guido van Rossum25ce5661997-08-02 03:10:38 +0000724 if (PyThreadState_Swap(NULL) != tstate)
725 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000726 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000727
728 /* Other threads may run now */
729
Guido van Rossum65d5b571998-12-21 19:32:43 +0000730 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000731 if (PyThreadState_Swap(tstate) != NULL)
732 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000733 }
734#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000735 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000736
Guido van Rossum374a9221991-04-04 10:40:29 +0000737 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000738
Guido van Rossum408027e1996-12-30 16:17:54 +0000739#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000740 f->f_lasti = INSTR_OFFSET();
741#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000742
Guido van Rossum374a9221991-04-04 10:40:29 +0000743 opcode = NEXTOP();
744 if (HAS_ARG(opcode))
745 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000746 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000747#ifdef DYNAMIC_EXECUTION_PROFILE
748#ifdef DXPAIRS
749 dxpairs[lastopcode][opcode]++;
750 lastopcode = opcode;
751#endif
752 dxp[opcode]++;
753#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000754
Guido van Rossum96a42c81992-01-12 02:29:51 +0000755#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000756 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000757
Guido van Rossum96a42c81992-01-12 02:29:51 +0000758 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000759 if (HAS_ARG(opcode)) {
760 printf("%d: %d, %d\n",
761 (int) (INSTR_OFFSET() - 3),
762 opcode, oparg);
763 }
764 else {
765 printf("%d: %d\n",
766 (int) (INSTR_OFFSET() - 1), opcode);
767 }
768 }
769#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000770 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000771
Guido van Rossum374a9221991-04-04 10:40:29 +0000772 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000773
Guido van Rossum374a9221991-04-04 10:40:29 +0000774 /* BEWARE!
775 It is essential that any operation that fails sets either
776 x to NULL, err to nonzero, or why to anything but WHY_NOT,
777 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000778
Guido van Rossum374a9221991-04-04 10:40:29 +0000779 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000780
Guido van Rossum374a9221991-04-04 10:40:29 +0000781 case POP_TOP:
782 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000783 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000784 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000785
Guido van Rossum374a9221991-04-04 10:40:29 +0000786 case ROT_TWO:
787 v = POP();
788 w = POP();
789 PUSH(v);
790 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000791 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000792
Guido van Rossum374a9221991-04-04 10:40:29 +0000793 case ROT_THREE:
794 v = POP();
795 w = POP();
796 x = POP();
797 PUSH(v);
798 PUSH(x);
799 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000800 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000801
Thomas Wouters434d0822000-08-24 20:11:32 +0000802 case ROT_FOUR:
803 u = POP();
804 v = POP();
805 w = POP();
806 x = POP();
807 PUSH(u);
808 PUSH(x);
809 PUSH(w);
810 PUSH(v);
811 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000812
Guido van Rossum374a9221991-04-04 10:40:29 +0000813 case DUP_TOP:
814 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000815 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000817 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000818
Thomas Wouters434d0822000-08-24 20:11:32 +0000819 case DUP_TOPX:
820 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000821 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000822 x = TOP();
823 Py_INCREF(x);
824 PUSH(x);
825 continue;
826 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000827 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000828 Py_INCREF(x);
829 w = TOP();
830 Py_INCREF(w);
831 PUSH(x);
832 PUSH(w);
833 PUSH(x);
834 continue;
835 case 3:
836 x = POP();
837 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000838 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000839 Py_INCREF(w);
840 v = TOP();
841 Py_INCREF(v);
842 PUSH(w);
843 PUSH(x);
844 PUSH(v);
845 PUSH(w);
846 PUSH(x);
847 continue;
848 case 4:
849 x = POP();
850 Py_INCREF(x);
851 w = POP();
852 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000853 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000854 Py_INCREF(v);
855 u = TOP();
856 Py_INCREF(u);
857 PUSH(v);
858 PUSH(w);
859 PUSH(x);
860 PUSH(u);
861 PUSH(v);
862 PUSH(w);
863 PUSH(x);
864 continue;
865 case 5:
866 x = POP();
867 Py_INCREF(x);
868 w = POP();
869 Py_INCREF(w);
870 v = POP();
871 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000872 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000873 Py_INCREF(u);
874 t = TOP();
875 Py_INCREF(t);
876 PUSH(u);
877 PUSH(v);
878 PUSH(w);
879 PUSH(x);
880 PUSH(t);
881 PUSH(u);
882 PUSH(v);
883 PUSH(w);
884 PUSH(x);
885 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000886 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000887 Py_FatalError("invalid argument to DUP_TOPX"
888 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000889 }
Tim Peters35ba6892000-10-11 07:04:49 +0000890 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000891
Guido van Rossum374a9221991-04-04 10:40:29 +0000892 case UNARY_POSITIVE:
893 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000894 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000895 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000896 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000897 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000898 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000899
Guido van Rossum374a9221991-04-04 10:40:29 +0000900 case UNARY_NEGATIVE:
901 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000902 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000903 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000904 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000905 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000906 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000907
Guido van Rossum374a9221991-04-04 10:40:29 +0000908 case UNARY_NOT:
909 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000910 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000911 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000912 if (err == 0) {
913 Py_INCREF(Py_True);
914 PUSH(Py_True);
915 continue;
916 }
917 else if (err > 0) {
918 Py_INCREF(Py_False);
919 PUSH(Py_False);
920 err = 0;
921 continue;
922 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000923 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000924
Guido van Rossum374a9221991-04-04 10:40:29 +0000925 case UNARY_CONVERT:
926 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000927 x = PyObject_Repr(v);
928 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000929 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000930 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000931 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000932
Guido van Rossum7928cd71991-10-24 14:59:31 +0000933 case UNARY_INVERT:
934 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000935 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000936 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000937 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000938 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000939 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000940
Guido van Rossum50564e81996-01-12 01:13:16 +0000941 case BINARY_POWER:
942 w = POP();
943 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000944 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000945 Py_DECREF(v);
946 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000947 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000948 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000949 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000950
Guido van Rossum374a9221991-04-04 10:40:29 +0000951 case BINARY_MULTIPLY:
952 w = POP();
953 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000954 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000955 Py_DECREF(v);
956 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000957 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000958 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000959 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000960
Guido van Rossum374a9221991-04-04 10:40:29 +0000961 case BINARY_DIVIDE:
962 w = POP();
963 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000964 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000965 Py_DECREF(v);
966 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000967 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000968 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000969 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000970
Guido van Rossum374a9221991-04-04 10:40:29 +0000971 case BINARY_MODULO:
972 w = POP();
973 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000974 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000975 Py_DECREF(v);
976 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000977 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000978 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000979 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000980
Guido van Rossum374a9221991-04-04 10:40:29 +0000981 case BINARY_ADD:
982 w = POP();
983 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000984 if (PyInt_Check(v) && PyInt_Check(w)) {
985 /* INLINE: int + int */
986 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000987 a = PyInt_AS_LONG(v);
988 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000989 i = a + b;
990 if ((i^a) < 0 && (i^b) < 0) {
991 PyErr_SetString(PyExc_OverflowError,
992 "integer addition");
993 x = NULL;
994 }
995 else
996 x = PyInt_FromLong(i);
997 }
998 else
999 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001000 Py_DECREF(v);
1001 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001002 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001003 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001004 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001005
Guido van Rossum374a9221991-04-04 10:40:29 +00001006 case BINARY_SUBTRACT:
1007 w = POP();
1008 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001009 if (PyInt_Check(v) && PyInt_Check(w)) {
1010 /* INLINE: int - int */
1011 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001012 a = PyInt_AS_LONG(v);
1013 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001014 i = a - b;
1015 if ((i^a) < 0 && (i^~b) < 0) {
1016 PyErr_SetString(PyExc_OverflowError,
1017 "integer subtraction");
1018 x = NULL;
1019 }
1020 else
1021 x = PyInt_FromLong(i);
1022 }
1023 else
1024 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001025 Py_DECREF(v);
1026 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001027 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001028 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001029 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001030
Guido van Rossum374a9221991-04-04 10:40:29 +00001031 case BINARY_SUBSCR:
1032 w = POP();
1033 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001034 if (PyList_Check(v) && PyInt_Check(w)) {
1035 /* INLINE: list[int] */
1036 long i = PyInt_AsLong(w);
1037 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +00001038 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +00001039 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +00001040 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +00001041 PyErr_SetString(PyExc_IndexError,
1042 "list index out of range");
1043 x = NULL;
1044 }
1045 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +00001046 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +00001047 Py_INCREF(x);
1048 }
1049 }
1050 else
1051 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001052 Py_DECREF(v);
1053 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001054 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001055 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001056 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001057
Guido van Rossum7928cd71991-10-24 14:59:31 +00001058 case BINARY_LSHIFT:
1059 w = POP();
1060 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001061 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001062 Py_DECREF(v);
1063 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001064 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001065 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001066 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001067
Guido van Rossum7928cd71991-10-24 14:59:31 +00001068 case BINARY_RSHIFT:
1069 w = POP();
1070 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001071 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001072 Py_DECREF(v);
1073 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001074 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001075 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001076 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001077
Guido van Rossum7928cd71991-10-24 14:59:31 +00001078 case BINARY_AND:
1079 w = POP();
1080 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001081 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001082 Py_DECREF(v);
1083 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001084 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001085 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001086 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001087
Guido van Rossum7928cd71991-10-24 14:59:31 +00001088 case BINARY_XOR:
1089 w = POP();
1090 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001091 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001092 Py_DECREF(v);
1093 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001094 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001095 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001096 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001097
Guido van Rossum7928cd71991-10-24 14:59:31 +00001098 case BINARY_OR:
1099 w = POP();
1100 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001101 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001102 Py_DECREF(v);
1103 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001104 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001105 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001106 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001107
1108 case INPLACE_POWER:
1109 w = POP();
1110 v = POP();
1111 x = PyNumber_InPlacePower(v, w, Py_None);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Thomas Wouters434d0822000-08-24 20:11:32 +00001118 case INPLACE_MULTIPLY:
1119 w = POP();
1120 v = POP();
1121 x = PyNumber_InPlaceMultiply(v, w);
1122 Py_DECREF(v);
1123 Py_DECREF(w);
1124 PUSH(x);
1125 if (x != NULL) continue;
1126 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001127
Thomas Wouters434d0822000-08-24 20:11:32 +00001128 case INPLACE_DIVIDE:
1129 w = POP();
1130 v = POP();
1131 x = PyNumber_InPlaceDivide(v, w);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
1134 PUSH(x);
1135 if (x != NULL) continue;
1136 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001137
Thomas Wouters434d0822000-08-24 20:11:32 +00001138 case INPLACE_MODULO:
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceRemainder(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001147
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 case INPLACE_ADD:
1149 w = POP();
1150 v = POP();
1151 if (PyInt_Check(v) && PyInt_Check(w)) {
1152 /* INLINE: int + int */
1153 register long a, b, i;
1154 a = PyInt_AS_LONG(v);
1155 b = PyInt_AS_LONG(w);
1156 i = a + b;
1157 if ((i^a) < 0 && (i^b) < 0) {
1158 PyErr_SetString(PyExc_OverflowError,
1159 "integer addition");
1160 x = NULL;
1161 }
1162 else
1163 x = PyInt_FromLong(i);
1164 }
1165 else
1166 x = PyNumber_InPlaceAdd(v, w);
1167 Py_DECREF(v);
1168 Py_DECREF(w);
1169 PUSH(x);
1170 if (x != NULL) continue;
1171 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001172
Thomas Wouters434d0822000-08-24 20:11:32 +00001173 case INPLACE_SUBTRACT:
1174 w = POP();
1175 v = POP();
1176 if (PyInt_Check(v) && PyInt_Check(w)) {
1177 /* INLINE: int - int */
1178 register long a, b, i;
1179 a = PyInt_AS_LONG(v);
1180 b = PyInt_AS_LONG(w);
1181 i = a - b;
1182 if ((i^a) < 0 && (i^~b) < 0) {
1183 PyErr_SetString(PyExc_OverflowError,
1184 "integer subtraction");
1185 x = NULL;
1186 }
1187 else
1188 x = PyInt_FromLong(i);
1189 }
1190 else
1191 x = PyNumber_InPlaceSubtract(v, w);
1192 Py_DECREF(v);
1193 Py_DECREF(w);
1194 PUSH(x);
1195 if (x != NULL) continue;
1196 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001197
Thomas Wouters434d0822000-08-24 20:11:32 +00001198 case INPLACE_LSHIFT:
1199 w = POP();
1200 v = POP();
1201 x = PyNumber_InPlaceLshift(v, w);
1202 Py_DECREF(v);
1203 Py_DECREF(w);
1204 PUSH(x);
1205 if (x != NULL) continue;
1206 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001207
Thomas Wouters434d0822000-08-24 20:11:32 +00001208 case INPLACE_RSHIFT:
1209 w = POP();
1210 v = POP();
1211 x = PyNumber_InPlaceRshift(v, w);
1212 Py_DECREF(v);
1213 Py_DECREF(w);
1214 PUSH(x);
1215 if (x != NULL) continue;
1216 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001217
Thomas Wouters434d0822000-08-24 20:11:32 +00001218 case INPLACE_AND:
1219 w = POP();
1220 v = POP();
1221 x = PyNumber_InPlaceAnd(v, w);
1222 Py_DECREF(v);
1223 Py_DECREF(w);
1224 PUSH(x);
1225 if (x != NULL) continue;
1226 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001227
Thomas Wouters434d0822000-08-24 20:11:32 +00001228 case INPLACE_XOR:
1229 w = POP();
1230 v = POP();
1231 x = PyNumber_InPlaceXor(v, w);
1232 Py_DECREF(v);
1233 Py_DECREF(w);
1234 PUSH(x);
1235 if (x != NULL) continue;
1236 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001237
Thomas Wouters434d0822000-08-24 20:11:32 +00001238 case INPLACE_OR:
1239 w = POP();
1240 v = POP();
1241 x = PyNumber_InPlaceOr(v, w);
1242 Py_DECREF(v);
1243 Py_DECREF(w);
1244 PUSH(x);
1245 if (x != NULL) continue;
1246 break;
1247
Guido van Rossum374a9221991-04-04 10:40:29 +00001248 case SLICE+0:
1249 case SLICE+1:
1250 case SLICE+2:
1251 case SLICE+3:
1252 if ((opcode-SLICE) & 2)
1253 w = POP();
1254 else
1255 w = NULL;
1256 if ((opcode-SLICE) & 1)
1257 v = POP();
1258 else
1259 v = NULL;
1260 u = POP();
1261 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001262 Py_DECREF(u);
1263 Py_XDECREF(v);
1264 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001265 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001266 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001267 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001268
Guido van Rossum374a9221991-04-04 10:40:29 +00001269 case STORE_SLICE+0:
1270 case STORE_SLICE+1:
1271 case STORE_SLICE+2:
1272 case STORE_SLICE+3:
1273 if ((opcode-STORE_SLICE) & 2)
1274 w = POP();
1275 else
1276 w = NULL;
1277 if ((opcode-STORE_SLICE) & 1)
1278 v = POP();
1279 else
1280 v = NULL;
1281 u = POP();
1282 t = POP();
1283 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001284 Py_DECREF(t);
1285 Py_DECREF(u);
1286 Py_XDECREF(v);
1287 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001288 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001289 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001290
Guido van Rossum374a9221991-04-04 10:40:29 +00001291 case DELETE_SLICE+0:
1292 case DELETE_SLICE+1:
1293 case DELETE_SLICE+2:
1294 case DELETE_SLICE+3:
1295 if ((opcode-DELETE_SLICE) & 2)
1296 w = POP();
1297 else
1298 w = NULL;
1299 if ((opcode-DELETE_SLICE) & 1)
1300 v = POP();
1301 else
1302 v = NULL;
1303 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001304 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001305 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001306 Py_DECREF(u);
1307 Py_XDECREF(v);
1308 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001309 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001310 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001311
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 case STORE_SUBSCR:
1313 w = POP();
1314 v = POP();
1315 u = POP();
1316 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001317 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001318 Py_DECREF(u);
1319 Py_DECREF(v);
1320 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001321 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001322 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001323
Guido van Rossum374a9221991-04-04 10:40:29 +00001324 case DELETE_SUBSCR:
1325 w = POP();
1326 v = POP();
1327 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001328 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001329 Py_DECREF(v);
1330 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001331 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001332 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001333
Guido van Rossum374a9221991-04-04 10:40:29 +00001334 case PRINT_EXPR:
1335 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001336 w = PySys_GetObject("displayhook");
1337 if (w == NULL) {
1338 PyErr_SetString(PyExc_RuntimeError,
1339 "lost sys.displayhook");
1340 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001341 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001342 }
1343 if (err == 0) {
1344 x = Py_BuildValue("(O)", v);
1345 if (x == NULL)
1346 err = -1;
1347 }
1348 if (err == 0) {
1349 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001350 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001351 if (w == NULL)
1352 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001353 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001354 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001355 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001356 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001357
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001358 case PRINT_ITEM_TO:
1359 w = stream = POP();
1360 /* fall through to PRINT_ITEM */
1361
Guido van Rossum374a9221991-04-04 10:40:29 +00001362 case PRINT_ITEM:
1363 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001364 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001365 w = PySys_GetObject("stdout");
1366 if (w == NULL) {
1367 PyErr_SetString(PyExc_RuntimeError,
1368 "lost sys.stdout");
1369 err = -1;
1370 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001371 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001372 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001373 err = PyFile_WriteString(" ", w);
1374 if (err == 0)
1375 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001376 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001377 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001378 char *s = PyString_AsString(v);
1379 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001380 if (len > 0 &&
1381 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001382 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001383 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001384 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001385 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001386 Py_XDECREF(stream);
1387 stream = NULL;
1388 if (err == 0)
1389 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001391
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001392 case PRINT_NEWLINE_TO:
1393 w = stream = POP();
1394 /* fall through to PRINT_NEWLINE */
1395
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001397 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001398 w = PySys_GetObject("stdout");
1399 if (w == NULL)
1400 PyErr_SetString(PyExc_RuntimeError,
1401 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001402 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001403 if (w != NULL) {
1404 err = PyFile_WriteString("\n", w);
1405 if (err == 0)
1406 PyFile_SoftSpace(w, 0);
1407 }
1408 Py_XDECREF(stream);
1409 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001411
Thomas Wouters434d0822000-08-24 20:11:32 +00001412
1413#ifdef CASE_TOO_BIG
1414 default: switch (opcode) {
1415#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 case BREAK_LOOP:
1417 why = WHY_BREAK;
1418 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001419
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001420 case CONTINUE_LOOP:
1421 retval = PyInt_FromLong(oparg);
1422 why = WHY_CONTINUE;
1423 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001424
Guido van Rossumf10570b1995-07-07 22:53:21 +00001425 case RAISE_VARARGS:
1426 u = v = w = NULL;
1427 switch (oparg) {
1428 case 3:
1429 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001430 /* Fallthrough */
1431 case 2:
1432 v = POP(); /* value */
1433 /* Fallthrough */
1434 case 1:
1435 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001436 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001437 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001438 break;
1439 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001440 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001441 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001442 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001443 break;
1444 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001445 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001446
Guido van Rossum374a9221991-04-04 10:40:29 +00001447 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001448 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001449 PyErr_SetString(PyExc_SystemError,
1450 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001451 break;
1452 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001453 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001455 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001456
Guido van Rossum374a9221991-04-04 10:40:29 +00001457 case RETURN_VALUE:
1458 retval = POP();
1459 why = WHY_RETURN;
1460 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001461
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001462 case EXEC_STMT:
1463 w = POP();
1464 v = POP();
1465 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001466 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001467 Py_DECREF(u);
1468 Py_DECREF(v);
1469 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001470 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001471
Guido van Rossum374a9221991-04-04 10:40:29 +00001472 case POP_BLOCK:
1473 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001474 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001475 while (STACK_LEVEL() > b->b_level) {
1476 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001477 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001478 }
1479 }
1480 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001481
Guido van Rossum374a9221991-04-04 10:40:29 +00001482 case END_FINALLY:
1483 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001484 if (PyInt_Check(v)) {
1485 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001486 if (why == WHY_RETURN ||
1487 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001488 retval = POP();
1489 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001490 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001491 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001492 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001493 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001495 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001497 else if (v != Py_None) {
1498 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001499 "'finally' pops bad exception");
1500 why = WHY_EXCEPTION;
1501 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001503 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001504
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001506 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001508 w = POP();
1509 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001510 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001511 Py_DECREF(u);
1512 Py_DECREF(v);
1513 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001514 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001515
Guido van Rossum374a9221991-04-04 10:40:29 +00001516 case STORE_NAME:
1517 w = GETNAMEV(oparg);
1518 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001519 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001520 PyErr_Format(PyExc_SystemError,
1521 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001522 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001523 break;
1524 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001525 err = PyDict_SetItem(x, w, v);
1526 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001530 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001531 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001532 PyErr_Format(PyExc_SystemError,
1533 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001534 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001535 break;
1536 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001537 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001538 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001539 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001541
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001542 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001544 if (PyTuple_Check(v)) {
1545 if (PyTuple_Size(v) != oparg) {
1546 PyErr_SetString(PyExc_ValueError,
1547 "unpack tuple of wrong size");
1548 why = WHY_EXCEPTION;
1549 }
1550 else {
1551 for (; --oparg >= 0; ) {
1552 w = PyTuple_GET_ITEM(v, oparg);
1553 Py_INCREF(w);
1554 PUSH(w);
1555 }
1556 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001558 else if (PyList_Check(v)) {
1559 if (PyList_Size(v) != oparg) {
1560 PyErr_SetString(PyExc_ValueError,
1561 "unpack list of wrong size");
1562 why = WHY_EXCEPTION;
1563 }
1564 else {
1565 for (; --oparg >= 0; ) {
1566 w = PyList_GET_ITEM(v, oparg);
1567 Py_INCREF(w);
1568 PUSH(w);
1569 }
1570 }
1571 }
1572 else if (PySequence_Check(v)) {
1573 if (unpack_sequence(v, oparg,
1574 stack_pointer + oparg))
1575 stack_pointer += oparg;
1576 else
1577 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001578 }
1579 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001580 PyErr_SetString(PyExc_TypeError,
1581 "unpack non-sequence");
1582 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001583 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001584 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001585 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001586
Guido van Rossum374a9221991-04-04 10:40:29 +00001587 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001588 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001589 v = POP();
1590 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001591 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1592 Py_DECREF(v);
1593 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001594 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001595
Guido van Rossum374a9221991-04-04 10:40:29 +00001596 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001597 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001598 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001599 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1600 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001601 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001602 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001603
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001604 case STORE_GLOBAL:
1605 w = GETNAMEV(oparg);
1606 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001607 err = PyDict_SetItem(f->f_globals, w, v);
1608 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001609 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001610
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001611 case DELETE_GLOBAL:
1612 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001613 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001614 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001615 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001616 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001617
Guido van Rossum374a9221991-04-04 10:40:29 +00001618 case LOAD_CONST:
1619 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001620 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001621 PUSH(x);
1622 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001623
Guido van Rossum374a9221991-04-04 10:40:29 +00001624 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001625 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001626 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001627 PyErr_Format(PyExc_SystemError,
1628 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001629 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001630 break;
1631 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001632 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001633 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001634 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001635 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001636 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001637 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001638 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001639 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001640 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001641 break;
1642 }
1643 }
1644 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001645 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001646 PUSH(x);
1647 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001648
Guido van Rossum374a9221991-04-04 10:40:29 +00001649 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001650 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001651 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001652 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001655 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001656 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001657 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 break;
1659 }
1660 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 PUSH(x);
1663 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001664
Guido van Rossum9bfef441993-03-29 10:43:31 +00001665 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001666 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001667 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001668 format_exc_check_arg(
1669 PyExc_UnboundLocalError,
1670 UNBOUNDLOCAL_ERROR_MSG,
1671 PyTuple_GetItem(co->co_varnames, oparg)
1672 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001673 break;
1674 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001675 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001676 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001677 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001678 break;
1679
1680 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001681 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001682 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001684
1685 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001686 x = GETLOCAL(oparg);
1687 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001688 format_exc_check_arg(
1689 PyExc_UnboundLocalError,
1690 UNBOUNDLOCAL_ERROR_MSG,
1691 PyTuple_GetItem(co->co_varnames, oparg)
1692 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001693 break;
1694 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001695 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001696 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001697
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001698 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001699 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001700 Py_INCREF(x);
1701 PUSH(x);
1702 break;
1703
1704 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001705 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001706 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001707 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001708 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001709 v = PyTuple_GetItem(co->co_cellvars,
1710 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001711 format_exc_check_arg(
1712 PyExc_UnboundLocalError,
1713 UNBOUNDLOCAL_ERROR_MSG,
1714 v);
1715 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001716 v = PyTuple_GetItem(
1717 co->co_freevars,
1718 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001719 format_exc_check_arg(
1720 PyExc_NameError,
1721 UNBOUNDFREE_ERROR_MSG,
1722 v);
1723 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001724 err = -1;
1725 break;
1726 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001727 PUSH(w);
1728 break;
1729
1730 case STORE_DEREF:
1731 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001732 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001733 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001734 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001735 continue;
1736
Guido van Rossum374a9221991-04-04 10:40:29 +00001737 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001738 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001739 if (x != NULL) {
1740 for (; --oparg >= 0;) {
1741 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001742 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001743 }
1744 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001745 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001746 }
1747 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001748
Guido van Rossum374a9221991-04-04 10:40:29 +00001749 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001750 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001751 if (x != NULL) {
1752 for (; --oparg >= 0;) {
1753 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001754 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001755 }
1756 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001757 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 }
1759 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001760
Guido van Rossum374a9221991-04-04 10:40:29 +00001761 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001762 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001763 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001764 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001765 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001766
Guido van Rossum374a9221991-04-04 10:40:29 +00001767 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001768 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001769 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001770 x = PyObject_GetAttr(v, w);
1771 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001773 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001774 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001775
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 case COMPARE_OP:
1777 w = POP();
1778 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001779 if (PyInt_Check(v) && PyInt_Check(w)) {
1780 /* INLINE: cmp(int, int) */
1781 register long a, b;
1782 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001783 a = PyInt_AS_LONG(v);
1784 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001785 switch (oparg) {
1786 case LT: res = a < b; break;
1787 case LE: res = a <= b; break;
1788 case EQ: res = a == b; break;
1789 case NE: res = a != b; break;
1790 case GT: res = a > b; break;
1791 case GE: res = a >= b; break;
1792 case IS: res = v == w; break;
1793 case IS_NOT: res = v != w; break;
1794 default: goto slow_compare;
1795 }
1796 x = res ? Py_True : Py_False;
1797 Py_INCREF(x);
1798 }
1799 else {
1800 slow_compare:
1801 x = cmp_outcome(oparg, v, w);
1802 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001803 Py_DECREF(v);
1804 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001805 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001806 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001807 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001808
Guido van Rossum374a9221991-04-04 10:40:29 +00001809 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001810 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001811 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001813 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001814 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001815 break;
1816 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001817 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001818 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001819 w,
1820 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001821 f->f_locals == NULL ?
1822 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001823 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001824 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001825 if (w == NULL) {
1826 x = NULL;
1827 break;
1828 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001829 x = PyEval_CallObject(x, w);
1830 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001831 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001832 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001834
Thomas Wouters52152252000-08-17 22:55:00 +00001835 case IMPORT_STAR:
1836 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001837 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001838 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001839 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001840 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001841 break;
1842 }
Thomas Wouters52152252000-08-17 22:55:00 +00001843 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001845 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001846 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001847 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001848
Thomas Wouters52152252000-08-17 22:55:00 +00001849 case IMPORT_FROM:
1850 w = GETNAMEV(oparg);
1851 v = TOP();
1852 x = import_from(v, w);
1853 PUSH(x);
1854 if (x != NULL) continue;
1855 break;
1856
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 case JUMP_FORWARD:
1858 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001859 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001860
Guido van Rossum374a9221991-04-04 10:40:29 +00001861 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001862 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001863 if (err > 0)
1864 err = 0;
1865 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001866 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001867 else
1868 break;
1869 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001870
Guido van Rossum374a9221991-04-04 10:40:29 +00001871 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001872 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001873 if (err > 0) {
1874 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001875 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001876 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001877 else if (err == 0)
1878 ;
1879 else
1880 break;
1881 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001882
Guido van Rossum374a9221991-04-04 10:40:29 +00001883 case JUMP_ABSOLUTE:
1884 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001885 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001886
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001887 case GET_ITER:
1888 /* before: [obj]; after [getiter(obj)] */
1889 v = POP();
1890 x = PyObject_GetIter(v);
1891 Py_DECREF(v);
1892 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001893 PUSH(x);
1894 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001895 }
1896 break;
1897
1898 case FOR_ITER:
1899 /* before: [iter]; after: [iter, iter()] *or* [] */
1900 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001901 x = PyIter_Next(v);
1902 if (x != NULL) {
1903 PUSH(x);
1904 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001905 }
Tim Petersf4848da2001-05-05 00:14:56 +00001906 if (!PyErr_Occurred()) {
1907 /* iterator ended normally */
1908 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001909 Py_DECREF(v);
1910 JUMPBY(oparg);
1911 continue;
1912 }
1913 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001914
Guido van Rossum374a9221991-04-04 10:40:29 +00001915 case FOR_LOOP:
1916 /* for v in s: ...
1917 On entry: stack contains s, i.
1918 On exit: stack contains s, i+1, s[i];
1919 but if loop exhausted:
1920 s, i are popped, and we jump */
1921 w = POP(); /* Loop index */
1922 v = POP(); /* Sequence object */
1923 u = loop_subscript(v, w);
1924 if (u != NULL) {
1925 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001926 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001927 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001928 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001929 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001930 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001931 }
1932 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001933 Py_DECREF(v);
1934 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001935 /* A NULL can mean "s exhausted"
1936 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001937 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001938 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001939 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001940 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001941 continue;
1942 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001943 }
1944 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001945
Guido van Rossum374a9221991-04-04 10:40:29 +00001946 case SETUP_LOOP:
1947 case SETUP_EXCEPT:
1948 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001949 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001950 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001951 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001952
Guido van Rossum374a9221991-04-04 10:40:29 +00001953 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001954#ifdef LLTRACE
1955 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001956 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001957#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001958 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001959 if (f->f_trace == NULL)
1960 continue;
1961 /* Trace each line of code reached */
1962 f->f_lasti = INSTR_OFFSET();
1963 err = call_trace(&f->f_trace, &f->f_trace,
Fred Drake904aa7b2001-06-08 04:33:09 +00001964 f, "line", &str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001965 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001966
1967 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001968 {
1969 int na = oparg & 0xff;
1970 int nk = (oparg>>8) & 0xff;
1971 int n = na + 2 * nk;
1972 PyObject **pfunc = stack_pointer - n - 1;
1973 PyObject *func = *pfunc;
1974 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1975
1976 /* Always dispatch PyCFunction first, because
1977 these are presumed to be the most frequent
1978 callable object.
1979 */
1980 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001981 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001982 if (flags > 1 || nk != 0)
1983 x = do_call(func, &stack_pointer,
1984 na, nk);
1985 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001986 PyObject *callargs;
1987 callargs = load_args(&stack_pointer, na);
1988 x = call_cfunction(func, callargs, NULL);
1989 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001990 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001991 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001992 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001993 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001994 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001995 && PyMethod_GET_SELF(func) != NULL) {
1996 /* optimize access to bound methods */
1997 PyObject *self = PyMethod_GET_SELF(func);
1998 Py_INCREF(self);
1999 func = PyMethod_GET_FUNCTION(func);
2000 Py_INCREF(func);
2001 Py_DECREF(*pfunc);
2002 *pfunc = self;
2003 na++;
2004 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002005 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002006 Py_INCREF(func);
2007 if (PyFunction_Check(func)) {
2008 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00002009 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00002010 } else {
2011 x = do_call(func, &stack_pointer,
2012 na, nk);
2013 }
2014 Py_DECREF(func);
2015 }
2016
2017 while (stack_pointer > pfunc) {
2018 w = POP();
2019 Py_DECREF(w);
2020 }
2021 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002022 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002023 continue;
2024 break;
2025 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002026
Jeremy Hylton76901512000-03-28 23:49:17 +00002027 case CALL_FUNCTION_VAR:
2028 case CALL_FUNCTION_KW:
2029 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00002030 {
Jeremy Hylton76901512000-03-28 23:49:17 +00002031 int na = oparg & 0xff;
2032 int nk = (oparg>>8) & 0xff;
2033 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00002034 int n = na + 2 * nk;
2035 PyObject **pfunc, *func;
2036 if (flags & CALL_FLAG_VAR)
2037 n++;
2038 if (flags & CALL_FLAG_KW)
2039 n++;
2040 pfunc = stack_pointer - n - 1;
2041 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00002042 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00002043
Guido van Rossumac7be682001-01-17 15:42:30 +00002044 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00002045 && PyMethod_GET_SELF(func) != NULL) {
2046 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002047 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00002048 func = PyMethod_GET_FUNCTION(func);
2049 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00002050 Py_DECREF(*pfunc);
2051 *pfunc = self;
2052 na++;
2053 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00002054 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00002055 Py_INCREF(func);
2056 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00002057 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00002058
Jeremy Hylton76901512000-03-28 23:49:17 +00002059 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00002060 w = POP();
2061 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00002062 }
2063 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00002064 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00002065 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00002066 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002067 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002068
Guido van Rossum681d79a1995-07-18 14:51:37 +00002069 case MAKE_FUNCTION:
2070 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00002071 x = PyFunction_New(v, f->f_globals);
2072 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002073 /* XXX Maybe this should be a separate opcode? */
2074 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002075 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002076 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002077 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002078 x = NULL;
2079 break;
2080 }
2081 while (--oparg >= 0) {
2082 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002083 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002084 }
2085 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002086 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002087 }
2088 PUSH(x);
2089 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002090
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002091 case MAKE_CLOSURE:
2092 {
2093 int nfree;
2094 v = POP(); /* code object */
2095 x = PyFunction_New(v, f->f_globals);
2096 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2097 Py_DECREF(v);
2098 /* XXX Maybe this should be a separate opcode? */
2099 if (x != NULL && nfree > 0) {
2100 v = PyTuple_New(nfree);
2101 if (v == NULL) {
2102 Py_DECREF(x);
2103 x = NULL;
2104 break;
2105 }
2106 while (--nfree >= 0) {
2107 w = POP();
2108 PyTuple_SET_ITEM(v, nfree, w);
2109 }
2110 err = PyFunction_SetClosure(x, v);
2111 Py_DECREF(v);
2112 }
2113 if (x != NULL && oparg > 0) {
2114 v = PyTuple_New(oparg);
2115 if (v == NULL) {
2116 Py_DECREF(x);
2117 x = NULL;
2118 break;
2119 }
2120 while (--oparg >= 0) {
2121 w = POP();
2122 PyTuple_SET_ITEM(v, oparg, w);
2123 }
2124 err = PyFunction_SetDefaults(x, v);
2125 Py_DECREF(v);
2126 }
2127 PUSH(x);
2128 break;
2129 }
2130
Guido van Rossum8861b741996-07-30 16:49:37 +00002131 case BUILD_SLICE:
2132 if (oparg == 3)
2133 w = POP();
2134 else
2135 w = NULL;
2136 v = POP();
2137 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002138 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002139 Py_DECREF(u);
2140 Py_DECREF(v);
2141 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002142 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002143 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002144 break;
2145
Fred Drakeef8ace32000-08-24 00:32:09 +00002146 case EXTENDED_ARG:
2147 opcode = NEXTOP();
2148 oparg = oparg<<16 | NEXTARG();
2149 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002150
Guido van Rossum374a9221991-04-04 10:40:29 +00002151 default:
2152 fprintf(stderr,
2153 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002154 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002155 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 why = WHY_EXCEPTION;
2157 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002158
2159#ifdef CASE_TOO_BIG
2160 }
2161#endif
2162
Guido van Rossum374a9221991-04-04 10:40:29 +00002163 } /* switch */
2164
2165 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002166
Guido van Rossum374a9221991-04-04 10:40:29 +00002167 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002168
Guido van Rossum374a9221991-04-04 10:40:29 +00002169 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002170 if (err == 0 && x != NULL) {
2171#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002172 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002173 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002174 fprintf(stderr,
2175 "XXX undetected error\n");
2176 else
2177#endif
2178 continue; /* Normal, fast path */
2179 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002181 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 err = 0;
2183 }
2184
Guido van Rossum374a9221991-04-04 10:40:29 +00002185 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002186
Guido van Rossum374a9221991-04-04 10:40:29 +00002187 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002188 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002189 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002190 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002191 why = WHY_EXCEPTION;
2192 }
2193 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002194#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002195 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002196 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002197 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002198 fprintf(stderr,
2199 "XXX undetected error (why=%d)\n",
2200 why);
2201 why = WHY_EXCEPTION;
2202 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002203 }
2204#endif
2205
2206 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002207
Guido van Rossum374a9221991-04-04 10:40:29 +00002208 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002209 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002211 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002212 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002213
Guido van Rossume59214e1994-08-30 08:01:59 +00002214 if (f->f_trace)
2215 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002216 if (tstate->sys_profilefunc)
2217 call_exc_trace(&tstate->sys_profilefunc,
2218 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002219 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002220
Guido van Rossum374a9221991-04-04 10:40:29 +00002221 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002222
Guido van Rossum374a9221991-04-04 10:40:29 +00002223 if (why == WHY_RERAISE)
2224 why = WHY_EXCEPTION;
2225
2226 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002227
Guido van Rossum374a9221991-04-04 10:40:29 +00002228 while (why != WHY_NOT && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002229 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002230
2231 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2232 /* For a continue inside a try block,
2233 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002234 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002235 b->b_handler);
2236 why = WHY_NOT;
2237 JUMPTO(PyInt_AS_LONG(retval));
2238 Py_DECREF(retval);
2239 break;
2240 }
2241
Guido van Rossum374a9221991-04-04 10:40:29 +00002242 while (STACK_LEVEL() > b->b_level) {
2243 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002244 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002245 }
2246 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2247 why = WHY_NOT;
2248 JUMPTO(b->b_handler);
2249 break;
2250 }
2251 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002252 (b->b_type == SETUP_EXCEPT &&
2253 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002254 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002255 PyObject *exc, *val, *tb;
2256 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002257 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002258 val = Py_None;
2259 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002260 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002261 /* Make the raw exception data
2262 available to the handler,
2263 so a program can emulate the
2264 Python main loop. Don't do
2265 this for 'finally'. */
2266 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002267 PyErr_NormalizeException(
2268 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002269 set_exc_info(tstate,
2270 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002271 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002272 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002273 PUSH(val);
2274 PUSH(exc);
2275 }
2276 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002277 if (why == WHY_RETURN ||
2278 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002279 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002280 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002281 PUSH(v);
2282 }
2283 why = WHY_NOT;
2284 JUMPTO(b->b_handler);
2285 break;
2286 }
2287 } /* unwind stack */
2288
2289 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002290
Guido van Rossum374a9221991-04-04 10:40:29 +00002291 if (why != WHY_NOT)
2292 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002293
Guido van Rossum374a9221991-04-04 10:40:29 +00002294 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002295
Guido van Rossum374a9221991-04-04 10:40:29 +00002296 /* Pop remaining stack entries */
Guido van Rossumac7be682001-01-17 15:42:30 +00002297
Guido van Rossum374a9221991-04-04 10:40:29 +00002298 while (!EMPTY()) {
2299 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002300 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002301 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002302
Guido van Rossum96a42c81992-01-12 02:29:51 +00002303 if (why != WHY_RETURN)
2304 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002305
Guido van Rossume59214e1994-08-30 08:01:59 +00002306 if (f->f_trace) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002307 if (why == WHY_RETURN) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002308 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Drake904aa7b2001-06-08 04:33:09 +00002309 "return", &str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002310 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002311 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002312 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002313 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002314 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002315 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002316
Guido van Rossuma027efa1997-05-05 20:56:21 +00002317 if (tstate->sys_profilefunc && why == WHY_RETURN) {
2318 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Drake904aa7b2001-06-08 04:33:09 +00002319 f, "return", &str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002320 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002321 retval = NULL;
2322 why = WHY_EXCEPTION;
2323 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002324 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002325
Guido van Rossuma027efa1997-05-05 20:56:21 +00002326 reset_exc_info(tstate);
2327
2328 --tstate->recursion_depth;
Guido van Rossum8c5df061997-01-24 04:19:24 +00002329
2330 fail: /* Jump here from prelude on failure */
Guido van Rossumac7be682001-01-17 15:42:30 +00002331
Guido van Rossum374a9221991-04-04 10:40:29 +00002332 /* Restore previous frame and release the current one */
Guido van Rossum681d79a1995-07-18 14:51:37 +00002333
Guido van Rossuma027efa1997-05-05 20:56:21 +00002334 tstate->frame = f->f_back;
Guido van Rossumb209a111997-04-29 18:18:01 +00002335 Py_DECREF(f);
Guido van Rossumac7be682001-01-17 15:42:30 +00002336
Guido van Rossum96a42c81992-01-12 02:29:51 +00002337 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002338}
2339
Guido van Rossuma027efa1997-05-05 20:56:21 +00002340static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002341set_exc_info(PyThreadState *tstate,
2342 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002343{
2344 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002345 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002346
Guido van Rossuma027efa1997-05-05 20:56:21 +00002347 frame = tstate->frame;
2348 if (frame->f_exc_type == NULL) {
2349 /* This frame didn't catch an exception before */
2350 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002351 if (tstate->exc_type == NULL) {
2352 Py_INCREF(Py_None);
2353 tstate->exc_type = Py_None;
2354 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002355 tmp_type = frame->f_exc_type;
2356 tmp_value = frame->f_exc_value;
2357 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002358 Py_XINCREF(tstate->exc_type);
2359 Py_XINCREF(tstate->exc_value);
2360 Py_XINCREF(tstate->exc_traceback);
2361 frame->f_exc_type = tstate->exc_type;
2362 frame->f_exc_value = tstate->exc_value;
2363 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002364 Py_XDECREF(tmp_type);
2365 Py_XDECREF(tmp_value);
2366 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002367 }
2368 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002369 tmp_type = tstate->exc_type;
2370 tmp_value = tstate->exc_value;
2371 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002372 Py_XINCREF(type);
2373 Py_XINCREF(value);
2374 Py_XINCREF(tb);
2375 tstate->exc_type = type;
2376 tstate->exc_value = value;
2377 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002378 Py_XDECREF(tmp_type);
2379 Py_XDECREF(tmp_value);
2380 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002381 /* For b/w compatibility */
2382 PySys_SetObject("exc_type", type);
2383 PySys_SetObject("exc_value", value);
2384 PySys_SetObject("exc_traceback", tb);
2385}
2386
2387static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002388reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002389{
2390 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002391 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002392 frame = tstate->frame;
2393 if (frame->f_exc_type != NULL) {
2394 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002395 tmp_type = tstate->exc_type;
2396 tmp_value = tstate->exc_value;
2397 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002398 Py_XINCREF(frame->f_exc_type);
2399 Py_XINCREF(frame->f_exc_value);
2400 Py_XINCREF(frame->f_exc_traceback);
2401 tstate->exc_type = frame->f_exc_type;
2402 tstate->exc_value = frame->f_exc_value;
2403 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002404 Py_XDECREF(tmp_type);
2405 Py_XDECREF(tmp_value);
2406 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002407 /* For b/w compatibility */
2408 PySys_SetObject("exc_type", frame->f_exc_type);
2409 PySys_SetObject("exc_value", frame->f_exc_value);
2410 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2411 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002412 tmp_type = frame->f_exc_type;
2413 tmp_value = frame->f_exc_value;
2414 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002415 frame->f_exc_type = NULL;
2416 frame->f_exc_value = NULL;
2417 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002418 Py_XDECREF(tmp_type);
2419 Py_XDECREF(tmp_value);
2420 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002421}
2422
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002423/* Logic for the raise statement (too complicated for inlining).
2424 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002425static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002426do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002427{
Guido van Rossumd295f121998-04-09 21:39:57 +00002428 if (type == NULL) {
2429 /* Reraise */
2430 PyThreadState *tstate = PyThreadState_Get();
2431 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2432 value = tstate->exc_value;
2433 tb = tstate->exc_traceback;
2434 Py_XINCREF(type);
2435 Py_XINCREF(value);
2436 Py_XINCREF(tb);
2437 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002438
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002439 /* We support the following forms of raise:
2440 raise <class>, <classinstance>
2441 raise <class>, <argument tuple>
2442 raise <class>, None
2443 raise <class>, <argument>
2444 raise <classinstance>, None
2445 raise <string>, <object>
2446 raise <string>, None
2447
2448 An omitted second argument is the same as None.
2449
2450 In addition, raise <tuple>, <anything> is the same as
2451 raising the tuple's first item (and it better have one!);
2452 this rule is applied recursively.
2453
2454 Finally, an optional third argument can be supplied, which
2455 gives the traceback to be substituted (useful when
2456 re-raising an exception after examining it). */
2457
2458 /* First, check the traceback argument, replacing None with
2459 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002460 if (tb == Py_None) {
2461 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002462 tb = NULL;
2463 }
2464 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002465 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002466 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002467 goto raise_error;
2468 }
2469
2470 /* Next, replace a missing value with None */
2471 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002472 value = Py_None;
2473 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002474 }
2475
2476 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002477 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2478 PyObject *tmp = type;
2479 type = PyTuple_GET_ITEM(type, 0);
2480 Py_INCREF(type);
2481 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002482 }
2483
Barry Warsaw4249f541997-08-22 21:26:19 +00002484 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002485 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002486
2487 else if (PyClass_Check(type))
2488 PyErr_NormalizeException(&type, &value, &tb);
2489
Guido van Rossumb209a111997-04-29 18:18:01 +00002490 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002491 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002492 if (value != Py_None) {
2493 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002494 "instance exception may not have a separate value");
2495 goto raise_error;
2496 }
2497 else {
2498 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002499 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002500 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002501 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2502 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002503 }
2504 }
2505 else {
2506 /* Not something you can raise. You get an exception
2507 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002508 PyErr_Format(PyExc_TypeError,
2509 "exceptions must be strings, classes, or "
2510 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002511 goto raise_error;
2512 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002513 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002514 if (tb == NULL)
2515 return WHY_EXCEPTION;
2516 else
2517 return WHY_RERAISE;
2518 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002519 Py_XDECREF(value);
2520 Py_XDECREF(type);
2521 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002522 return WHY_EXCEPTION;
2523}
2524
Barry Warsawe42b18f1997-08-25 22:13:04 +00002525static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002526unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002527{
2528 int i;
2529 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002530
Barry Warsawe42b18f1997-08-25 22:13:04 +00002531 for (i = 0; i < argcnt; i++) {
2532 if (! (w = PySequence_GetItem(v, i))) {
2533 if (PyErr_ExceptionMatches(PyExc_IndexError))
2534 PyErr_SetString(PyExc_ValueError,
2535 "unpack sequence of wrong size");
2536 goto finally;
2537 }
2538 *--sp = w;
2539 }
2540 /* we better get an IndexError now */
2541 if (PySequence_GetItem(v, i) == NULL) {
2542 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2543 PyErr_Clear();
2544 return 1;
2545 }
2546 /* some other exception occurred. fall through to finally */
2547 }
2548 else
2549 PyErr_SetString(PyExc_ValueError,
2550 "unpack sequence of wrong size");
2551 /* fall through */
2552finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002553 for (; i > 0; i--, sp++)
2554 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002555
2556 return 0;
2557}
2558
2559
Guido van Rossum96a42c81992-01-12 02:29:51 +00002560#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002561static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002562prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002564 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002565 if (PyObject_Print(v, stdout, 0) != 0)
2566 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002567 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002568 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002570#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002572static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002573call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002574{
Guido van Rossumb209a111997-04-29 18:18:01 +00002575 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002576 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002577 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002578 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002579 value = Py_None;
2580 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002581 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002582 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002583 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002584 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002585 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002586 }
Fred Drake904aa7b2001-06-08 04:33:09 +00002587 err = call_trace(p_trace, p_newtrace, f,
2588 "exception", &str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002589 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002590 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002591 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002592 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002593 Py_XDECREF(type);
2594 Py_XDECREF(value);
2595 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002596 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002597}
2598
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002599/* PyObject **p_trace: in/out; may not be NULL;
2600 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002601 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002602 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002603 may be same variable as p_newtrace
2604 PyObject **p_omsg: in/out; may not be NULL;
2605 if non-null & *p_omsg == NULL, will be
2606 initialized with an interned string
2607 corresponding to msg.
2608*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002609
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002610static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002611call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Drake904aa7b2001-06-08 04:33:09 +00002612 char *msg, PyObject **p_omsg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002613{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002614 PyThreadState *tstate = f->f_tstate;
Guido van Rossumb209a111997-04-29 18:18:01 +00002615 PyObject *args, *what;
2616 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002617
Guido van Rossuma027efa1997-05-05 20:56:21 +00002618 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002619 /* Don't do recursive traces */
2620 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002621 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002622 *p_newtrace = NULL;
2623 }
2624 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002625 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002626
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002628 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002629 goto cleanup;
Fred Drake904aa7b2001-06-08 04:33:09 +00002630 if (*p_omsg != NULL) {
2631 what = *p_omsg;
2632 Py_INCREF(what);
2633 }
2634 else {
2635 what = PyString_InternFromString(msg);
2636 if (what == NULL)
2637 goto cleanup;
2638 *p_omsg = what;
2639 Py_INCREF(what);
2640 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002641 Py_INCREF(f);
2642 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
2643 PyTuple_SET_ITEM(args, 1, what);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002644 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002645 arg = Py_None;
2646 Py_INCREF(arg);
2647 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002648 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 PyFrame_FastToLocals(f);
2650 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2651 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002652 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002653 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002654 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002655 if (res == NULL) {
2656 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002657 PyTraceBack_Here(f);
2658 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002659 *p_trace = NULL;
2660 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002661 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002662 *p_newtrace = NULL;
2663 }
Barry Warsawf6202631999-09-08 16:26:33 +00002664 /* to be extra double plus sure we don't get recursive
2665 * calls inf either tracefunc or profilefunc gets an
2666 * exception, zap the global variables.
2667 */
2668 Py_XDECREF(tstate->sys_tracefunc);
2669 tstate->sys_tracefunc = NULL;
2670 Py_XDECREF(tstate->sys_profilefunc);
2671 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002672 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002673 }
2674 else {
2675 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002676 Py_XDECREF(*p_newtrace);
2677 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002678 *p_newtrace = NULL;
2679 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002680 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002681 *p_newtrace = res;
2682 }
2683 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002684 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002685 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002686 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002687}
2688
Guido van Rossumb209a111997-04-29 18:18:01 +00002689PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002690PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002691{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002692 PyThreadState *tstate = PyThreadState_Get();
2693 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002694 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002695 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002696 else
2697 return current_frame->f_builtins;
2698}
2699
Guido van Rossumb209a111997-04-29 18:18:01 +00002700PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002701PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002702{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002703 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002704 if (current_frame == NULL)
2705 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002706 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002707 return current_frame->f_locals;
2708}
2709
Guido van Rossumb209a111997-04-29 18:18:01 +00002710PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002711PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002712{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002713 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002714 if (current_frame == NULL)
2715 return NULL;
2716 else
2717 return current_frame->f_globals;
2718}
2719
Guido van Rossumb209a111997-04-29 18:18:01 +00002720PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002721PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002722{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002723 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002725}
2726
Guido van Rossum6135a871995-01-09 17:53:26 +00002727int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002728PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002729{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002730 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002731 return current_frame == NULL ? 0 : current_frame->f_restricted;
2732}
2733
Guido van Rossumbe270261997-05-22 22:26:18 +00002734int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002735PyEval_GetNestedScopes(void)
2736{
2737 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2738 return current_frame == NULL ? 0 :
2739 current_frame->f_code->co_flags & CO_NESTED;
2740}
2741
2742int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002743Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002744{
Guido van Rossumb209a111997-04-29 18:18:01 +00002745 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002746 if (f == NULL)
2747 return 0;
2748 if (!PyFile_SoftSpace(f, 0))
2749 return 0;
2750 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751}
2752
Guido van Rossum3f5da241990-12-20 15:06:42 +00002753
Guido van Rossum681d79a1995-07-18 14:51:37 +00002754/* External interface to call any callable object.
2755 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002756
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002757#undef PyEval_CallObject
2758/* for backward compatibility: export this interface */
2759
Guido van Rossumb209a111997-04-29 18:18:01 +00002760PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002761PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002762{
Guido van Rossumb209a111997-04-29 18:18:01 +00002763 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002764}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002765#define PyEval_CallObject(func,arg) \
2766 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002767
Guido van Rossumb209a111997-04-29 18:18:01 +00002768PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002769PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002770{
Jeremy Hylton52820442001-01-03 23:52:36 +00002771 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002772
2773 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002774 arg = PyTuple_New(0);
2775 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002776 PyErr_SetString(PyExc_TypeError,
2777 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002778 return NULL;
2779 }
2780 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002781 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002782
Guido van Rossumb209a111997-04-29 18:18:01 +00002783 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002784 PyErr_SetString(PyExc_TypeError,
2785 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002786 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002787 return NULL;
2788 }
2789
Jeremy Hylton52820442001-01-03 23:52:36 +00002790 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002791 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002792 return result;
2793}
2794
2795/* How often is each kind of object called? The answer depends on the
2796 program. An instrumented call_object() was used to run the Python
2797 regression test suite. The results were:
2798 4200000 PyCFunctions
2799 390000 fast_function() calls
2800 94000 other functions
2801 480000 all functions (sum of prev two)
2802 150000 methods
2803 100000 classes
2804
2805 Tests on other bodies of code show that PyCFunctions are still
2806 most common, but not by such a large margin.
2807*/
2808
Jeremy Hylton512a2372001-04-11 13:52:29 +00002809static char *
2810get_func_name(PyObject *func)
2811{
2812 if (PyMethod_Check(func))
2813 return get_func_name(PyMethod_GET_FUNCTION(func));
2814 else if (PyFunction_Check(func))
2815 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2816 else if (PyCFunction_Check(func))
2817 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2818 else if (PyClass_Check(func))
2819 return PyString_AsString(((PyClassObject*)func)->cl_name);
2820 else if (PyInstance_Check(func)) {
2821 return PyString_AsString(
2822 ((PyInstanceObject*)func)->in_class->cl_name);
2823 } else {
2824 return func->ob_type->tp_name;
2825 }
2826}
2827
2828static char *
2829get_func_desc(PyObject *func)
2830{
2831 if (PyMethod_Check(func))
2832 return "()";
2833 else if (PyFunction_Check(func))
2834 return "()";
2835 else if (PyCFunction_Check(func))
2836 return "()";
2837 else if (PyClass_Check(func))
2838 return " constructor";
2839 else if (PyInstance_Check(func)) {
2840 return " instance";
2841 } else {
2842 return " object";
2843 }
2844}
2845
Jeremy Hylton52820442001-01-03 23:52:36 +00002846static PyObject *
2847call_object(PyObject *func, PyObject *arg, PyObject *kw)
2848{
2849 ternaryfunc call;
2850 PyObject *result;
2851
2852 if (PyMethod_Check(func))
2853 result = call_method(func, arg, kw);
2854 else if (PyFunction_Check(func))
2855 result = call_eval_code2(func, arg, kw);
2856 else if (PyCFunction_Check(func))
2857 result = call_cfunction(func, arg, kw);
2858 else if (PyClass_Check(func))
2859 result = PyInstance_New(func, arg, kw);
2860 else if (PyInstance_Check(func))
2861 result = call_instance(func, arg, kw);
2862 else if ((call = func->ob_type->tp_call) != NULL)
2863 result = (*call)(func, arg, kw);
2864 else {
2865 PyErr_Format(PyExc_TypeError, "object is not callable: %s",
2866 PyString_AS_STRING(PyObject_Repr(func)));
2867 return NULL;
2868 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002869 if (result == NULL && !PyErr_Occurred())
2870 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002871 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002872
Guido van Rossume59214e1994-08-30 08:01:59 +00002873 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002874}
2875
Guido van Rossumb209a111997-04-29 18:18:01 +00002876static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002877call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878{
Jeremy Hylton52820442001-01-03 23:52:36 +00002879 PyCFunctionObject* f = (PyCFunctionObject*)func;
2880 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2881 PyObject *self = PyCFunction_GET_SELF(func);
2882 int flags = PyCFunction_GET_FLAGS(func);
2883
Jeremy Hylton52820442001-01-03 23:52:36 +00002884 if (flags & METH_KEYWORDS) {
2885 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002887 if (kw != NULL && PyDict_Size(kw) != 0) {
2888 PyErr_Format(PyExc_TypeError,
2889 "%.200s() takes no keyword arguments",
2890 f->m_ml->ml_name);
2891 return NULL;
2892 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002893 if (flags & METH_VARARGS) {
2894 return (*meth)(self, arg);
2895 }
2896 if (!(flags & METH_VARARGS)) {
2897 /* the really old style */
2898 int size = PyTuple_GET_SIZE(arg);
2899 if (size == 1)
2900 arg = PyTuple_GET_ITEM(arg, 0);
2901 else if (size == 0)
2902 arg = NULL;
2903 return (*meth)(self, arg);
2904 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002905 /* should never get here ??? */
2906 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 return NULL;
2908}
2909
Guido van Rossumb209a111997-04-29 18:18:01 +00002910static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002911call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912{
Jeremy Hylton52820442001-01-03 23:52:36 +00002913 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2914 if (call == NULL) {
2915 PyInstanceObject *inst = (PyInstanceObject*) func;
2916 PyErr_Clear();
2917 PyErr_Format(PyExc_AttributeError,
2918 "%.200s instance has no __call__ method",
2919 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002920 return NULL;
2921 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002922 res = call_object(call, arg, kw);
2923 Py_DECREF(call);
2924 return res;
2925}
2926
2927static PyObject *
2928call_method(PyObject *func, PyObject *arg, PyObject *kw)
2929{
2930 PyObject *self = PyMethod_GET_SELF(func);
2931 PyObject *class = PyMethod_GET_CLASS(func);
2932 PyObject *result;
2933
2934 func = PyMethod_GET_FUNCTION(func);
2935 if (self == NULL) {
2936 /* Unbound methods must be called with an instance of
2937 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002938 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00002939 if (PyTuple_Size(arg) >= 1)
2940 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002941 if (self == NULL)
2942 ok = 0;
2943 else {
2944 ok = PyObject_IsInstance(self, class);
2945 if (ok < 0)
2946 return NULL;
2947 }
2948 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002949 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002950 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002951 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002952 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953 return NULL;
2954 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002955 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002956 }
2957 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002958 int argcount = PyTuple_Size(arg);
2959 PyObject *newarg = PyTuple_New(argcount + 1);
2960 int i;
2961 if (newarg == NULL)
2962 return NULL;
2963 Py_INCREF(self);
2964 PyTuple_SET_ITEM(newarg, 0, self);
2965 for (i = 0; i < argcount; i++) {
2966 PyObject *v = PyTuple_GET_ITEM(arg, i);
2967 Py_XINCREF(v);
2968 PyTuple_SET_ITEM(newarg, i+1, v);
2969 }
2970 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002972 result = call_object(func, arg, kw);
2973 Py_DECREF(arg);
2974 return result;
2975}
2976
2977static PyObject *
2978call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2979{
2980 PyObject *result;
2981 PyObject *argdefs;
2982 PyObject **d, **k;
2983 int nk, nd;
2984
2985 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00002986 if (argdefs != NULL && PyTuple_Check(argdefs)) {
2987 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
2988 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002989 }
2990 else {
2991 d = NULL;
2992 nd = 0;
2993 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002994
Guido van Rossum681d79a1995-07-18 14:51:37 +00002995 if (kw != NULL) {
2996 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00002997 nk = PyDict_Size(kw);
2998 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002999 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003000 PyErr_NoMemory();
3001 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003002 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003003 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003004 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003005 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003006 i += 2;
3007 nk = i/2;
3008 /* XXX This is broken if the caller deletes dict items! */
3009 }
3010 else {
3011 k = NULL;
3012 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003013 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003014
Guido van Rossum681d79a1995-07-18 14:51:37 +00003015 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003016 (PyCodeObject *)PyFunction_GET_CODE(func),
3017 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003018 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003019 k, nk, d, nd,
3020 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003021
Guido van Rossumb18618d2000-05-03 23:44:39 +00003022 if (k != NULL)
3023 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003024
Guido van Rossum681d79a1995-07-18 14:51:37 +00003025 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026}
3027
Jeremy Hylton52820442001-01-03 23:52:36 +00003028#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3029
3030/* The two fast_xxx() functions optimize calls for which no argument
3031 tuple is necessary; the objects are passed directly from the stack.
3032 fast_cfunction() is called for METH_OLDARGS functions.
3033 fast_function() is for functions with no special argument handling.
3034*/
3035
3036static PyObject *
3037fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3038{
3039 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3040 PyObject *self = PyCFunction_GET_SELF(func);
3041
3042 if (na == 0)
3043 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003044 else if (na == 1) {
3045 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003046 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003047 Py_DECREF(arg);
3048 return result;
3049 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003050 PyObject *args = load_args(pp_stack, na);
3051 PyObject *result = (*meth)(self, args);
3052 Py_DECREF(args);
3053 return result;
3054 }
3055}
3056
3057static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003058fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003059{
3060 PyObject *co = PyFunction_GET_CODE(func);
3061 PyObject *globals = PyFunction_GET_GLOBALS(func);
3062 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003063 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003064 PyObject **d = NULL;
3065 int nd = 0;
3066
3067 if (argdefs != NULL) {
3068 d = &PyTuple_GET_ITEM(argdefs, 0);
3069 nd = ((PyTupleObject *)argdefs)->ob_size;
3070 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003071 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003072 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003073 (*pp_stack)-2*nk, nk, d, nd,
3074 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003075}
3076
3077static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003078update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3079 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003080{
3081 PyObject *kwdict = NULL;
3082 if (orig_kwdict == NULL)
3083 kwdict = PyDict_New();
3084 else {
3085 kwdict = PyDict_Copy(orig_kwdict);
3086 Py_DECREF(orig_kwdict);
3087 }
3088 if (kwdict == NULL)
3089 return NULL;
3090 while (--nk >= 0) {
3091 int err;
3092 PyObject *value = EXT_POP(*pp_stack);
3093 PyObject *key = EXT_POP(*pp_stack);
3094 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003095 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003096 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003097 "for keyword argument '%.200s'",
3098 get_func_name(func),
3099 get_func_desc(func),
3100 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003101 Py_DECREF(key);
3102 Py_DECREF(value);
3103 Py_DECREF(kwdict);
3104 return NULL;
3105 }
3106 err = PyDict_SetItem(kwdict, key, value);
3107 Py_DECREF(key);
3108 Py_DECREF(value);
3109 if (err) {
3110 Py_DECREF(kwdict);
3111 return NULL;
3112 }
3113 }
3114 return kwdict;
3115}
3116
3117static PyObject *
3118update_star_args(int nstack, int nstar, PyObject *stararg,
3119 PyObject ***pp_stack)
3120{
3121 PyObject *callargs, *w;
3122
3123 callargs = PyTuple_New(nstack + nstar);
3124 if (callargs == NULL) {
3125 return NULL;
3126 }
3127 if (nstar) {
3128 int i;
3129 for (i = 0; i < nstar; i++) {
3130 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3131 Py_INCREF(a);
3132 PyTuple_SET_ITEM(callargs, nstack + i, a);
3133 }
3134 }
3135 while (--nstack >= 0) {
3136 w = EXT_POP(*pp_stack);
3137 PyTuple_SET_ITEM(callargs, nstack, w);
3138 }
3139 return callargs;
3140}
3141
3142static PyObject *
3143load_args(PyObject ***pp_stack, int na)
3144{
3145 PyObject *args = PyTuple_New(na);
3146 PyObject *w;
3147
3148 if (args == NULL)
3149 return NULL;
3150 while (--na >= 0) {
3151 w = EXT_POP(*pp_stack);
3152 PyTuple_SET_ITEM(args, na, w);
3153 }
3154 return args;
3155}
3156
3157static PyObject *
3158do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3159{
3160 PyObject *callargs = NULL;
3161 PyObject *kwdict = NULL;
3162 PyObject *result = NULL;
3163
3164 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003165 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003166 if (kwdict == NULL)
3167 goto call_fail;
3168 }
3169 callargs = load_args(pp_stack, na);
3170 if (callargs == NULL)
3171 goto call_fail;
3172 result = call_object(func, callargs, kwdict);
3173 call_fail:
3174 Py_XDECREF(callargs);
3175 Py_XDECREF(kwdict);
3176 return result;
3177}
3178
3179static PyObject *
3180ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3181{
3182 int nstar = 0;
3183 PyObject *callargs = NULL;
3184 PyObject *stararg = NULL;
3185 PyObject *kwdict = NULL;
3186 PyObject *result = NULL;
3187
3188 if (flags & CALL_FLAG_KW) {
3189 kwdict = EXT_POP(*pp_stack);
3190 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003191 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003192 "%s%s argument after ** "
3193 "must be a dictionary",
3194 get_func_name(func),
3195 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003196 goto ext_call_fail;
3197 }
3198 }
3199 if (flags & CALL_FLAG_VAR) {
3200 stararg = EXT_POP(*pp_stack);
3201 if (!PyTuple_Check(stararg)) {
3202 PyObject *t = NULL;
3203 t = PySequence_Tuple(stararg);
3204 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003205 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3206 PyErr_Format(PyExc_TypeError,
3207 "%s%s argument after * "
3208 "must be a sequence",
3209 get_func_name(func),
3210 get_func_desc(func));
3211 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003212 goto ext_call_fail;
3213 }
3214 Py_DECREF(stararg);
3215 stararg = t;
3216 }
3217 nstar = PyTuple_GET_SIZE(stararg);
3218 }
3219 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003220 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003221 if (kwdict == NULL)
3222 goto ext_call_fail;
3223 }
3224 callargs = update_star_args(na, nstar, stararg, pp_stack);
3225 if (callargs == NULL)
3226 goto ext_call_fail;
3227 result = call_object(func, callargs, kwdict);
3228 ext_call_fail:
3229 Py_XDECREF(callargs);
3230 Py_XDECREF(kwdict);
3231 Py_XDECREF(stararg);
3232 return result;
3233}
3234
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003235#define SLICE_ERROR_MSG \
3236 "standard sequence type does not support step size other than one"
3237
Guido van Rossumb209a111997-04-29 18:18:01 +00003238static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003239loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240{
Guido van Rossumb209a111997-04-29 18:18:01 +00003241 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003242 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003243 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003244 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 return NULL;
3246 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003247 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003248 v = (*sq->sq_item)(v, i);
3249 if (v)
3250 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003251 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003252 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003253 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254}
3255
Guido van Rossum20c6add2000-05-08 14:06:50 +00003256/* Extract a slice index from a PyInt or PyLong, the index is bound to
3257 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3258 and error. Returns 1 on success.*/
3259
3260int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003261_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262{
3263 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003264 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003265 if (PyInt_Check(v)) {
3266 x = PyInt_AsLong(v);
3267 } else if (PyLong_Check(v)) {
3268 x = PyLong_AsLong(v);
3269 if (x==-1 && PyErr_Occurred()) {
3270 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003271 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003272
Guido van Rossumac7be682001-01-17 15:42:30 +00003273 if (!PyErr_ExceptionMatches(
3274 PyExc_OverflowError)) {
3275 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003276 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003277 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003278 }
3279
Guido van Rossumac7be682001-01-17 15:42:30 +00003280 /* Clear the OverflowError */
3281 PyErr_Clear();
3282
3283 /* It's an overflow error, so we need to
3284 check the sign of the long integer,
3285 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003286 the error. */
3287
3288 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003289 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003290 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003291
3292 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003293 cmp = PyObject_RichCompareBool(v, long_zero,
3294 Py_GT);
3295 Py_DECREF(long_zero);
3296 if (cmp < 0)
3297 return 0;
3298 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003299 x = INT_MAX;
3300 else
3301 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003302 }
3303 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003304 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003305 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003306 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003308 /* Truncate -- very long indices are truncated anyway */
3309 if (x > INT_MAX)
3310 x = INT_MAX;
3311 else if (x < -INT_MAX)
3312 x = 0;
3313 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003315 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003316}
3317
Guido van Rossumb209a111997-04-29 18:18:01 +00003318static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003319apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003321 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003322 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003324 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003325 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003326 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003328
3329static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003330assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3331 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003333 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003334 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003335 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003336 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003337 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003338 if (x == NULL)
3339 return PySequence_DelSlice(u, ilow, ihigh);
3340 else
3341 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342}
3343
Guido van Rossumb209a111997-04-29 18:18:01 +00003344static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003345cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346{
Guido van Rossumac7be682001-01-17 15:42:30 +00003347 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003349 case IS:
3350 case IS_NOT:
3351 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003352 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003353 res = !res;
3354 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 case IN:
3356 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003357 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003358 if (res < 0)
3359 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003360 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003361 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 break;
3363 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003364 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 break;
3366 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003367 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003369 v = res ? Py_True : Py_False;
3370 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 return v;
3372}
3373
Thomas Wouters52152252000-08-17 22:55:00 +00003374static PyObject *
3375import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003376{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003377 PyObject *x;
3378
3379 x = PyObject_GetAttr(v, name);
3380 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003381 PyErr_Format(PyExc_ImportError,
3382 "cannot import name %.230s",
3383 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003384 }
Thomas Wouters52152252000-08-17 22:55:00 +00003385 return x;
3386}
Guido van Rossumac7be682001-01-17 15:42:30 +00003387
Thomas Wouters52152252000-08-17 22:55:00 +00003388static int
3389import_all_from(PyObject *locals, PyObject *v)
3390{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003391 PyObject *all = PyObject_GetAttrString(v, "__all__");
3392 PyObject *dict, *name, *value;
3393 int skip_leading_underscores = 0;
3394 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003395
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003396 if (all == NULL) {
3397 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3398 return -1; /* Unexpected error */
3399 PyErr_Clear();
3400 dict = PyObject_GetAttrString(v, "__dict__");
3401 if (dict == NULL) {
3402 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3403 return -1;
3404 PyErr_SetString(PyExc_ImportError,
3405 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003406 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003407 }
3408 all = PyMapping_Keys(dict);
3409 Py_DECREF(dict);
3410 if (all == NULL)
3411 return -1;
3412 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003413 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003414
3415 for (pos = 0, err = 0; ; pos++) {
3416 name = PySequence_GetItem(all, pos);
3417 if (name == NULL) {
3418 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3419 err = -1;
3420 else
3421 PyErr_Clear();
3422 break;
3423 }
3424 if (skip_leading_underscores &&
3425 PyString_Check(name) &&
3426 PyString_AS_STRING(name)[0] == '_')
3427 {
3428 Py_DECREF(name);
3429 continue;
3430 }
3431 value = PyObject_GetAttr(v, name);
3432 if (value == NULL)
3433 err = -1;
3434 else
3435 err = PyDict_SetItem(locals, name, value);
3436 Py_DECREF(name);
3437 Py_XDECREF(value);
3438 if (err != 0)
3439 break;
3440 }
3441 Py_DECREF(all);
3442 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003443}
3444
Guido van Rossumb209a111997-04-29 18:18:01 +00003445static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003446build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003447{
Guido van Rossumcd649651997-08-22 16:56:16 +00003448 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003449 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003450 PyErr_SetString(PyExc_SystemError,
3451 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003452 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003453 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003454 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003455 PyErr_SetString(PyExc_SystemError,
3456 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003457 return NULL;
3458 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003459 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003460 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003461 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003462 return NULL;
3463 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003464 n = PyTuple_Size(bases);
3465 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003466 PyObject *base = PyTuple_GET_ITEM(bases, i);
3467 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003468 /* Call the base's *type*, if it is callable.
3469 This code is a hook for Donald Beaudry's
3470 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003471 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003472 since its types are not callable.
3473 Ditto: call the bases's *class*, if it has
3474 one. This makes the same thing possible
3475 without writing C code. A true meta-object
3476 protocol! */
3477 PyObject *basetype = (PyObject *)base->ob_type;
3478 PyObject *callable = NULL;
3479 if (PyCallable_Check(basetype))
3480 callable = basetype;
3481 else
3482 callable = PyObject_GetAttrString(
3483 base, "__class__");
3484 if (callable) {
3485 PyObject *args;
3486 PyObject *newclass = NULL;
3487 args = Py_BuildValue(
3488 "(OOO)", name, bases, methods);
3489 if (args != NULL) {
3490 newclass = PyEval_CallObject(
3491 callable, args);
3492 Py_DECREF(args);
3493 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003494 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003495 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003496 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003497 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003498 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003499 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003500 "base is not a class object");
3501 return NULL;
3502 }
3503 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003504 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003505}
3506
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003507static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003508exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3509 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003510{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003511 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003512 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003513 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003514
Guido van Rossumb209a111997-04-29 18:18:01 +00003515 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3516 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003517 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003518 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003519 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003520 locals = PyTuple_GetItem(prog, 2);
3521 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003522 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003523 if (globals == Py_None) {
3524 globals = PyEval_GetGlobals();
3525 if (locals == Py_None) {
3526 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003527 plain = 1;
3528 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003529 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003530 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003531 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003532 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003533 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003534 !PyCode_Check(prog) &&
3535 !PyFile_Check(prog)) {
3536 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003537 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003538 return -1;
3539 }
Fred Drake661ea262000-10-24 19:57:45 +00003540 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003541 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003542 "exec: arg 2 must be a dictionary or None");
3543 return -1;
3544 }
3545 if (!PyDict_Check(locals)) {
3546 PyErr_SetString(PyExc_TypeError,
3547 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003548 return -1;
3549 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003550 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003551 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003552 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003553 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003554 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003555 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003556 FILE *fp = PyFile_AsFile(prog);
3557 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003558 if (PyEval_GetNestedScopes()) {
3559 PyCompilerFlags cf;
3560 cf.cf_nested_scopes = 1;
3561 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3562 locals, &cf);
3563 } else {
3564 v = PyRun_File(fp, name, Py_file_input, globals,
3565 locals);
3566 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003567 }
3568 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003569 char *str;
3570 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003572 if (PyEval_GetNestedScopes()) {
3573 PyCompilerFlags cf;
3574 cf.cf_nested_scopes = 1;
3575 v = PyRun_StringFlags(str, Py_file_input, globals,
3576 locals, &cf);
3577 } else
3578 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003579 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003580 if (plain)
3581 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003582 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003583 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003584 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003585 return 0;
3586}
Guido van Rossum24c13741995-02-14 09:42:43 +00003587
Guido van Rossumac7be682001-01-17 15:42:30 +00003588static void
Paul Prescode68140d2000-08-30 20:25:01 +00003589format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3590{
3591 char *obj_str;
3592
3593 if (!obj)
3594 return;
3595
3596 obj_str = PyString_AsString(obj);
3597 if (!obj_str)
3598 return;
3599
3600 PyErr_Format(exc, format_str, obj_str);
3601}
Guido van Rossum950361c1997-01-24 13:49:28 +00003602
3603#ifdef DYNAMIC_EXECUTION_PROFILE
3604
3605PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003606getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003607{
3608 int i;
3609 PyObject *l = PyList_New(256);
3610 if (l == NULL) return NULL;
3611 for (i = 0; i < 256; i++) {
3612 PyObject *x = PyInt_FromLong(a[i]);
3613 if (x == NULL) {
3614 Py_DECREF(l);
3615 return NULL;
3616 }
3617 PyList_SetItem(l, i, x);
3618 }
3619 for (i = 0; i < 256; i++)
3620 a[i] = 0;
3621 return l;
3622}
3623
3624PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003625_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003626{
3627#ifndef DXPAIRS
3628 return getarray(dxp);
3629#else
3630 int i;
3631 PyObject *l = PyList_New(257);
3632 if (l == NULL) return NULL;
3633 for (i = 0; i < 257; i++) {
3634 PyObject *x = getarray(dxpairs[i]);
3635 if (x == NULL) {
3636 Py_DECREF(l);
3637 return NULL;
3638 }
3639 PyList_SetItem(l, i, x);
3640 }
3641 return l;
3642#endif
3643}
3644
3645#endif