blob: ea5c5378995a8c492dc6db60a753461e1890e498 [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
Tim Peters5ca576e2001-06-18 22:08:13 +000043static PyObject *eval_frame(PyFrameObject *);
Jeremy Hylton512a2372001-04-11 13:52:29 +000044static char *get_func_name(PyObject *);
45static char *get_func_desc(PyObject *);
Jeremy Hylton52820442001-01-03 23:52:36 +000046static PyObject *call_object(PyObject *, PyObject *, PyObject *);
47static PyObject *call_cfunction(PyObject *, PyObject *, PyObject *);
48static PyObject *call_instance(PyObject *, PyObject *, PyObject *);
49static PyObject *call_method(PyObject *, PyObject *, PyObject *);
50static PyObject *call_eval_code2(PyObject *, PyObject *, PyObject *);
51static PyObject *fast_function(PyObject *, PyObject ***, int, int, int);
52static PyObject *fast_cfunction(PyObject *, PyObject ***, int);
53static PyObject *do_call(PyObject *, PyObject ***, int, int);
54static PyObject *ext_do_call(PyObject *, PyObject ***, int, int, int);
Guido van Rossumac7be682001-01-17 15:42:30 +000055static PyObject *update_keyword_args(PyObject *, int, PyObject ***,PyObject *);
Ka-Ping Yee20579702001-01-15 22:14:16 +000056static PyObject *update_star_args(int, int, PyObject *, PyObject ***);
Jeremy Hylton52820442001-01-03 23:52:36 +000057static PyObject *load_args(PyObject ***, int);
58#define CALL_FLAG_VAR 1
59#define CALL_FLAG_KW 2
60
Guido van Rossum0a066c01992-03-27 17:29:15 +000061#ifdef LLTRACE
Tim Petersdbd9ba62000-07-09 03:09:57 +000062static int prtrace(PyObject *, char *);
Guido van Rossum0a066c01992-03-27 17:29:15 +000063#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000064static void call_exc_trace(PyObject **, PyObject**, PyFrameObject *);
65static int call_trace(PyObject **, PyObject **,
Fred Draked0838392001-06-16 21:02:31 +000066 PyFrameObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000067static PyObject *loop_subscript(PyObject *, PyObject *);
68static PyObject *apply_slice(PyObject *, PyObject *, PyObject *);
69static int assign_slice(PyObject *, PyObject *,
70 PyObject *, PyObject *);
71static PyObject *cmp_outcome(int, PyObject *, PyObject *);
Thomas Wouters52152252000-08-17 22:55:00 +000072static PyObject *import_from(PyObject *, PyObject *);
73static int import_all_from(PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000074static PyObject *build_class(PyObject *, PyObject *, PyObject *);
75static int exec_statement(PyFrameObject *,
76 PyObject *, PyObject *, PyObject *);
Tim Petersdbd9ba62000-07-09 03:09:57 +000077static void set_exc_info(PyThreadState *, PyObject *, PyObject *, PyObject *);
78static void reset_exc_info(PyThreadState *);
Paul Prescode68140d2000-08-30 20:25:01 +000079static void format_exc_check_arg(PyObject *, char *, PyObject *);
Guido van Rossum374a9221991-04-04 10:40:29 +000080
Paul Prescode68140d2000-08-30 20:25:01 +000081#define NAME_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000082 "name '%.200s' is not defined"
Jeremy Hylton64949cb2001-01-25 20:06:59 +000083#define GLOBAL_NAME_ERROR_MSG \
84 "global name '%.200s' is not defined"
Paul Prescode68140d2000-08-30 20:25:01 +000085#define UNBOUNDLOCAL_ERROR_MSG \
Fred Drake661ea262000-10-24 19:57:45 +000086 "local variable '%.200s' referenced before assignment"
Jeremy Hyltonc76770c2001-04-13 16:51:46 +000087#define UNBOUNDFREE_ERROR_MSG \
88 "free variable '%.200s' referenced before assignment" \
89 " in enclosing scope"
Guido van Rossum374a9221991-04-04 10:40:29 +000090
Guido van Rossum950361c1997-01-24 13:49:28 +000091/* Dynamic execution profile */
92#ifdef DYNAMIC_EXECUTION_PROFILE
93#ifdef DXPAIRS
94static long dxpairs[257][256];
95#define dxp dxpairs[256]
96#else
97static long dxp[256];
98#endif
99#endif
100
Fred Drake904aa7b2001-06-08 04:33:09 +0000101/* Cached interned string objects used for calling the profile and
102 * trace functions.
103 */
104static PyObject *str_call = NULL;
105static PyObject *str_exception = NULL;
106static PyObject *str_line = NULL;
107static PyObject *str_return = NULL;
108
109
Tim Peters5ca576e2001-06-18 22:08:13 +0000110staticforward PyTypeObject gentype;
111
112typedef struct {
113 PyObject_HEAD
114 PyFrameObject *frame;
115 int running; /* true if generator is being executed */
116} genobject;
117
118static PyObject *
119gen_new(PyFrameObject *f)
120{
121 genobject *gen = PyObject_New(genobject, &gentype);
122 if (gen == NULL) {
123 Py_DECREF(f);
124 return NULL;
125 }
126 gen->frame = f;
127 gen->running = 0;
128 return (PyObject *)gen;
129}
130
131static void
132gen_dealloc(genobject *gen)
133{
134 Py_DECREF(gen->frame);
135 PyObject_DEL(gen);
136}
137
138static PyObject *
139gen_iternext(genobject *gen)
140{
141 PyFrameObject *f = gen->frame;
142 PyObject *result;
143
144 if (gen->running) {
145 PyErr_SetString(PyExc_ValueError,
146 "generator already executing");
147 return NULL;
148 }
149 if (f->f_stackbottom == NULL) {
150 return NULL;
151 }
152 gen->running = 1;
153 result = eval_frame(f);
154 gen->running = 0;
Tim Peters6302ec62001-06-20 06:57:32 +0000155 /* The connection between this frame and its parent is over now, so
156 must NULL out f_back lest it get decref'ed when gen dies (note
157 that eval_frame sets f->f_back without bumping its refcount: we
158 never had a fully legit reference to it). */
159 f->f_back = NULL;
Tim Peters5ca576e2001-06-18 22:08:13 +0000160 return result;
161}
162
163static PyObject *
164gen_next(genobject *gen, PyObject *args)
165{
166 PyObject *result;
167
168 if (!PyArg_ParseTuple(args, ":next"))
169 return NULL;
170
171 result = gen_iternext(gen);
172
173 if (result == NULL && !PyErr_Occurred()) {
174 PyErr_SetObject(PyExc_StopIteration, Py_None);
175 return NULL;
176 }
177
178 return result;
179}
180
181static PyObject *
182gen_getiter(PyObject *gen)
183{
184 Py_INCREF(gen);
185 return gen;
186}
187
188static struct PyMethodDef gen_methods[] = {
189 {"next", (PyCFunction)gen_next, METH_VARARGS,
190 "next() -- get the next value, or raise StopIteration"},
191 {NULL, NULL} /* Sentinel */
192};
193
194static PyObject *
195gen_getattr(genobject *gen, char *name)
196{
197 return Py_FindMethod(gen_methods, (PyObject *)gen, name);
198}
199
200statichere PyTypeObject gentype = {
201 PyObject_HEAD_INIT(&PyType_Type)
202 0, /* ob_size */
203 "generator", /* tp_name */
204 sizeof(genobject), /* tp_basicsize */
205 0, /* tp_itemsize */
206 /* methods */
207 (destructor)gen_dealloc, /* tp_dealloc */
208 0, /* tp_print */
209 (getattrfunc)gen_getattr, /* tp_getattr */
210 0, /* tp_setattr */
211 0, /* tp_compare */
212 0, /* tp_repr */
213 0, /* tp_as_number */
214 0, /* tp_as_sequence */
215 0, /* tp_as_mapping */
216 0, /* tp_hash */
217 0, /* tp_call */
218 0, /* tp_str */
219 0, /* tp_getattro */
220 0, /* tp_setattro */
221 0, /* tp_as_buffer */
222 Py_TPFLAGS_DEFAULT, /* tp_flags */
223 0, /* tp_doc */
224 0, /* tp_traverse */
225 0, /* tp_clear */
226 0, /* tp_richcompare */
227 0, /* tp_weaklistoffset */
228 (getiterfunc)gen_getiter, /* tp_iter */
229 (iternextfunc)gen_iternext, /* tp_iternext */
230};
231
232
Guido van Rossume59214e1994-08-30 08:01:59 +0000233#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000234
Guido van Rossum2571cc81999-04-07 16:07:23 +0000235#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000236#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000237#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000238#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000239
Guido van Rossuma027efa1997-05-05 20:56:21 +0000240extern int _PyThread_Started; /* Flag for Py_Exit */
241
Guido van Rossum65d5b571998-12-21 19:32:43 +0000242static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000243static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000244
245void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000246PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000247{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000248 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000249 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000250 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000251 interpreter_lock = PyThread_allocate_lock();
252 PyThread_acquire_lock(interpreter_lock, 1);
253 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000255
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000256void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000257PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000258{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000259 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000260}
261
262void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000263PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000264{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000265 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000266}
267
268void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000270{
271 if (tstate == NULL)
272 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000273 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000274 if (PyThreadState_Swap(tstate) != NULL)
275 Py_FatalError(
276 "PyEval_AcquireThread: non-NULL old thread state");
277}
278
279void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000280PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000281{
282 if (tstate == NULL)
283 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
284 if (PyThreadState_Swap(NULL) != tstate)
285 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000286 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000287}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000288
289/* This function is called from PyOS_AfterFork to ensure that newly
290 created child processes don't hold locks referring to threads which
291 are not running in the child process. (This could also be done using
292 pthread_atfork mechanism, at least for the pthreads implementation.) */
293
294void
295PyEval_ReInitThreads(void)
296{
297 if (!interpreter_lock)
298 return;
299 /*XXX Can't use PyThread_free_lock here because it does too
300 much error-checking. Doing this cleanly would require
301 adding a new function to each thread_*.h. Instead, just
302 create a new lock and waste a little bit of memory */
303 interpreter_lock = PyThread_allocate_lock();
304 PyThread_acquire_lock(interpreter_lock, 1);
305 main_thread = PyThread_get_thread_ident();
306}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000307#endif
308
Guido van Rossumff4949e1992-08-05 19:58:53 +0000309/* Functions save_thread and restore_thread are always defined so
310 dynamically loaded modules needn't be compiled separately for use
311 with and without threads: */
312
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000313PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000314PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000315{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000316 PyThreadState *tstate = PyThreadState_Swap(NULL);
317 if (tstate == NULL)
318 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000319#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000320 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000321 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000323 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000324}
325
326void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000328{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000329 if (tstate == NULL)
330 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000331#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000334 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336 }
337#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000338 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000339}
340
341
Guido van Rossuma9672091994-09-14 13:31:22 +0000342/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
343 signal handlers or Mac I/O completion routines) can schedule calls
344 to a function to be called synchronously.
345 The synchronous function is called with one void* argument.
346 It should return 0 for success or -1 for failure -- failure should
347 be accompanied by an exception.
348
349 If registry succeeds, the registry function returns 0; if it fails
350 (e.g. due to too many pending calls) it returns -1 (without setting
351 an exception condition).
352
353 Note that because registry may occur from within signal handlers,
354 or other asynchronous events, calling malloc() is unsafe!
355
356#ifdef WITH_THREAD
357 Any thread can schedule pending calls, but only the main thread
358 will execute them.
359#endif
360
361 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
362 There are two possible race conditions:
363 (1) nested asynchronous registry calls;
364 (2) registry calls made while pending calls are being processed.
365 While (1) is very unlikely, (2) is a real possibility.
366 The current code is safe against (2), but not against (1).
367 The safety against (2) is derived from the fact that only one
368 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000369
Guido van Rossuma027efa1997-05-05 20:56:21 +0000370 XXX Darn! With the advent of thread state, we should have an array
371 of pending calls per thread in the thread state! Later...
372*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000373
Guido van Rossuma9672091994-09-14 13:31:22 +0000374#define NPENDINGCALLS 32
375static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000376 int (*func)(void *);
377 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000378} pendingcalls[NPENDINGCALLS];
379static volatile int pendingfirst = 0;
380static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000381static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000382
383int
Thomas Wouters334fb892000-07-25 12:56:38 +0000384Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000385{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000386 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000387 int i, j;
388 /* XXX Begin critical section */
389 /* XXX If you want this to be safe against nested
390 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000391 if (busy)
392 return -1;
393 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000394 i = pendinglast;
395 j = (i + 1) % NPENDINGCALLS;
396 if (j == pendingfirst)
397 return -1; /* Queue full */
398 pendingcalls[i].func = func;
399 pendingcalls[i].arg = arg;
400 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000401 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000402 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000403 /* XXX End critical section */
404 return 0;
405}
406
Guido van Rossum180d7b41994-09-29 09:45:57 +0000407int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000408Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000409{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000410 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000411#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000412 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000413 return 0;
414#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000415 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000416 return 0;
417 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000418 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000419 for (;;) {
420 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000421 int (*func)(void *);
422 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000423 i = pendingfirst;
424 if (i == pendinglast)
425 break; /* Queue empty */
426 func = pendingcalls[i].func;
427 arg = pendingcalls[i].arg;
428 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000429 if (func(arg) < 0) {
430 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000431 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000432 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000433 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000434 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000435 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000436 return 0;
437}
438
439
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000440/* The interpreter's recursion limit */
441
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000442static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000443
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000444int
445Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000446{
447 return recursion_limit;
448}
449
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000450void
451Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000452{
453 recursion_limit = new_limit;
454}
455
Guido van Rossum374a9221991-04-04 10:40:29 +0000456/* Status code for main loop (reason for stack unwind) */
457
458enum why_code {
459 WHY_NOT, /* No error */
460 WHY_EXCEPTION, /* Exception occurred */
461 WHY_RERAISE, /* Exception re-raised by 'finally' */
462 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000463 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000464 WHY_CONTINUE, /* 'continue' statement */
465 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000466};
467
Tim Petersdbd9ba62000-07-09 03:09:57 +0000468static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
469static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000470
Guido van Rossum374a9221991-04-04 10:40:29 +0000471
Guido van Rossumb209a111997-04-29 18:18:01 +0000472PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000473PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000474{
475 return eval_code2(co,
476 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000477 (PyObject **)NULL, 0,
478 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000479 (PyObject **)NULL, 0,
480 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000481}
482
483
484/* Interpreter main loop */
485
Tim Peters5ca576e2001-06-18 22:08:13 +0000486PyObject *
487eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000488{
Guido van Rossum950361c1997-01-24 13:49:28 +0000489#ifdef DXPAIRS
490 int lastopcode = 0;
491#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000492 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000493 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000494 register int opcode=0; /* Current opcode */
495 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000496 register enum why_code why; /* Reason for block stack unwind */
497 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000498 register PyObject *x; /* Result object -- NULL if error */
499 register PyObject *v; /* Temporary objects popped off stack */
500 register PyObject *w;
501 register PyObject *u;
502 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000503 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000504 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000505 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000506 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000507 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000508 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000509#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000510 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000511#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000512#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000513 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000514 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000515#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000516
517/* Code access macros */
518
519#define GETCONST(i) Getconst(f, i)
520#define GETNAME(i) Getname(f, i)
521#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000522#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000523#define NEXTOP() (*next_instr++)
524#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000525#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000526#define JUMPBY(x) (next_instr += (x))
527
528/* Stack manipulation macros */
529
530#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
531#define EMPTY() (STACK_LEVEL() == 0)
532#define TOP() (stack_pointer[-1])
533#define BASIC_PUSH(v) (*stack_pointer++ = (v))
534#define BASIC_POP() (*--stack_pointer)
535
Guido van Rossum96a42c81992-01-12 02:29:51 +0000536#ifdef LLTRACE
537#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
538#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000539#else
540#define PUSH(v) BASIC_PUSH(v)
541#define POP() BASIC_POP()
542#endif
543
Guido van Rossum681d79a1995-07-18 14:51:37 +0000544/* Local variable macros */
545
546#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000547#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000548 GETLOCAL(i) = value; } while (0)
549
Guido van Rossuma027efa1997-05-05 20:56:21 +0000550/* Start of code */
551
Tim Peters5ca576e2001-06-18 22:08:13 +0000552 if (f == NULL)
553 return NULL;
554
Guido van Rossum8861b741996-07-30 16:49:37 +0000555#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000556 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000557 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000558 return NULL;
559 }
560#endif
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000563 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000564 --tstate->recursion_depth;
565 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000566 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000567 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570
Tim Peters5ca576e2001-06-18 22:08:13 +0000571 f->f_back = tstate->frame;
572 tstate->frame = f;
573
574 co = f->f_code;
575 fastlocals = f->f_localsplus;
576 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000577 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000578 next_instr = first_instr + f->f_lasti;
579 stack_pointer = f->f_stackbottom;
580 f->f_stackbottom = NULL;
581
582#ifdef LLTRACE
583 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
584#endif
585#if defined(Py_DEBUG) || defined(LLTRACE)
586 filename = PyString_AsString(co->co_filename);
587#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000588
Guido van Rossum374a9221991-04-04 10:40:29 +0000589 why = WHY_NOT;
590 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000591 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000592 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000593
Guido van Rossum374a9221991-04-04 10:40:29 +0000594 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000595 /* Do periodic things. Doing this every time through
596 the loop would add too much overhead, so we do it
597 only every Nth instruction. We also do it if
598 ``things_to_do'' is set, i.e. when an asynchronous
599 event needs attention (e.g. a signal handler or
600 async I/O handler); see Py_AddPendingCall() and
601 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000602
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000604 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000605 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000606 if (Py_MakePendingCalls() < 0) {
607 why = WHY_EXCEPTION;
608 goto on_error;
609 }
610 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000611#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000612 /* If we have true signals, the signal handler
613 will call Py_AddPendingCall() so we don't
614 have to call sigcheck(). On the Mac and
615 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000616 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000617 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000618 goto on_error;
619 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000620#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000621
Guido van Rossume59214e1994-08-30 08:01:59 +0000622#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000623 if (interpreter_lock) {
624 /* Give another thread a chance */
625
Guido van Rossum25ce5661997-08-02 03:10:38 +0000626 if (PyThreadState_Swap(NULL) != tstate)
627 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000628 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000629
630 /* Other threads may run now */
631
Guido van Rossum65d5b571998-12-21 19:32:43 +0000632 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000633 if (PyThreadState_Swap(tstate) != NULL)
634 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635 }
636#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000637 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638
Guido van Rossum374a9221991-04-04 10:40:29 +0000639 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000640
Guido van Rossum408027e1996-12-30 16:17:54 +0000641#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000642 f->f_lasti = INSTR_OFFSET();
643#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000644
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 opcode = NEXTOP();
646 if (HAS_ARG(opcode))
647 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000648 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000649#ifdef DYNAMIC_EXECUTION_PROFILE
650#ifdef DXPAIRS
651 dxpairs[lastopcode][opcode]++;
652 lastopcode = opcode;
653#endif
654 dxp[opcode]++;
655#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000656
Guido van Rossum96a42c81992-01-12 02:29:51 +0000657#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000658 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000659
Guido van Rossum96a42c81992-01-12 02:29:51 +0000660 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000661 if (HAS_ARG(opcode)) {
662 printf("%d: %d, %d\n",
663 (int) (INSTR_OFFSET() - 3),
664 opcode, oparg);
665 }
666 else {
667 printf("%d: %d\n",
668 (int) (INSTR_OFFSET() - 1), opcode);
669 }
670 }
671#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000672 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000673
Guido van Rossum374a9221991-04-04 10:40:29 +0000674 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000675
Guido van Rossum374a9221991-04-04 10:40:29 +0000676 /* BEWARE!
677 It is essential that any operation that fails sets either
678 x to NULL, err to nonzero, or why to anything but WHY_NOT,
679 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000680
Guido van Rossum374a9221991-04-04 10:40:29 +0000681 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000682
Guido van Rossum374a9221991-04-04 10:40:29 +0000683 case POP_TOP:
684 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000685 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000686 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000687
Guido van Rossum374a9221991-04-04 10:40:29 +0000688 case ROT_TWO:
689 v = POP();
690 w = POP();
691 PUSH(v);
692 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000693 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000694
Guido van Rossum374a9221991-04-04 10:40:29 +0000695 case ROT_THREE:
696 v = POP();
697 w = POP();
698 x = POP();
699 PUSH(v);
700 PUSH(x);
701 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000702 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000703
Thomas Wouters434d0822000-08-24 20:11:32 +0000704 case ROT_FOUR:
705 u = POP();
706 v = POP();
707 w = POP();
708 x = POP();
709 PUSH(u);
710 PUSH(x);
711 PUSH(w);
712 PUSH(v);
713 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000714
Guido van Rossum374a9221991-04-04 10:40:29 +0000715 case DUP_TOP:
716 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000717 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000718 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000719 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000720
Thomas Wouters434d0822000-08-24 20:11:32 +0000721 case DUP_TOPX:
722 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000723 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000724 x = TOP();
725 Py_INCREF(x);
726 PUSH(x);
727 continue;
728 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000729 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000730 Py_INCREF(x);
731 w = TOP();
732 Py_INCREF(w);
733 PUSH(x);
734 PUSH(w);
735 PUSH(x);
736 continue;
737 case 3:
738 x = POP();
739 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000740 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000741 Py_INCREF(w);
742 v = TOP();
743 Py_INCREF(v);
744 PUSH(w);
745 PUSH(x);
746 PUSH(v);
747 PUSH(w);
748 PUSH(x);
749 continue;
750 case 4:
751 x = POP();
752 Py_INCREF(x);
753 w = POP();
754 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000755 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000756 Py_INCREF(v);
757 u = TOP();
758 Py_INCREF(u);
759 PUSH(v);
760 PUSH(w);
761 PUSH(x);
762 PUSH(u);
763 PUSH(v);
764 PUSH(w);
765 PUSH(x);
766 continue;
767 case 5:
768 x = POP();
769 Py_INCREF(x);
770 w = POP();
771 Py_INCREF(w);
772 v = POP();
773 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000774 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000775 Py_INCREF(u);
776 t = TOP();
777 Py_INCREF(t);
778 PUSH(u);
779 PUSH(v);
780 PUSH(w);
781 PUSH(x);
782 PUSH(t);
783 PUSH(u);
784 PUSH(v);
785 PUSH(w);
786 PUSH(x);
787 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000788 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000789 Py_FatalError("invalid argument to DUP_TOPX"
790 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000791 }
Tim Peters35ba6892000-10-11 07:04:49 +0000792 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000793
Guido van Rossum374a9221991-04-04 10:40:29 +0000794 case UNARY_POSITIVE:
795 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000796 x = PyNumber_Positive(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000797 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000798 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000799 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000800 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000801
Guido van Rossum374a9221991-04-04 10:40:29 +0000802 case UNARY_NEGATIVE:
803 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000804 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000805 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000806 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000807 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000808 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000809
Guido van Rossum374a9221991-04-04 10:40:29 +0000810 case UNARY_NOT:
811 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000812 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000813 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000814 if (err == 0) {
815 Py_INCREF(Py_True);
816 PUSH(Py_True);
817 continue;
818 }
819 else if (err > 0) {
820 Py_INCREF(Py_False);
821 PUSH(Py_False);
822 err = 0;
823 continue;
824 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000825 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000826
Guido van Rossum374a9221991-04-04 10:40:29 +0000827 case UNARY_CONVERT:
828 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000829 x = PyObject_Repr(v);
830 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000831 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000832 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000834
Guido van Rossum7928cd71991-10-24 14:59:31 +0000835 case UNARY_INVERT:
836 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000837 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000838 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000841 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000842
Guido van Rossum50564e81996-01-12 01:13:16 +0000843 case BINARY_POWER:
844 w = POP();
845 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000846 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000847 Py_DECREF(v);
848 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000849 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000850 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000851 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000852
Guido van Rossum374a9221991-04-04 10:40:29 +0000853 case BINARY_MULTIPLY:
854 w = POP();
855 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000856 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000857 Py_DECREF(v);
858 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000859 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000860 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000862
Guido van Rossum374a9221991-04-04 10:40:29 +0000863 case BINARY_DIVIDE:
864 w = POP();
865 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000866 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000867 Py_DECREF(v);
868 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000870 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000872
Guido van Rossum374a9221991-04-04 10:40:29 +0000873 case BINARY_MODULO:
874 w = POP();
875 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000876 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000877 Py_DECREF(v);
878 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000880 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000882
Guido van Rossum374a9221991-04-04 10:40:29 +0000883 case BINARY_ADD:
884 w = POP();
885 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000886 if (PyInt_Check(v) && PyInt_Check(w)) {
887 /* INLINE: int + int */
888 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000889 a = PyInt_AS_LONG(v);
890 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000891 i = a + b;
892 if ((i^a) < 0 && (i^b) < 0) {
893 PyErr_SetString(PyExc_OverflowError,
894 "integer addition");
895 x = NULL;
896 }
897 else
898 x = PyInt_FromLong(i);
899 }
900 else
901 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000902 Py_DECREF(v);
903 Py_DECREF(w);
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 BINARY_SUBTRACT:
909 w = POP();
910 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000911 if (PyInt_Check(v) && PyInt_Check(w)) {
912 /* INLINE: int - int */
913 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000914 a = PyInt_AS_LONG(v);
915 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000916 i = a - b;
917 if ((i^a) < 0 && (i^~b) < 0) {
918 PyErr_SetString(PyExc_OverflowError,
919 "integer subtraction");
920 x = NULL;
921 }
922 else
923 x = PyInt_FromLong(i);
924 }
925 else
926 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000927 Py_DECREF(v);
928 Py_DECREF(w);
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 Rossum374a9221991-04-04 10:40:29 +0000933 case BINARY_SUBSCR:
934 w = POP();
935 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000936 if (PyList_Check(v) && PyInt_Check(w)) {
937 /* INLINE: list[int] */
938 long i = PyInt_AsLong(w);
939 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000940 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000941 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000942 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000943 PyErr_SetString(PyExc_IndexError,
944 "list index out of range");
945 x = NULL;
946 }
947 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000948 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000949 Py_INCREF(x);
950 }
951 }
952 else
953 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000954 Py_DECREF(v);
955 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000956 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000957 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000958 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000959
Guido van Rossum7928cd71991-10-24 14:59:31 +0000960 case BINARY_LSHIFT:
961 w = POP();
962 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000963 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000964 Py_DECREF(v);
965 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000966 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000967 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000968 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000969
Guido van Rossum7928cd71991-10-24 14:59:31 +0000970 case BINARY_RSHIFT:
971 w = POP();
972 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000973 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000974 Py_DECREF(v);
975 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000976 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000977 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000978 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000979
Guido van Rossum7928cd71991-10-24 14:59:31 +0000980 case BINARY_AND:
981 w = POP();
982 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000983 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000984 Py_DECREF(v);
985 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000986 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000987 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000988 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000989
Guido van Rossum7928cd71991-10-24 14:59:31 +0000990 case BINARY_XOR:
991 w = POP();
992 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000993 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000994 Py_DECREF(v);
995 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000996 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000997 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000998 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000999
Guido van Rossum7928cd71991-10-24 14:59:31 +00001000 case BINARY_OR:
1001 w = POP();
1002 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001003 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001004 Py_DECREF(v);
1005 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001006 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001007 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001009
1010 case INPLACE_POWER:
1011 w = POP();
1012 v = POP();
1013 x = PyNumber_InPlacePower(v, w, Py_None);
1014 Py_DECREF(v);
1015 Py_DECREF(w);
1016 PUSH(x);
1017 if (x != NULL) continue;
1018 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001019
Thomas Wouters434d0822000-08-24 20:11:32 +00001020 case INPLACE_MULTIPLY:
1021 w = POP();
1022 v = POP();
1023 x = PyNumber_InPlaceMultiply(v, w);
1024 Py_DECREF(v);
1025 Py_DECREF(w);
1026 PUSH(x);
1027 if (x != NULL) continue;
1028 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001029
Thomas Wouters434d0822000-08-24 20:11:32 +00001030 case INPLACE_DIVIDE:
1031 w = POP();
1032 v = POP();
1033 x = PyNumber_InPlaceDivide(v, w);
1034 Py_DECREF(v);
1035 Py_DECREF(w);
1036 PUSH(x);
1037 if (x != NULL) continue;
1038 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001039
Thomas Wouters434d0822000-08-24 20:11:32 +00001040 case INPLACE_MODULO:
1041 w = POP();
1042 v = POP();
1043 x = PyNumber_InPlaceRemainder(v, w);
1044 Py_DECREF(v);
1045 Py_DECREF(w);
1046 PUSH(x);
1047 if (x != NULL) continue;
1048 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001049
Thomas Wouters434d0822000-08-24 20:11:32 +00001050 case INPLACE_ADD:
1051 w = POP();
1052 v = POP();
1053 if (PyInt_Check(v) && PyInt_Check(w)) {
1054 /* INLINE: int + int */
1055 register long a, b, i;
1056 a = PyInt_AS_LONG(v);
1057 b = PyInt_AS_LONG(w);
1058 i = a + b;
1059 if ((i^a) < 0 && (i^b) < 0) {
1060 PyErr_SetString(PyExc_OverflowError,
1061 "integer addition");
1062 x = NULL;
1063 }
1064 else
1065 x = PyInt_FromLong(i);
1066 }
1067 else
1068 x = PyNumber_InPlaceAdd(v, w);
1069 Py_DECREF(v);
1070 Py_DECREF(w);
1071 PUSH(x);
1072 if (x != NULL) continue;
1073 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001074
Thomas Wouters434d0822000-08-24 20:11:32 +00001075 case INPLACE_SUBTRACT:
1076 w = POP();
1077 v = POP();
1078 if (PyInt_Check(v) && PyInt_Check(w)) {
1079 /* INLINE: int - int */
1080 register long a, b, i;
1081 a = PyInt_AS_LONG(v);
1082 b = PyInt_AS_LONG(w);
1083 i = a - b;
1084 if ((i^a) < 0 && (i^~b) < 0) {
1085 PyErr_SetString(PyExc_OverflowError,
1086 "integer subtraction");
1087 x = NULL;
1088 }
1089 else
1090 x = PyInt_FromLong(i);
1091 }
1092 else
1093 x = PyNumber_InPlaceSubtract(v, w);
1094 Py_DECREF(v);
1095 Py_DECREF(w);
1096 PUSH(x);
1097 if (x != NULL) continue;
1098 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001099
Thomas Wouters434d0822000-08-24 20:11:32 +00001100 case INPLACE_LSHIFT:
1101 w = POP();
1102 v = POP();
1103 x = PyNumber_InPlaceLshift(v, w);
1104 Py_DECREF(v);
1105 Py_DECREF(w);
1106 PUSH(x);
1107 if (x != NULL) continue;
1108 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001109
Thomas Wouters434d0822000-08-24 20:11:32 +00001110 case INPLACE_RSHIFT:
1111 w = POP();
1112 v = POP();
1113 x = PyNumber_InPlaceRshift(v, w);
1114 Py_DECREF(v);
1115 Py_DECREF(w);
1116 PUSH(x);
1117 if (x != NULL) continue;
1118 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001119
Thomas Wouters434d0822000-08-24 20:11:32 +00001120 case INPLACE_AND:
1121 w = POP();
1122 v = POP();
1123 x = PyNumber_InPlaceAnd(v, w);
1124 Py_DECREF(v);
1125 Py_DECREF(w);
1126 PUSH(x);
1127 if (x != NULL) continue;
1128 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001129
Thomas Wouters434d0822000-08-24 20:11:32 +00001130 case INPLACE_XOR:
1131 w = POP();
1132 v = POP();
1133 x = PyNumber_InPlaceXor(v, w);
1134 Py_DECREF(v);
1135 Py_DECREF(w);
1136 PUSH(x);
1137 if (x != NULL) continue;
1138 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001139
Thomas Wouters434d0822000-08-24 20:11:32 +00001140 case INPLACE_OR:
1141 w = POP();
1142 v = POP();
1143 x = PyNumber_InPlaceOr(v, w);
1144 Py_DECREF(v);
1145 Py_DECREF(w);
1146 PUSH(x);
1147 if (x != NULL) continue;
1148 break;
1149
Guido van Rossum374a9221991-04-04 10:40:29 +00001150 case SLICE+0:
1151 case SLICE+1:
1152 case SLICE+2:
1153 case SLICE+3:
1154 if ((opcode-SLICE) & 2)
1155 w = POP();
1156 else
1157 w = NULL;
1158 if ((opcode-SLICE) & 1)
1159 v = POP();
1160 else
1161 v = NULL;
1162 u = POP();
1163 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001164 Py_DECREF(u);
1165 Py_XDECREF(v);
1166 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001167 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001168 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001169 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001170
Guido van Rossum374a9221991-04-04 10:40:29 +00001171 case STORE_SLICE+0:
1172 case STORE_SLICE+1:
1173 case STORE_SLICE+2:
1174 case STORE_SLICE+3:
1175 if ((opcode-STORE_SLICE) & 2)
1176 w = POP();
1177 else
1178 w = NULL;
1179 if ((opcode-STORE_SLICE) & 1)
1180 v = POP();
1181 else
1182 v = NULL;
1183 u = POP();
1184 t = POP();
1185 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001186 Py_DECREF(t);
1187 Py_DECREF(u);
1188 Py_XDECREF(v);
1189 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001190 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001191 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001192
Guido van Rossum374a9221991-04-04 10:40:29 +00001193 case DELETE_SLICE+0:
1194 case DELETE_SLICE+1:
1195 case DELETE_SLICE+2:
1196 case DELETE_SLICE+3:
1197 if ((opcode-DELETE_SLICE) & 2)
1198 w = POP();
1199 else
1200 w = NULL;
1201 if ((opcode-DELETE_SLICE) & 1)
1202 v = POP();
1203 else
1204 v = NULL;
1205 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001206 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001207 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001208 Py_DECREF(u);
1209 Py_XDECREF(v);
1210 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001211 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001212 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001213
Guido van Rossum374a9221991-04-04 10:40:29 +00001214 case STORE_SUBSCR:
1215 w = POP();
1216 v = POP();
1217 u = POP();
1218 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001219 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001220 Py_DECREF(u);
1221 Py_DECREF(v);
1222 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001223 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001224 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001225
Guido van Rossum374a9221991-04-04 10:40:29 +00001226 case DELETE_SUBSCR:
1227 w = POP();
1228 v = POP();
1229 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001230 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001231 Py_DECREF(v);
1232 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001233 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001235
Guido van Rossum374a9221991-04-04 10:40:29 +00001236 case PRINT_EXPR:
1237 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001238 w = PySys_GetObject("displayhook");
1239 if (w == NULL) {
1240 PyErr_SetString(PyExc_RuntimeError,
1241 "lost sys.displayhook");
1242 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001243 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001244 }
1245 if (err == 0) {
1246 x = Py_BuildValue("(O)", v);
1247 if (x == NULL)
1248 err = -1;
1249 }
1250 if (err == 0) {
1251 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001252 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001253 if (w == NULL)
1254 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001255 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001256 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001257 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001258 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001259
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001260 case PRINT_ITEM_TO:
1261 w = stream = POP();
1262 /* fall through to PRINT_ITEM */
1263
Guido van Rossum374a9221991-04-04 10:40:29 +00001264 case PRINT_ITEM:
1265 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001266 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001267 w = PySys_GetObject("stdout");
1268 if (w == NULL) {
1269 PyErr_SetString(PyExc_RuntimeError,
1270 "lost sys.stdout");
1271 err = -1;
1272 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001273 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001274 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001275 err = PyFile_WriteString(" ", w);
1276 if (err == 0)
1277 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001278 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001279 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001280 char *s = PyString_AsString(v);
1281 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001282 if (len > 0 &&
1283 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001284 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001285 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001286 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001287 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001288 Py_XDECREF(stream);
1289 stream = NULL;
1290 if (err == 0)
1291 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001292 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001293
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001294 case PRINT_NEWLINE_TO:
1295 w = stream = POP();
1296 /* fall through to PRINT_NEWLINE */
1297
Guido van Rossum374a9221991-04-04 10:40:29 +00001298 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001299 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001300 w = PySys_GetObject("stdout");
1301 if (w == NULL)
1302 PyErr_SetString(PyExc_RuntimeError,
1303 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001304 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001305 if (w != NULL) {
1306 err = PyFile_WriteString("\n", w);
1307 if (err == 0)
1308 PyFile_SoftSpace(w, 0);
1309 }
1310 Py_XDECREF(stream);
1311 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001312 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001313
Thomas Wouters434d0822000-08-24 20:11:32 +00001314
1315#ifdef CASE_TOO_BIG
1316 default: switch (opcode) {
1317#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001318 case BREAK_LOOP:
1319 why = WHY_BREAK;
1320 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001321
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001322 case CONTINUE_LOOP:
1323 retval = PyInt_FromLong(oparg);
1324 why = WHY_CONTINUE;
1325 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001326
Guido van Rossumf10570b1995-07-07 22:53:21 +00001327 case RAISE_VARARGS:
1328 u = v = w = NULL;
1329 switch (oparg) {
1330 case 3:
1331 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001332 /* Fallthrough */
1333 case 2:
1334 v = POP(); /* value */
1335 /* Fallthrough */
1336 case 1:
1337 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001338 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001339 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001340 break;
1341 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001342 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001343 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001344 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001345 break;
1346 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001347 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001348
Guido van Rossum374a9221991-04-04 10:40:29 +00001349 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001350 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001351 PyErr_SetString(PyExc_SystemError,
1352 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001353 break;
1354 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001355 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001356 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001358
Guido van Rossum374a9221991-04-04 10:40:29 +00001359 case RETURN_VALUE:
1360 retval = POP();
1361 why = WHY_RETURN;
1362 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001363
Tim Peters5ca576e2001-06-18 22:08:13 +00001364 case YIELD_VALUE:
1365 retval = POP();
1366 f->f_stackbottom = stack_pointer;
1367 f->f_lasti = INSTR_OFFSET();
1368 why = WHY_YIELD;
1369 break;
1370
1371
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001372 case EXEC_STMT:
1373 w = POP();
1374 v = POP();
1375 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001376 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001377 Py_DECREF(u);
1378 Py_DECREF(v);
1379 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001380 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001381
Guido van Rossum374a9221991-04-04 10:40:29 +00001382 case POP_BLOCK:
1383 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001384 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001385 while (STACK_LEVEL() > b->b_level) {
1386 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001387 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001388 }
1389 }
1390 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001391
Guido van Rossum374a9221991-04-04 10:40:29 +00001392 case END_FINALLY:
1393 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001394 if (PyInt_Check(v)) {
1395 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001396 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001397 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001398 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001399 retval = POP();
1400 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001401 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001402 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001403 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001404 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001405 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001406 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001408 else if (v != Py_None) {
1409 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 "'finally' pops bad exception");
1411 why = WHY_EXCEPTION;
1412 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001413 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001414 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001415
Guido van Rossum374a9221991-04-04 10:40:29 +00001416 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001417 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001419 w = POP();
1420 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001421 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001422 Py_DECREF(u);
1423 Py_DECREF(v);
1424 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001425 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001426
Guido van Rossum374a9221991-04-04 10:40:29 +00001427 case STORE_NAME:
1428 w = GETNAMEV(oparg);
1429 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001430 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001431 PyErr_Format(PyExc_SystemError,
1432 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001433 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001434 break;
1435 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001436 err = PyDict_SetItem(x, w, v);
1437 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001438 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001439
Guido van Rossum374a9221991-04-04 10:40:29 +00001440 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001441 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001443 PyErr_Format(PyExc_SystemError,
1444 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001445 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001446 break;
1447 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001448 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001449 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001450 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001451 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001452
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001453 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001454 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001455 if (PyTuple_Check(v)) {
1456 if (PyTuple_Size(v) != oparg) {
1457 PyErr_SetString(PyExc_ValueError,
1458 "unpack tuple of wrong size");
1459 why = WHY_EXCEPTION;
1460 }
1461 else {
1462 for (; --oparg >= 0; ) {
1463 w = PyTuple_GET_ITEM(v, oparg);
1464 Py_INCREF(w);
1465 PUSH(w);
1466 }
1467 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001468 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001469 else if (PyList_Check(v)) {
1470 if (PyList_Size(v) != oparg) {
1471 PyErr_SetString(PyExc_ValueError,
1472 "unpack list of wrong size");
1473 why = WHY_EXCEPTION;
1474 }
1475 else {
1476 for (; --oparg >= 0; ) {
1477 w = PyList_GET_ITEM(v, oparg);
1478 Py_INCREF(w);
1479 PUSH(w);
1480 }
1481 }
1482 }
1483 else if (PySequence_Check(v)) {
1484 if (unpack_sequence(v, oparg,
1485 stack_pointer + oparg))
1486 stack_pointer += oparg;
1487 else
1488 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001489 }
1490 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001491 PyErr_SetString(PyExc_TypeError,
1492 "unpack non-sequence");
1493 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001494 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001495 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001496 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001497
Guido van Rossum374a9221991-04-04 10:40:29 +00001498 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001499 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001500 v = POP();
1501 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001502 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1503 Py_DECREF(v);
1504 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001505 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001506
Guido van Rossum374a9221991-04-04 10:40:29 +00001507 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001508 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001509 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001510 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1511 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001512 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001515 case STORE_GLOBAL:
1516 w = GETNAMEV(oparg);
1517 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001518 err = PyDict_SetItem(f->f_globals, w, v);
1519 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001520 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001521
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001522 case DELETE_GLOBAL:
1523 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001524 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001525 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001526 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001527 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001528
Guido van Rossum374a9221991-04-04 10:40:29 +00001529 case LOAD_CONST:
1530 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001531 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001532 PUSH(x);
1533 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001534
Guido van Rossum374a9221991-04-04 10:40:29 +00001535 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001536 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001537 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001538 PyErr_Format(PyExc_SystemError,
1539 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001540 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001541 break;
1542 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001543 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001544 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001545 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001546 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001547 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001548 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001549 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001550 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001551 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 break;
1553 }
1554 }
1555 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001556 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001557 PUSH(x);
1558 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001559
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001561 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001562 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001563 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001566 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001567 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001568 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001569 break;
1570 }
1571 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 PUSH(x);
1574 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001575
Guido van Rossum9bfef441993-03-29 10:43:31 +00001576 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001577 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001578 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001579 format_exc_check_arg(
1580 PyExc_UnboundLocalError,
1581 UNBOUNDLOCAL_ERROR_MSG,
1582 PyTuple_GetItem(co->co_varnames, oparg)
1583 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001584 break;
1585 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001586 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001587 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001588 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001589 break;
1590
1591 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001592 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001593 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001594 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001595
1596 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001597 x = GETLOCAL(oparg);
1598 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001599 format_exc_check_arg(
1600 PyExc_UnboundLocalError,
1601 UNBOUNDLOCAL_ERROR_MSG,
1602 PyTuple_GetItem(co->co_varnames, oparg)
1603 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001604 break;
1605 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001606 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001607 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001608
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001609 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001610 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001611 Py_INCREF(x);
1612 PUSH(x);
1613 break;
1614
1615 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001616 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001617 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001618 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001619 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001620 v = PyTuple_GetItem(co->co_cellvars,
1621 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001622 format_exc_check_arg(
1623 PyExc_UnboundLocalError,
1624 UNBOUNDLOCAL_ERROR_MSG,
1625 v);
1626 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001627 v = PyTuple_GetItem(
1628 co->co_freevars,
1629 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001630 format_exc_check_arg(
1631 PyExc_NameError,
1632 UNBOUNDFREE_ERROR_MSG,
1633 v);
1634 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001635 err = -1;
1636 break;
1637 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001638 PUSH(w);
1639 break;
1640
1641 case STORE_DEREF:
1642 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001643 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001644 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001645 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001646 continue;
1647
Guido van Rossum374a9221991-04-04 10:40:29 +00001648 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001649 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001650 if (x != NULL) {
1651 for (; --oparg >= 0;) {
1652 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001653 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001654 }
1655 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001656 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001657 }
1658 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001659
Guido van Rossum374a9221991-04-04 10:40:29 +00001660 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 if (x != NULL) {
1663 for (; --oparg >= 0;) {
1664 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001665 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001666 }
1667 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001668 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001669 }
1670 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001671
Guido van Rossum374a9221991-04-04 10:40:29 +00001672 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001673 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001675 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001676 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001677
Guido van Rossum374a9221991-04-04 10:40:29 +00001678 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001679 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 x = PyObject_GetAttr(v, w);
1682 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001683 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001684 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001685 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001686
Guido van Rossum374a9221991-04-04 10:40:29 +00001687 case COMPARE_OP:
1688 w = POP();
1689 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001690 if (PyInt_Check(v) && PyInt_Check(w)) {
1691 /* INLINE: cmp(int, int) */
1692 register long a, b;
1693 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001694 a = PyInt_AS_LONG(v);
1695 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001696 switch (oparg) {
1697 case LT: res = a < b; break;
1698 case LE: res = a <= b; break;
1699 case EQ: res = a == b; break;
1700 case NE: res = a != b; break;
1701 case GT: res = a > b; break;
1702 case GE: res = a >= b; break;
1703 case IS: res = v == w; break;
1704 case IS_NOT: res = v != w; break;
1705 default: goto slow_compare;
1706 }
1707 x = res ? Py_True : Py_False;
1708 Py_INCREF(x);
1709 }
1710 else {
1711 slow_compare:
1712 x = cmp_outcome(oparg, v, w);
1713 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001714 Py_DECREF(v);
1715 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001716 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001717 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001718 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001719
Guido van Rossum374a9221991-04-04 10:40:29 +00001720 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001721 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001723 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001724 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001725 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001726 break;
1727 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001728 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001729 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001730 w,
1731 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001732 f->f_locals == NULL ?
1733 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001734 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001735 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001736 if (w == NULL) {
1737 x = NULL;
1738 break;
1739 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001740 x = PyEval_CallObject(x, w);
1741 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001742 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001743 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001744 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001745
Thomas Wouters52152252000-08-17 22:55:00 +00001746 case IMPORT_STAR:
1747 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001749 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001750 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001751 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001752 break;
1753 }
Thomas Wouters52152252000-08-17 22:55:00 +00001754 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001755 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001756 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001757 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001758 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001759
Thomas Wouters52152252000-08-17 22:55:00 +00001760 case IMPORT_FROM:
1761 w = GETNAMEV(oparg);
1762 v = TOP();
1763 x = import_from(v, w);
1764 PUSH(x);
1765 if (x != NULL) continue;
1766 break;
1767
Guido van Rossum374a9221991-04-04 10:40:29 +00001768 case JUMP_FORWARD:
1769 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001770 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001771
Guido van Rossum374a9221991-04-04 10:40:29 +00001772 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001773 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001774 if (err > 0)
1775 err = 0;
1776 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001777 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001778 else
1779 break;
1780 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001781
Guido van Rossum374a9221991-04-04 10:40:29 +00001782 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001783 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001784 if (err > 0) {
1785 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001786 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001787 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001788 else if (err == 0)
1789 ;
1790 else
1791 break;
1792 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001793
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 case JUMP_ABSOLUTE:
1795 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001797
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001798 case GET_ITER:
1799 /* before: [obj]; after [getiter(obj)] */
1800 v = POP();
1801 x = PyObject_GetIter(v);
1802 Py_DECREF(v);
1803 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001804 PUSH(x);
1805 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001806 }
1807 break;
1808
1809 case FOR_ITER:
1810 /* before: [iter]; after: [iter, iter()] *or* [] */
1811 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001812 x = PyIter_Next(v);
1813 if (x != NULL) {
1814 PUSH(x);
1815 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001816 }
Tim Petersf4848da2001-05-05 00:14:56 +00001817 if (!PyErr_Occurred()) {
1818 /* iterator ended normally */
1819 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001820 Py_DECREF(v);
1821 JUMPBY(oparg);
1822 continue;
1823 }
1824 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001825
Guido van Rossum374a9221991-04-04 10:40:29 +00001826 case FOR_LOOP:
1827 /* for v in s: ...
1828 On entry: stack contains s, i.
1829 On exit: stack contains s, i+1, s[i];
1830 but if loop exhausted:
1831 s, i are popped, and we jump */
1832 w = POP(); /* Loop index */
1833 v = POP(); /* Sequence object */
1834 u = loop_subscript(v, w);
1835 if (u != NULL) {
1836 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001837 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001838 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001839 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001840 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001841 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001842 }
1843 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001844 Py_DECREF(v);
1845 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 /* A NULL can mean "s exhausted"
1847 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001848 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001849 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001850 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001851 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001852 continue;
1853 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 }
1855 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001856
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 case SETUP_LOOP:
1858 case SETUP_EXCEPT:
1859 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001860 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001861 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001862 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001863
Guido van Rossum374a9221991-04-04 10:40:29 +00001864 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001865#ifdef LLTRACE
1866 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001867 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001868#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001869 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001870 if (f->f_trace == NULL)
1871 continue;
1872 /* Trace each line of code reached */
1873 f->f_lasti = INSTR_OFFSET();
1874 err = call_trace(&f->f_trace, &f->f_trace,
Fred Draked0838392001-06-16 21:02:31 +00001875 f, str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001876 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001877
1878 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001879 {
1880 int na = oparg & 0xff;
1881 int nk = (oparg>>8) & 0xff;
1882 int n = na + 2 * nk;
1883 PyObject **pfunc = stack_pointer - n - 1;
1884 PyObject *func = *pfunc;
1885 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1886
1887 /* Always dispatch PyCFunction first, because
1888 these are presumed to be the most frequent
1889 callable object.
1890 */
1891 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001892 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001893 if (flags > 1 || nk != 0)
1894 x = do_call(func, &stack_pointer,
1895 na, nk);
1896 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001897 PyObject *callargs;
1898 callargs = load_args(&stack_pointer, na);
1899 x = call_cfunction(func, callargs, NULL);
1900 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001901 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001902 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001903 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001904 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001905 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001906 && PyMethod_GET_SELF(func) != NULL) {
1907 /* optimize access to bound methods */
1908 PyObject *self = PyMethod_GET_SELF(func);
1909 Py_INCREF(self);
1910 func = PyMethod_GET_FUNCTION(func);
1911 Py_INCREF(func);
1912 Py_DECREF(*pfunc);
1913 *pfunc = self;
1914 na++;
1915 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001916 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001917 Py_INCREF(func);
1918 if (PyFunction_Check(func)) {
1919 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001920 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001921 } else {
1922 x = do_call(func, &stack_pointer,
1923 na, nk);
1924 }
1925 Py_DECREF(func);
1926 }
1927
1928 while (stack_pointer > pfunc) {
1929 w = POP();
1930 Py_DECREF(w);
1931 }
1932 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001933 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001934 continue;
1935 break;
1936 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001937
Jeremy Hylton76901512000-03-28 23:49:17 +00001938 case CALL_FUNCTION_VAR:
1939 case CALL_FUNCTION_KW:
1940 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001941 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001942 int na = oparg & 0xff;
1943 int nk = (oparg>>8) & 0xff;
1944 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001945 int n = na + 2 * nk;
1946 PyObject **pfunc, *func;
1947 if (flags & CALL_FLAG_VAR)
1948 n++;
1949 if (flags & CALL_FLAG_KW)
1950 n++;
1951 pfunc = stack_pointer - n - 1;
1952 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001953 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001954
Guido van Rossumac7be682001-01-17 15:42:30 +00001955 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001956 && PyMethod_GET_SELF(func) != NULL) {
1957 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001958 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001959 func = PyMethod_GET_FUNCTION(func);
1960 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001961 Py_DECREF(*pfunc);
1962 *pfunc = self;
1963 na++;
1964 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001965 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001966 Py_INCREF(func);
1967 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001968 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001969
Jeremy Hylton76901512000-03-28 23:49:17 +00001970 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001971 w = POP();
1972 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001973 }
1974 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001975 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001976 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001977 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001978 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001979
Guido van Rossum681d79a1995-07-18 14:51:37 +00001980 case MAKE_FUNCTION:
1981 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001982 x = PyFunction_New(v, f->f_globals);
1983 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001984 /* XXX Maybe this should be a separate opcode? */
1985 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001986 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001987 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001988 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001989 x = NULL;
1990 break;
1991 }
1992 while (--oparg >= 0) {
1993 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001995 }
1996 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001997 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001998 }
1999 PUSH(x);
2000 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002001
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002002 case MAKE_CLOSURE:
2003 {
2004 int nfree;
2005 v = POP(); /* code object */
2006 x = PyFunction_New(v, f->f_globals);
2007 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2008 Py_DECREF(v);
2009 /* XXX Maybe this should be a separate opcode? */
2010 if (x != NULL && nfree > 0) {
2011 v = PyTuple_New(nfree);
2012 if (v == NULL) {
2013 Py_DECREF(x);
2014 x = NULL;
2015 break;
2016 }
2017 while (--nfree >= 0) {
2018 w = POP();
2019 PyTuple_SET_ITEM(v, nfree, w);
2020 }
2021 err = PyFunction_SetClosure(x, v);
2022 Py_DECREF(v);
2023 }
2024 if (x != NULL && oparg > 0) {
2025 v = PyTuple_New(oparg);
2026 if (v == NULL) {
2027 Py_DECREF(x);
2028 x = NULL;
2029 break;
2030 }
2031 while (--oparg >= 0) {
2032 w = POP();
2033 PyTuple_SET_ITEM(v, oparg, w);
2034 }
2035 err = PyFunction_SetDefaults(x, v);
2036 Py_DECREF(v);
2037 }
2038 PUSH(x);
2039 break;
2040 }
2041
Guido van Rossum8861b741996-07-30 16:49:37 +00002042 case BUILD_SLICE:
2043 if (oparg == 3)
2044 w = POP();
2045 else
2046 w = NULL;
2047 v = POP();
2048 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002049 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002050 Py_DECREF(u);
2051 Py_DECREF(v);
2052 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002053 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002054 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002055 break;
2056
Fred Drakeef8ace32000-08-24 00:32:09 +00002057 case EXTENDED_ARG:
2058 opcode = NEXTOP();
2059 oparg = oparg<<16 | NEXTARG();
2060 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002061
Guido van Rossum374a9221991-04-04 10:40:29 +00002062 default:
2063 fprintf(stderr,
2064 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002065 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002066 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002067 why = WHY_EXCEPTION;
2068 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002069
2070#ifdef CASE_TOO_BIG
2071 }
2072#endif
2073
Guido van Rossum374a9221991-04-04 10:40:29 +00002074 } /* switch */
2075
2076 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002077
Guido van Rossum374a9221991-04-04 10:40:29 +00002078 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002079
Guido van Rossum374a9221991-04-04 10:40:29 +00002080 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002081 if (err == 0 && x != NULL) {
2082#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002083 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002084 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002085 fprintf(stderr,
2086 "XXX undetected error\n");
2087 else
2088#endif
2089 continue; /* Normal, fast path */
2090 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002091 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002093 err = 0;
2094 }
2095
Guido van Rossum374a9221991-04-04 10:40:29 +00002096 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002097
Guido van Rossum374a9221991-04-04 10:40:29 +00002098 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002099 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002100 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002101 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002102 why = WHY_EXCEPTION;
2103 }
2104 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002105#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002106 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002107 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002108 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002109 fprintf(stderr,
2110 "XXX undetected error (why=%d)\n",
2111 why);
2112 why = WHY_EXCEPTION;
2113 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 }
2115#endif
2116
2117 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002118
Guido van Rossum374a9221991-04-04 10:40:29 +00002119 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002120 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002121 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002122 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002123 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002124
Guido van Rossume59214e1994-08-30 08:01:59 +00002125 if (f->f_trace)
2126 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002127 if (tstate->sys_profilefunc)
2128 call_exc_trace(&tstate->sys_profilefunc,
2129 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002130 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002131
Guido van Rossum374a9221991-04-04 10:40:29 +00002132 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002133
Guido van Rossum374a9221991-04-04 10:40:29 +00002134 if (why == WHY_RERAISE)
2135 why = WHY_EXCEPTION;
2136
2137 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002138
Tim Peters5ca576e2001-06-18 22:08:13 +00002139 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002140 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002141
2142 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2143 /* For a continue inside a try block,
2144 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002145 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002146 b->b_handler);
2147 why = WHY_NOT;
2148 JUMPTO(PyInt_AS_LONG(retval));
2149 Py_DECREF(retval);
2150 break;
2151 }
2152
Guido van Rossum374a9221991-04-04 10:40:29 +00002153 while (STACK_LEVEL() > b->b_level) {
2154 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002155 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002156 }
2157 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2158 why = WHY_NOT;
2159 JUMPTO(b->b_handler);
2160 break;
2161 }
2162 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002163 (b->b_type == SETUP_EXCEPT &&
2164 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002165 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002166 PyObject *exc, *val, *tb;
2167 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002168 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002169 val = Py_None;
2170 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002171 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002172 /* Make the raw exception data
2173 available to the handler,
2174 so a program can emulate the
2175 Python main loop. Don't do
2176 this for 'finally'. */
2177 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002178 PyErr_NormalizeException(
2179 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002180 set_exc_info(tstate,
2181 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002182 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002183 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002184 PUSH(val);
2185 PUSH(exc);
2186 }
2187 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002188 if (why == WHY_RETURN ||
2189 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002191 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 PUSH(v);
2193 }
2194 why = WHY_NOT;
2195 JUMPTO(b->b_handler);
2196 break;
2197 }
2198 } /* unwind stack */
2199
2200 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002201
Guido van Rossum374a9221991-04-04 10:40:29 +00002202 if (why != WHY_NOT)
2203 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002204
Guido van Rossum374a9221991-04-04 10:40:29 +00002205 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002206
Tim Peters5ca576e2001-06-18 22:08:13 +00002207 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002208 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002209
Guido van Rossume59214e1994-08-30 08:01:59 +00002210 if (f->f_trace) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002211 if (why == WHY_RETURN || why == WHY_YIELD) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002212 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Draked0838392001-06-16 21:02:31 +00002213 str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002214 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002215 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002216 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002217 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002218 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002219 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002220
Tim Peters5ca576e2001-06-18 22:08:13 +00002221 if (tstate->sys_profilefunc &&
2222 (why == WHY_RETURN || why == WHY_YIELD)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002223 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Draked0838392001-06-16 21:02:31 +00002224 f, str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002225 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002226 retval = NULL;
2227 why = WHY_EXCEPTION;
2228 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002229 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002230
Guido van Rossuma027efa1997-05-05 20:56:21 +00002231 reset_exc_info(tstate);
2232
Tim Peters5ca576e2001-06-18 22:08:13 +00002233 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002234 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002235 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002236
Guido van Rossum96a42c81992-01-12 02:29:51 +00002237 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002238}
2239
Tim Peters5ca576e2001-06-18 22:08:13 +00002240static PyObject *
2241eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2242 PyObject **args, int argcount, PyObject **kws, int kwcount,
2243 PyObject **defs, int defcount, PyObject *closure)
2244{
2245 register PyFrameObject *f;
2246 register PyObject *retval = NULL;
2247 register PyObject **fastlocals, **freevars;
2248 PyThreadState *tstate = PyThreadState_GET();
2249 PyObject *x, *u;
2250
2251 if (globals == NULL) {
2252 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2253 return NULL;
2254 }
2255
2256 f = PyFrame_New(tstate, /*back*/
2257 co, /*code*/
2258 globals, locals);
2259 if (f == NULL)
2260 return NULL;
2261
2262 fastlocals = f->f_localsplus;
2263 freevars = f->f_localsplus + f->f_nlocals;
2264
2265 if (co->co_argcount > 0 ||
2266 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2267 int i;
2268 int n = argcount;
2269 PyObject *kwdict = NULL;
2270 if (co->co_flags & CO_VARKEYWORDS) {
2271 kwdict = PyDict_New();
2272 if (kwdict == NULL)
2273 goto fail;
2274 i = co->co_argcount;
2275 if (co->co_flags & CO_VARARGS)
2276 i++;
2277 SETLOCAL(i, kwdict);
2278 }
2279 if (argcount > co->co_argcount) {
2280 if (!(co->co_flags & CO_VARARGS)) {
2281 PyErr_Format(PyExc_TypeError,
2282 "%.200s() takes %s %d "
2283 "%sargument%s (%d given)",
2284 PyString_AsString(co->co_name),
2285 defcount ? "at most" : "exactly",
2286 co->co_argcount,
2287 kwcount ? "non-keyword " : "",
2288 co->co_argcount == 1 ? "" : "s",
2289 argcount);
2290 goto fail;
2291 }
2292 n = co->co_argcount;
2293 }
2294 for (i = 0; i < n; i++) {
2295 x = args[i];
2296 Py_INCREF(x);
2297 SETLOCAL(i, x);
2298 }
2299 if (co->co_flags & CO_VARARGS) {
2300 u = PyTuple_New(argcount - n);
2301 if (u == NULL)
2302 goto fail;
2303 SETLOCAL(co->co_argcount, u);
2304 for (i = n; i < argcount; i++) {
2305 x = args[i];
2306 Py_INCREF(x);
2307 PyTuple_SET_ITEM(u, i-n, x);
2308 }
2309 }
2310 for (i = 0; i < kwcount; i++) {
2311 PyObject *keyword = kws[2*i];
2312 PyObject *value = kws[2*i + 1];
2313 int j;
2314 if (keyword == NULL || !PyString_Check(keyword)) {
2315 PyErr_Format(PyExc_TypeError,
2316 "%.200s() keywords must be strings",
2317 PyString_AsString(co->co_name));
2318 goto fail;
2319 }
2320 /* XXX slow -- speed up using dictionary? */
2321 for (j = 0; j < co->co_argcount; j++) {
2322 PyObject *nm = PyTuple_GET_ITEM(
2323 co->co_varnames, j);
2324 int cmp = PyObject_RichCompareBool(
2325 keyword, nm, Py_EQ);
2326 if (cmp > 0)
2327 break;
2328 else if (cmp < 0)
2329 goto fail;
2330 }
2331 /* Check errors from Compare */
2332 if (PyErr_Occurred())
2333 goto fail;
2334 if (j >= co->co_argcount) {
2335 if (kwdict == NULL) {
2336 PyErr_Format(PyExc_TypeError,
2337 "%.200s() got an unexpected "
2338 "keyword argument '%.400s'",
2339 PyString_AsString(co->co_name),
2340 PyString_AsString(keyword));
2341 goto fail;
2342 }
2343 PyDict_SetItem(kwdict, keyword, value);
2344 }
2345 else {
2346 if (GETLOCAL(j) != NULL) {
2347 PyErr_Format(PyExc_TypeError,
2348 "%.200s() got multiple "
2349 "values for keyword "
2350 "argument '%.400s'",
2351 PyString_AsString(co->co_name),
2352 PyString_AsString(keyword));
2353 goto fail;
2354 }
2355 Py_INCREF(value);
2356 SETLOCAL(j, value);
2357 }
2358 }
2359 if (argcount < co->co_argcount) {
2360 int m = co->co_argcount - defcount;
2361 for (i = argcount; i < m; i++) {
2362 if (GETLOCAL(i) == NULL) {
2363 PyErr_Format(PyExc_TypeError,
2364 "%.200s() takes %s %d "
2365 "%sargument%s (%d given)",
2366 PyString_AsString(co->co_name),
2367 ((co->co_flags & CO_VARARGS) ||
2368 defcount) ? "at least"
2369 : "exactly",
2370 m, kwcount ? "non-keyword " : "",
2371 m == 1 ? "" : "s", i);
2372 goto fail;
2373 }
2374 }
2375 if (n > m)
2376 i = n - m;
2377 else
2378 i = 0;
2379 for (; i < defcount; i++) {
2380 if (GETLOCAL(m+i) == NULL) {
2381 PyObject *def = defs[i];
2382 Py_INCREF(def);
2383 SETLOCAL(m+i, def);
2384 }
2385 }
2386 }
2387 }
2388 else {
2389 if (argcount > 0 || kwcount > 0) {
2390 PyErr_Format(PyExc_TypeError,
2391 "%.200s() takes no arguments (%d given)",
2392 PyString_AsString(co->co_name),
2393 argcount + kwcount);
2394 goto fail;
2395 }
2396 }
2397 /* Allocate and initialize storage for cell vars, and copy free
2398 vars into frame. This isn't too efficient right now. */
2399 if (f->f_ncells) {
2400 int i = 0, j = 0, nargs, found;
2401 char *cellname, *argname;
2402 PyObject *c;
2403
2404 nargs = co->co_argcount;
2405 if (co->co_flags & CO_VARARGS)
2406 nargs++;
2407 if (co->co_flags & CO_VARKEYWORDS)
2408 nargs++;
2409
2410 /* Check for cells that shadow args */
2411 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2412 cellname = PyString_AS_STRING(
2413 PyTuple_GET_ITEM(co->co_cellvars, i));
2414 found = 0;
2415 while (j < nargs) {
2416 argname = PyString_AS_STRING(
2417 PyTuple_GET_ITEM(co->co_varnames, j));
2418 if (strcmp(cellname, argname) == 0) {
2419 c = PyCell_New(GETLOCAL(j));
2420 if (c == NULL)
2421 goto fail;
2422 GETLOCAL(f->f_nlocals + i) = c;
2423 found = 1;
2424 break;
2425 }
2426 j++;
2427 }
2428 if (found == 0) {
2429 c = PyCell_New(NULL);
2430 if (c == NULL)
2431 goto fail;
2432 SETLOCAL(f->f_nlocals + i, c);
2433 }
2434 }
2435 /* Initialize any that are left */
2436 while (i < f->f_ncells) {
2437 c = PyCell_New(NULL);
2438 if (c == NULL)
2439 goto fail;
2440 SETLOCAL(f->f_nlocals + i, c);
2441 i++;
2442 }
2443 }
2444 if (f->f_nfreevars) {
2445 int i;
2446 for (i = 0; i < f->f_nfreevars; ++i) {
2447 PyObject *o = PyTuple_GET_ITEM(closure, i);
2448 Py_INCREF(o);
2449 freevars[f->f_ncells + i] = o;
2450 }
2451 }
2452
2453 if (tstate->sys_tracefunc != NULL) {
2454 /* tstate->sys_tracefunc, if defined, is a function that
2455 will be called on *every* entry to a code block.
2456 Its return value, if not None, is a function that
2457 will be called at the start of each executed line
2458 of code. (Actually, the function must return
2459 itself in order to continue tracing.)
2460 The trace functions are called with three arguments:
2461 a pointer to the current frame, a string indicating
2462 why the function is called, and an argument which
2463 depends on the situation. The global trace function
2464 (sys.trace) is also called whenever an exception
2465 is detected. */
2466 if (call_trace(&tstate->sys_tracefunc,
2467 &f->f_trace, f, str_call,
2468 Py_None/*XXX how to compute arguments now?*/)) {
2469 /* Trace function raised an error */
2470 goto fail;
2471 }
2472 }
2473
2474 if (tstate->sys_profilefunc != NULL) {
2475 /* Similar for sys_profilefunc, except it needn't return
2476 itself and isn't called for "line" events */
2477 if (call_trace(&tstate->sys_profilefunc,
2478 (PyObject**)0, f, str_call,
2479 Py_None/*XXX*/)) {
2480 goto fail;
2481 }
2482 }
2483
2484 if (co->co_flags & CO_GENERATOR) {
2485 /* create a new generator that owns the ready to run frame
2486 * and return that as the value */
2487 return gen_new(f);
2488 }
2489
2490 retval = eval_frame(f);
2491
2492 fail: /* Jump here from prelude on failure */
2493
2494 Py_DECREF(f);
2495 return retval;
2496}
2497
2498
Guido van Rossuma027efa1997-05-05 20:56:21 +00002499static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002500set_exc_info(PyThreadState *tstate,
2501 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002502{
2503 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002504 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002505
Guido van Rossuma027efa1997-05-05 20:56:21 +00002506 frame = tstate->frame;
2507 if (frame->f_exc_type == NULL) {
2508 /* This frame didn't catch an exception before */
2509 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002510 if (tstate->exc_type == NULL) {
2511 Py_INCREF(Py_None);
2512 tstate->exc_type = Py_None;
2513 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002514 tmp_type = frame->f_exc_type;
2515 tmp_value = frame->f_exc_value;
2516 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002517 Py_XINCREF(tstate->exc_type);
2518 Py_XINCREF(tstate->exc_value);
2519 Py_XINCREF(tstate->exc_traceback);
2520 frame->f_exc_type = tstate->exc_type;
2521 frame->f_exc_value = tstate->exc_value;
2522 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002523 Py_XDECREF(tmp_type);
2524 Py_XDECREF(tmp_value);
2525 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002526 }
2527 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002528 tmp_type = tstate->exc_type;
2529 tmp_value = tstate->exc_value;
2530 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002531 Py_XINCREF(type);
2532 Py_XINCREF(value);
2533 Py_XINCREF(tb);
2534 tstate->exc_type = type;
2535 tstate->exc_value = value;
2536 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002537 Py_XDECREF(tmp_type);
2538 Py_XDECREF(tmp_value);
2539 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002540 /* For b/w compatibility */
2541 PySys_SetObject("exc_type", type);
2542 PySys_SetObject("exc_value", value);
2543 PySys_SetObject("exc_traceback", tb);
2544}
2545
2546static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002547reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002548{
2549 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002550 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002551 frame = tstate->frame;
2552 if (frame->f_exc_type != NULL) {
2553 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002554 tmp_type = tstate->exc_type;
2555 tmp_value = tstate->exc_value;
2556 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002557 Py_XINCREF(frame->f_exc_type);
2558 Py_XINCREF(frame->f_exc_value);
2559 Py_XINCREF(frame->f_exc_traceback);
2560 tstate->exc_type = frame->f_exc_type;
2561 tstate->exc_value = frame->f_exc_value;
2562 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002563 Py_XDECREF(tmp_type);
2564 Py_XDECREF(tmp_value);
2565 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002566 /* For b/w compatibility */
2567 PySys_SetObject("exc_type", frame->f_exc_type);
2568 PySys_SetObject("exc_value", frame->f_exc_value);
2569 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2570 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002571 tmp_type = frame->f_exc_type;
2572 tmp_value = frame->f_exc_value;
2573 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002574 frame->f_exc_type = NULL;
2575 frame->f_exc_value = NULL;
2576 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002577 Py_XDECREF(tmp_type);
2578 Py_XDECREF(tmp_value);
2579 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002580}
2581
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002582/* Logic for the raise statement (too complicated for inlining).
2583 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002584static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002585do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002586{
Guido van Rossumd295f121998-04-09 21:39:57 +00002587 if (type == NULL) {
2588 /* Reraise */
2589 PyThreadState *tstate = PyThreadState_Get();
2590 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2591 value = tstate->exc_value;
2592 tb = tstate->exc_traceback;
2593 Py_XINCREF(type);
2594 Py_XINCREF(value);
2595 Py_XINCREF(tb);
2596 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002597
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002598 /* We support the following forms of raise:
2599 raise <class>, <classinstance>
2600 raise <class>, <argument tuple>
2601 raise <class>, None
2602 raise <class>, <argument>
2603 raise <classinstance>, None
2604 raise <string>, <object>
2605 raise <string>, None
2606
2607 An omitted second argument is the same as None.
2608
2609 In addition, raise <tuple>, <anything> is the same as
2610 raising the tuple's first item (and it better have one!);
2611 this rule is applied recursively.
2612
2613 Finally, an optional third argument can be supplied, which
2614 gives the traceback to be substituted (useful when
2615 re-raising an exception after examining it). */
2616
2617 /* First, check the traceback argument, replacing None with
2618 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002619 if (tb == Py_None) {
2620 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002621 tb = NULL;
2622 }
2623 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002624 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002625 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002626 goto raise_error;
2627 }
2628
2629 /* Next, replace a missing value with None */
2630 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002631 value = Py_None;
2632 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002633 }
2634
2635 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002636 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2637 PyObject *tmp = type;
2638 type = PyTuple_GET_ITEM(type, 0);
2639 Py_INCREF(type);
2640 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002641 }
2642
Barry Warsaw4249f541997-08-22 21:26:19 +00002643 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002644 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002645
2646 else if (PyClass_Check(type))
2647 PyErr_NormalizeException(&type, &value, &tb);
2648
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002650 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002651 if (value != Py_None) {
2652 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002653 "instance exception may not have a separate value");
2654 goto raise_error;
2655 }
2656 else {
2657 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002658 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002659 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002660 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2661 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002662 }
2663 }
2664 else {
2665 /* Not something you can raise. You get an exception
2666 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002667 PyErr_Format(PyExc_TypeError,
2668 "exceptions must be strings, classes, or "
2669 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002670 goto raise_error;
2671 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002672 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002673 if (tb == NULL)
2674 return WHY_EXCEPTION;
2675 else
2676 return WHY_RERAISE;
2677 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002678 Py_XDECREF(value);
2679 Py_XDECREF(type);
2680 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002681 return WHY_EXCEPTION;
2682}
2683
Barry Warsawe42b18f1997-08-25 22:13:04 +00002684static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002685unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002686{
2687 int i;
2688 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002689
Barry Warsawe42b18f1997-08-25 22:13:04 +00002690 for (i = 0; i < argcnt; i++) {
2691 if (! (w = PySequence_GetItem(v, i))) {
2692 if (PyErr_ExceptionMatches(PyExc_IndexError))
2693 PyErr_SetString(PyExc_ValueError,
2694 "unpack sequence of wrong size");
2695 goto finally;
2696 }
2697 *--sp = w;
2698 }
2699 /* we better get an IndexError now */
2700 if (PySequence_GetItem(v, i) == NULL) {
2701 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2702 PyErr_Clear();
2703 return 1;
2704 }
2705 /* some other exception occurred. fall through to finally */
2706 }
2707 else
2708 PyErr_SetString(PyExc_ValueError,
2709 "unpack sequence of wrong size");
2710 /* fall through */
2711finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002712 for (; i > 0; i--, sp++)
2713 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002714
2715 return 0;
2716}
2717
2718
Guido van Rossum96a42c81992-01-12 02:29:51 +00002719#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002720static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002721prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002723 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002724 if (PyObject_Print(v, stdout, 0) != 0)
2725 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002726 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002727 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002729#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002730
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002732call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002733{
Guido van Rossumb209a111997-04-29 18:18:01 +00002734 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002735 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002736 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002737 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002738 value = Py_None;
2739 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002740 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002741 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002742 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002743 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002744 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002745 }
Fred Draked0838392001-06-16 21:02:31 +00002746 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002748 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002750 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 Py_XDECREF(type);
2752 Py_XDECREF(value);
2753 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002754 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002755}
2756
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002757/* PyObject **p_trace: in/out; may not be NULL;
2758 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002759 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002760 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002761 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002762 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002763*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002764
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002765static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002766call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002767 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002768{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002769 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002770 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002771 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002772
Guido van Rossuma027efa1997-05-05 20:56:21 +00002773 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002774 /* Don't do recursive traces */
2775 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002776 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002777 *p_newtrace = NULL;
2778 }
2779 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002780 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002781
Guido van Rossumb209a111997-04-29 18:18:01 +00002782 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002783 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002784 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002785 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002786 Py_INCREF(f);
2787 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002788 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002789 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002790 arg = Py_None;
2791 Py_INCREF(arg);
2792 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002793 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002794 PyFrame_FastToLocals(f);
2795 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2796 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002797 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002798 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002800 if (res == NULL) {
2801 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002802 PyTraceBack_Here(f);
2803 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002804 *p_trace = NULL;
2805 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002806 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002807 *p_newtrace = NULL;
2808 }
Barry Warsawf6202631999-09-08 16:26:33 +00002809 /* to be extra double plus sure we don't get recursive
2810 * calls inf either tracefunc or profilefunc gets an
2811 * exception, zap the global variables.
2812 */
2813 Py_XDECREF(tstate->sys_tracefunc);
2814 tstate->sys_tracefunc = NULL;
2815 Py_XDECREF(tstate->sys_profilefunc);
2816 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002817 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002818 }
2819 else {
2820 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002821 Py_XDECREF(*p_newtrace);
2822 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002823 *p_newtrace = NULL;
2824 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002825 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002826 *p_newtrace = res;
2827 }
2828 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002829 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002830 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002831 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002832}
2833
Fred Draked0838392001-06-16 21:02:31 +00002834/* Initialize the strings that get passed to the profile and trace functions;
2835 * this avoids doing this while we're actually profiling/tracing.
2836 */
2837int
2838_PyTrace_Init(void)
2839{
2840 if (str_call == NULL) {
2841 str_call = PyString_InternFromString("call");
2842 if (str_call == NULL)
2843 return -1;
2844 }
2845 if (str_exception == NULL) {
2846 str_exception = PyString_InternFromString("exception");
2847 if (str_exception == NULL)
2848 return -1;
2849 }
2850 if (str_line == NULL) {
2851 str_line = PyString_InternFromString("line");
2852 if (str_line == NULL)
2853 return -1;
2854 }
2855 if (str_return == NULL) {
2856 str_return = PyString_InternFromString("return");
2857 if (str_return == NULL)
2858 return -1;
2859 }
2860 return 0;
2861}
2862
Guido van Rossumb209a111997-04-29 18:18:01 +00002863PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002864PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002865{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002866 PyThreadState *tstate = PyThreadState_Get();
2867 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002868 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002869 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002870 else
2871 return current_frame->f_builtins;
2872}
2873
Guido van Rossumb209a111997-04-29 18:18:01 +00002874PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002875PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002876{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002877 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002878 if (current_frame == NULL)
2879 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002880 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002881 return current_frame->f_locals;
2882}
2883
Guido van Rossumb209a111997-04-29 18:18:01 +00002884PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002885PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002886{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002887 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002888 if (current_frame == NULL)
2889 return NULL;
2890 else
2891 return current_frame->f_globals;
2892}
2893
Guido van Rossumb209a111997-04-29 18:18:01 +00002894PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002895PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002896{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002897 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002898 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002899}
2900
Guido van Rossum6135a871995-01-09 17:53:26 +00002901int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002902PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002903{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002904 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002905 return current_frame == NULL ? 0 : current_frame->f_restricted;
2906}
2907
Guido van Rossumbe270261997-05-22 22:26:18 +00002908int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002909PyEval_GetNestedScopes(void)
2910{
2911 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2912 return current_frame == NULL ? 0 :
2913 current_frame->f_code->co_flags & CO_NESTED;
2914}
2915
2916int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002917Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002918{
Guido van Rossumb209a111997-04-29 18:18:01 +00002919 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002920 if (f == NULL)
2921 return 0;
2922 if (!PyFile_SoftSpace(f, 0))
2923 return 0;
2924 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925}
2926
Guido van Rossum3f5da241990-12-20 15:06:42 +00002927
Guido van Rossum681d79a1995-07-18 14:51:37 +00002928/* External interface to call any callable object.
2929 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002930
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002931#undef PyEval_CallObject
2932/* for backward compatibility: export this interface */
2933
Guido van Rossumb209a111997-04-29 18:18:01 +00002934PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002936{
Guido van Rossumb209a111997-04-29 18:18:01 +00002937 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002938}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002939#define PyEval_CallObject(func,arg) \
2940 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002941
Guido van Rossumb209a111997-04-29 18:18:01 +00002942PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002943PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002944{
Jeremy Hylton52820442001-01-03 23:52:36 +00002945 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002946
2947 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002948 arg = PyTuple_New(0);
2949 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002950 PyErr_SetString(PyExc_TypeError,
2951 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002952 return NULL;
2953 }
2954 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002955 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002956
Guido van Rossumb209a111997-04-29 18:18:01 +00002957 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002958 PyErr_SetString(PyExc_TypeError,
2959 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002960 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002961 return NULL;
2962 }
2963
Jeremy Hylton52820442001-01-03 23:52:36 +00002964 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002965 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002966 return result;
2967}
2968
2969/* How often is each kind of object called? The answer depends on the
2970 program. An instrumented call_object() was used to run the Python
2971 regression test suite. The results were:
2972 4200000 PyCFunctions
2973 390000 fast_function() calls
2974 94000 other functions
2975 480000 all functions (sum of prev two)
2976 150000 methods
2977 100000 classes
2978
2979 Tests on other bodies of code show that PyCFunctions are still
2980 most common, but not by such a large margin.
2981*/
2982
Jeremy Hylton512a2372001-04-11 13:52:29 +00002983static char *
2984get_func_name(PyObject *func)
2985{
2986 if (PyMethod_Check(func))
2987 return get_func_name(PyMethod_GET_FUNCTION(func));
2988 else if (PyFunction_Check(func))
2989 return PyString_AsString(((PyFunctionObject*)func)->func_name);
2990 else if (PyCFunction_Check(func))
2991 return ((PyCFunctionObject*)func)->m_ml->ml_name;
2992 else if (PyClass_Check(func))
2993 return PyString_AsString(((PyClassObject*)func)->cl_name);
2994 else if (PyInstance_Check(func)) {
2995 return PyString_AsString(
2996 ((PyInstanceObject*)func)->in_class->cl_name);
2997 } else {
2998 return func->ob_type->tp_name;
2999 }
3000}
3001
3002static char *
3003get_func_desc(PyObject *func)
3004{
3005 if (PyMethod_Check(func))
3006 return "()";
3007 else if (PyFunction_Check(func))
3008 return "()";
3009 else if (PyCFunction_Check(func))
3010 return "()";
3011 else if (PyClass_Check(func))
3012 return " constructor";
3013 else if (PyInstance_Check(func)) {
3014 return " instance";
3015 } else {
3016 return " object";
3017 }
3018}
3019
Jeremy Hylton52820442001-01-03 23:52:36 +00003020static PyObject *
3021call_object(PyObject *func, PyObject *arg, PyObject *kw)
3022{
3023 ternaryfunc call;
3024 PyObject *result;
3025
3026 if (PyMethod_Check(func))
3027 result = call_method(func, arg, kw);
3028 else if (PyFunction_Check(func))
3029 result = call_eval_code2(func, arg, kw);
3030 else if (PyCFunction_Check(func))
3031 result = call_cfunction(func, arg, kw);
3032 else if (PyClass_Check(func))
3033 result = PyInstance_New(func, arg, kw);
3034 else if (PyInstance_Check(func))
3035 result = call_instance(func, arg, kw);
3036 else if ((call = func->ob_type->tp_call) != NULL)
3037 result = (*call)(func, arg, kw);
3038 else {
Tim Peters239508c2001-06-16 00:09:28 +00003039 PyErr_Format(PyExc_TypeError,
3040 "object of type '%.100s' is not callable",
3041 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003042 return NULL;
3043 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003044 if (result == NULL && !PyErr_Occurred())
3045 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003046 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003047
Guido van Rossume59214e1994-08-30 08:01:59 +00003048 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003049}
3050
Guido van Rossumb209a111997-04-29 18:18:01 +00003051static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003052call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053{
Jeremy Hylton52820442001-01-03 23:52:36 +00003054 PyCFunctionObject* f = (PyCFunctionObject*)func;
3055 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3056 PyObject *self = PyCFunction_GET_SELF(func);
3057 int flags = PyCFunction_GET_FLAGS(func);
3058
Jeremy Hylton52820442001-01-03 23:52:36 +00003059 if (flags & METH_KEYWORDS) {
3060 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003062 if (kw != NULL && PyDict_Size(kw) != 0) {
3063 PyErr_Format(PyExc_TypeError,
3064 "%.200s() takes no keyword arguments",
3065 f->m_ml->ml_name);
3066 return NULL;
3067 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003068 if (flags & METH_VARARGS) {
3069 return (*meth)(self, arg);
3070 }
3071 if (!(flags & METH_VARARGS)) {
3072 /* the really old style */
3073 int size = PyTuple_GET_SIZE(arg);
3074 if (size == 1)
3075 arg = PyTuple_GET_ITEM(arg, 0);
3076 else if (size == 0)
3077 arg = NULL;
3078 return (*meth)(self, arg);
3079 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003080 /* should never get here ??? */
3081 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 return NULL;
3083}
3084
Guido van Rossumb209a111997-04-29 18:18:01 +00003085static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003086call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087{
Jeremy Hylton52820442001-01-03 23:52:36 +00003088 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3089 if (call == NULL) {
3090 PyInstanceObject *inst = (PyInstanceObject*) func;
3091 PyErr_Clear();
3092 PyErr_Format(PyExc_AttributeError,
3093 "%.200s instance has no __call__ method",
3094 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003095 return NULL;
3096 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003097 res = call_object(call, arg, kw);
3098 Py_DECREF(call);
3099 return res;
3100}
3101
3102static PyObject *
3103call_method(PyObject *func, PyObject *arg, PyObject *kw)
3104{
3105 PyObject *self = PyMethod_GET_SELF(func);
3106 PyObject *class = PyMethod_GET_CLASS(func);
3107 PyObject *result;
3108
3109 func = PyMethod_GET_FUNCTION(func);
3110 if (self == NULL) {
3111 /* Unbound methods must be called with an instance of
3112 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003113 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003114 if (PyTuple_Size(arg) >= 1)
3115 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003116 if (self == NULL)
3117 ok = 0;
3118 else {
3119 ok = PyObject_IsInstance(self, class);
3120 if (ok < 0)
3121 return NULL;
3122 }
3123 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003124 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003125 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003126 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003127 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003128 return NULL;
3129 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003130 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003131 }
3132 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003133 int argcount = PyTuple_Size(arg);
3134 PyObject *newarg = PyTuple_New(argcount + 1);
3135 int i;
3136 if (newarg == NULL)
3137 return NULL;
3138 Py_INCREF(self);
3139 PyTuple_SET_ITEM(newarg, 0, self);
3140 for (i = 0; i < argcount; i++) {
3141 PyObject *v = PyTuple_GET_ITEM(arg, i);
3142 Py_XINCREF(v);
3143 PyTuple_SET_ITEM(newarg, i+1, v);
3144 }
3145 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003147 result = call_object(func, arg, kw);
3148 Py_DECREF(arg);
3149 return result;
3150}
3151
3152static PyObject *
3153call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3154{
3155 PyObject *result;
3156 PyObject *argdefs;
3157 PyObject **d, **k;
3158 int nk, nd;
3159
3160 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003161 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3162 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3163 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003164 }
3165 else {
3166 d = NULL;
3167 nd = 0;
3168 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003169
Guido van Rossum681d79a1995-07-18 14:51:37 +00003170 if (kw != NULL) {
3171 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003172 nk = PyDict_Size(kw);
3173 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003174 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003175 PyErr_NoMemory();
3176 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003177 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003178 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003179 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003180 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003181 i += 2;
3182 nk = i/2;
3183 /* XXX This is broken if the caller deletes dict items! */
3184 }
3185 else {
3186 k = NULL;
3187 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003188 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003189
Guido van Rossum681d79a1995-07-18 14:51:37 +00003190 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003191 (PyCodeObject *)PyFunction_GET_CODE(func),
3192 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003193 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003194 k, nk, d, nd,
3195 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003196
Guido van Rossumb18618d2000-05-03 23:44:39 +00003197 if (k != NULL)
3198 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003199
Guido van Rossum681d79a1995-07-18 14:51:37 +00003200 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201}
3202
Jeremy Hylton52820442001-01-03 23:52:36 +00003203#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3204
3205/* The two fast_xxx() functions optimize calls for which no argument
3206 tuple is necessary; the objects are passed directly from the stack.
3207 fast_cfunction() is called for METH_OLDARGS functions.
3208 fast_function() is for functions with no special argument handling.
3209*/
3210
3211static PyObject *
3212fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3213{
3214 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3215 PyObject *self = PyCFunction_GET_SELF(func);
3216
3217 if (na == 0)
3218 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003219 else if (na == 1) {
3220 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003221 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003222 Py_DECREF(arg);
3223 return result;
3224 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003225 PyObject *args = load_args(pp_stack, na);
3226 PyObject *result = (*meth)(self, args);
3227 Py_DECREF(args);
3228 return result;
3229 }
3230}
3231
3232static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003233fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003234{
3235 PyObject *co = PyFunction_GET_CODE(func);
3236 PyObject *globals = PyFunction_GET_GLOBALS(func);
3237 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003238 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003239 PyObject **d = NULL;
3240 int nd = 0;
3241
3242 if (argdefs != NULL) {
3243 d = &PyTuple_GET_ITEM(argdefs, 0);
3244 nd = ((PyTupleObject *)argdefs)->ob_size;
3245 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003246 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003247 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003248 (*pp_stack)-2*nk, nk, d, nd,
3249 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003250}
3251
3252static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003253update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3254 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003255{
3256 PyObject *kwdict = NULL;
3257 if (orig_kwdict == NULL)
3258 kwdict = PyDict_New();
3259 else {
3260 kwdict = PyDict_Copy(orig_kwdict);
3261 Py_DECREF(orig_kwdict);
3262 }
3263 if (kwdict == NULL)
3264 return NULL;
3265 while (--nk >= 0) {
3266 int err;
3267 PyObject *value = EXT_POP(*pp_stack);
3268 PyObject *key = EXT_POP(*pp_stack);
3269 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003270 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003271 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003272 "for keyword argument '%.200s'",
3273 get_func_name(func),
3274 get_func_desc(func),
3275 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003276 Py_DECREF(key);
3277 Py_DECREF(value);
3278 Py_DECREF(kwdict);
3279 return NULL;
3280 }
3281 err = PyDict_SetItem(kwdict, key, value);
3282 Py_DECREF(key);
3283 Py_DECREF(value);
3284 if (err) {
3285 Py_DECREF(kwdict);
3286 return NULL;
3287 }
3288 }
3289 return kwdict;
3290}
3291
3292static PyObject *
3293update_star_args(int nstack, int nstar, PyObject *stararg,
3294 PyObject ***pp_stack)
3295{
3296 PyObject *callargs, *w;
3297
3298 callargs = PyTuple_New(nstack + nstar);
3299 if (callargs == NULL) {
3300 return NULL;
3301 }
3302 if (nstar) {
3303 int i;
3304 for (i = 0; i < nstar; i++) {
3305 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3306 Py_INCREF(a);
3307 PyTuple_SET_ITEM(callargs, nstack + i, a);
3308 }
3309 }
3310 while (--nstack >= 0) {
3311 w = EXT_POP(*pp_stack);
3312 PyTuple_SET_ITEM(callargs, nstack, w);
3313 }
3314 return callargs;
3315}
3316
3317static PyObject *
3318load_args(PyObject ***pp_stack, int na)
3319{
3320 PyObject *args = PyTuple_New(na);
3321 PyObject *w;
3322
3323 if (args == NULL)
3324 return NULL;
3325 while (--na >= 0) {
3326 w = EXT_POP(*pp_stack);
3327 PyTuple_SET_ITEM(args, na, w);
3328 }
3329 return args;
3330}
3331
3332static PyObject *
3333do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3334{
3335 PyObject *callargs = NULL;
3336 PyObject *kwdict = NULL;
3337 PyObject *result = NULL;
3338
3339 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003340 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003341 if (kwdict == NULL)
3342 goto call_fail;
3343 }
3344 callargs = load_args(pp_stack, na);
3345 if (callargs == NULL)
3346 goto call_fail;
3347 result = call_object(func, callargs, kwdict);
3348 call_fail:
3349 Py_XDECREF(callargs);
3350 Py_XDECREF(kwdict);
3351 return result;
3352}
3353
3354static PyObject *
3355ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3356{
3357 int nstar = 0;
3358 PyObject *callargs = NULL;
3359 PyObject *stararg = NULL;
3360 PyObject *kwdict = NULL;
3361 PyObject *result = NULL;
3362
3363 if (flags & CALL_FLAG_KW) {
3364 kwdict = EXT_POP(*pp_stack);
3365 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003366 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003367 "%s%s argument after ** "
3368 "must be a dictionary",
3369 get_func_name(func),
3370 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003371 goto ext_call_fail;
3372 }
3373 }
3374 if (flags & CALL_FLAG_VAR) {
3375 stararg = EXT_POP(*pp_stack);
3376 if (!PyTuple_Check(stararg)) {
3377 PyObject *t = NULL;
3378 t = PySequence_Tuple(stararg);
3379 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003380 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3381 PyErr_Format(PyExc_TypeError,
3382 "%s%s argument after * "
3383 "must be a sequence",
3384 get_func_name(func),
3385 get_func_desc(func));
3386 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003387 goto ext_call_fail;
3388 }
3389 Py_DECREF(stararg);
3390 stararg = t;
3391 }
3392 nstar = PyTuple_GET_SIZE(stararg);
3393 }
3394 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003395 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003396 if (kwdict == NULL)
3397 goto ext_call_fail;
3398 }
3399 callargs = update_star_args(na, nstar, stararg, pp_stack);
3400 if (callargs == NULL)
3401 goto ext_call_fail;
3402 result = call_object(func, callargs, kwdict);
3403 ext_call_fail:
3404 Py_XDECREF(callargs);
3405 Py_XDECREF(kwdict);
3406 Py_XDECREF(stararg);
3407 return result;
3408}
3409
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003410#define SLICE_ERROR_MSG \
3411 "standard sequence type does not support step size other than one"
3412
Guido van Rossumb209a111997-04-29 18:18:01 +00003413static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003414loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415{
Guido van Rossumb209a111997-04-29 18:18:01 +00003416 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003417 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003418 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003419 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420 return NULL;
3421 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003422 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003423 v = (*sq->sq_item)(v, i);
3424 if (v)
3425 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003426 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003427 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003428 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429}
3430
Guido van Rossum20c6add2000-05-08 14:06:50 +00003431/* Extract a slice index from a PyInt or PyLong, the index is bound to
3432 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3433 and error. Returns 1 on success.*/
3434
3435int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003436_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437{
3438 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003439 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003440 if (PyInt_Check(v)) {
3441 x = PyInt_AsLong(v);
3442 } else if (PyLong_Check(v)) {
3443 x = PyLong_AsLong(v);
3444 if (x==-1 && PyErr_Occurred()) {
3445 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003446 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003447
Guido van Rossumac7be682001-01-17 15:42:30 +00003448 if (!PyErr_ExceptionMatches(
3449 PyExc_OverflowError)) {
3450 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003451 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003452 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003453 }
3454
Guido van Rossumac7be682001-01-17 15:42:30 +00003455 /* Clear the OverflowError */
3456 PyErr_Clear();
3457
3458 /* It's an overflow error, so we need to
3459 check the sign of the long integer,
3460 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003461 the error. */
3462
3463 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003464 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003465 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003466
3467 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 cmp = PyObject_RichCompareBool(v, long_zero,
3469 Py_GT);
3470 Py_DECREF(long_zero);
3471 if (cmp < 0)
3472 return 0;
3473 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003474 x = INT_MAX;
3475 else
3476 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003477 }
3478 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003479 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003480 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003481 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003483 /* Truncate -- very long indices are truncated anyway */
3484 if (x > INT_MAX)
3485 x = INT_MAX;
3486 else if (x < -INT_MAX)
3487 x = 0;
3488 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003490 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491}
3492
Guido van Rossumb209a111997-04-29 18:18:01 +00003493static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003494apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003496 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003497 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003499 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003500 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003501 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003503
3504static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003505assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3506 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003508 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003509 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003510 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003511 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003512 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003513 if (x == NULL)
3514 return PySequence_DelSlice(u, ilow, ihigh);
3515 else
3516 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517}
3518
Guido van Rossumb209a111997-04-29 18:18:01 +00003519static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003520cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521{
Guido van Rossumac7be682001-01-17 15:42:30 +00003522 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003524 case IS:
3525 case IS_NOT:
3526 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003527 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003528 res = !res;
3529 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530 case IN:
3531 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003532 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003533 if (res < 0)
3534 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003535 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003536 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003537 break;
3538 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003539 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003540 break;
3541 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003542 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003543 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003544 v = res ? Py_True : Py_False;
3545 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003546 return v;
3547}
3548
Thomas Wouters52152252000-08-17 22:55:00 +00003549static PyObject *
3550import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003551{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003552 PyObject *x;
3553
3554 x = PyObject_GetAttr(v, name);
3555 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003556 PyErr_Format(PyExc_ImportError,
3557 "cannot import name %.230s",
3558 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003559 }
Thomas Wouters52152252000-08-17 22:55:00 +00003560 return x;
3561}
Guido van Rossumac7be682001-01-17 15:42:30 +00003562
Thomas Wouters52152252000-08-17 22:55:00 +00003563static int
3564import_all_from(PyObject *locals, PyObject *v)
3565{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003566 PyObject *all = PyObject_GetAttrString(v, "__all__");
3567 PyObject *dict, *name, *value;
3568 int skip_leading_underscores = 0;
3569 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003570
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003571 if (all == NULL) {
3572 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3573 return -1; /* Unexpected error */
3574 PyErr_Clear();
3575 dict = PyObject_GetAttrString(v, "__dict__");
3576 if (dict == NULL) {
3577 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3578 return -1;
3579 PyErr_SetString(PyExc_ImportError,
3580 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003581 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003582 }
3583 all = PyMapping_Keys(dict);
3584 Py_DECREF(dict);
3585 if (all == NULL)
3586 return -1;
3587 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003588 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003589
3590 for (pos = 0, err = 0; ; pos++) {
3591 name = PySequence_GetItem(all, pos);
3592 if (name == NULL) {
3593 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3594 err = -1;
3595 else
3596 PyErr_Clear();
3597 break;
3598 }
3599 if (skip_leading_underscores &&
3600 PyString_Check(name) &&
3601 PyString_AS_STRING(name)[0] == '_')
3602 {
3603 Py_DECREF(name);
3604 continue;
3605 }
3606 value = PyObject_GetAttr(v, name);
3607 if (value == NULL)
3608 err = -1;
3609 else
3610 err = PyDict_SetItem(locals, name, value);
3611 Py_DECREF(name);
3612 Py_XDECREF(value);
3613 if (err != 0)
3614 break;
3615 }
3616 Py_DECREF(all);
3617 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003618}
3619
Guido van Rossumb209a111997-04-29 18:18:01 +00003620static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003621build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003622{
Guido van Rossumcd649651997-08-22 16:56:16 +00003623 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003624 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003625 PyErr_SetString(PyExc_SystemError,
3626 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003627 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003628 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003629 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003630 PyErr_SetString(PyExc_SystemError,
3631 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003632 return NULL;
3633 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003634 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003635 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003636 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003637 return NULL;
3638 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003639 n = PyTuple_Size(bases);
3640 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003641 PyObject *base = PyTuple_GET_ITEM(bases, i);
3642 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003643 /* Call the base's *type*, if it is callable.
3644 This code is a hook for Donald Beaudry's
3645 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003646 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003647 since its types are not callable.
3648 Ditto: call the bases's *class*, if it has
3649 one. This makes the same thing possible
3650 without writing C code. A true meta-object
3651 protocol! */
3652 PyObject *basetype = (PyObject *)base->ob_type;
3653 PyObject *callable = NULL;
3654 if (PyCallable_Check(basetype))
3655 callable = basetype;
3656 else
3657 callable = PyObject_GetAttrString(
3658 base, "__class__");
3659 if (callable) {
3660 PyObject *args;
3661 PyObject *newclass = NULL;
3662 args = Py_BuildValue(
3663 "(OOO)", name, bases, methods);
3664 if (args != NULL) {
3665 newclass = PyEval_CallObject(
3666 callable, args);
3667 Py_DECREF(args);
3668 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003669 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003670 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003671 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003672 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003673 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003674 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003675 "base is not a class object");
3676 return NULL;
3677 }
3678 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003679 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003680}
3681
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003682static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003683exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3684 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003685{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003686 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003687 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003688 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003689
Guido van Rossumb209a111997-04-29 18:18:01 +00003690 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3691 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003692 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003693 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003694 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003695 locals = PyTuple_GetItem(prog, 2);
3696 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003697 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003698 if (globals == Py_None) {
3699 globals = PyEval_GetGlobals();
3700 if (locals == Py_None) {
3701 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003702 plain = 1;
3703 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003704 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003705 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003706 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003707 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003708 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003709 !PyCode_Check(prog) &&
3710 !PyFile_Check(prog)) {
3711 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003712 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003713 return -1;
3714 }
Fred Drake661ea262000-10-24 19:57:45 +00003715 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003716 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003717 "exec: arg 2 must be a dictionary or None");
3718 return -1;
3719 }
3720 if (!PyDict_Check(locals)) {
3721 PyErr_SetString(PyExc_TypeError,
3722 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003723 return -1;
3724 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003725 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003726 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003727 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003728 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003729 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003730 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003731 FILE *fp = PyFile_AsFile(prog);
3732 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003733 if (PyEval_GetNestedScopes()) {
3734 PyCompilerFlags cf;
3735 cf.cf_nested_scopes = 1;
3736 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3737 locals, &cf);
3738 } else {
3739 v = PyRun_File(fp, name, Py_file_input, globals,
3740 locals);
3741 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003742 }
3743 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003744 char *str;
3745 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003746 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003747 if (PyEval_GetNestedScopes()) {
3748 PyCompilerFlags cf;
3749 cf.cf_nested_scopes = 1;
3750 v = PyRun_StringFlags(str, Py_file_input, globals,
3751 locals, &cf);
3752 } else
3753 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003754 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003755 if (plain)
3756 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003757 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003758 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003759 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003760 return 0;
3761}
Guido van Rossum24c13741995-02-14 09:42:43 +00003762
Guido van Rossumac7be682001-01-17 15:42:30 +00003763static void
Paul Prescode68140d2000-08-30 20:25:01 +00003764format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3765{
3766 char *obj_str;
3767
3768 if (!obj)
3769 return;
3770
3771 obj_str = PyString_AsString(obj);
3772 if (!obj_str)
3773 return;
3774
3775 PyErr_Format(exc, format_str, obj_str);
3776}
Guido van Rossum950361c1997-01-24 13:49:28 +00003777
3778#ifdef DYNAMIC_EXECUTION_PROFILE
3779
3780PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003781getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003782{
3783 int i;
3784 PyObject *l = PyList_New(256);
3785 if (l == NULL) return NULL;
3786 for (i = 0; i < 256; i++) {
3787 PyObject *x = PyInt_FromLong(a[i]);
3788 if (x == NULL) {
3789 Py_DECREF(l);
3790 return NULL;
3791 }
3792 PyList_SetItem(l, i, x);
3793 }
3794 for (i = 0; i < 256; i++)
3795 a[i] = 0;
3796 return l;
3797}
3798
3799PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003800_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003801{
3802#ifndef DXPAIRS
3803 return getarray(dxp);
3804#else
3805 int i;
3806 PyObject *l = PyList_New(257);
3807 if (l == NULL) return NULL;
3808 for (i = 0; i < 257; i++) {
3809 PyObject *x = getarray(dxpairs[i]);
3810 if (x == NULL) {
3811 Py_DECREF(l);
3812 return NULL;
3813 }
3814 PyList_SetItem(l, i, x);
3815 }
3816 return l;
3817#endif
3818}
3819
3820#endif