blob: f9d03253eb8fbff3b9eb62ba333c621a48b7f297 [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 Draked0838392001-06-16 21:02:31 +000065 PyFrameObject *, 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 Draked0838392001-06-16 21:02:31 +0000657 &f->f_trace, f, 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 Draked0838392001-06-16 21:02:31 +0000668 (PyObject**)0, f, 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 Draked0838392001-06-16 21:02:31 +00001964 f, 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 Draked0838392001-06-16 21:02:31 +00002309 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 Draked0838392001-06-16 21:02:31 +00002319 f, 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 Draked0838392001-06-16 21:02:31 +00002587 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002588 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002589 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002590 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002591 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002592 Py_XDECREF(type);
2593 Py_XDECREF(value);
2594 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002595 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002596}
2597
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598/* PyObject **p_trace: in/out; may not be NULL;
2599 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002600 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002601 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002602 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002603 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002604*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002605
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002606static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002607call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002608 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002609{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002610 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002611 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002612 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002613
Guido van Rossuma027efa1997-05-05 20:56:21 +00002614 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002615 /* Don't do recursive traces */
2616 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002617 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002618 *p_newtrace = NULL;
2619 }
2620 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002621 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002622
Guido van Rossumb209a111997-04-29 18:18:01 +00002623 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002624 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002625 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002626 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002627 Py_INCREF(f);
2628 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002629 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002630 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 arg = Py_None;
2632 Py_INCREF(arg);
2633 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002634 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002635 PyFrame_FastToLocals(f);
2636 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2637 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002638 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002639 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002640 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002641 if (res == NULL) {
2642 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002643 PyTraceBack_Here(f);
2644 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002645 *p_trace = NULL;
2646 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002647 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002648 *p_newtrace = NULL;
2649 }
Barry Warsawf6202631999-09-08 16:26:33 +00002650 /* to be extra double plus sure we don't get recursive
2651 * calls inf either tracefunc or profilefunc gets an
2652 * exception, zap the global variables.
2653 */
2654 Py_XDECREF(tstate->sys_tracefunc);
2655 tstate->sys_tracefunc = NULL;
2656 Py_XDECREF(tstate->sys_profilefunc);
2657 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002658 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002659 }
2660 else {
2661 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 Py_XDECREF(*p_newtrace);
2663 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002664 *p_newtrace = NULL;
2665 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002666 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002667 *p_newtrace = res;
2668 }
2669 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002670 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002671 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002672 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002673}
2674
Fred Draked0838392001-06-16 21:02:31 +00002675/* Initialize the strings that get passed to the profile and trace functions;
2676 * this avoids doing this while we're actually profiling/tracing.
2677 */
2678int
2679_PyTrace_Init(void)
2680{
2681 if (str_call == NULL) {
2682 str_call = PyString_InternFromString("call");
2683 if (str_call == NULL)
2684 return -1;
2685 }
2686 if (str_exception == NULL) {
2687 str_exception = PyString_InternFromString("exception");
2688 if (str_exception == NULL)
2689 return -1;
2690 }
2691 if (str_line == NULL) {
2692 str_line = PyString_InternFromString("line");
2693 if (str_line == NULL)
2694 return -1;
2695 }
2696 if (str_return == NULL) {
2697 str_return = PyString_InternFromString("return");
2698 if (str_return == NULL)
2699 return -1;
2700 }
2701 return 0;
2702}
2703
2704
Guido van Rossumb209a111997-04-29 18:18:01 +00002705PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002706PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002707{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002708 PyThreadState *tstate = PyThreadState_Get();
2709 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002710 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002711 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002712 else
2713 return current_frame->f_builtins;
2714}
2715
Guido van Rossumb209a111997-04-29 18:18:01 +00002716PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002717PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002718{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002719 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002720 if (current_frame == NULL)
2721 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002722 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002723 return current_frame->f_locals;
2724}
2725
Guido van Rossumb209a111997-04-29 18:18:01 +00002726PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002727PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002728{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002729 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002730 if (current_frame == NULL)
2731 return NULL;
2732 else
2733 return current_frame->f_globals;
2734}
2735
Guido van Rossumb209a111997-04-29 18:18:01 +00002736PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002737PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002738{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002739 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002740 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002741}
2742
Guido van Rossum6135a871995-01-09 17:53:26 +00002743int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002744PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002745{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002746 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002747 return current_frame == NULL ? 0 : current_frame->f_restricted;
2748}
2749
Guido van Rossumbe270261997-05-22 22:26:18 +00002750int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002751PyEval_GetNestedScopes(void)
2752{
2753 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2754 return current_frame == NULL ? 0 :
2755 current_frame->f_code->co_flags & CO_NESTED;
2756}
2757
2758int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002759Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760{
Guido van Rossumb209a111997-04-29 18:18:01 +00002761 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002762 if (f == NULL)
2763 return 0;
2764 if (!PyFile_SoftSpace(f, 0))
2765 return 0;
2766 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767}
2768
Guido van Rossum3f5da241990-12-20 15:06:42 +00002769
Guido van Rossum681d79a1995-07-18 14:51:37 +00002770/* External interface to call any callable object.
2771 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002772
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002773#undef PyEval_CallObject
2774/* for backward compatibility: export this interface */
2775
Guido van Rossumb209a111997-04-29 18:18:01 +00002776PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002777PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002778{
Guido van Rossumb209a111997-04-29 18:18:01 +00002779 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002780}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002781#define PyEval_CallObject(func,arg) \
2782 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002783
Guido van Rossumb209a111997-04-29 18:18:01 +00002784PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002785PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002786{
Jeremy Hylton52820442001-01-03 23:52:36 +00002787 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002788
2789 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 arg = PyTuple_New(0);
2791 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002792 PyErr_SetString(PyExc_TypeError,
2793 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002794 return NULL;
2795 }
2796 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002797 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002798
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002800 PyErr_SetString(PyExc_TypeError,
2801 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002802 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002803 return NULL;
2804 }
2805
Jeremy Hylton52820442001-01-03 23:52:36 +00002806 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002808 return result;
2809}
2810
2811/* How often is each kind of object called? The answer depends on the
2812 program. An instrumented call_object() was used to run the Python
2813 regression test suite. The results were:
2814 4200000 PyCFunctions
2815 390000 fast_function() calls
2816 94000 other functions
2817 480000 all functions (sum of prev two)
2818 150000 methods
2819 100000 classes
2820
2821 Tests on other bodies of code show that PyCFunctions are still
2822 most common, but not by such a large margin.
2823*/
2824
Jeremy Hylton512a2372001-04-11 13:52:29 +00002825static char *
2826get_func_name(PyObject *func)
2827{
2828 if (PyMethod_Check(func))
2829 return get_func_name(PyMethod_GET_FUNCTION(func));
2830 else if (PyFunction_Check(func))
2831 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2832 else if (PyCFunction_Check(func))
2833 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2834 else if (PyClass_Check(func))
2835 return PyString_AsString(((PyClassObject*)func)->cl_name);
2836 else if (PyInstance_Check(func)) {
2837 return PyString_AsString(
2838 ((PyInstanceObject*)func)->in_class->cl_name);
2839 } else {
2840 return func->ob_type->tp_name;
2841 }
2842}
2843
2844static char *
2845get_func_desc(PyObject *func)
2846{
2847 if (PyMethod_Check(func))
2848 return "()";
2849 else if (PyFunction_Check(func))
2850 return "()";
2851 else if (PyCFunction_Check(func))
2852 return "()";
2853 else if (PyClass_Check(func))
2854 return " constructor";
2855 else if (PyInstance_Check(func)) {
2856 return " instance";
2857 } else {
2858 return " object";
2859 }
2860}
2861
Jeremy Hylton52820442001-01-03 23:52:36 +00002862static PyObject *
2863call_object(PyObject *func, PyObject *arg, PyObject *kw)
2864{
2865 ternaryfunc call;
2866 PyObject *result;
2867
2868 if (PyMethod_Check(func))
2869 result = call_method(func, arg, kw);
2870 else if (PyFunction_Check(func))
2871 result = call_eval_code2(func, arg, kw);
2872 else if (PyCFunction_Check(func))
2873 result = call_cfunction(func, arg, kw);
2874 else if (PyClass_Check(func))
2875 result = PyInstance_New(func, arg, kw);
2876 else if (PyInstance_Check(func))
2877 result = call_instance(func, arg, kw);
2878 else if ((call = func->ob_type->tp_call) != NULL)
2879 result = (*call)(func, arg, kw);
2880 else {
Tim Peters239508c2001-06-16 00:09:28 +00002881 PyErr_Format(PyExc_TypeError,
2882 "object of type '%.100s' is not callable",
2883 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00002884 return NULL;
2885 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002886 if (result == NULL && !PyErr_Occurred())
2887 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00002888 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00002889
Guido van Rossume59214e1994-08-30 08:01:59 +00002890 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002891}
2892
Guido van Rossumb209a111997-04-29 18:18:01 +00002893static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002894call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895{
Jeremy Hylton52820442001-01-03 23:52:36 +00002896 PyCFunctionObject* f = (PyCFunctionObject*)func;
2897 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
2898 PyObject *self = PyCFunction_GET_SELF(func);
2899 int flags = PyCFunction_GET_FLAGS(func);
2900
Jeremy Hylton52820442001-01-03 23:52:36 +00002901 if (flags & METH_KEYWORDS) {
2902 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002904 if (kw != NULL && PyDict_Size(kw) != 0) {
2905 PyErr_Format(PyExc_TypeError,
2906 "%.200s() takes no keyword arguments",
2907 f->m_ml->ml_name);
2908 return NULL;
2909 }
Fred Drake1a7aab72001-01-04 22:33:02 +00002910 if (flags & METH_VARARGS) {
2911 return (*meth)(self, arg);
2912 }
2913 if (!(flags & METH_VARARGS)) {
2914 /* the really old style */
2915 int size = PyTuple_GET_SIZE(arg);
2916 if (size == 1)
2917 arg = PyTuple_GET_ITEM(arg, 0);
2918 else if (size == 0)
2919 arg = NULL;
2920 return (*meth)(self, arg);
2921 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002922 /* should never get here ??? */
2923 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002924 return NULL;
2925}
2926
Guido van Rossumb209a111997-04-29 18:18:01 +00002927static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00002928call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929{
Jeremy Hylton52820442001-01-03 23:52:36 +00002930 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2931 if (call == NULL) {
2932 PyInstanceObject *inst = (PyInstanceObject*) func;
2933 PyErr_Clear();
2934 PyErr_Format(PyExc_AttributeError,
2935 "%.200s instance has no __call__ method",
2936 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00002937 return NULL;
2938 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002939 res = call_object(call, arg, kw);
2940 Py_DECREF(call);
2941 return res;
2942}
2943
2944static PyObject *
2945call_method(PyObject *func, PyObject *arg, PyObject *kw)
2946{
2947 PyObject *self = PyMethod_GET_SELF(func);
2948 PyObject *class = PyMethod_GET_CLASS(func);
2949 PyObject *result;
2950
2951 func = PyMethod_GET_FUNCTION(func);
2952 if (self == NULL) {
2953 /* Unbound methods must be called with an instance of
2954 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002955 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00002956 if (PyTuple_Size(arg) >= 1)
2957 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002958 if (self == NULL)
2959 ok = 0;
2960 else {
2961 ok = PyObject_IsInstance(self, class);
2962 if (ok < 0)
2963 return NULL;
2964 }
2965 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002966 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002967 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002968 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00002969 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002970 return NULL;
2971 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002972 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002973 }
2974 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00002975 int argcount = PyTuple_Size(arg);
2976 PyObject *newarg = PyTuple_New(argcount + 1);
2977 int i;
2978 if (newarg == NULL)
2979 return NULL;
2980 Py_INCREF(self);
2981 PyTuple_SET_ITEM(newarg, 0, self);
2982 for (i = 0; i < argcount; i++) {
2983 PyObject *v = PyTuple_GET_ITEM(arg, i);
2984 Py_XINCREF(v);
2985 PyTuple_SET_ITEM(newarg, i+1, v);
2986 }
2987 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988 }
Jeremy Hylton52820442001-01-03 23:52:36 +00002989 result = call_object(func, arg, kw);
2990 Py_DECREF(arg);
2991 return result;
2992}
2993
2994static PyObject *
2995call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
2996{
2997 PyObject *result;
2998 PyObject *argdefs;
2999 PyObject **d, **k;
3000 int nk, nd;
3001
3002 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003003 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3004 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3005 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003006 }
3007 else {
3008 d = NULL;
3009 nd = 0;
3010 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003011
Guido van Rossum681d79a1995-07-18 14:51:37 +00003012 if (kw != NULL) {
3013 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003014 nk = PyDict_Size(kw);
3015 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003016 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003017 PyErr_NoMemory();
3018 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003019 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003020 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003021 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003022 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003023 i += 2;
3024 nk = i/2;
3025 /* XXX This is broken if the caller deletes dict items! */
3026 }
3027 else {
3028 k = NULL;
3029 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003030 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003031
Guido van Rossum681d79a1995-07-18 14:51:37 +00003032 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003033 (PyCodeObject *)PyFunction_GET_CODE(func),
3034 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003035 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003036 k, nk, d, nd,
3037 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003038
Guido van Rossumb18618d2000-05-03 23:44:39 +00003039 if (k != NULL)
3040 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003041
Guido van Rossum681d79a1995-07-18 14:51:37 +00003042 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003043}
3044
Jeremy Hylton52820442001-01-03 23:52:36 +00003045#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3046
3047/* The two fast_xxx() functions optimize calls for which no argument
3048 tuple is necessary; the objects are passed directly from the stack.
3049 fast_cfunction() is called for METH_OLDARGS functions.
3050 fast_function() is for functions with no special argument handling.
3051*/
3052
3053static PyObject *
3054fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3055{
3056 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3057 PyObject *self = PyCFunction_GET_SELF(func);
3058
3059 if (na == 0)
3060 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003061 else if (na == 1) {
3062 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003063 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003064 Py_DECREF(arg);
3065 return result;
3066 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003067 PyObject *args = load_args(pp_stack, na);
3068 PyObject *result = (*meth)(self, args);
3069 Py_DECREF(args);
3070 return result;
3071 }
3072}
3073
3074static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003075fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003076{
3077 PyObject *co = PyFunction_GET_CODE(func);
3078 PyObject *globals = PyFunction_GET_GLOBALS(func);
3079 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003080 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003081 PyObject **d = NULL;
3082 int nd = 0;
3083
3084 if (argdefs != NULL) {
3085 d = &PyTuple_GET_ITEM(argdefs, 0);
3086 nd = ((PyTupleObject *)argdefs)->ob_size;
3087 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003088 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003089 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003090 (*pp_stack)-2*nk, nk, d, nd,
3091 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003092}
3093
3094static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003095update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3096 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003097{
3098 PyObject *kwdict = NULL;
3099 if (orig_kwdict == NULL)
3100 kwdict = PyDict_New();
3101 else {
3102 kwdict = PyDict_Copy(orig_kwdict);
3103 Py_DECREF(orig_kwdict);
3104 }
3105 if (kwdict == NULL)
3106 return NULL;
3107 while (--nk >= 0) {
3108 int err;
3109 PyObject *value = EXT_POP(*pp_stack);
3110 PyObject *key = EXT_POP(*pp_stack);
3111 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003112 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003113 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003114 "for keyword argument '%.200s'",
3115 get_func_name(func),
3116 get_func_desc(func),
3117 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003118 Py_DECREF(key);
3119 Py_DECREF(value);
3120 Py_DECREF(kwdict);
3121 return NULL;
3122 }
3123 err = PyDict_SetItem(kwdict, key, value);
3124 Py_DECREF(key);
3125 Py_DECREF(value);
3126 if (err) {
3127 Py_DECREF(kwdict);
3128 return NULL;
3129 }
3130 }
3131 return kwdict;
3132}
3133
3134static PyObject *
3135update_star_args(int nstack, int nstar, PyObject *stararg,
3136 PyObject ***pp_stack)
3137{
3138 PyObject *callargs, *w;
3139
3140 callargs = PyTuple_New(nstack + nstar);
3141 if (callargs == NULL) {
3142 return NULL;
3143 }
3144 if (nstar) {
3145 int i;
3146 for (i = 0; i < nstar; i++) {
3147 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3148 Py_INCREF(a);
3149 PyTuple_SET_ITEM(callargs, nstack + i, a);
3150 }
3151 }
3152 while (--nstack >= 0) {
3153 w = EXT_POP(*pp_stack);
3154 PyTuple_SET_ITEM(callargs, nstack, w);
3155 }
3156 return callargs;
3157}
3158
3159static PyObject *
3160load_args(PyObject ***pp_stack, int na)
3161{
3162 PyObject *args = PyTuple_New(na);
3163 PyObject *w;
3164
3165 if (args == NULL)
3166 return NULL;
3167 while (--na >= 0) {
3168 w = EXT_POP(*pp_stack);
3169 PyTuple_SET_ITEM(args, na, w);
3170 }
3171 return args;
3172}
3173
3174static PyObject *
3175do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3176{
3177 PyObject *callargs = NULL;
3178 PyObject *kwdict = NULL;
3179 PyObject *result = NULL;
3180
3181 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003182 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003183 if (kwdict == NULL)
3184 goto call_fail;
3185 }
3186 callargs = load_args(pp_stack, na);
3187 if (callargs == NULL)
3188 goto call_fail;
3189 result = call_object(func, callargs, kwdict);
3190 call_fail:
3191 Py_XDECREF(callargs);
3192 Py_XDECREF(kwdict);
3193 return result;
3194}
3195
3196static PyObject *
3197ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3198{
3199 int nstar = 0;
3200 PyObject *callargs = NULL;
3201 PyObject *stararg = NULL;
3202 PyObject *kwdict = NULL;
3203 PyObject *result = NULL;
3204
3205 if (flags & CALL_FLAG_KW) {
3206 kwdict = EXT_POP(*pp_stack);
3207 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003208 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003209 "%s%s argument after ** "
3210 "must be a dictionary",
3211 get_func_name(func),
3212 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003213 goto ext_call_fail;
3214 }
3215 }
3216 if (flags & CALL_FLAG_VAR) {
3217 stararg = EXT_POP(*pp_stack);
3218 if (!PyTuple_Check(stararg)) {
3219 PyObject *t = NULL;
3220 t = PySequence_Tuple(stararg);
3221 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003222 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3223 PyErr_Format(PyExc_TypeError,
3224 "%s%s argument after * "
3225 "must be a sequence",
3226 get_func_name(func),
3227 get_func_desc(func));
3228 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003229 goto ext_call_fail;
3230 }
3231 Py_DECREF(stararg);
3232 stararg = t;
3233 }
3234 nstar = PyTuple_GET_SIZE(stararg);
3235 }
3236 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003237 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003238 if (kwdict == NULL)
3239 goto ext_call_fail;
3240 }
3241 callargs = update_star_args(na, nstar, stararg, pp_stack);
3242 if (callargs == NULL)
3243 goto ext_call_fail;
3244 result = call_object(func, callargs, kwdict);
3245 ext_call_fail:
3246 Py_XDECREF(callargs);
3247 Py_XDECREF(kwdict);
3248 Py_XDECREF(stararg);
3249 return result;
3250}
3251
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003252#define SLICE_ERROR_MSG \
3253 "standard sequence type does not support step size other than one"
3254
Guido van Rossumb209a111997-04-29 18:18:01 +00003255static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003256loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003257{
Guido van Rossumb209a111997-04-29 18:18:01 +00003258 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003259 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003260 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003261 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 return NULL;
3263 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003264 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003265 v = (*sq->sq_item)(v, i);
3266 if (v)
3267 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003268 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003269 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003270 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271}
3272
Guido van Rossum20c6add2000-05-08 14:06:50 +00003273/* Extract a slice index from a PyInt or PyLong, the index is bound to
3274 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3275 and error. Returns 1 on success.*/
3276
3277int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003278_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279{
3280 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003281 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003282 if (PyInt_Check(v)) {
3283 x = PyInt_AsLong(v);
3284 } else if (PyLong_Check(v)) {
3285 x = PyLong_AsLong(v);
3286 if (x==-1 && PyErr_Occurred()) {
3287 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003288 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003289
Guido van Rossumac7be682001-01-17 15:42:30 +00003290 if (!PyErr_ExceptionMatches(
3291 PyExc_OverflowError)) {
3292 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003293 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003294 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003295 }
3296
Guido van Rossumac7be682001-01-17 15:42:30 +00003297 /* Clear the OverflowError */
3298 PyErr_Clear();
3299
3300 /* It's an overflow error, so we need to
3301 check the sign of the long integer,
3302 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003303 the error. */
3304
3305 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003306 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003307 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003308
3309 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003310 cmp = PyObject_RichCompareBool(v, long_zero,
3311 Py_GT);
3312 Py_DECREF(long_zero);
3313 if (cmp < 0)
3314 return 0;
3315 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003316 x = INT_MAX;
3317 else
3318 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003319 }
3320 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003321 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003322 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003323 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003325 /* Truncate -- very long indices are truncated anyway */
3326 if (x > INT_MAX)
3327 x = INT_MAX;
3328 else if (x < -INT_MAX)
3329 x = 0;
3330 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003332 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333}
3334
Guido van Rossumb209a111997-04-29 18:18:01 +00003335static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003336apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003338 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003339 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003341 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003342 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003343 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003345
3346static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003347assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3348 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003350 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003351 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003352 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003353 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003354 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003355 if (x == NULL)
3356 return PySequence_DelSlice(u, ilow, ihigh);
3357 else
3358 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359}
3360
Guido van Rossumb209a111997-04-29 18:18:01 +00003361static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003362cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363{
Guido van Rossumac7be682001-01-17 15:42:30 +00003364 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003366 case IS:
3367 case IS_NOT:
3368 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003369 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003370 res = !res;
3371 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003372 case IN:
3373 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003374 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003375 if (res < 0)
3376 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003377 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003378 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379 break;
3380 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003381 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 break;
3383 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003384 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003386 v = res ? Py_True : Py_False;
3387 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388 return v;
3389}
3390
Thomas Wouters52152252000-08-17 22:55:00 +00003391static PyObject *
3392import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003393{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003394 PyObject *x;
3395
3396 x = PyObject_GetAttr(v, name);
3397 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003398 PyErr_Format(PyExc_ImportError,
3399 "cannot import name %.230s",
3400 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003401 }
Thomas Wouters52152252000-08-17 22:55:00 +00003402 return x;
3403}
Guido van Rossumac7be682001-01-17 15:42:30 +00003404
Thomas Wouters52152252000-08-17 22:55:00 +00003405static int
3406import_all_from(PyObject *locals, PyObject *v)
3407{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003408 PyObject *all = PyObject_GetAttrString(v, "__all__");
3409 PyObject *dict, *name, *value;
3410 int skip_leading_underscores = 0;
3411 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003412
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003413 if (all == NULL) {
3414 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3415 return -1; /* Unexpected error */
3416 PyErr_Clear();
3417 dict = PyObject_GetAttrString(v, "__dict__");
3418 if (dict == NULL) {
3419 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3420 return -1;
3421 PyErr_SetString(PyExc_ImportError,
3422 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003423 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003424 }
3425 all = PyMapping_Keys(dict);
3426 Py_DECREF(dict);
3427 if (all == NULL)
3428 return -1;
3429 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003430 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003431
3432 for (pos = 0, err = 0; ; pos++) {
3433 name = PySequence_GetItem(all, pos);
3434 if (name == NULL) {
3435 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3436 err = -1;
3437 else
3438 PyErr_Clear();
3439 break;
3440 }
3441 if (skip_leading_underscores &&
3442 PyString_Check(name) &&
3443 PyString_AS_STRING(name)[0] == '_')
3444 {
3445 Py_DECREF(name);
3446 continue;
3447 }
3448 value = PyObject_GetAttr(v, name);
3449 if (value == NULL)
3450 err = -1;
3451 else
3452 err = PyDict_SetItem(locals, name, value);
3453 Py_DECREF(name);
3454 Py_XDECREF(value);
3455 if (err != 0)
3456 break;
3457 }
3458 Py_DECREF(all);
3459 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003460}
3461
Guido van Rossumb209a111997-04-29 18:18:01 +00003462static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003463build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003464{
Guido van Rossumcd649651997-08-22 16:56:16 +00003465 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003466 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003467 PyErr_SetString(PyExc_SystemError,
3468 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003469 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003470 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003471 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003472 PyErr_SetString(PyExc_SystemError,
3473 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003474 return NULL;
3475 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003476 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003477 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003478 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003479 return NULL;
3480 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003481 n = PyTuple_Size(bases);
3482 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003483 PyObject *base = PyTuple_GET_ITEM(bases, i);
3484 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003485 /* Call the base's *type*, if it is callable.
3486 This code is a hook for Donald Beaudry's
3487 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003488 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003489 since its types are not callable.
3490 Ditto: call the bases's *class*, if it has
3491 one. This makes the same thing possible
3492 without writing C code. A true meta-object
3493 protocol! */
3494 PyObject *basetype = (PyObject *)base->ob_type;
3495 PyObject *callable = NULL;
3496 if (PyCallable_Check(basetype))
3497 callable = basetype;
3498 else
3499 callable = PyObject_GetAttrString(
3500 base, "__class__");
3501 if (callable) {
3502 PyObject *args;
3503 PyObject *newclass = NULL;
3504 args = Py_BuildValue(
3505 "(OOO)", name, bases, methods);
3506 if (args != NULL) {
3507 newclass = PyEval_CallObject(
3508 callable, args);
3509 Py_DECREF(args);
3510 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003511 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003512 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003513 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003514 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003515 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003516 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003517 "base is not a class object");
3518 return NULL;
3519 }
3520 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003521 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003522}
3523
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003524static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003525exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3526 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003527{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003528 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003529 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003530 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003531
Guido van Rossumb209a111997-04-29 18:18:01 +00003532 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3533 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003534 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003535 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003536 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003537 locals = PyTuple_GetItem(prog, 2);
3538 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003539 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003540 if (globals == Py_None) {
3541 globals = PyEval_GetGlobals();
3542 if (locals == Py_None) {
3543 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003544 plain = 1;
3545 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003546 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003547 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003548 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003549 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003550 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003551 !PyCode_Check(prog) &&
3552 !PyFile_Check(prog)) {
3553 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003554 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003555 return -1;
3556 }
Fred Drake661ea262000-10-24 19:57:45 +00003557 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003558 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003559 "exec: arg 2 must be a dictionary or None");
3560 return -1;
3561 }
3562 if (!PyDict_Check(locals)) {
3563 PyErr_SetString(PyExc_TypeError,
3564 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003565 return -1;
3566 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003567 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003568 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003569 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003570 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003572 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003573 FILE *fp = PyFile_AsFile(prog);
3574 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003575 if (PyEval_GetNestedScopes()) {
3576 PyCompilerFlags cf;
3577 cf.cf_nested_scopes = 1;
3578 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3579 locals, &cf);
3580 } else {
3581 v = PyRun_File(fp, name, Py_file_input, globals,
3582 locals);
3583 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003584 }
3585 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003586 char *str;
3587 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003588 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003589 if (PyEval_GetNestedScopes()) {
3590 PyCompilerFlags cf;
3591 cf.cf_nested_scopes = 1;
3592 v = PyRun_StringFlags(str, Py_file_input, globals,
3593 locals, &cf);
3594 } else
3595 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003596 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003597 if (plain)
3598 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003599 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003600 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003601 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003602 return 0;
3603}
Guido van Rossum24c13741995-02-14 09:42:43 +00003604
Guido van Rossumac7be682001-01-17 15:42:30 +00003605static void
Paul Prescode68140d2000-08-30 20:25:01 +00003606format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3607{
3608 char *obj_str;
3609
3610 if (!obj)
3611 return;
3612
3613 obj_str = PyString_AsString(obj);
3614 if (!obj_str)
3615 return;
3616
3617 PyErr_Format(exc, format_str, obj_str);
3618}
Guido van Rossum950361c1997-01-24 13:49:28 +00003619
3620#ifdef DYNAMIC_EXECUTION_PROFILE
3621
3622PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003623getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003624{
3625 int i;
3626 PyObject *l = PyList_New(256);
3627 if (l == NULL) return NULL;
3628 for (i = 0; i < 256; i++) {
3629 PyObject *x = PyInt_FromLong(a[i]);
3630 if (x == NULL) {
3631 Py_DECREF(l);
3632 return NULL;
3633 }
3634 PyList_SetItem(l, i, x);
3635 }
3636 for (i = 0; i < 256; i++)
3637 a[i] = 0;
3638 return l;
3639}
3640
3641PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003642_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003643{
3644#ifndef DXPAIRS
3645 return getarray(dxp);
3646#else
3647 int i;
3648 PyObject *l = PyList_New(257);
3649 if (l == NULL) return NULL;
3650 for (i = 0; i < 257; i++) {
3651 PyObject *x = getarray(dxpairs[i]);
3652 if (x == NULL) {
3653 Py_DECREF(l);
3654 return NULL;
3655 }
3656 PyList_SetItem(l, i, x);
3657 }
3658 return l;
3659#endif
3660}
3661
3662#endif