blob: a71d48f03b2b979efebe121b05138020043985c6 [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{
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000141 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000142 PyFrameObject *f = gen->frame;
143 PyObject *result;
144
145 if (gen->running) {
146 PyErr_SetString(PyExc_ValueError,
147 "generator already executing");
148 return NULL;
149 }
150 if (f->f_stackbottom == NULL) {
151 return NULL;
152 }
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000153
154 /* Generators always return to their most recent caller, not
155 * necessarily their creator. */
156 Py_INCREF(tstate->frame);
157 assert(f->f_back == NULL);
158 f->f_back = tstate->frame;
159
160 gen->running = 1;
Tim Peters5ca576e2001-06-18 22:08:13 +0000161 result = eval_frame(f);
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000162 gen->running = 0;
163
164 /* Don't keep the reference to f_back any longer than necessary. It
165 * may keep a chain of frames alive or it could create a reference
166 * cycle. */
167 Py_DECREF(f->f_back);
Tim Peters6302ec62001-06-20 06:57:32 +0000168 f->f_back = NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000169
170 return result;
Tim Peters5ca576e2001-06-18 22:08:13 +0000171}
172
173static PyObject *
174gen_next(genobject *gen, PyObject *args)
175{
176 PyObject *result;
177
178 if (!PyArg_ParseTuple(args, ":next"))
179 return NULL;
180
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000181 result = gen_iternext(gen);
Tim Peters5ca576e2001-06-18 22:08:13 +0000182
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000183 if (result == NULL && !PyErr_Occurred()) {
Tim Peters5ca576e2001-06-18 22:08:13 +0000184 PyErr_SetObject(PyExc_StopIteration, Py_None);
185 return NULL;
Neil Schemenauer2b13ce82001-06-21 02:41:10 +0000186 }
Tim Peters5ca576e2001-06-18 22:08:13 +0000187
188 return result;
189}
190
191static PyObject *
192gen_getiter(PyObject *gen)
193{
194 Py_INCREF(gen);
195 return gen;
196}
197
198static struct PyMethodDef gen_methods[] = {
199 {"next", (PyCFunction)gen_next, METH_VARARGS,
200 "next() -- get the next value, or raise StopIteration"},
201 {NULL, NULL} /* Sentinel */
202};
203
204static PyObject *
205gen_getattr(genobject *gen, char *name)
206{
207 return Py_FindMethod(gen_methods, (PyObject *)gen, name);
208}
209
210statichere PyTypeObject gentype = {
211 PyObject_HEAD_INIT(&PyType_Type)
212 0, /* ob_size */
213 "generator", /* tp_name */
214 sizeof(genobject), /* tp_basicsize */
215 0, /* tp_itemsize */
216 /* methods */
217 (destructor)gen_dealloc, /* tp_dealloc */
218 0, /* tp_print */
219 (getattrfunc)gen_getattr, /* tp_getattr */
220 0, /* tp_setattr */
221 0, /* tp_compare */
222 0, /* tp_repr */
223 0, /* tp_as_number */
224 0, /* tp_as_sequence */
225 0, /* tp_as_mapping */
226 0, /* tp_hash */
227 0, /* tp_call */
228 0, /* tp_str */
229 0, /* tp_getattro */
230 0, /* tp_setattro */
231 0, /* tp_as_buffer */
232 Py_TPFLAGS_DEFAULT, /* tp_flags */
233 0, /* tp_doc */
234 0, /* tp_traverse */
235 0, /* tp_clear */
236 0, /* tp_richcompare */
237 0, /* tp_weaklistoffset */
238 (getiterfunc)gen_getiter, /* tp_iter */
239 (iternextfunc)gen_iternext, /* tp_iternext */
240};
241
242
Guido van Rossume59214e1994-08-30 08:01:59 +0000243#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000244
Guido van Rossum2571cc81999-04-07 16:07:23 +0000245#ifndef DONT_HAVE_ERRNO_H
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000246#include <errno.h>
Guido van Rossum2571cc81999-04-07 16:07:23 +0000247#endif
Guido van Rossum49b56061998-10-01 20:42:43 +0000248#include "pythread.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +0000249
Guido van Rossuma027efa1997-05-05 20:56:21 +0000250extern int _PyThread_Started; /* Flag for Py_Exit */
251
Guido van Rossum65d5b571998-12-21 19:32:43 +0000252static PyThread_type_lock interpreter_lock = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000253static long main_thread = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000254
255void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000256PyEval_InitThreads(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000257{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000258 if (interpreter_lock)
Sjoerd Mullendered59d201993-01-06 13:36:38 +0000259 return;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000260 _PyThread_Started = 1;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000261 interpreter_lock = PyThread_allocate_lock();
262 PyThread_acquire_lock(interpreter_lock, 1);
263 main_thread = PyThread_get_thread_ident();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000264}
Guido van Rossumff4949e1992-08-05 19:58:53 +0000265
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000266void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000267PyEval_AcquireLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000268{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000269 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000270}
271
272void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000273PyEval_ReleaseLock(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000274{
Guido van Rossum65d5b571998-12-21 19:32:43 +0000275 PyThread_release_lock(interpreter_lock);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276}
277
278void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279PyEval_AcquireThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000280{
281 if (tstate == NULL)
282 Py_FatalError("PyEval_AcquireThread: NULL new thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000283 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000284 if (PyThreadState_Swap(tstate) != NULL)
285 Py_FatalError(
286 "PyEval_AcquireThread: non-NULL old thread state");
287}
288
289void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000290PyEval_ReleaseThread(PyThreadState *tstate)
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000291{
292 if (tstate == NULL)
293 Py_FatalError("PyEval_ReleaseThread: NULL thread state");
294 if (PyThreadState_Swap(NULL) != tstate)
295 Py_FatalError("PyEval_ReleaseThread: wrong thread state");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000296 PyThread_release_lock(interpreter_lock);
Guido van Rossum9cc8a201997-07-19 19:55:50 +0000297}
Guido van Rossumfee3a2d2000-08-27 17:34:07 +0000298
299/* This function is called from PyOS_AfterFork to ensure that newly
300 created child processes don't hold locks referring to threads which
301 are not running in the child process. (This could also be done using
302 pthread_atfork mechanism, at least for the pthreads implementation.) */
303
304void
305PyEval_ReInitThreads(void)
306{
307 if (!interpreter_lock)
308 return;
309 /*XXX Can't use PyThread_free_lock here because it does too
310 much error-checking. Doing this cleanly would require
311 adding a new function to each thread_*.h. Instead, just
312 create a new lock and waste a little bit of memory */
313 interpreter_lock = PyThread_allocate_lock();
314 PyThread_acquire_lock(interpreter_lock, 1);
315 main_thread = PyThread_get_thread_ident();
316}
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000317#endif
318
Guido van Rossumff4949e1992-08-05 19:58:53 +0000319/* Functions save_thread and restore_thread are always defined so
320 dynamically loaded modules needn't be compiled separately for use
321 with and without threads: */
322
Guido van Rossum2fca21f71997-07-18 23:56:58 +0000323PyThreadState *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000324PyEval_SaveThread(void)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000325{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000326 PyThreadState *tstate = PyThreadState_Swap(NULL);
327 if (tstate == NULL)
328 Py_FatalError("PyEval_SaveThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000329#ifdef WITH_THREAD
Guido van Rossumb74eca91997-09-30 22:03:16 +0000330 if (interpreter_lock)
Guido van Rossum65d5b571998-12-21 19:32:43 +0000331 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000333 return tstate;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000337PyEval_RestoreThread(PyThreadState *tstate)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000338{
Guido van Rossumb74eca91997-09-30 22:03:16 +0000339 if (tstate == NULL)
340 Py_FatalError("PyEval_RestoreThread: NULL tstate");
Guido van Rossume59214e1994-08-30 08:01:59 +0000341#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 if (interpreter_lock) {
Guido van Rossumb74eca91997-09-30 22:03:16 +0000343 int err = errno;
Guido van Rossum65d5b571998-12-21 19:32:43 +0000344 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000345 errno = err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346 }
347#endif
Guido van Rossumb74eca91997-09-30 22:03:16 +0000348 PyThreadState_Swap(tstate);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000349}
350
351
Guido van Rossuma9672091994-09-14 13:31:22 +0000352/* Mechanism whereby asynchronously executing callbacks (e.g. UNIX
353 signal handlers or Mac I/O completion routines) can schedule calls
354 to a function to be called synchronously.
355 The synchronous function is called with one void* argument.
356 It should return 0 for success or -1 for failure -- failure should
357 be accompanied by an exception.
358
359 If registry succeeds, the registry function returns 0; if it fails
360 (e.g. due to too many pending calls) it returns -1 (without setting
361 an exception condition).
362
363 Note that because registry may occur from within signal handlers,
364 or other asynchronous events, calling malloc() is unsafe!
365
366#ifdef WITH_THREAD
367 Any thread can schedule pending calls, but only the main thread
368 will execute them.
369#endif
370
371 XXX WARNING! ASYNCHRONOUSLY EXECUTING CODE!
372 There are two possible race conditions:
373 (1) nested asynchronous registry calls;
374 (2) registry calls made while pending calls are being processed.
375 While (1) is very unlikely, (2) is a real possibility.
376 The current code is safe against (2), but not against (1).
377 The safety against (2) is derived from the fact that only one
378 thread (the main thread) ever takes things out of the queue.
Guido van Rossuma9672091994-09-14 13:31:22 +0000379
Guido van Rossuma027efa1997-05-05 20:56:21 +0000380 XXX Darn! With the advent of thread state, we should have an array
381 of pending calls per thread in the thread state! Later...
382*/
Guido van Rossum8861b741996-07-30 16:49:37 +0000383
Guido van Rossuma9672091994-09-14 13:31:22 +0000384#define NPENDINGCALLS 32
385static struct {
Thomas Wouters334fb892000-07-25 12:56:38 +0000386 int (*func)(void *);
387 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000388} pendingcalls[NPENDINGCALLS];
389static volatile int pendingfirst = 0;
390static volatile int pendinglast = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000391static volatile int things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000392
393int
Thomas Wouters334fb892000-07-25 12:56:38 +0000394Py_AddPendingCall(int (*func)(void *), void *arg)
Guido van Rossuma9672091994-09-14 13:31:22 +0000395{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000396 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000397 int i, j;
398 /* XXX Begin critical section */
399 /* XXX If you want this to be safe against nested
400 XXX asynchronous calls, you'll have to work harder! */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000401 if (busy)
402 return -1;
403 busy = 1;
Guido van Rossuma9672091994-09-14 13:31:22 +0000404 i = pendinglast;
405 j = (i + 1) % NPENDINGCALLS;
406 if (j == pendingfirst)
407 return -1; /* Queue full */
408 pendingcalls[i].func = func;
409 pendingcalls[i].arg = arg;
410 pendinglast = j;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000411 things_to_do = 1; /* Signal main loop */
Guido van Rossum180d7b41994-09-29 09:45:57 +0000412 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000413 /* XXX End critical section */
414 return 0;
415}
416
Guido van Rossum180d7b41994-09-29 09:45:57 +0000417int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000418Py_MakePendingCalls(void)
Guido van Rossuma9672091994-09-14 13:31:22 +0000419{
Guido van Rossum180d7b41994-09-29 09:45:57 +0000420 static int busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000421#ifdef WITH_THREAD
Guido van Rossum65d5b571998-12-21 19:32:43 +0000422 if (main_thread && PyThread_get_thread_ident() != main_thread)
Guido van Rossuma9672091994-09-14 13:31:22 +0000423 return 0;
424#endif
Guido van Rossuma027efa1997-05-05 20:56:21 +0000425 if (busy)
Guido van Rossum180d7b41994-09-29 09:45:57 +0000426 return 0;
427 busy = 1;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000428 things_to_do = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000429 for (;;) {
430 int i;
Thomas Wouters334fb892000-07-25 12:56:38 +0000431 int (*func)(void *);
432 void *arg;
Guido van Rossuma9672091994-09-14 13:31:22 +0000433 i = pendingfirst;
434 if (i == pendinglast)
435 break; /* Queue empty */
436 func = pendingcalls[i].func;
437 arg = pendingcalls[i].arg;
438 pendingfirst = (i + 1) % NPENDINGCALLS;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000439 if (func(arg) < 0) {
440 busy = 0;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000441 things_to_do = 1; /* We're not done yet */
Guido van Rossuma9672091994-09-14 13:31:22 +0000442 return -1;
Guido van Rossum180d7b41994-09-29 09:45:57 +0000443 }
Guido van Rossuma9672091994-09-14 13:31:22 +0000444 }
Guido van Rossum180d7b41994-09-29 09:45:57 +0000445 busy = 0;
Guido van Rossuma9672091994-09-14 13:31:22 +0000446 return 0;
447}
448
449
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000450/* The interpreter's recursion limit */
451
Guido van Rossum349ff6f2000-09-01 01:52:08 +0000452static int recursion_limit = 1000;
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000453
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000454int
455Py_GetRecursionLimit(void)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000456{
457 return recursion_limit;
458}
459
Vladimir Marangozov7bd25be2000-09-01 11:07:19 +0000460void
461Py_SetRecursionLimit(int new_limit)
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000462{
463 recursion_limit = new_limit;
464}
465
Guido van Rossum374a9221991-04-04 10:40:29 +0000466/* Status code for main loop (reason for stack unwind) */
467
468enum why_code {
469 WHY_NOT, /* No error */
470 WHY_EXCEPTION, /* Exception occurred */
471 WHY_RERAISE, /* Exception re-raised by 'finally' */
472 WHY_RETURN, /* 'return' statement */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +0000473 WHY_BREAK, /* 'break' statement */
Tim Peters5ca576e2001-06-18 22:08:13 +0000474 WHY_CONTINUE, /* 'continue' statement */
475 WHY_YIELD, /* 'yield' operator */
Guido van Rossum374a9221991-04-04 10:40:29 +0000476};
477
Tim Petersdbd9ba62000-07-09 03:09:57 +0000478static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
479static int unpack_sequence(PyObject *, int, PyObject **);
Guido van Rossum1aa14831997-01-21 05:34:20 +0000480
Guido van Rossum374a9221991-04-04 10:40:29 +0000481
Guido van Rossumb209a111997-04-29 18:18:01 +0000482PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000483PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000484{
485 return eval_code2(co,
486 globals, locals,
Guido van Rossumb209a111997-04-29 18:18:01 +0000487 (PyObject **)NULL, 0,
488 (PyObject **)NULL, 0,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000489 (PyObject **)NULL, 0,
490 NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000491}
492
493
494/* Interpreter main loop */
495
Tim Peters5ca576e2001-06-18 22:08:13 +0000496PyObject *
497eval_frame(PyFrameObject *f)
Guido van Rossum374a9221991-04-04 10:40:29 +0000498{
Guido van Rossum950361c1997-01-24 13:49:28 +0000499#ifdef DXPAIRS
500 int lastopcode = 0;
501#endif
Jeremy Hylton52820442001-01-03 23:52:36 +0000502 PyObject **stack_pointer;
Guido van Rossum374a9221991-04-04 10:40:29 +0000503 register unsigned char *next_instr;
Moshe Zadkaaa39a7e2000-08-07 06:34:45 +0000504 register int opcode=0; /* Current opcode */
505 register int oparg=0; /* Current opcode argument, if any */
Guido van Rossum374a9221991-04-04 10:40:29 +0000506 register enum why_code why; /* Reason for block stack unwind */
507 register int err; /* Error status -- nonzero if error */
Guido van Rossumb209a111997-04-29 18:18:01 +0000508 register PyObject *x; /* Result object -- NULL if error */
509 register PyObject *v; /* Temporary objects popped off stack */
510 register PyObject *w;
511 register PyObject *u;
512 register PyObject *t;
Barry Warsaw23c9ec82000-08-21 15:44:01 +0000513 register PyObject *stream = NULL; /* for PRINT opcodes */
Jeremy Hylton2b724da2001-01-29 22:51:52 +0000514 register PyObject **fastlocals, **freevars;
Guido van Rossum014518f1998-11-23 21:09:51 +0000515 PyObject *retval = NULL; /* Return value */
Guido van Rossum885553e1998-12-21 18:33:30 +0000516 PyThreadState *tstate = PyThreadState_GET();
Tim Peters5ca576e2001-06-18 22:08:13 +0000517 PyCodeObject *co;
Guido van Rossumd076c731998-10-07 19:42:25 +0000518 unsigned char *first_instr;
Guido van Rossum96a42c81992-01-12 02:29:51 +0000519#ifdef LLTRACE
Guido van Rossumacbe8da1993-04-15 15:33:52 +0000520 int lltrace;
Guido van Rossum374a9221991-04-04 10:40:29 +0000521#endif
Guido van Rossum408027e1996-12-30 16:17:54 +0000522#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum681d79a1995-07-18 14:51:37 +0000523 /* Make it easier to find out where we are with a debugger */
Tim Peters5ca576e2001-06-18 22:08:13 +0000524 char *filename;
Guido van Rossum99bec951992-09-03 20:29:45 +0000525#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000526
527/* Code access macros */
528
529#define GETCONST(i) Getconst(f, i)
530#define GETNAME(i) Getname(f, i)
531#define GETNAMEV(i) Getnamev(f, i)
Guido van Rossumd076c731998-10-07 19:42:25 +0000532#define INSTR_OFFSET() (next_instr - first_instr)
Guido van Rossum374a9221991-04-04 10:40:29 +0000533#define NEXTOP() (*next_instr++)
534#define NEXTARG() (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2])
Guido van Rossumd076c731998-10-07 19:42:25 +0000535#define JUMPTO(x) (next_instr = first_instr + (x))
Guido van Rossum374a9221991-04-04 10:40:29 +0000536#define JUMPBY(x) (next_instr += (x))
537
538/* Stack manipulation macros */
539
540#define STACK_LEVEL() (stack_pointer - f->f_valuestack)
541#define EMPTY() (STACK_LEVEL() == 0)
542#define TOP() (stack_pointer[-1])
543#define BASIC_PUSH(v) (*stack_pointer++ = (v))
544#define BASIC_POP() (*--stack_pointer)
545
Guido van Rossum96a42c81992-01-12 02:29:51 +0000546#ifdef LLTRACE
547#define PUSH(v) (BASIC_PUSH(v), lltrace && prtrace(TOP(), "push"))
548#define POP() (lltrace && prtrace(TOP(), "pop"), BASIC_POP())
Guido van Rossum374a9221991-04-04 10:40:29 +0000549#else
550#define PUSH(v) BASIC_PUSH(v)
551#define POP() BASIC_POP()
552#endif
553
Guido van Rossum681d79a1995-07-18 14:51:37 +0000554/* Local variable macros */
555
556#define GETLOCAL(i) (fastlocals[i])
Guido van Rossumb209a111997-04-29 18:18:01 +0000557#define SETLOCAL(i, value) do { Py_XDECREF(GETLOCAL(i)); \
Guido van Rossum681d79a1995-07-18 14:51:37 +0000558 GETLOCAL(i) = value; } while (0)
559
Guido van Rossuma027efa1997-05-05 20:56:21 +0000560/* Start of code */
561
Tim Peters5ca576e2001-06-18 22:08:13 +0000562 if (f == NULL)
563 return NULL;
564
Guido van Rossum8861b741996-07-30 16:49:37 +0000565#ifdef USE_STACKCHECK
Guido van Rossuma027efa1997-05-05 20:56:21 +0000566 if (tstate->recursion_depth%10 == 0 && PyOS_CheckStack()) {
Guido van Rossumb209a111997-04-29 18:18:01 +0000567 PyErr_SetString(PyExc_MemoryError, "Stack overflow");
Guido van Rossum8861b741996-07-30 16:49:37 +0000568 return NULL;
569 }
570#endif
571
Tim Peters5ca576e2001-06-18 22:08:13 +0000572 /* push frame */
Jeremy Hyltonee5adfb2000-08-31 19:23:01 +0000573 if (++tstate->recursion_depth > recursion_limit) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000574 --tstate->recursion_depth;
575 PyErr_SetString(PyExc_RuntimeError,
Fred Drake661ea262000-10-24 19:57:45 +0000576 "maximum recursion depth exceeded");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000577 tstate->frame = f->f_back;
Guido van Rossum8861b741996-07-30 16:49:37 +0000578 return NULL;
579 }
580
Tim Peters5ca576e2001-06-18 22:08:13 +0000581 tstate->frame = f;
Tim Peters5ca576e2001-06-18 22:08:13 +0000582 co = f->f_code;
583 fastlocals = f->f_localsplus;
584 freevars = f->f_localsplus + f->f_nlocals;
Guido van Rossumd076c731998-10-07 19:42:25 +0000585 _PyCode_GETCODEPTR(co, &first_instr);
Tim Peters5ca576e2001-06-18 22:08:13 +0000586 next_instr = first_instr + f->f_lasti;
587 stack_pointer = f->f_stackbottom;
588 f->f_stackbottom = NULL;
589
590#ifdef LLTRACE
591 lltrace = PyDict_GetItemString(f->f_globals,"__lltrace__") != NULL;
592#endif
593#if defined(Py_DEBUG) || defined(LLTRACE)
594 filename = PyString_AsString(co->co_filename);
595#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000596
Guido van Rossum374a9221991-04-04 10:40:29 +0000597 why = WHY_NOT;
598 err = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +0000599 x = Py_None; /* Not a reference, just anything non-NULL */
Fred Drake48fba732000-10-11 13:54:07 +0000600 w = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +0000601
Guido van Rossum374a9221991-04-04 10:40:29 +0000602 for (;;) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000603 /* Do periodic things. Doing this every time through
604 the loop would add too much overhead, so we do it
605 only every Nth instruction. We also do it if
606 ``things_to_do'' is set, i.e. when an asynchronous
607 event needs attention (e.g. a signal handler or
608 async I/O handler); see Py_AddPendingCall() and
609 Py_MakePendingCalls() above. */
Guido van Rossumac7be682001-01-17 15:42:30 +0000610
Guido van Rossuma027efa1997-05-05 20:56:21 +0000611 if (things_to_do || --tstate->ticker < 0) {
Guido van Rossum25ce5661997-08-02 03:10:38 +0000612 tstate->ticker = tstate->interp->checkinterval;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000613 if (things_to_do) {
Guido van Rossum8861b741996-07-30 16:49:37 +0000614 if (Py_MakePendingCalls() < 0) {
615 why = WHY_EXCEPTION;
616 goto on_error;
617 }
618 }
Guido van Rossumdf0d00e1997-05-20 15:57:49 +0000619#if !defined(HAVE_SIGNAL_H) || defined(macintosh)
Guido van Rossuma027efa1997-05-05 20:56:21 +0000620 /* If we have true signals, the signal handler
621 will call Py_AddPendingCall() so we don't
622 have to call sigcheck(). On the Mac and
623 DOS, alas, we have to call it. */
Guido van Rossumb209a111997-04-29 18:18:01 +0000624 if (PyErr_CheckSignals()) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000625 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +0000626 goto on_error;
627 }
Guido van Rossum70d44781997-01-21 06:15:24 +0000628#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000629
Guido van Rossume59214e1994-08-30 08:01:59 +0000630#ifdef WITH_THREAD
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000631 if (interpreter_lock) {
632 /* Give another thread a chance */
633
Guido van Rossum25ce5661997-08-02 03:10:38 +0000634 if (PyThreadState_Swap(NULL) != tstate)
635 Py_FatalError("ceval: tstate mix-up");
Guido van Rossum65d5b571998-12-21 19:32:43 +0000636 PyThread_release_lock(interpreter_lock);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000637
638 /* Other threads may run now */
639
Guido van Rossum65d5b571998-12-21 19:32:43 +0000640 PyThread_acquire_lock(interpreter_lock, 1);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000641 if (PyThreadState_Swap(tstate) != NULL)
642 Py_FatalError("ceval: orphan tstate");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000643 }
644#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000645 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000646
Guido van Rossum374a9221991-04-04 10:40:29 +0000647 /* Extract opcode and argument */
Guido van Rossum99bec951992-09-03 20:29:45 +0000648
Guido van Rossum408027e1996-12-30 16:17:54 +0000649#if defined(Py_DEBUG) || defined(LLTRACE)
Guido van Rossum99bec951992-09-03 20:29:45 +0000650 f->f_lasti = INSTR_OFFSET();
651#endif
Guido van Rossumac7be682001-01-17 15:42:30 +0000652
Guido van Rossum374a9221991-04-04 10:40:29 +0000653 opcode = NEXTOP();
654 if (HAS_ARG(opcode))
655 oparg = NEXTARG();
Fred Drakeef8ace32000-08-24 00:32:09 +0000656 dispatch_opcode:
Guido van Rossum950361c1997-01-24 13:49:28 +0000657#ifdef DYNAMIC_EXECUTION_PROFILE
658#ifdef DXPAIRS
659 dxpairs[lastopcode][opcode]++;
660 lastopcode = opcode;
661#endif
662 dxp[opcode]++;
663#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000664
Guido van Rossum96a42c81992-01-12 02:29:51 +0000665#ifdef LLTRACE
Guido van Rossum374a9221991-04-04 10:40:29 +0000666 /* Instruction tracing */
Guido van Rossumac7be682001-01-17 15:42:30 +0000667
Guido van Rossum96a42c81992-01-12 02:29:51 +0000668 if (lltrace) {
Guido van Rossum374a9221991-04-04 10:40:29 +0000669 if (HAS_ARG(opcode)) {
670 printf("%d: %d, %d\n",
671 (int) (INSTR_OFFSET() - 3),
672 opcode, oparg);
673 }
674 else {
675 printf("%d: %d\n",
676 (int) (INSTR_OFFSET() - 1), opcode);
677 }
678 }
679#endif
Guido van Rossum374a9221991-04-04 10:40:29 +0000680 /* Main switch on opcode */
Jeremy Hylton52820442001-01-03 23:52:36 +0000681
Guido van Rossum374a9221991-04-04 10:40:29 +0000682 switch (opcode) {
Guido van Rossumac7be682001-01-17 15:42:30 +0000683
Guido van Rossum374a9221991-04-04 10:40:29 +0000684 /* BEWARE!
685 It is essential that any operation that fails sets either
686 x to NULL, err to nonzero, or why to anything but WHY_NOT,
687 and that no operation that succeeds does this! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000688
Guido van Rossum374a9221991-04-04 10:40:29 +0000689 /* case STOP_CODE: this is an error! */
Guido van Rossumac7be682001-01-17 15:42:30 +0000690
Guido van Rossum374a9221991-04-04 10:40:29 +0000691 case POP_TOP:
692 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000693 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000694 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000695
Guido van Rossum374a9221991-04-04 10:40:29 +0000696 case ROT_TWO:
697 v = POP();
698 w = POP();
699 PUSH(v);
700 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000701 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000702
Guido van Rossum374a9221991-04-04 10:40:29 +0000703 case ROT_THREE:
704 v = POP();
705 w = POP();
706 x = POP();
707 PUSH(v);
708 PUSH(x);
709 PUSH(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000710 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000711
Thomas Wouters434d0822000-08-24 20:11:32 +0000712 case ROT_FOUR:
713 u = POP();
714 v = POP();
715 w = POP();
716 x = POP();
717 PUSH(u);
718 PUSH(x);
719 PUSH(w);
720 PUSH(v);
721 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000722
Guido van Rossum374a9221991-04-04 10:40:29 +0000723 case DUP_TOP:
724 v = TOP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000725 Py_INCREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000726 PUSH(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000727 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +0000728
Thomas Wouters434d0822000-08-24 20:11:32 +0000729 case DUP_TOPX:
730 switch (oparg) {
Thomas Wouters434d0822000-08-24 20:11:32 +0000731 case 1:
Tim Peters35ba6892000-10-11 07:04:49 +0000732 x = TOP();
733 Py_INCREF(x);
734 PUSH(x);
735 continue;
736 case 2:
Thomas Wouters434d0822000-08-24 20:11:32 +0000737 x = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000738 Py_INCREF(x);
739 w = TOP();
740 Py_INCREF(w);
741 PUSH(x);
742 PUSH(w);
743 PUSH(x);
744 continue;
745 case 3:
746 x = POP();
747 Py_INCREF(x);
Thomas Wouters434d0822000-08-24 20:11:32 +0000748 w = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000749 Py_INCREF(w);
750 v = TOP();
751 Py_INCREF(v);
752 PUSH(w);
753 PUSH(x);
754 PUSH(v);
755 PUSH(w);
756 PUSH(x);
757 continue;
758 case 4:
759 x = POP();
760 Py_INCREF(x);
761 w = POP();
762 Py_INCREF(w);
Thomas Wouters434d0822000-08-24 20:11:32 +0000763 v = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000764 Py_INCREF(v);
765 u = TOP();
766 Py_INCREF(u);
767 PUSH(v);
768 PUSH(w);
769 PUSH(x);
770 PUSH(u);
771 PUSH(v);
772 PUSH(w);
773 PUSH(x);
774 continue;
775 case 5:
776 x = POP();
777 Py_INCREF(x);
778 w = POP();
779 Py_INCREF(w);
780 v = POP();
781 Py_INCREF(v);
Thomas Wouters434d0822000-08-24 20:11:32 +0000782 u = POP();
Tim Peters35ba6892000-10-11 07:04:49 +0000783 Py_INCREF(u);
784 t = TOP();
785 Py_INCREF(t);
786 PUSH(u);
787 PUSH(v);
788 PUSH(w);
789 PUSH(x);
790 PUSH(t);
791 PUSH(u);
792 PUSH(v);
793 PUSH(w);
794 PUSH(x);
795 continue;
Thomas Wouters434d0822000-08-24 20:11:32 +0000796 default:
Thomas Wouters0be483f2000-10-11 23:26:11 +0000797 Py_FatalError("invalid argument to DUP_TOPX"
798 " (bytecode corruption?)");
Thomas Wouters434d0822000-08-24 20:11:32 +0000799 }
Tim Peters35ba6892000-10-11 07:04:49 +0000800 break;
Thomas Wouters434d0822000-08-24 20:11:32 +0000801
Guido van Rossum374a9221991-04-04 10:40:29 +0000802 case UNARY_POSITIVE:
803 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000804 x = PyNumber_Positive(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_NEGATIVE:
811 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000812 x = PyNumber_Negative(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000813 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000814 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000815 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000816 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000817
Guido van Rossum374a9221991-04-04 10:40:29 +0000818 case UNARY_NOT:
819 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000820 err = PyObject_IsTrue(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000821 Py_DECREF(v);
Guido van Rossumfc490731997-05-06 15:06:49 +0000822 if (err == 0) {
823 Py_INCREF(Py_True);
824 PUSH(Py_True);
825 continue;
826 }
827 else if (err > 0) {
828 Py_INCREF(Py_False);
829 PUSH(Py_False);
830 err = 0;
831 continue;
832 }
Guido van Rossum374a9221991-04-04 10:40:29 +0000833 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000834
Guido van Rossum374a9221991-04-04 10:40:29 +0000835 case UNARY_CONVERT:
836 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +0000837 x = PyObject_Repr(v);
838 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +0000839 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000840 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000841 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000842
Guido van Rossum7928cd71991-10-24 14:59:31 +0000843 case UNARY_INVERT:
844 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000845 x = PyNumber_Invert(v);
Guido van Rossumb209a111997-04-29 18:18:01 +0000846 Py_DECREF(v);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000847 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000848 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000849 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000850
Guido van Rossum50564e81996-01-12 01:13:16 +0000851 case BINARY_POWER:
852 w = POP();
853 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000854 x = PyNumber_Power(v, w, Py_None);
Guido van Rossumb209a111997-04-29 18:18:01 +0000855 Py_DECREF(v);
856 Py_DECREF(w);
Guido van Rossum50564e81996-01-12 01:13:16 +0000857 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000858 if (x != NULL) continue;
Guido van Rossum50564e81996-01-12 01:13:16 +0000859 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000860
Guido van Rossum374a9221991-04-04 10:40:29 +0000861 case BINARY_MULTIPLY:
862 w = POP();
863 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000864 x = PyNumber_Multiply(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000865 Py_DECREF(v);
866 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000867 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000868 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000869 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000870
Guido van Rossum374a9221991-04-04 10:40:29 +0000871 case BINARY_DIVIDE:
872 w = POP();
873 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000874 x = PyNumber_Divide(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000875 Py_DECREF(v);
876 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000877 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000878 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000879 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000880
Guido van Rossum374a9221991-04-04 10:40:29 +0000881 case BINARY_MODULO:
882 w = POP();
883 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000884 x = PyNumber_Remainder(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000885 Py_DECREF(v);
886 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000887 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000888 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000889 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000890
Guido van Rossum374a9221991-04-04 10:40:29 +0000891 case BINARY_ADD:
892 w = POP();
893 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000894 if (PyInt_Check(v) && PyInt_Check(w)) {
895 /* INLINE: int + int */
896 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000897 a = PyInt_AS_LONG(v);
898 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000899 i = a + b;
900 if ((i^a) < 0 && (i^b) < 0) {
901 PyErr_SetString(PyExc_OverflowError,
902 "integer addition");
903 x = NULL;
904 }
905 else
906 x = PyInt_FromLong(i);
907 }
908 else
909 x = PyNumber_Add(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000910 Py_DECREF(v);
911 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000912 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000913 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000914 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000915
Guido van Rossum374a9221991-04-04 10:40:29 +0000916 case BINARY_SUBTRACT:
917 w = POP();
918 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000919 if (PyInt_Check(v) && PyInt_Check(w)) {
920 /* INLINE: int - int */
921 register long a, b, i;
Guido van Rossumcf183ac1998-12-04 18:51:36 +0000922 a = PyInt_AS_LONG(v);
923 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +0000924 i = a - b;
925 if ((i^a) < 0 && (i^~b) < 0) {
926 PyErr_SetString(PyExc_OverflowError,
927 "integer subtraction");
928 x = NULL;
929 }
930 else
931 x = PyInt_FromLong(i);
932 }
933 else
934 x = PyNumber_Subtract(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000935 Py_DECREF(v);
936 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000937 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000938 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000939 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000940
Guido van Rossum374a9221991-04-04 10:40:29 +0000941 case BINARY_SUBSCR:
942 w = POP();
943 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +0000944 if (PyList_Check(v) && PyInt_Check(w)) {
945 /* INLINE: list[int] */
946 long i = PyInt_AsLong(w);
947 if (i < 0)
Guido van Rossumfa00e951998-07-08 15:02:37 +0000948 i += PyList_GET_SIZE(v);
Guido van Rossumc12da691997-07-17 23:12:42 +0000949 if (i < 0 ||
Guido van Rossumfa00e951998-07-08 15:02:37 +0000950 i >= PyList_GET_SIZE(v)) {
Guido van Rossumc12da691997-07-17 23:12:42 +0000951 PyErr_SetString(PyExc_IndexError,
952 "list index out of range");
953 x = NULL;
954 }
955 else {
Guido van Rossumfa00e951998-07-08 15:02:37 +0000956 x = PyList_GET_ITEM(v, i);
Guido van Rossumc12da691997-07-17 23:12:42 +0000957 Py_INCREF(x);
958 }
959 }
960 else
961 x = PyObject_GetItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000962 Py_DECREF(v);
963 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +0000964 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000965 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +0000966 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000967
Guido van Rossum7928cd71991-10-24 14:59:31 +0000968 case BINARY_LSHIFT:
969 w = POP();
970 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000971 x = PyNumber_Lshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000972 Py_DECREF(v);
973 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000974 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000975 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000976 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000977
Guido van Rossum7928cd71991-10-24 14:59:31 +0000978 case BINARY_RSHIFT:
979 w = POP();
980 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000981 x = PyNumber_Rshift(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000982 Py_DECREF(v);
983 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000984 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000985 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000986 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000987
Guido van Rossum7928cd71991-10-24 14:59:31 +0000988 case BINARY_AND:
989 w = POP();
990 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +0000991 x = PyNumber_And(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +0000992 Py_DECREF(v);
993 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +0000994 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +0000995 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +0000996 break;
Guido van Rossumac7be682001-01-17 15:42:30 +0000997
Guido van Rossum7928cd71991-10-24 14:59:31 +0000998 case BINARY_XOR:
999 w = POP();
1000 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001001 x = PyNumber_Xor(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001002 Py_DECREF(v);
1003 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001004 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001005 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001006 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001007
Guido van Rossum7928cd71991-10-24 14:59:31 +00001008 case BINARY_OR:
1009 w = POP();
1010 v = POP();
Guido van Rossumfc490731997-05-06 15:06:49 +00001011 x = PyNumber_Or(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001012 Py_DECREF(v);
1013 Py_DECREF(w);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001014 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001015 if (x != NULL) continue;
Guido van Rossum7928cd71991-10-24 14:59:31 +00001016 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00001017
1018 case INPLACE_POWER:
1019 w = POP();
1020 v = POP();
1021 x = PyNumber_InPlacePower(v, w, Py_None);
1022 Py_DECREF(v);
1023 Py_DECREF(w);
1024 PUSH(x);
1025 if (x != NULL) continue;
1026 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001027
Thomas Wouters434d0822000-08-24 20:11:32 +00001028 case INPLACE_MULTIPLY:
1029 w = POP();
1030 v = POP();
1031 x = PyNumber_InPlaceMultiply(v, w);
1032 Py_DECREF(v);
1033 Py_DECREF(w);
1034 PUSH(x);
1035 if (x != NULL) continue;
1036 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001037
Thomas Wouters434d0822000-08-24 20:11:32 +00001038 case INPLACE_DIVIDE:
1039 w = POP();
1040 v = POP();
1041 x = PyNumber_InPlaceDivide(v, w);
1042 Py_DECREF(v);
1043 Py_DECREF(w);
1044 PUSH(x);
1045 if (x != NULL) continue;
1046 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001047
Thomas Wouters434d0822000-08-24 20:11:32 +00001048 case INPLACE_MODULO:
1049 w = POP();
1050 v = POP();
1051 x = PyNumber_InPlaceRemainder(v, w);
1052 Py_DECREF(v);
1053 Py_DECREF(w);
1054 PUSH(x);
1055 if (x != NULL) continue;
1056 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001057
Thomas Wouters434d0822000-08-24 20:11:32 +00001058 case INPLACE_ADD:
1059 w = POP();
1060 v = POP();
1061 if (PyInt_Check(v) && PyInt_Check(w)) {
1062 /* INLINE: int + int */
1063 register long a, b, i;
1064 a = PyInt_AS_LONG(v);
1065 b = PyInt_AS_LONG(w);
1066 i = a + b;
1067 if ((i^a) < 0 && (i^b) < 0) {
1068 PyErr_SetString(PyExc_OverflowError,
1069 "integer addition");
1070 x = NULL;
1071 }
1072 else
1073 x = PyInt_FromLong(i);
1074 }
1075 else
1076 x = PyNumber_InPlaceAdd(v, w);
1077 Py_DECREF(v);
1078 Py_DECREF(w);
1079 PUSH(x);
1080 if (x != NULL) continue;
1081 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001082
Thomas Wouters434d0822000-08-24 20:11:32 +00001083 case INPLACE_SUBTRACT:
1084 w = POP();
1085 v = POP();
1086 if (PyInt_Check(v) && PyInt_Check(w)) {
1087 /* INLINE: int - int */
1088 register long a, b, i;
1089 a = PyInt_AS_LONG(v);
1090 b = PyInt_AS_LONG(w);
1091 i = a - b;
1092 if ((i^a) < 0 && (i^~b) < 0) {
1093 PyErr_SetString(PyExc_OverflowError,
1094 "integer subtraction");
1095 x = NULL;
1096 }
1097 else
1098 x = PyInt_FromLong(i);
1099 }
1100 else
1101 x = PyNumber_InPlaceSubtract(v, w);
1102 Py_DECREF(v);
1103 Py_DECREF(w);
1104 PUSH(x);
1105 if (x != NULL) continue;
1106 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001107
Thomas Wouters434d0822000-08-24 20:11:32 +00001108 case INPLACE_LSHIFT:
1109 w = POP();
1110 v = POP();
1111 x = PyNumber_InPlaceLshift(v, w);
1112 Py_DECREF(v);
1113 Py_DECREF(w);
1114 PUSH(x);
1115 if (x != NULL) continue;
1116 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001117
Thomas Wouters434d0822000-08-24 20:11:32 +00001118 case INPLACE_RSHIFT:
1119 w = POP();
1120 v = POP();
1121 x = PyNumber_InPlaceRshift(v, w);
1122 Py_DECREF(v);
1123 Py_DECREF(w);
1124 PUSH(x);
1125 if (x != NULL) continue;
1126 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001127
Thomas Wouters434d0822000-08-24 20:11:32 +00001128 case INPLACE_AND:
1129 w = POP();
1130 v = POP();
1131 x = PyNumber_InPlaceAnd(v, w);
1132 Py_DECREF(v);
1133 Py_DECREF(w);
1134 PUSH(x);
1135 if (x != NULL) continue;
1136 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001137
Thomas Wouters434d0822000-08-24 20:11:32 +00001138 case INPLACE_XOR:
1139 w = POP();
1140 v = POP();
1141 x = PyNumber_InPlaceXor(v, w);
1142 Py_DECREF(v);
1143 Py_DECREF(w);
1144 PUSH(x);
1145 if (x != NULL) continue;
1146 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001147
Thomas Wouters434d0822000-08-24 20:11:32 +00001148 case INPLACE_OR:
1149 w = POP();
1150 v = POP();
1151 x = PyNumber_InPlaceOr(v, w);
1152 Py_DECREF(v);
1153 Py_DECREF(w);
1154 PUSH(x);
1155 if (x != NULL) continue;
1156 break;
1157
Guido van Rossum374a9221991-04-04 10:40:29 +00001158 case SLICE+0:
1159 case SLICE+1:
1160 case SLICE+2:
1161 case SLICE+3:
1162 if ((opcode-SLICE) & 2)
1163 w = POP();
1164 else
1165 w = NULL;
1166 if ((opcode-SLICE) & 1)
1167 v = POP();
1168 else
1169 v = NULL;
1170 u = POP();
1171 x = apply_slice(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001172 Py_DECREF(u);
1173 Py_XDECREF(v);
1174 Py_XDECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001175 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001176 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001177 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001178
Guido van Rossum374a9221991-04-04 10:40:29 +00001179 case STORE_SLICE+0:
1180 case STORE_SLICE+1:
1181 case STORE_SLICE+2:
1182 case STORE_SLICE+3:
1183 if ((opcode-STORE_SLICE) & 2)
1184 w = POP();
1185 else
1186 w = NULL;
1187 if ((opcode-STORE_SLICE) & 1)
1188 v = POP();
1189 else
1190 v = NULL;
1191 u = POP();
1192 t = POP();
1193 err = assign_slice(u, v, w, t); /* u[v:w] = t */
Guido van Rossumb209a111997-04-29 18:18:01 +00001194 Py_DECREF(t);
1195 Py_DECREF(u);
1196 Py_XDECREF(v);
1197 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001198 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001199 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001200
Guido van Rossum374a9221991-04-04 10:40:29 +00001201 case DELETE_SLICE+0:
1202 case DELETE_SLICE+1:
1203 case DELETE_SLICE+2:
1204 case DELETE_SLICE+3:
1205 if ((opcode-DELETE_SLICE) & 2)
1206 w = POP();
1207 else
1208 w = NULL;
1209 if ((opcode-DELETE_SLICE) & 1)
1210 v = POP();
1211 else
1212 v = NULL;
1213 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001214 err = assign_slice(u, v, w, (PyObject *)NULL);
Guido van Rossum374a9221991-04-04 10:40:29 +00001215 /* del u[v:w] */
Guido van Rossumb209a111997-04-29 18:18:01 +00001216 Py_DECREF(u);
1217 Py_XDECREF(v);
1218 Py_XDECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001219 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001220 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001221
Guido van Rossum374a9221991-04-04 10:40:29 +00001222 case STORE_SUBSCR:
1223 w = POP();
1224 v = POP();
1225 u = POP();
1226 /* v[w] = u */
Guido van Rossumfc490731997-05-06 15:06:49 +00001227 err = PyObject_SetItem(v, w, u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001228 Py_DECREF(u);
1229 Py_DECREF(v);
1230 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001231 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001232 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001233
Guido van Rossum374a9221991-04-04 10:40:29 +00001234 case DELETE_SUBSCR:
1235 w = POP();
1236 v = POP();
1237 /* del v[w] */
Guido van Rossumfc490731997-05-06 15:06:49 +00001238 err = PyObject_DelItem(v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001239 Py_DECREF(v);
1240 Py_DECREF(w);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001241 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001242 break;
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001243
Guido van Rossum374a9221991-04-04 10:40:29 +00001244 case PRINT_EXPR:
1245 v = POP();
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001246 w = PySys_GetObject("displayhook");
1247 if (w == NULL) {
1248 PyErr_SetString(PyExc_RuntimeError,
1249 "lost sys.displayhook");
1250 err = -1;
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001251 x = NULL;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001252 }
1253 if (err == 0) {
1254 x = Py_BuildValue("(O)", v);
1255 if (x == NULL)
1256 err = -1;
1257 }
1258 if (err == 0) {
1259 w = PyEval_CallObject(w, x);
Moshe Zadkaf5df3832001-01-11 11:55:37 +00001260 Py_XDECREF(w);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001261 if (w == NULL)
1262 err = -1;
Guido van Rossum374a9221991-04-04 10:40:29 +00001263 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001264 Py_DECREF(v);
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001265 Py_XDECREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001266 break;
Moshe Zadkaf68f2fe2001-01-11 05:41:27 +00001267
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001268 case PRINT_ITEM_TO:
1269 w = stream = POP();
1270 /* fall through to PRINT_ITEM */
1271
Guido van Rossum374a9221991-04-04 10:40:29 +00001272 case PRINT_ITEM:
1273 v = POP();
Barry Warsaw093abe02000-08-29 04:56:13 +00001274 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001275 w = PySys_GetObject("stdout");
1276 if (w == NULL) {
1277 PyErr_SetString(PyExc_RuntimeError,
1278 "lost sys.stdout");
1279 err = -1;
1280 }
Guido van Rossum8f183201997-12-31 05:53:15 +00001281 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001282 if (w != NULL && PyFile_SoftSpace(w, 1))
Guido van Rossumbe270261997-05-22 22:26:18 +00001283 err = PyFile_WriteString(" ", w);
1284 if (err == 0)
1285 err = PyFile_WriteObject(v, w, Py_PRINT_RAW);
Guido van Rossumb209a111997-04-29 18:18:01 +00001286 if (err == 0 && PyString_Check(v)) {
Guido van Rossumc6004111993-11-05 10:22:19 +00001287 /* XXX move into writeobject() ? */
Guido van Rossumb209a111997-04-29 18:18:01 +00001288 char *s = PyString_AsString(v);
1289 int len = PyString_Size(v);
Guido van Rossum7f7f2741995-02-10 17:01:56 +00001290 if (len > 0 &&
1291 isspace(Py_CHARMASK(s[len-1])) &&
Guido van Rossumc6004111993-11-05 10:22:19 +00001292 s[len-1] != ' ')
Guido van Rossumb209a111997-04-29 18:18:01 +00001293 PyFile_SoftSpace(w, 0);
Guido van Rossum374a9221991-04-04 10:40:29 +00001294 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001295 Py_DECREF(v);
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001296 Py_XDECREF(stream);
1297 stream = NULL;
1298 if (err == 0)
1299 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001300 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001301
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001302 case PRINT_NEWLINE_TO:
1303 w = stream = POP();
1304 /* fall through to PRINT_NEWLINE */
1305
Guido van Rossum374a9221991-04-04 10:40:29 +00001306 case PRINT_NEWLINE:
Barry Warsaw093abe02000-08-29 04:56:13 +00001307 if (stream == NULL || stream == Py_None) {
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001308 w = PySys_GetObject("stdout");
1309 if (w == NULL)
1310 PyErr_SetString(PyExc_RuntimeError,
1311 "lost sys.stdout");
Guido van Rossum3165fe61992-09-25 21:59:05 +00001312 }
Barry Warsaw23c9ec82000-08-21 15:44:01 +00001313 if (w != NULL) {
1314 err = PyFile_WriteString("\n", w);
1315 if (err == 0)
1316 PyFile_SoftSpace(w, 0);
1317 }
1318 Py_XDECREF(stream);
1319 stream = NULL;
Guido van Rossum374a9221991-04-04 10:40:29 +00001320 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001321
Thomas Wouters434d0822000-08-24 20:11:32 +00001322
1323#ifdef CASE_TOO_BIG
1324 default: switch (opcode) {
1325#endif
Guido van Rossum374a9221991-04-04 10:40:29 +00001326 case BREAK_LOOP:
1327 why = WHY_BREAK;
1328 break;
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00001329
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001330 case CONTINUE_LOOP:
1331 retval = PyInt_FromLong(oparg);
1332 why = WHY_CONTINUE;
1333 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001334
Guido van Rossumf10570b1995-07-07 22:53:21 +00001335 case RAISE_VARARGS:
1336 u = v = w = NULL;
1337 switch (oparg) {
1338 case 3:
1339 u = POP(); /* traceback */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001340 /* Fallthrough */
1341 case 2:
1342 v = POP(); /* value */
1343 /* Fallthrough */
1344 case 1:
1345 w = POP(); /* exc */
Guido van Rossumd295f121998-04-09 21:39:57 +00001346 case 0: /* Fallthrough */
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001347 why = do_raise(w, v, u);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001348 break;
1349 default:
Guido van Rossumb209a111997-04-29 18:18:01 +00001350 PyErr_SetString(PyExc_SystemError,
Guido van Rossumf10570b1995-07-07 22:53:21 +00001351 "bad RAISE_VARARGS oparg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001352 why = WHY_EXCEPTION;
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00001353 break;
1354 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001355 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001356
Guido van Rossum374a9221991-04-04 10:40:29 +00001357 case LOAD_LOCALS:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001358 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001359 PyErr_SetString(PyExc_SystemError,
1360 "no locals");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001361 break;
1362 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001363 Py_INCREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001364 PUSH(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001365 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001366
Guido van Rossum374a9221991-04-04 10:40:29 +00001367 case RETURN_VALUE:
1368 retval = POP();
1369 why = WHY_RETURN;
1370 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001371
Tim Peters5ca576e2001-06-18 22:08:13 +00001372 case YIELD_VALUE:
1373 retval = POP();
1374 f->f_stackbottom = stack_pointer;
1375 f->f_lasti = INSTR_OFFSET();
1376 why = WHY_YIELD;
1377 break;
1378
1379
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001380 case EXEC_STMT:
1381 w = POP();
1382 v = POP();
1383 u = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001384 err = exec_statement(f, u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00001385 Py_DECREF(u);
1386 Py_DECREF(v);
1387 Py_DECREF(w);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00001388 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001389
Guido van Rossum374a9221991-04-04 10:40:29 +00001390 case POP_BLOCK:
1391 {
Guido van Rossumb209a111997-04-29 18:18:01 +00001392 PyTryBlock *b = PyFrame_BlockPop(f);
Guido van Rossum374a9221991-04-04 10:40:29 +00001393 while (STACK_LEVEL() > b->b_level) {
1394 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001395 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001396 }
1397 }
1398 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001399
Guido van Rossum374a9221991-04-04 10:40:29 +00001400 case END_FINALLY:
1401 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001402 if (PyInt_Check(v)) {
1403 why = (enum why_code) PyInt_AsLong(v);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001404 if (why == WHY_RETURN ||
Tim Peters5ca576e2001-06-18 22:08:13 +00001405 why == WHY_YIELD ||
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001406 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00001407 retval = POP();
1408 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001409 else if (PyString_Check(v) || PyClass_Check(v)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00001410 w = POP();
Guido van Rossumf10570b1995-07-07 22:53:21 +00001411 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001412 PyErr_Restore(v, w, u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001413 why = WHY_RERAISE;
Guido van Rossum0db1ef91995-07-28 23:06:00 +00001414 break;
Guido van Rossum374a9221991-04-04 10:40:29 +00001415 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001416 else if (v != Py_None) {
1417 PyErr_SetString(PyExc_SystemError,
Guido van Rossum374a9221991-04-04 10:40:29 +00001418 "'finally' pops bad exception");
1419 why = WHY_EXCEPTION;
1420 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001421 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001422 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001423
Guido van Rossum374a9221991-04-04 10:40:29 +00001424 case BUILD_CLASS:
Guido van Rossum25831651993-05-19 14:50:45 +00001425 u = POP();
Guido van Rossum374a9221991-04-04 10:40:29 +00001426 v = POP();
Guido van Rossum25831651993-05-19 14:50:45 +00001427 w = POP();
1428 x = build_class(u, v, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001429 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001430 Py_DECREF(u);
1431 Py_DECREF(v);
1432 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001433 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001434
Guido van Rossum374a9221991-04-04 10:40:29 +00001435 case STORE_NAME:
1436 w = GETNAMEV(oparg);
1437 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001438 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001439 PyErr_Format(PyExc_SystemError,
1440 "no locals found when storing %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001441 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001442 break;
1443 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001444 err = PyDict_SetItem(x, w, v);
1445 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001446 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001447
Guido van Rossum374a9221991-04-04 10:40:29 +00001448 case DELETE_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001449 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001450 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001451 PyErr_Format(PyExc_SystemError,
1452 "no locals when deleting %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001453 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001454 break;
1455 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001456 if ((err = PyDict_DelItem(x, w)) != 0)
Guido van Rossumac7be682001-01-17 15:42:30 +00001457 format_exc_check_arg(PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001458 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001459 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00001460
Thomas Wouters0be5aab2000-08-11 22:15:52 +00001461 case UNPACK_SEQUENCE:
Guido van Rossum374a9221991-04-04 10:40:29 +00001462 v = POP();
Barry Warsawe42b18f1997-08-25 22:13:04 +00001463 if (PyTuple_Check(v)) {
1464 if (PyTuple_Size(v) != oparg) {
1465 PyErr_SetString(PyExc_ValueError,
1466 "unpack tuple of wrong size");
1467 why = WHY_EXCEPTION;
1468 }
1469 else {
1470 for (; --oparg >= 0; ) {
1471 w = PyTuple_GET_ITEM(v, oparg);
1472 Py_INCREF(w);
1473 PUSH(w);
1474 }
1475 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001476 }
Barry Warsawe42b18f1997-08-25 22:13:04 +00001477 else if (PyList_Check(v)) {
1478 if (PyList_Size(v) != oparg) {
1479 PyErr_SetString(PyExc_ValueError,
1480 "unpack list of wrong size");
1481 why = WHY_EXCEPTION;
1482 }
1483 else {
1484 for (; --oparg >= 0; ) {
1485 w = PyList_GET_ITEM(v, oparg);
1486 Py_INCREF(w);
1487 PUSH(w);
1488 }
1489 }
1490 }
1491 else if (PySequence_Check(v)) {
1492 if (unpack_sequence(v, oparg,
1493 stack_pointer + oparg))
1494 stack_pointer += oparg;
1495 else
1496 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001497 }
1498 else {
Barry Warsawe42b18f1997-08-25 22:13:04 +00001499 PyErr_SetString(PyExc_TypeError,
1500 "unpack non-sequence");
1501 why = WHY_EXCEPTION;
Guido van Rossum374a9221991-04-04 10:40:29 +00001502 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001503 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001504 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001505
Guido van Rossum374a9221991-04-04 10:40:29 +00001506 case STORE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001507 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001508 v = POP();
1509 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001510 err = PyObject_SetAttr(v, w, u); /* v.w = u */
1511 Py_DECREF(v);
1512 Py_DECREF(u);
Guido van Rossum374a9221991-04-04 10:40:29 +00001513 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001514
Guido van Rossum374a9221991-04-04 10:40:29 +00001515 case DELETE_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001516 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001517 v = POP();
Guido van Rossuma027efa1997-05-05 20:56:21 +00001518 err = PyObject_SetAttr(v, w, (PyObject *)NULL);
1519 /* del v.w */
Guido van Rossumb209a111997-04-29 18:18:01 +00001520 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001521 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001522
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001523 case STORE_GLOBAL:
1524 w = GETNAMEV(oparg);
1525 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001526 err = PyDict_SetItem(f->f_globals, w, v);
1527 Py_DECREF(v);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001528 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001529
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001530 case DELETE_GLOBAL:
1531 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001532 if ((err = PyDict_DelItem(f->f_globals, w)) != 0)
Paul Prescode68140d2000-08-30 20:25:01 +00001533 format_exc_check_arg(
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001534 PyExc_NameError, GLOBAL_NAME_ERROR_MSG, w);
Guido van Rossum32c6cdf1991-12-10 13:52:46 +00001535 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001536
Guido van Rossum374a9221991-04-04 10:40:29 +00001537 case LOAD_CONST:
1538 x = GETCONST(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001539 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001540 PUSH(x);
1541 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001542
Guido van Rossum374a9221991-04-04 10:40:29 +00001543 case LOAD_NAME:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001544 w = GETNAMEV(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001545 if ((x = f->f_locals) == NULL) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001546 PyErr_Format(PyExc_SystemError,
1547 "no locals when loading %s",
Jeremy Hylton483638c2001-02-01 20:20:45 +00001548 PyObject_REPR(w));
Guido van Rossum681d79a1995-07-18 14:51:37 +00001549 break;
1550 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001551 x = PyDict_GetItem(x, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001552 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001553 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001554 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001555 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001556 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001557 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001558 PyExc_NameError,
Paul Prescode68140d2000-08-30 20:25:01 +00001559 NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001560 break;
1561 }
1562 }
1563 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001564 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001565 PUSH(x);
1566 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001567
Guido van Rossum374a9221991-04-04 10:40:29 +00001568 case LOAD_GLOBAL:
Guido van Rossumdf62e441991-08-16 08:56:04 +00001569 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001570 x = PyDict_GetItem(f->f_globals, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001571 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001572 x = PyDict_GetItem(f->f_builtins, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001573 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001574 format_exc_check_arg(
Guido van Rossumac7be682001-01-17 15:42:30 +00001575 PyExc_NameError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001576 GLOBAL_NAME_ERROR_MSG ,w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001577 break;
1578 }
1579 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001580 Py_INCREF(x);
Guido van Rossum374a9221991-04-04 10:40:29 +00001581 PUSH(x);
1582 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001583
Guido van Rossum9bfef441993-03-29 10:43:31 +00001584 case LOAD_FAST:
Guido van Rossum681d79a1995-07-18 14:51:37 +00001585 x = GETLOCAL(oparg);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001586 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001587 format_exc_check_arg(
1588 PyExc_UnboundLocalError,
1589 UNBOUNDLOCAL_ERROR_MSG,
1590 PyTuple_GetItem(co->co_varnames, oparg)
1591 );
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001592 break;
1593 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001594 Py_INCREF(x);
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001595 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001596 if (x != NULL) continue;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001597 break;
1598
1599 case STORE_FAST:
Guido van Rossum25831651993-05-19 14:50:45 +00001600 v = POP();
Guido van Rossum681d79a1995-07-18 14:51:37 +00001601 SETLOCAL(oparg, v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001602 continue;
Guido van Rossum8b17d6b1993-03-30 13:18:41 +00001603
1604 case DELETE_FAST:
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001605 x = GETLOCAL(oparg);
1606 if (x == NULL) {
Paul Prescode68140d2000-08-30 20:25:01 +00001607 format_exc_check_arg(
1608 PyExc_UnboundLocalError,
1609 UNBOUNDLOCAL_ERROR_MSG,
1610 PyTuple_GetItem(co->co_varnames, oparg)
1611 );
Guido van Rossum2e4c8991998-05-12 20:27:36 +00001612 break;
1613 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00001614 SETLOCAL(oparg, NULL);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001615 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001616
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001617 case LOAD_CLOSURE:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001618 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001619 Py_INCREF(x);
1620 PUSH(x);
1621 break;
1622
1623 case LOAD_DEREF:
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001624 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001625 w = PyCell_Get(x);
Jeremy Hylton2524d692001-02-05 17:23:16 +00001626 if (w == NULL) {
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001627 if (oparg < f->f_ncells) {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001628 v = PyTuple_GetItem(co->co_cellvars,
1629 oparg);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001630 format_exc_check_arg(
1631 PyExc_UnboundLocalError,
1632 UNBOUNDLOCAL_ERROR_MSG,
1633 v);
1634 } else {
Jeremy Hylton2524d692001-02-05 17:23:16 +00001635 v = PyTuple_GetItem(
1636 co->co_freevars,
1637 oparg - f->f_ncells);
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00001638 format_exc_check_arg(
1639 PyExc_NameError,
1640 UNBOUNDFREE_ERROR_MSG,
1641 v);
1642 }
Jeremy Hylton2524d692001-02-05 17:23:16 +00001643 err = -1;
1644 break;
1645 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001646 PUSH(w);
1647 break;
1648
1649 case STORE_DEREF:
1650 w = POP();
Jeremy Hylton2b724da2001-01-29 22:51:52 +00001651 x = freevars[oparg];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001652 PyCell_Set(x, w);
Jeremy Hylton30c9f392001-03-13 01:58:22 +00001653 Py_DECREF(w);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001654 continue;
1655
Guido van Rossum374a9221991-04-04 10:40:29 +00001656 case BUILD_TUPLE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001657 x = PyTuple_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001658 if (x != NULL) {
1659 for (; --oparg >= 0;) {
1660 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001661 PyTuple_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001662 }
1663 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001664 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001665 }
1666 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001667
Guido van Rossum374a9221991-04-04 10:40:29 +00001668 case BUILD_LIST:
Guido van Rossumb209a111997-04-29 18:18:01 +00001669 x = PyList_New(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001670 if (x != NULL) {
1671 for (; --oparg >= 0;) {
1672 w = POP();
Guido van Rossum5053efc1998-08-04 15:27:50 +00001673 PyList_SET_ITEM(x, oparg, w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001674 }
1675 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001676 continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001677 }
1678 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001679
Guido van Rossum374a9221991-04-04 10:40:29 +00001680 case BUILD_MAP:
Guido van Rossumb209a111997-04-29 18:18:01 +00001681 x = PyDict_New();
Guido van Rossum374a9221991-04-04 10:40:29 +00001682 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001683 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001684 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001685
Guido van Rossum374a9221991-04-04 10:40:29 +00001686 case LOAD_ATTR:
Guido van Rossum9bfef441993-03-29 10:43:31 +00001687 w = GETNAMEV(oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001688 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001689 x = PyObject_GetAttr(v, w);
1690 Py_DECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00001691 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001692 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001693 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001694
Guido van Rossum374a9221991-04-04 10:40:29 +00001695 case COMPARE_OP:
1696 w = POP();
1697 v = POP();
Guido van Rossumc12da691997-07-17 23:12:42 +00001698 if (PyInt_Check(v) && PyInt_Check(w)) {
1699 /* INLINE: cmp(int, int) */
1700 register long a, b;
1701 register int res;
Guido van Rossumcf183ac1998-12-04 18:51:36 +00001702 a = PyInt_AS_LONG(v);
1703 b = PyInt_AS_LONG(w);
Guido van Rossumc12da691997-07-17 23:12:42 +00001704 switch (oparg) {
1705 case LT: res = a < b; break;
1706 case LE: res = a <= b; break;
1707 case EQ: res = a == b; break;
1708 case NE: res = a != b; break;
1709 case GT: res = a > b; break;
1710 case GE: res = a >= b; break;
1711 case IS: res = v == w; break;
1712 case IS_NOT: res = v != w; break;
1713 default: goto slow_compare;
1714 }
1715 x = res ? Py_True : Py_False;
1716 Py_INCREF(x);
1717 }
1718 else {
1719 slow_compare:
1720 x = cmp_outcome(oparg, v, w);
1721 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001722 Py_DECREF(v);
1723 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001724 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001725 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001726 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001727
Guido van Rossum374a9221991-04-04 10:40:29 +00001728 case IMPORT_NAME:
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001729 w = GETNAMEV(oparg);
Guido van Rossumb209a111997-04-29 18:18:01 +00001730 x = PyDict_GetItemString(f->f_builtins, "__import__");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001731 if (x == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001732 PyErr_SetString(PyExc_ImportError,
Guido van Rossumfc490731997-05-06 15:06:49 +00001733 "__import__ not found");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001734 break;
1735 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00001736 u = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001737 w = Py_BuildValue("(OOOO)",
Guido van Rossum681d79a1995-07-18 14:51:37 +00001738 w,
1739 f->f_globals,
Guido van Rossuma027efa1997-05-05 20:56:21 +00001740 f->f_locals == NULL ?
1741 Py_None : f->f_locals,
Guido van Rossum681d79a1995-07-18 14:51:37 +00001742 u);
Guido van Rossumb209a111997-04-29 18:18:01 +00001743 Py_DECREF(u);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001744 if (w == NULL) {
1745 x = NULL;
1746 break;
1747 }
Guido van Rossumb209a111997-04-29 18:18:01 +00001748 x = PyEval_CallObject(x, w);
1749 Py_DECREF(w);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001750 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001751 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001752 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001753
Thomas Wouters52152252000-08-17 22:55:00 +00001754 case IMPORT_STAR:
1755 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00001756 PyFrame_FastToLocals(f);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001757 if ((x = f->f_locals) == NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00001758 PyErr_SetString(PyExc_SystemError,
Jeremy Hyltonc862cf42001-01-19 03:25:05 +00001759 "no locals found during 'import *'");
Guido van Rossum681d79a1995-07-18 14:51:37 +00001760 break;
1761 }
Thomas Wouters52152252000-08-17 22:55:00 +00001762 err = import_all_from(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001763 PyFrame_LocalsToFast(f, 0);
Thomas Wouters52152252000-08-17 22:55:00 +00001764 Py_DECREF(v);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001765 if (err == 0) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001766 break;
Guido van Rossum25831651993-05-19 14:50:45 +00001767
Thomas Wouters52152252000-08-17 22:55:00 +00001768 case IMPORT_FROM:
1769 w = GETNAMEV(oparg);
1770 v = TOP();
1771 x = import_from(v, w);
1772 PUSH(x);
1773 if (x != NULL) continue;
1774 break;
1775
Guido van Rossum374a9221991-04-04 10:40:29 +00001776 case JUMP_FORWARD:
1777 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001778 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001779
Guido van Rossum374a9221991-04-04 10:40:29 +00001780 case JUMP_IF_FALSE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001781 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001782 if (err > 0)
1783 err = 0;
1784 else if (err == 0)
Guido van Rossum374a9221991-04-04 10:40:29 +00001785 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001786 else
1787 break;
1788 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001789
Guido van Rossum374a9221991-04-04 10:40:29 +00001790 case JUMP_IF_TRUE:
Guido van Rossumb209a111997-04-29 18:18:01 +00001791 err = PyObject_IsTrue(TOP());
Guido van Rossum04691fc1992-08-12 15:35:34 +00001792 if (err > 0) {
1793 err = 0;
Guido van Rossum374a9221991-04-04 10:40:29 +00001794 JUMPBY(oparg);
Guido van Rossum04691fc1992-08-12 15:35:34 +00001795 }
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001796 else if (err == 0)
1797 ;
1798 else
1799 break;
1800 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001801
Guido van Rossum374a9221991-04-04 10:40:29 +00001802 case JUMP_ABSOLUTE:
1803 JUMPTO(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001804 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001805
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001806 case GET_ITER:
1807 /* before: [obj]; after [getiter(obj)] */
1808 v = POP();
1809 x = PyObject_GetIter(v);
1810 Py_DECREF(v);
1811 if (x != NULL) {
Guido van Rossum213c7a62001-04-23 14:08:49 +00001812 PUSH(x);
1813 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001814 }
1815 break;
1816
1817 case FOR_ITER:
1818 /* before: [iter]; after: [iter, iter()] *or* [] */
1819 v = TOP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001820 x = PyIter_Next(v);
1821 if (x != NULL) {
1822 PUSH(x);
1823 continue;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001824 }
Tim Petersf4848da2001-05-05 00:14:56 +00001825 if (!PyErr_Occurred()) {
1826 /* iterator ended normally */
1827 x = v = POP();
Guido van Rossum213c7a62001-04-23 14:08:49 +00001828 Py_DECREF(v);
1829 JUMPBY(oparg);
1830 continue;
1831 }
1832 break;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001833
Guido van Rossum374a9221991-04-04 10:40:29 +00001834 case FOR_LOOP:
1835 /* for v in s: ...
1836 On entry: stack contains s, i.
1837 On exit: stack contains s, i+1, s[i];
1838 but if loop exhausted:
1839 s, i are popped, and we jump */
1840 w = POP(); /* Loop index */
1841 v = POP(); /* Sequence object */
1842 u = loop_subscript(v, w);
1843 if (u != NULL) {
1844 PUSH(v);
Guido van Rossumb209a111997-04-29 18:18:01 +00001845 x = PyInt_FromLong(PyInt_AsLong(w)+1);
Guido van Rossum374a9221991-04-04 10:40:29 +00001846 PUSH(x);
Guido van Rossumb209a111997-04-29 18:18:01 +00001847 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001848 PUSH(u);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001849 if (x != NULL) continue;
Guido van Rossum374a9221991-04-04 10:40:29 +00001850 }
1851 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00001852 Py_DECREF(v);
1853 Py_DECREF(w);
Guido van Rossum374a9221991-04-04 10:40:29 +00001854 /* A NULL can mean "s exhausted"
1855 but also an error: */
Guido van Rossumb209a111997-04-29 18:18:01 +00001856 if (PyErr_Occurred())
Guido van Rossum374a9221991-04-04 10:40:29 +00001857 why = WHY_EXCEPTION;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001858 else {
Guido van Rossum374a9221991-04-04 10:40:29 +00001859 JUMPBY(oparg);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001860 continue;
1861 }
Guido van Rossum374a9221991-04-04 10:40:29 +00001862 }
1863 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00001864
Guido van Rossum374a9221991-04-04 10:40:29 +00001865 case SETUP_LOOP:
1866 case SETUP_EXCEPT:
1867 case SETUP_FINALLY:
Guido van Rossumb209a111997-04-29 18:18:01 +00001868 PyFrame_BlockSetup(f, opcode, INSTR_OFFSET() + oparg,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00001869 STACK_LEVEL());
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001870 continue;
Guido van Rossumac7be682001-01-17 15:42:30 +00001871
Guido van Rossum374a9221991-04-04 10:40:29 +00001872 case SET_LINENO:
Guido van Rossum96a42c81992-01-12 02:29:51 +00001873#ifdef LLTRACE
1874 if (lltrace)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001875 printf("--- %s:%d \n", filename, oparg);
Guido van Rossum374a9221991-04-04 10:40:29 +00001876#endif
Guido van Rossum96a42c81992-01-12 02:29:51 +00001877 f->f_lineno = oparg;
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00001878 if (f->f_trace == NULL)
1879 continue;
1880 /* Trace each line of code reached */
1881 f->f_lasti = INSTR_OFFSET();
1882 err = call_trace(&f->f_trace, &f->f_trace,
Fred Draked0838392001-06-16 21:02:31 +00001883 f, str_line, Py_None);
Guido van Rossum374a9221991-04-04 10:40:29 +00001884 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001885
1886 case CALL_FUNCTION:
Jeremy Hylton52820442001-01-03 23:52:36 +00001887 {
1888 int na = oparg & 0xff;
1889 int nk = (oparg>>8) & 0xff;
1890 int n = na + 2 * nk;
1891 PyObject **pfunc = stack_pointer - n - 1;
1892 PyObject *func = *pfunc;
1893 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
1894
1895 /* Always dispatch PyCFunction first, because
1896 these are presumed to be the most frequent
1897 callable object.
1898 */
1899 if (PyCFunction_Check(func)) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001900 int flags = PyCFunction_GET_FLAGS(func);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001901 if (flags > 1 || nk != 0)
1902 x = do_call(func, &stack_pointer,
1903 na, nk);
1904 else if (flags == METH_VARARGS) {
Jeremy Hyltonda20fce2001-05-18 20:53:14 +00001905 PyObject *callargs;
1906 callargs = load_args(&stack_pointer, na);
1907 x = call_cfunction(func, callargs, NULL);
1908 Py_XDECREF(callargs);
Jeremy Hylton4c9dace2001-05-29 16:23:26 +00001909 } else if (flags == 0)
Jeremy Hylton52820442001-01-03 23:52:36 +00001910 x = fast_cfunction(func,
Guido van Rossumac7be682001-01-17 15:42:30 +00001911 &stack_pointer, na);
Jeremy Hylton52820442001-01-03 23:52:36 +00001912 } else {
Guido van Rossumac7be682001-01-17 15:42:30 +00001913 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001914 && PyMethod_GET_SELF(func) != NULL) {
1915 /* optimize access to bound methods */
1916 PyObject *self = PyMethod_GET_SELF(func);
1917 Py_INCREF(self);
1918 func = PyMethod_GET_FUNCTION(func);
1919 Py_INCREF(func);
1920 Py_DECREF(*pfunc);
1921 *pfunc = self;
1922 na++;
1923 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001924 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001925 Py_INCREF(func);
1926 if (PyFunction_Check(func)) {
1927 x = fast_function(func, &stack_pointer,
Guido van Rossumac7be682001-01-17 15:42:30 +00001928 n, na, nk);
Jeremy Hylton52820442001-01-03 23:52:36 +00001929 } else {
1930 x = do_call(func, &stack_pointer,
1931 na, nk);
1932 }
1933 Py_DECREF(func);
1934 }
1935
1936 while (stack_pointer > pfunc) {
1937 w = POP();
1938 Py_DECREF(w);
1939 }
1940 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001941 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001942 continue;
1943 break;
1944 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001945
Jeremy Hylton76901512000-03-28 23:49:17 +00001946 case CALL_FUNCTION_VAR:
1947 case CALL_FUNCTION_KW:
1948 case CALL_FUNCTION_VAR_KW:
Guido van Rossumf10570b1995-07-07 22:53:21 +00001949 {
Jeremy Hylton76901512000-03-28 23:49:17 +00001950 int na = oparg & 0xff;
1951 int nk = (oparg>>8) & 0xff;
1952 int flags = (opcode - CALL_FUNCTION) & 3;
Jeremy Hylton52820442001-01-03 23:52:36 +00001953 int n = na + 2 * nk;
1954 PyObject **pfunc, *func;
1955 if (flags & CALL_FLAG_VAR)
1956 n++;
1957 if (flags & CALL_FLAG_KW)
1958 n++;
1959 pfunc = stack_pointer - n - 1;
1960 func = *pfunc;
Jeremy Hylton76901512000-03-28 23:49:17 +00001961 f->f_lasti = INSTR_OFFSET() - 3; /* For tracing */
Jeremy Hylton52820442001-01-03 23:52:36 +00001962
Guido van Rossumac7be682001-01-17 15:42:30 +00001963 if (PyMethod_Check(func)
Jeremy Hylton52820442001-01-03 23:52:36 +00001964 && PyMethod_GET_SELF(func) != NULL) {
1965 PyObject *self = PyMethod_GET_SELF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001966 Py_INCREF(self);
Jeremy Hylton52820442001-01-03 23:52:36 +00001967 func = PyMethod_GET_FUNCTION(func);
1968 Py_INCREF(func);
Jeremy Hylton76901512000-03-28 23:49:17 +00001969 Py_DECREF(*pfunc);
1970 *pfunc = self;
1971 na++;
1972 n++;
Guido van Rossumac7be682001-01-17 15:42:30 +00001973 } else
Jeremy Hylton52820442001-01-03 23:52:36 +00001974 Py_INCREF(func);
1975 x = ext_do_call(func, &stack_pointer, flags, na, nk);
Jeremy Hylton76901512000-03-28 23:49:17 +00001976 Py_DECREF(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00001977
Jeremy Hylton76901512000-03-28 23:49:17 +00001978 while (stack_pointer > pfunc) {
Jeremy Hylton52820442001-01-03 23:52:36 +00001979 w = POP();
1980 Py_DECREF(w);
Jeremy Hylton76901512000-03-28 23:49:17 +00001981 }
1982 PUSH(x);
Guido van Rossumac7be682001-01-17 15:42:30 +00001983 if (x != NULL)
Jeremy Hylton52820442001-01-03 23:52:36 +00001984 continue;
Jeremy Hylton76901512000-03-28 23:49:17 +00001985 break;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001986 }
Guido van Rossumac7be682001-01-17 15:42:30 +00001987
Guido van Rossum681d79a1995-07-18 14:51:37 +00001988 case MAKE_FUNCTION:
1989 v = POP(); /* code object */
Guido van Rossumb209a111997-04-29 18:18:01 +00001990 x = PyFunction_New(v, f->f_globals);
1991 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001992 /* XXX Maybe this should be a separate opcode? */
1993 if (x != NULL && oparg > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001994 v = PyTuple_New(oparg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001995 if (v == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00001996 Py_DECREF(x);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001997 x = NULL;
1998 break;
1999 }
2000 while (--oparg >= 0) {
2001 w = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002002 PyTuple_SET_ITEM(v, oparg, w);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002003 }
2004 err = PyFunction_SetDefaults(x, v);
Guido van Rossumb209a111997-04-29 18:18:01 +00002005 Py_DECREF(v);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002006 }
2007 PUSH(x);
2008 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002009
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002010 case MAKE_CLOSURE:
2011 {
2012 int nfree;
2013 v = POP(); /* code object */
2014 x = PyFunction_New(v, f->f_globals);
2015 nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
2016 Py_DECREF(v);
2017 /* XXX Maybe this should be a separate opcode? */
2018 if (x != NULL && nfree > 0) {
2019 v = PyTuple_New(nfree);
2020 if (v == NULL) {
2021 Py_DECREF(x);
2022 x = NULL;
2023 break;
2024 }
2025 while (--nfree >= 0) {
2026 w = POP();
2027 PyTuple_SET_ITEM(v, nfree, w);
2028 }
2029 err = PyFunction_SetClosure(x, v);
2030 Py_DECREF(v);
2031 }
2032 if (x != NULL && oparg > 0) {
2033 v = PyTuple_New(oparg);
2034 if (v == NULL) {
2035 Py_DECREF(x);
2036 x = NULL;
2037 break;
2038 }
2039 while (--oparg >= 0) {
2040 w = POP();
2041 PyTuple_SET_ITEM(v, oparg, w);
2042 }
2043 err = PyFunction_SetDefaults(x, v);
2044 Py_DECREF(v);
2045 }
2046 PUSH(x);
2047 break;
2048 }
2049
Guido van Rossum8861b741996-07-30 16:49:37 +00002050 case BUILD_SLICE:
2051 if (oparg == 3)
2052 w = POP();
2053 else
2054 w = NULL;
2055 v = POP();
2056 u = POP();
Guido van Rossum1aa14831997-01-21 05:34:20 +00002057 x = PySlice_New(u, v, w);
Guido van Rossumb209a111997-04-29 18:18:01 +00002058 Py_DECREF(u);
2059 Py_DECREF(v);
2060 Py_XDECREF(w);
Guido van Rossum8861b741996-07-30 16:49:37 +00002061 PUSH(x);
Guido van Rossum3dfd53b1997-01-18 02:46:13 +00002062 if (x != NULL) continue;
Guido van Rossum8861b741996-07-30 16:49:37 +00002063 break;
2064
Fred Drakeef8ace32000-08-24 00:32:09 +00002065 case EXTENDED_ARG:
2066 opcode = NEXTOP();
2067 oparg = oparg<<16 | NEXTARG();
2068 goto dispatch_opcode;
Guido van Rossum8861b741996-07-30 16:49:37 +00002069
Guido van Rossum374a9221991-04-04 10:40:29 +00002070 default:
2071 fprintf(stderr,
2072 "XXX lineno: %d, opcode: %d\n",
Guido van Rossum96a42c81992-01-12 02:29:51 +00002073 f->f_lineno, opcode);
Guido van Rossumb209a111997-04-29 18:18:01 +00002074 PyErr_SetString(PyExc_SystemError, "unknown opcode");
Guido van Rossum374a9221991-04-04 10:40:29 +00002075 why = WHY_EXCEPTION;
2076 break;
Guido van Rossum04691fc1992-08-12 15:35:34 +00002077
2078#ifdef CASE_TOO_BIG
2079 }
2080#endif
2081
Guido van Rossum374a9221991-04-04 10:40:29 +00002082 } /* switch */
2083
2084 on_error:
Guido van Rossumac7be682001-01-17 15:42:30 +00002085
Guido van Rossum374a9221991-04-04 10:40:29 +00002086 /* Quickly continue if no error occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002087
Guido van Rossum374a9221991-04-04 10:40:29 +00002088 if (why == WHY_NOT) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002089 if (err == 0 && x != NULL) {
2090#ifdef CHECKEXC
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002091 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002092 if (PyErr_Occurred())
Guido van Rossum681d79a1995-07-18 14:51:37 +00002093 fprintf(stderr,
2094 "XXX undetected error\n");
2095 else
2096#endif
2097 continue; /* Normal, fast path */
2098 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002099 why = WHY_EXCEPTION;
Guido van Rossumb209a111997-04-29 18:18:01 +00002100 x = Py_None;
Guido van Rossum374a9221991-04-04 10:40:29 +00002101 err = 0;
2102 }
2103
Guido van Rossum374a9221991-04-04 10:40:29 +00002104 /* Double-check exception status */
Guido van Rossumac7be682001-01-17 15:42:30 +00002105
Guido van Rossum374a9221991-04-04 10:40:29 +00002106 if (why == WHY_EXCEPTION || why == WHY_RERAISE) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002107 if (!PyErr_Occurred()) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002108 PyErr_SetString(PyExc_SystemError,
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002109 "error return without exception set");
Guido van Rossum374a9221991-04-04 10:40:29 +00002110 why = WHY_EXCEPTION;
2111 }
2112 }
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002113#ifdef CHECKEXC
Guido van Rossum374a9221991-04-04 10:40:29 +00002114 else {
Guido van Rossumeb894eb1999-03-09 16:16:45 +00002115 /* This check is expensive! */
Guido van Rossumb209a111997-04-29 18:18:01 +00002116 if (PyErr_Occurred()) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00002117 fprintf(stderr,
2118 "XXX undetected error (why=%d)\n",
2119 why);
2120 why = WHY_EXCEPTION;
2121 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002122 }
2123#endif
2124
2125 /* Log traceback info if this is a real exception */
Guido van Rossumac7be682001-01-17 15:42:30 +00002126
Guido van Rossum374a9221991-04-04 10:40:29 +00002127 if (why == WHY_EXCEPTION) {
Guido van Rossum96a42c81992-01-12 02:29:51 +00002128 f->f_lasti = INSTR_OFFSET() - 1;
Guido van Rossum374a9221991-04-04 10:40:29 +00002129 if (HAS_ARG(opcode))
Guido van Rossum96a42c81992-01-12 02:29:51 +00002130 f->f_lasti -= 2;
Guido van Rossumb209a111997-04-29 18:18:01 +00002131 PyTraceBack_Here(f);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002132
Guido van Rossume59214e1994-08-30 08:01:59 +00002133 if (f->f_trace)
2134 call_exc_trace(&f->f_trace, &f->f_trace, f);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002135 if (tstate->sys_profilefunc)
2136 call_exc_trace(&tstate->sys_profilefunc,
2137 (PyObject**)0, f);
Guido van Rossum014518f1998-11-23 21:09:51 +00002138 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002139
Guido van Rossum374a9221991-04-04 10:40:29 +00002140 /* For the rest, treat WHY_RERAISE as WHY_EXCEPTION */
Guido van Rossumac7be682001-01-17 15:42:30 +00002141
Guido van Rossum374a9221991-04-04 10:40:29 +00002142 if (why == WHY_RERAISE)
2143 why = WHY_EXCEPTION;
2144
2145 /* Unwind stacks if a (pseudo) exception occurred */
Guido van Rossumac7be682001-01-17 15:42:30 +00002146
Tim Peters5ca576e2001-06-18 22:08:13 +00002147 while (why != WHY_NOT && why != WHY_YIELD && f->f_iblock > 0) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002148 PyTryBlock *b = PyFrame_BlockPop(f);
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002149
2150 if (b->b_type == SETUP_LOOP && why == WHY_CONTINUE) {
2151 /* For a continue inside a try block,
2152 don't pop the block for the loop. */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00002153 PyFrame_BlockSetup(f, b->b_type, b->b_level,
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002154 b->b_handler);
2155 why = WHY_NOT;
2156 JUMPTO(PyInt_AS_LONG(retval));
2157 Py_DECREF(retval);
2158 break;
2159 }
2160
Guido van Rossum374a9221991-04-04 10:40:29 +00002161 while (STACK_LEVEL() > b->b_level) {
2162 v = POP();
Guido van Rossumb209a111997-04-29 18:18:01 +00002163 Py_XDECREF(v);
Guido van Rossum374a9221991-04-04 10:40:29 +00002164 }
2165 if (b->b_type == SETUP_LOOP && why == WHY_BREAK) {
2166 why = WHY_NOT;
2167 JUMPTO(b->b_handler);
2168 break;
2169 }
2170 if (b->b_type == SETUP_FINALLY ||
Guido van Rossum150b2df1996-12-05 23:17:11 +00002171 (b->b_type == SETUP_EXCEPT &&
2172 why == WHY_EXCEPTION)) {
Guido van Rossum374a9221991-04-04 10:40:29 +00002173 if (why == WHY_EXCEPTION) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002174 PyObject *exc, *val, *tb;
2175 PyErr_Fetch(&exc, &val, &tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002176 if (val == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002177 val = Py_None;
2178 Py_INCREF(val);
Guido van Rossum374a9221991-04-04 10:40:29 +00002179 }
Guido van Rossum374a9221991-04-04 10:40:29 +00002180 /* Make the raw exception data
2181 available to the handler,
2182 so a program can emulate the
2183 Python main loop. Don't do
2184 this for 'finally'. */
2185 if (b->b_type == SETUP_EXCEPT) {
Barry Warsaweaedc7c1997-08-28 22:36:40 +00002186 PyErr_NormalizeException(
2187 &exc, &val, &tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002188 set_exc_info(tstate,
2189 exc, val, tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002190 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002191 PUSH(tb);
Guido van Rossum374a9221991-04-04 10:40:29 +00002192 PUSH(val);
2193 PUSH(exc);
2194 }
2195 else {
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00002196 if (why == WHY_RETURN ||
2197 why == CONTINUE_LOOP)
Guido van Rossum374a9221991-04-04 10:40:29 +00002198 PUSH(retval);
Guido van Rossumb209a111997-04-29 18:18:01 +00002199 v = PyInt_FromLong((long)why);
Guido van Rossum374a9221991-04-04 10:40:29 +00002200 PUSH(v);
2201 }
2202 why = WHY_NOT;
2203 JUMPTO(b->b_handler);
2204 break;
2205 }
2206 } /* unwind stack */
2207
2208 /* End the loop if we still have an error (or return) */
Guido van Rossumac7be682001-01-17 15:42:30 +00002209
Guido van Rossum374a9221991-04-04 10:40:29 +00002210 if (why != WHY_NOT)
2211 break;
Guido van Rossumac7be682001-01-17 15:42:30 +00002212
Guido van Rossum374a9221991-04-04 10:40:29 +00002213 } /* main loop */
Guido van Rossumac7be682001-01-17 15:42:30 +00002214
Tim Peters5ca576e2001-06-18 22:08:13 +00002215 if (why != WHY_RETURN && why != WHY_YIELD)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002216 retval = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002217
Guido van Rossume59214e1994-08-30 08:01:59 +00002218 if (f->f_trace) {
Tim Peters5ca576e2001-06-18 22:08:13 +00002219 if (why == WHY_RETURN || why == WHY_YIELD) {
Guido van Rossume59214e1994-08-30 08:01:59 +00002220 if (call_trace(&f->f_trace, &f->f_trace, f,
Fred Draked0838392001-06-16 21:02:31 +00002221 str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002222 Py_XDECREF(retval);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002223 retval = NULL;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002224 why = WHY_EXCEPTION;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002225 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002226 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002227 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002228
Tim Peters5ca576e2001-06-18 22:08:13 +00002229 if (tstate->sys_profilefunc &&
2230 (why == WHY_RETURN || why == WHY_YIELD)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002231 if (call_trace(&tstate->sys_profilefunc, (PyObject**)0,
Fred Draked0838392001-06-16 21:02:31 +00002232 f, str_return, retval)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002233 Py_XDECREF(retval);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002234 retval = NULL;
2235 why = WHY_EXCEPTION;
2236 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002237 }
Guido van Rossuma4240131997-01-21 21:18:36 +00002238
Guido van Rossuma027efa1997-05-05 20:56:21 +00002239 reset_exc_info(tstate);
2240
Tim Peters5ca576e2001-06-18 22:08:13 +00002241 /* pop frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002242 --tstate->recursion_depth;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002243 tstate->frame = f->f_back;
Guido van Rossumac7be682001-01-17 15:42:30 +00002244
Guido van Rossum96a42c81992-01-12 02:29:51 +00002245 return retval;
Guido van Rossum374a9221991-04-04 10:40:29 +00002246}
2247
Tim Peters5ca576e2001-06-18 22:08:13 +00002248static PyObject *
2249eval_code2(PyCodeObject *co, PyObject *globals, PyObject *locals,
2250 PyObject **args, int argcount, PyObject **kws, int kwcount,
2251 PyObject **defs, int defcount, PyObject *closure)
2252{
2253 register PyFrameObject *f;
2254 register PyObject *retval = NULL;
2255 register PyObject **fastlocals, **freevars;
2256 PyThreadState *tstate = PyThreadState_GET();
2257 PyObject *x, *u;
2258
2259 if (globals == NULL) {
2260 PyErr_SetString(PyExc_SystemError, "eval_code2: NULL globals");
2261 return NULL;
2262 }
2263
2264 f = PyFrame_New(tstate, /*back*/
2265 co, /*code*/
2266 globals, locals);
2267 if (f == NULL)
2268 return NULL;
2269
2270 fastlocals = f->f_localsplus;
2271 freevars = f->f_localsplus + f->f_nlocals;
2272
2273 if (co->co_argcount > 0 ||
2274 co->co_flags & (CO_VARARGS | CO_VARKEYWORDS)) {
2275 int i;
2276 int n = argcount;
2277 PyObject *kwdict = NULL;
2278 if (co->co_flags & CO_VARKEYWORDS) {
2279 kwdict = PyDict_New();
2280 if (kwdict == NULL)
2281 goto fail;
2282 i = co->co_argcount;
2283 if (co->co_flags & CO_VARARGS)
2284 i++;
2285 SETLOCAL(i, kwdict);
2286 }
2287 if (argcount > co->co_argcount) {
2288 if (!(co->co_flags & CO_VARARGS)) {
2289 PyErr_Format(PyExc_TypeError,
2290 "%.200s() takes %s %d "
2291 "%sargument%s (%d given)",
2292 PyString_AsString(co->co_name),
2293 defcount ? "at most" : "exactly",
2294 co->co_argcount,
2295 kwcount ? "non-keyword " : "",
2296 co->co_argcount == 1 ? "" : "s",
2297 argcount);
2298 goto fail;
2299 }
2300 n = co->co_argcount;
2301 }
2302 for (i = 0; i < n; i++) {
2303 x = args[i];
2304 Py_INCREF(x);
2305 SETLOCAL(i, x);
2306 }
2307 if (co->co_flags & CO_VARARGS) {
2308 u = PyTuple_New(argcount - n);
2309 if (u == NULL)
2310 goto fail;
2311 SETLOCAL(co->co_argcount, u);
2312 for (i = n; i < argcount; i++) {
2313 x = args[i];
2314 Py_INCREF(x);
2315 PyTuple_SET_ITEM(u, i-n, x);
2316 }
2317 }
2318 for (i = 0; i < kwcount; i++) {
2319 PyObject *keyword = kws[2*i];
2320 PyObject *value = kws[2*i + 1];
2321 int j;
2322 if (keyword == NULL || !PyString_Check(keyword)) {
2323 PyErr_Format(PyExc_TypeError,
2324 "%.200s() keywords must be strings",
2325 PyString_AsString(co->co_name));
2326 goto fail;
2327 }
2328 /* XXX slow -- speed up using dictionary? */
2329 for (j = 0; j < co->co_argcount; j++) {
2330 PyObject *nm = PyTuple_GET_ITEM(
2331 co->co_varnames, j);
2332 int cmp = PyObject_RichCompareBool(
2333 keyword, nm, Py_EQ);
2334 if (cmp > 0)
2335 break;
2336 else if (cmp < 0)
2337 goto fail;
2338 }
2339 /* Check errors from Compare */
2340 if (PyErr_Occurred())
2341 goto fail;
2342 if (j >= co->co_argcount) {
2343 if (kwdict == NULL) {
2344 PyErr_Format(PyExc_TypeError,
2345 "%.200s() got an unexpected "
2346 "keyword argument '%.400s'",
2347 PyString_AsString(co->co_name),
2348 PyString_AsString(keyword));
2349 goto fail;
2350 }
2351 PyDict_SetItem(kwdict, keyword, value);
2352 }
2353 else {
2354 if (GETLOCAL(j) != NULL) {
2355 PyErr_Format(PyExc_TypeError,
2356 "%.200s() got multiple "
2357 "values for keyword "
2358 "argument '%.400s'",
2359 PyString_AsString(co->co_name),
2360 PyString_AsString(keyword));
2361 goto fail;
2362 }
2363 Py_INCREF(value);
2364 SETLOCAL(j, value);
2365 }
2366 }
2367 if (argcount < co->co_argcount) {
2368 int m = co->co_argcount - defcount;
2369 for (i = argcount; i < m; i++) {
2370 if (GETLOCAL(i) == NULL) {
2371 PyErr_Format(PyExc_TypeError,
2372 "%.200s() takes %s %d "
2373 "%sargument%s (%d given)",
2374 PyString_AsString(co->co_name),
2375 ((co->co_flags & CO_VARARGS) ||
2376 defcount) ? "at least"
2377 : "exactly",
2378 m, kwcount ? "non-keyword " : "",
2379 m == 1 ? "" : "s", i);
2380 goto fail;
2381 }
2382 }
2383 if (n > m)
2384 i = n - m;
2385 else
2386 i = 0;
2387 for (; i < defcount; i++) {
2388 if (GETLOCAL(m+i) == NULL) {
2389 PyObject *def = defs[i];
2390 Py_INCREF(def);
2391 SETLOCAL(m+i, def);
2392 }
2393 }
2394 }
2395 }
2396 else {
2397 if (argcount > 0 || kwcount > 0) {
2398 PyErr_Format(PyExc_TypeError,
2399 "%.200s() takes no arguments (%d given)",
2400 PyString_AsString(co->co_name),
2401 argcount + kwcount);
2402 goto fail;
2403 }
2404 }
2405 /* Allocate and initialize storage for cell vars, and copy free
2406 vars into frame. This isn't too efficient right now. */
2407 if (f->f_ncells) {
2408 int i = 0, j = 0, nargs, found;
2409 char *cellname, *argname;
2410 PyObject *c;
2411
2412 nargs = co->co_argcount;
2413 if (co->co_flags & CO_VARARGS)
2414 nargs++;
2415 if (co->co_flags & CO_VARKEYWORDS)
2416 nargs++;
2417
2418 /* Check for cells that shadow args */
2419 for (i = 0; i < f->f_ncells && j < nargs; ++i) {
2420 cellname = PyString_AS_STRING(
2421 PyTuple_GET_ITEM(co->co_cellvars, i));
2422 found = 0;
2423 while (j < nargs) {
2424 argname = PyString_AS_STRING(
2425 PyTuple_GET_ITEM(co->co_varnames, j));
2426 if (strcmp(cellname, argname) == 0) {
2427 c = PyCell_New(GETLOCAL(j));
2428 if (c == NULL)
2429 goto fail;
2430 GETLOCAL(f->f_nlocals + i) = c;
2431 found = 1;
2432 break;
2433 }
2434 j++;
2435 }
2436 if (found == 0) {
2437 c = PyCell_New(NULL);
2438 if (c == NULL)
2439 goto fail;
2440 SETLOCAL(f->f_nlocals + i, c);
2441 }
2442 }
2443 /* Initialize any that are left */
2444 while (i < f->f_ncells) {
2445 c = PyCell_New(NULL);
2446 if (c == NULL)
2447 goto fail;
2448 SETLOCAL(f->f_nlocals + i, c);
2449 i++;
2450 }
2451 }
2452 if (f->f_nfreevars) {
2453 int i;
2454 for (i = 0; i < f->f_nfreevars; ++i) {
2455 PyObject *o = PyTuple_GET_ITEM(closure, i);
2456 Py_INCREF(o);
2457 freevars[f->f_ncells + i] = o;
2458 }
2459 }
2460
2461 if (tstate->sys_tracefunc != NULL) {
2462 /* tstate->sys_tracefunc, if defined, is a function that
2463 will be called on *every* entry to a code block.
2464 Its return value, if not None, is a function that
2465 will be called at the start of each executed line
2466 of code. (Actually, the function must return
2467 itself in order to continue tracing.)
2468 The trace functions are called with three arguments:
2469 a pointer to the current frame, a string indicating
2470 why the function is called, and an argument which
2471 depends on the situation. The global trace function
2472 (sys.trace) is also called whenever an exception
2473 is detected. */
2474 if (call_trace(&tstate->sys_tracefunc,
2475 &f->f_trace, f, str_call,
2476 Py_None/*XXX how to compute arguments now?*/)) {
2477 /* Trace function raised an error */
2478 goto fail;
2479 }
2480 }
2481
2482 if (tstate->sys_profilefunc != NULL) {
2483 /* Similar for sys_profilefunc, except it needn't return
2484 itself and isn't called for "line" events */
2485 if (call_trace(&tstate->sys_profilefunc,
2486 (PyObject**)0, f, str_call,
2487 Py_None/*XXX*/)) {
2488 goto fail;
2489 }
2490 }
2491
2492 if (co->co_flags & CO_GENERATOR) {
Neil Schemenauer2b13ce82001-06-21 02:41:10 +00002493 /* Don't need to keep the reference to f_back, it will be set
2494 * when the generator is resumed. */
2495 Py_DECREF(f->f_back);
2496 f->f_back = NULL;
2497
2498 /* Create a new generator that owns the ready to run frame
2499 * and return that as the value. */
Tim Peters5ca576e2001-06-18 22:08:13 +00002500 return gen_new(f);
2501 }
2502
2503 retval = eval_frame(f);
2504
2505 fail: /* Jump here from prelude on failure */
2506
2507 Py_DECREF(f);
2508 return retval;
2509}
2510
2511
Guido van Rossuma027efa1997-05-05 20:56:21 +00002512static void
Guido van Rossumac7be682001-01-17 15:42:30 +00002513set_exc_info(PyThreadState *tstate,
2514 PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002515{
2516 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002517 PyObject *tmp_type, *tmp_value, *tmp_tb;
Barry Warsaw4249f541997-08-22 21:26:19 +00002518
Guido van Rossuma027efa1997-05-05 20:56:21 +00002519 frame = tstate->frame;
2520 if (frame->f_exc_type == NULL) {
2521 /* This frame didn't catch an exception before */
2522 /* Save previous exception of this thread in this frame */
Guido van Rossuma027efa1997-05-05 20:56:21 +00002523 if (tstate->exc_type == NULL) {
2524 Py_INCREF(Py_None);
2525 tstate->exc_type = Py_None;
2526 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002527 tmp_type = frame->f_exc_type;
2528 tmp_value = frame->f_exc_value;
2529 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002530 Py_XINCREF(tstate->exc_type);
2531 Py_XINCREF(tstate->exc_value);
2532 Py_XINCREF(tstate->exc_traceback);
2533 frame->f_exc_type = tstate->exc_type;
2534 frame->f_exc_value = tstate->exc_value;
2535 frame->f_exc_traceback = tstate->exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002536 Py_XDECREF(tmp_type);
2537 Py_XDECREF(tmp_value);
2538 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002539 }
2540 /* Set new exception for this thread */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002541 tmp_type = tstate->exc_type;
2542 tmp_value = tstate->exc_value;
2543 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002544 Py_XINCREF(type);
2545 Py_XINCREF(value);
2546 Py_XINCREF(tb);
2547 tstate->exc_type = type;
2548 tstate->exc_value = value;
2549 tstate->exc_traceback = tb;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002550 Py_XDECREF(tmp_type);
2551 Py_XDECREF(tmp_value);
2552 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002553 /* For b/w compatibility */
2554 PySys_SetObject("exc_type", type);
2555 PySys_SetObject("exc_value", value);
2556 PySys_SetObject("exc_traceback", tb);
2557}
2558
2559static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002560reset_exc_info(PyThreadState *tstate)
Guido van Rossuma027efa1997-05-05 20:56:21 +00002561{
2562 PyFrameObject *frame;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002563 PyObject *tmp_type, *tmp_value, *tmp_tb;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002564 frame = tstate->frame;
2565 if (frame->f_exc_type != NULL) {
2566 /* This frame caught an exception */
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002567 tmp_type = tstate->exc_type;
2568 tmp_value = tstate->exc_value;
2569 tmp_tb = tstate->exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002570 Py_XINCREF(frame->f_exc_type);
2571 Py_XINCREF(frame->f_exc_value);
2572 Py_XINCREF(frame->f_exc_traceback);
2573 tstate->exc_type = frame->f_exc_type;
2574 tstate->exc_value = frame->f_exc_value;
2575 tstate->exc_traceback = frame->f_exc_traceback;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002576 Py_XDECREF(tmp_type);
2577 Py_XDECREF(tmp_value);
2578 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002579 /* For b/w compatibility */
2580 PySys_SetObject("exc_type", frame->f_exc_type);
2581 PySys_SetObject("exc_value", frame->f_exc_value);
2582 PySys_SetObject("exc_traceback", frame->f_exc_traceback);
2583 }
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002584 tmp_type = frame->f_exc_type;
2585 tmp_value = frame->f_exc_value;
2586 tmp_tb = frame->f_exc_traceback;
Guido van Rossuma027efa1997-05-05 20:56:21 +00002587 frame->f_exc_type = NULL;
2588 frame->f_exc_value = NULL;
2589 frame->f_exc_traceback = NULL;
Guido van Rossumdf4c3081997-05-20 17:06:11 +00002590 Py_XDECREF(tmp_type);
2591 Py_XDECREF(tmp_value);
2592 Py_XDECREF(tmp_tb);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002593}
2594
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002595/* Logic for the raise statement (too complicated for inlining).
2596 This *consumes* a reference count to each of its arguments. */
Guido van Rossum1aa14831997-01-21 05:34:20 +00002597static enum why_code
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002598do_raise(PyObject *type, PyObject *value, PyObject *tb)
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002599{
Guido van Rossumd295f121998-04-09 21:39:57 +00002600 if (type == NULL) {
2601 /* Reraise */
2602 PyThreadState *tstate = PyThreadState_Get();
2603 type = tstate->exc_type == NULL ? Py_None : tstate->exc_type;
2604 value = tstate->exc_value;
2605 tb = tstate->exc_traceback;
2606 Py_XINCREF(type);
2607 Py_XINCREF(value);
2608 Py_XINCREF(tb);
2609 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002610
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002611 /* We support the following forms of raise:
2612 raise <class>, <classinstance>
2613 raise <class>, <argument tuple>
2614 raise <class>, None
2615 raise <class>, <argument>
2616 raise <classinstance>, None
2617 raise <string>, <object>
2618 raise <string>, None
2619
2620 An omitted second argument is the same as None.
2621
2622 In addition, raise <tuple>, <anything> is the same as
2623 raising the tuple's first item (and it better have one!);
2624 this rule is applied recursively.
2625
2626 Finally, an optional third argument can be supplied, which
2627 gives the traceback to be substituted (useful when
2628 re-raising an exception after examining it). */
2629
2630 /* First, check the traceback argument, replacing None with
2631 NULL. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002632 if (tb == Py_None) {
2633 Py_DECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002634 tb = NULL;
2635 }
2636 else if (tb != NULL && !PyTraceBack_Check(tb)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002637 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002638 "raise: arg 3 must be a traceback or None");
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002639 goto raise_error;
2640 }
2641
2642 /* Next, replace a missing value with None */
2643 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002644 value = Py_None;
2645 Py_INCREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002646 }
2647
2648 /* Next, repeatedly, replace a tuple exception with its first item */
Guido van Rossumb209a111997-04-29 18:18:01 +00002649 while (PyTuple_Check(type) && PyTuple_Size(type) > 0) {
2650 PyObject *tmp = type;
2651 type = PyTuple_GET_ITEM(type, 0);
2652 Py_INCREF(type);
2653 Py_DECREF(tmp);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002654 }
2655
Barry Warsaw4249f541997-08-22 21:26:19 +00002656 if (PyString_Check(type))
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002657 ;
Barry Warsaw4249f541997-08-22 21:26:19 +00002658
2659 else if (PyClass_Check(type))
2660 PyErr_NormalizeException(&type, &value, &tb);
2661
Guido van Rossumb209a111997-04-29 18:18:01 +00002662 else if (PyInstance_Check(type)) {
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002663 /* Raising an instance. The value should be a dummy. */
Guido van Rossumb209a111997-04-29 18:18:01 +00002664 if (value != Py_None) {
2665 PyErr_SetString(PyExc_TypeError,
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002666 "instance exception may not have a separate value");
2667 goto raise_error;
2668 }
2669 else {
2670 /* Normalize to raise <class>, <instance> */
Guido van Rossumb209a111997-04-29 18:18:01 +00002671 Py_DECREF(value);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002672 value = type;
Guido van Rossumb209a111997-04-29 18:18:01 +00002673 type = (PyObject*) ((PyInstanceObject*)type)->in_class;
2674 Py_INCREF(type);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002675 }
2676 }
2677 else {
2678 /* Not something you can raise. You get an exception
2679 anyway, just not what you specified :-) */
Jeremy Hylton960d9482001-04-27 02:25:33 +00002680 PyErr_Format(PyExc_TypeError,
2681 "exceptions must be strings, classes, or "
2682 "instances, not %s", type->ob_type->tp_name);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002683 goto raise_error;
2684 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002685 PyErr_Restore(type, value, tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002686 if (tb == NULL)
2687 return WHY_EXCEPTION;
2688 else
2689 return WHY_RERAISE;
2690 raise_error:
Guido van Rossumb209a111997-04-29 18:18:01 +00002691 Py_XDECREF(value);
2692 Py_XDECREF(type);
2693 Py_XDECREF(tb);
Guido van Rossum0aa9ee61996-12-10 18:07:35 +00002694 return WHY_EXCEPTION;
2695}
2696
Barry Warsawe42b18f1997-08-25 22:13:04 +00002697static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002698unpack_sequence(PyObject *v, int argcnt, PyObject **sp)
Barry Warsawe42b18f1997-08-25 22:13:04 +00002699{
2700 int i;
2701 PyObject *w;
Guido van Rossumac7be682001-01-17 15:42:30 +00002702
Barry Warsawe42b18f1997-08-25 22:13:04 +00002703 for (i = 0; i < argcnt; i++) {
2704 if (! (w = PySequence_GetItem(v, i))) {
2705 if (PyErr_ExceptionMatches(PyExc_IndexError))
2706 PyErr_SetString(PyExc_ValueError,
2707 "unpack sequence of wrong size");
2708 goto finally;
2709 }
2710 *--sp = w;
2711 }
2712 /* we better get an IndexError now */
2713 if (PySequence_GetItem(v, i) == NULL) {
2714 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2715 PyErr_Clear();
2716 return 1;
2717 }
2718 /* some other exception occurred. fall through to finally */
2719 }
2720 else
2721 PyErr_SetString(PyExc_ValueError,
2722 "unpack sequence of wrong size");
2723 /* fall through */
2724finally:
Barry Warsaw91010551997-08-25 22:30:51 +00002725 for (; i > 0; i--, sp++)
2726 Py_DECREF(*sp);
Barry Warsawe42b18f1997-08-25 22:13:04 +00002727
2728 return 0;
2729}
2730
2731
Guido van Rossum96a42c81992-01-12 02:29:51 +00002732#ifdef LLTRACE
Guido van Rossum3f5da241990-12-20 15:06:42 +00002733static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002734prtrace(PyObject *v, char *str)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735{
Guido van Rossum3f5da241990-12-20 15:06:42 +00002736 printf("%s ", str);
Guido van Rossumb209a111997-04-29 18:18:01 +00002737 if (PyObject_Print(v, stdout, 0) != 0)
2738 PyErr_Clear(); /* Don't know what else to do */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002739 printf("\n");
Guido van Rossumcc229ea2000-05-04 00:55:17 +00002740 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741}
Guido van Rossum3f5da241990-12-20 15:06:42 +00002742#endif
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002743
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002744static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002745call_exc_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002746{
Guido van Rossumb209a111997-04-29 18:18:01 +00002747 PyObject *type, *value, *traceback, *arg;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002748 int err;
Guido van Rossumb209a111997-04-29 18:18:01 +00002749 PyErr_Fetch(&type, &value, &traceback);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002750 if (value == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002751 value = Py_None;
2752 Py_INCREF(value);
Guido van Rossumbd9ccca1992-04-09 14:58:08 +00002753 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002754 arg = Py_BuildValue("(OOO)", type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002755 if (arg == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002756 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002757 return;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002758 }
Fred Draked0838392001-06-16 21:02:31 +00002759 err = call_trace(p_trace, p_newtrace, f, str_exception, arg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002760 Py_DECREF(arg);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002761 if (err == 0)
Guido van Rossumb209a111997-04-29 18:18:01 +00002762 PyErr_Restore(type, value, traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002763 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002764 Py_XDECREF(type);
2765 Py_XDECREF(value);
2766 Py_XDECREF(traceback);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002767 }
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002768}
2769
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002770/* PyObject **p_trace: in/out; may not be NULL;
2771 may not point to NULL variable initially
Fred Drake904aa7b2001-06-08 04:33:09 +00002772 PyObject **p_newtrace: in/out; may be NULL;
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002773 may point to NULL variable;
Fred Drake904aa7b2001-06-08 04:33:09 +00002774 may be same variable as p_newtrace
Fred Draked0838392001-06-16 21:02:31 +00002775 PyObject *msg: in; must not be NULL
Fred Drake904aa7b2001-06-08 04:33:09 +00002776*/
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002777
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002778static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002779call_trace(PyObject **p_trace, PyObject **p_newtrace, PyFrameObject *f,
Fred Draked0838392001-06-16 21:02:31 +00002780 PyObject *msg, PyObject *arg)
Guido van Rossum96a42c81992-01-12 02:29:51 +00002781{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002782 PyThreadState *tstate = f->f_tstate;
Fred Draked0838392001-06-16 21:02:31 +00002783 PyObject *args;
Guido van Rossumb209a111997-04-29 18:18:01 +00002784 PyObject *res = NULL;
Guido van Rossumac7be682001-01-17 15:42:30 +00002785
Guido van Rossuma027efa1997-05-05 20:56:21 +00002786 if (tstate->tracing) {
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002787 /* Don't do recursive traces */
2788 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002789 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002790 *p_newtrace = NULL;
2791 }
2792 return 0;
Guido van Rossum96a42c81992-01-12 02:29:51 +00002793 }
Guido van Rossumac7be682001-01-17 15:42:30 +00002794
Guido van Rossumb209a111997-04-29 18:18:01 +00002795 args = PyTuple_New(3);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002796 if (args == NULL)
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002797 goto cleanup;
Fred Draked0838392001-06-16 21:02:31 +00002798 Py_INCREF(msg);
Guido van Rossumb209a111997-04-29 18:18:01 +00002799 Py_INCREF(f);
2800 PyTuple_SET_ITEM(args, 0, (PyObject *)f);
Fred Draked0838392001-06-16 21:02:31 +00002801 PyTuple_SET_ITEM(args, 1, msg);
Guido van Rossum96a42c81992-01-12 02:29:51 +00002802 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002803 arg = Py_None;
2804 Py_INCREF(arg);
2805 PyTuple_SET_ITEM(args, 2, arg);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002806 tstate->tracing++;
Guido van Rossumb209a111997-04-29 18:18:01 +00002807 PyFrame_FastToLocals(f);
2808 res = PyEval_CallObject(*p_trace, args); /* May clear *p_trace! */
2809 PyFrame_LocalsToFast(f, 1);
Guido van Rossuma027efa1997-05-05 20:56:21 +00002810 tstate->tracing--;
Guido van Rossumf9c90c51997-08-05 02:18:01 +00002811 cleanup:
Guido van Rossumb209a111997-04-29 18:18:01 +00002812 Py_XDECREF(args);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002813 if (res == NULL) {
2814 /* The trace proc raised an exception */
Guido van Rossumb209a111997-04-29 18:18:01 +00002815 PyTraceBack_Here(f);
2816 Py_XDECREF(*p_trace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002817 *p_trace = NULL;
2818 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002819 Py_XDECREF(*p_newtrace);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002820 *p_newtrace = NULL;
2821 }
Barry Warsawf6202631999-09-08 16:26:33 +00002822 /* to be extra double plus sure we don't get recursive
2823 * calls inf either tracefunc or profilefunc gets an
2824 * exception, zap the global variables.
2825 */
2826 Py_XDECREF(tstate->sys_tracefunc);
2827 tstate->sys_tracefunc = NULL;
2828 Py_XDECREF(tstate->sys_profilefunc);
2829 tstate->sys_profilefunc = NULL;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002830 return -1;
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002831 }
2832 else {
2833 if (p_newtrace) {
Guido van Rossumb209a111997-04-29 18:18:01 +00002834 Py_XDECREF(*p_newtrace);
2835 if (res == Py_None)
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002836 *p_newtrace = NULL;
2837 else {
Guido van Rossumb209a111997-04-29 18:18:01 +00002838 Py_INCREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002839 *p_newtrace = res;
2840 }
2841 }
Guido van Rossumb209a111997-04-29 18:18:01 +00002842 Py_DECREF(res);
Guido van Rossum9c8d70d1992-03-23 18:19:28 +00002843 return 0;
Guido van Rossumeee3fd41992-04-05 14:18:13 +00002844 }
Guido van Rossum96a42c81992-01-12 02:29:51 +00002845}
2846
Fred Draked0838392001-06-16 21:02:31 +00002847/* Initialize the strings that get passed to the profile and trace functions;
2848 * this avoids doing this while we're actually profiling/tracing.
2849 */
2850int
2851_PyTrace_Init(void)
2852{
2853 if (str_call == NULL) {
2854 str_call = PyString_InternFromString("call");
2855 if (str_call == NULL)
2856 return -1;
2857 }
2858 if (str_exception == NULL) {
2859 str_exception = PyString_InternFromString("exception");
2860 if (str_exception == NULL)
2861 return -1;
2862 }
2863 if (str_line == NULL) {
2864 str_line = PyString_InternFromString("line");
2865 if (str_line == NULL)
2866 return -1;
2867 }
2868 if (str_return == NULL) {
2869 str_return = PyString_InternFromString("return");
2870 if (str_return == NULL)
2871 return -1;
2872 }
2873 return 0;
2874}
2875
Guido van Rossumb209a111997-04-29 18:18:01 +00002876PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002877PyEval_GetBuiltins(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002878{
Guido van Rossum25ce5661997-08-02 03:10:38 +00002879 PyThreadState *tstate = PyThreadState_Get();
2880 PyFrameObject *current_frame = tstate->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002881 if (current_frame == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002882 return tstate->interp->builtins;
Guido van Rossum6135a871995-01-09 17:53:26 +00002883 else
2884 return current_frame->f_builtins;
2885}
2886
Guido van Rossumb209a111997-04-29 18:18:01 +00002887PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002888PyEval_GetLocals(void)
Guido van Rossum5b722181993-03-30 17:46:03 +00002889{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002890 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum5b722181993-03-30 17:46:03 +00002891 if (current_frame == NULL)
2892 return NULL;
Guido van Rossumb209a111997-04-29 18:18:01 +00002893 PyFrame_FastToLocals(current_frame);
Guido van Rossum5b722181993-03-30 17:46:03 +00002894 return current_frame->f_locals;
2895}
2896
Guido van Rossumb209a111997-04-29 18:18:01 +00002897PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002898PyEval_GetGlobals(void)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002899{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002900 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002901 if (current_frame == NULL)
2902 return NULL;
2903 else
2904 return current_frame->f_globals;
2905}
2906
Guido van Rossumb209a111997-04-29 18:18:01 +00002907PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908PyEval_GetFrame(void)
Guido van Rossume59214e1994-08-30 08:01:59 +00002909{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002910 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossumb209a111997-04-29 18:18:01 +00002911 return (PyObject *)current_frame;
Guido van Rossume59214e1994-08-30 08:01:59 +00002912}
2913
Guido van Rossum6135a871995-01-09 17:53:26 +00002914int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002915PyEval_GetRestricted(void)
Guido van Rossum6135a871995-01-09 17:53:26 +00002916{
Guido van Rossuma027efa1997-05-05 20:56:21 +00002917 PyFrameObject *current_frame = PyThreadState_Get()->frame;
Guido van Rossum6135a871995-01-09 17:53:26 +00002918 return current_frame == NULL ? 0 : current_frame->f_restricted;
2919}
2920
Guido van Rossumbe270261997-05-22 22:26:18 +00002921int
Jeremy Hylton061d1062001-03-22 02:32:48 +00002922PyEval_GetNestedScopes(void)
2923{
2924 PyFrameObject *current_frame = PyThreadState_Get()->frame;
2925 return current_frame == NULL ? 0 :
2926 current_frame->f_code->co_flags & CO_NESTED;
2927}
2928
2929int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002930Py_FlushLine(void)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931{
Guido van Rossumb209a111997-04-29 18:18:01 +00002932 PyObject *f = PySys_GetObject("stdout");
Guido van Rossumbe270261997-05-22 22:26:18 +00002933 if (f == NULL)
2934 return 0;
2935 if (!PyFile_SoftSpace(f, 0))
2936 return 0;
2937 return PyFile_WriteString("\n", f);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002938}
2939
Guido van Rossum3f5da241990-12-20 15:06:42 +00002940
Guido van Rossum681d79a1995-07-18 14:51:37 +00002941/* External interface to call any callable object.
2942 The arg must be a tuple or NULL. */
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002943
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002944#undef PyEval_CallObject
2945/* for backward compatibility: export this interface */
2946
Guido van Rossumb209a111997-04-29 18:18:01 +00002947PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002948PyEval_CallObject(PyObject *func, PyObject *arg)
Guido van Rossum83bf35c1991-07-27 21:32:34 +00002949{
Guido van Rossumb209a111997-04-29 18:18:01 +00002950 return PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002951}
Guido van Rossumd7ed6831997-08-30 15:02:50 +00002952#define PyEval_CallObject(func,arg) \
2953 PyEval_CallObjectWithKeywords(func, arg, (PyObject *)NULL)
Guido van Rossume59214e1994-08-30 08:01:59 +00002954
Guido van Rossumb209a111997-04-29 18:18:01 +00002955PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002956PyEval_CallObjectWithKeywords(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum681d79a1995-07-18 14:51:37 +00002957{
Jeremy Hylton52820442001-01-03 23:52:36 +00002958 PyObject *result;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002959
2960 if (arg == NULL)
Guido van Rossumb209a111997-04-29 18:18:01 +00002961 arg = PyTuple_New(0);
2962 else if (!PyTuple_Check(arg)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002963 PyErr_SetString(PyExc_TypeError,
2964 "argument list must be a tuple");
Guido van Rossum681d79a1995-07-18 14:51:37 +00002965 return NULL;
2966 }
2967 else
Guido van Rossumb209a111997-04-29 18:18:01 +00002968 Py_INCREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00002969
Guido van Rossumb209a111997-04-29 18:18:01 +00002970 if (kw != NULL && !PyDict_Check(kw)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00002971 PyErr_SetString(PyExc_TypeError,
2972 "keyword list must be a dictionary");
Guido van Rossum25826c92000-04-21 21:17:39 +00002973 Py_DECREF(arg);
Guido van Rossume3e61c11995-08-04 04:14:47 +00002974 return NULL;
2975 }
2976
Jeremy Hylton52820442001-01-03 23:52:36 +00002977 result = call_object(func, arg, kw);
Guido van Rossumb209a111997-04-29 18:18:01 +00002978 Py_DECREF(arg);
Jeremy Hylton52820442001-01-03 23:52:36 +00002979 return result;
2980}
2981
2982/* How often is each kind of object called? The answer depends on the
2983 program. An instrumented call_object() was used to run the Python
2984 regression test suite. The results were:
2985 4200000 PyCFunctions
2986 390000 fast_function() calls
2987 94000 other functions
2988 480000 all functions (sum of prev two)
2989 150000 methods
2990 100000 classes
2991
2992 Tests on other bodies of code show that PyCFunctions are still
2993 most common, but not by such a large margin.
2994*/
2995
Jeremy Hylton512a2372001-04-11 13:52:29 +00002996static char *
2997get_func_name(PyObject *func)
2998{
2999 if (PyMethod_Check(func))
3000 return get_func_name(PyMethod_GET_FUNCTION(func));
3001 else if (PyFunction_Check(func))
3002 return PyString_AsString(((PyFunctionObject*)func)->func_name);
3003 else if (PyCFunction_Check(func))
3004 return ((PyCFunctionObject*)func)->m_ml->ml_name;
3005 else if (PyClass_Check(func))
3006 return PyString_AsString(((PyClassObject*)func)->cl_name);
3007 else if (PyInstance_Check(func)) {
3008 return PyString_AsString(
3009 ((PyInstanceObject*)func)->in_class->cl_name);
3010 } else {
3011 return func->ob_type->tp_name;
3012 }
3013}
3014
3015static char *
3016get_func_desc(PyObject *func)
3017{
3018 if (PyMethod_Check(func))
3019 return "()";
3020 else if (PyFunction_Check(func))
3021 return "()";
3022 else if (PyCFunction_Check(func))
3023 return "()";
3024 else if (PyClass_Check(func))
3025 return " constructor";
3026 else if (PyInstance_Check(func)) {
3027 return " instance";
3028 } else {
3029 return " object";
3030 }
3031}
3032
Jeremy Hylton52820442001-01-03 23:52:36 +00003033static PyObject *
3034call_object(PyObject *func, PyObject *arg, PyObject *kw)
3035{
3036 ternaryfunc call;
3037 PyObject *result;
3038
3039 if (PyMethod_Check(func))
3040 result = call_method(func, arg, kw);
3041 else if (PyFunction_Check(func))
3042 result = call_eval_code2(func, arg, kw);
3043 else if (PyCFunction_Check(func))
3044 result = call_cfunction(func, arg, kw);
3045 else if (PyClass_Check(func))
3046 result = PyInstance_New(func, arg, kw);
3047 else if (PyInstance_Check(func))
3048 result = call_instance(func, arg, kw);
3049 else if ((call = func->ob_type->tp_call) != NULL)
3050 result = (*call)(func, arg, kw);
3051 else {
Tim Peters239508c2001-06-16 00:09:28 +00003052 PyErr_Format(PyExc_TypeError,
3053 "object of type '%.100s' is not callable",
3054 func->ob_type->tp_name);
Jeremy Hylton52820442001-01-03 23:52:36 +00003055 return NULL;
3056 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003057 if (result == NULL && !PyErr_Occurred())
3058 PyErr_SetString(PyExc_SystemError,
Guido van Rossum681d79a1995-07-18 14:51:37 +00003059 "NULL result without error in call_object");
Guido van Rossumac7be682001-01-17 15:42:30 +00003060
Guido van Rossume59214e1994-08-30 08:01:59 +00003061 return result;
Guido van Rossum83bf35c1991-07-27 21:32:34 +00003062}
3063
Guido van Rossumb209a111997-04-29 18:18:01 +00003064static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003065call_cfunction(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066{
Jeremy Hylton52820442001-01-03 23:52:36 +00003067 PyCFunctionObject* f = (PyCFunctionObject*)func;
3068 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3069 PyObject *self = PyCFunction_GET_SELF(func);
3070 int flags = PyCFunction_GET_FLAGS(func);
3071
Jeremy Hylton52820442001-01-03 23:52:36 +00003072 if (flags & METH_KEYWORDS) {
3073 return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003075 if (kw != NULL && PyDict_Size(kw) != 0) {
3076 PyErr_Format(PyExc_TypeError,
3077 "%.200s() takes no keyword arguments",
3078 f->m_ml->ml_name);
3079 return NULL;
3080 }
Fred Drake1a7aab72001-01-04 22:33:02 +00003081 if (flags & METH_VARARGS) {
3082 return (*meth)(self, arg);
3083 }
3084 if (!(flags & METH_VARARGS)) {
3085 /* the really old style */
3086 int size = PyTuple_GET_SIZE(arg);
3087 if (size == 1)
3088 arg = PyTuple_GET_ITEM(arg, 0);
3089 else if (size == 0)
3090 arg = NULL;
3091 return (*meth)(self, arg);
3092 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003093 /* should never get here ??? */
3094 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 return NULL;
3096}
3097
Guido van Rossumb209a111997-04-29 18:18:01 +00003098static PyObject *
Jeremy Hylton52820442001-01-03 23:52:36 +00003099call_instance(PyObject *func, PyObject *arg, PyObject *kw)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100{
Jeremy Hylton52820442001-01-03 23:52:36 +00003101 PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
3102 if (call == NULL) {
3103 PyInstanceObject *inst = (PyInstanceObject*) func;
3104 PyErr_Clear();
3105 PyErr_Format(PyExc_AttributeError,
3106 "%.200s instance has no __call__ method",
3107 PyString_AsString(inst->in_class->cl_name));
Guido van Rossum681d79a1995-07-18 14:51:37 +00003108 return NULL;
3109 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003110 res = call_object(call, arg, kw);
3111 Py_DECREF(call);
3112 return res;
3113}
3114
3115static PyObject *
3116call_method(PyObject *func, PyObject *arg, PyObject *kw)
3117{
3118 PyObject *self = PyMethod_GET_SELF(func);
3119 PyObject *class = PyMethod_GET_CLASS(func);
3120 PyObject *result;
3121
3122 func = PyMethod_GET_FUNCTION(func);
3123 if (self == NULL) {
3124 /* Unbound methods must be called with an instance of
3125 the class (or a derived class) as first argument */
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003126 int ok;
Jeremy Hylton52820442001-01-03 23:52:36 +00003127 if (PyTuple_Size(arg) >= 1)
3128 self = PyTuple_GET_ITEM(arg, 0);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003129 if (self == NULL)
3130 ok = 0;
3131 else {
3132 ok = PyObject_IsInstance(self, class);
3133 if (ok < 0)
3134 return NULL;
3135 }
3136 if (!ok) {
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003137 PyErr_Format(PyExc_TypeError,
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003138 "unbound method %s%s must be "
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003139 "called with instance as first argument",
Jeremy Hyltonc76770c2001-04-13 16:51:46 +00003140 get_func_name(func), get_func_desc(func));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 return NULL;
3142 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003143 Py_INCREF(arg);
Guido van Rossum66b0e9c2001-03-21 19:17:22 +00003144 }
3145 else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003146 int argcount = PyTuple_Size(arg);
3147 PyObject *newarg = PyTuple_New(argcount + 1);
3148 int i;
3149 if (newarg == NULL)
3150 return NULL;
3151 Py_INCREF(self);
3152 PyTuple_SET_ITEM(newarg, 0, self);
3153 for (i = 0; i < argcount; i++) {
3154 PyObject *v = PyTuple_GET_ITEM(arg, i);
3155 Py_XINCREF(v);
3156 PyTuple_SET_ITEM(newarg, i+1, v);
3157 }
3158 arg = newarg;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003160 result = call_object(func, arg, kw);
3161 Py_DECREF(arg);
3162 return result;
3163}
3164
3165static PyObject *
3166call_eval_code2(PyObject *func, PyObject *arg, PyObject *kw)
3167{
3168 PyObject *result;
3169 PyObject *argdefs;
3170 PyObject **d, **k;
3171 int nk, nd;
3172
3173 argdefs = PyFunction_GET_DEFAULTS(func);
Guido van Rossumb209a111997-04-29 18:18:01 +00003174 if (argdefs != NULL && PyTuple_Check(argdefs)) {
3175 d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0);
3176 nd = PyTuple_Size(argdefs);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003177 }
3178 else {
3179 d = NULL;
3180 nd = 0;
3181 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003182
Guido van Rossum681d79a1995-07-18 14:51:37 +00003183 if (kw != NULL) {
3184 int pos, i;
Guido van Rossumb209a111997-04-29 18:18:01 +00003185 nk = PyDict_Size(kw);
3186 k = PyMem_NEW(PyObject *, 2*nk);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003187 if (k == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003188 PyErr_NoMemory();
3189 Py_DECREF(arg);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003190 return NULL;
Guido van Rossume59214e1994-08-30 08:01:59 +00003191 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003192 pos = i = 0;
Guido van Rossumb209a111997-04-29 18:18:01 +00003193 while (PyDict_Next(kw, &pos, &k[i], &k[i+1]))
Guido van Rossum681d79a1995-07-18 14:51:37 +00003194 i += 2;
3195 nk = i/2;
3196 /* XXX This is broken if the caller deletes dict items! */
3197 }
3198 else {
3199 k = NULL;
3200 nk = 0;
Guido van Rossume59214e1994-08-30 08:01:59 +00003201 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003202
Guido van Rossum681d79a1995-07-18 14:51:37 +00003203 result = eval_code2(
Jeremy Hylton52820442001-01-03 23:52:36 +00003204 (PyCodeObject *)PyFunction_GET_CODE(func),
3205 PyFunction_GET_GLOBALS(func), (PyObject *)NULL,
Guido van Rossumb209a111997-04-29 18:18:01 +00003206 &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg),
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003207 k, nk, d, nd,
3208 PyFunction_GET_CLOSURE(func));
Guido van Rossumac7be682001-01-17 15:42:30 +00003209
Guido van Rossumb18618d2000-05-03 23:44:39 +00003210 if (k != NULL)
3211 PyMem_DEL(k);
Guido van Rossumac7be682001-01-17 15:42:30 +00003212
Guido van Rossum681d79a1995-07-18 14:51:37 +00003213 return result;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214}
3215
Jeremy Hylton52820442001-01-03 23:52:36 +00003216#define EXT_POP(STACK_POINTER) (*--(STACK_POINTER))
3217
3218/* The two fast_xxx() functions optimize calls for which no argument
3219 tuple is necessary; the objects are passed directly from the stack.
3220 fast_cfunction() is called for METH_OLDARGS functions.
3221 fast_function() is for functions with no special argument handling.
3222*/
3223
3224static PyObject *
3225fast_cfunction(PyObject *func, PyObject ***pp_stack, int na)
3226{
3227 PyCFunction meth = PyCFunction_GET_FUNCTION(func);
3228 PyObject *self = PyCFunction_GET_SELF(func);
3229
3230 if (na == 0)
3231 return (*meth)(self, NULL);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003232 else if (na == 1) {
3233 PyObject *arg = EXT_POP(*pp_stack);
Guido van Rossumac7be682001-01-17 15:42:30 +00003234 PyObject *result = (*meth)(self, arg);
Charles G. Waldmaneec72a72001-01-10 22:11:59 +00003235 Py_DECREF(arg);
3236 return result;
3237 } else {
Jeremy Hylton52820442001-01-03 23:52:36 +00003238 PyObject *args = load_args(pp_stack, na);
3239 PyObject *result = (*meth)(self, args);
3240 Py_DECREF(args);
3241 return result;
3242 }
3243}
3244
3245static PyObject *
Guido van Rossumac7be682001-01-17 15:42:30 +00003246fast_function(PyObject *func, PyObject ***pp_stack, int n, int na, int nk)
Jeremy Hylton52820442001-01-03 23:52:36 +00003247{
3248 PyObject *co = PyFunction_GET_CODE(func);
3249 PyObject *globals = PyFunction_GET_GLOBALS(func);
3250 PyObject *argdefs = PyFunction_GET_DEFAULTS(func);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003251 PyObject *closure = PyFunction_GET_CLOSURE(func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003252 PyObject **d = NULL;
3253 int nd = 0;
3254
3255 if (argdefs != NULL) {
3256 d = &PyTuple_GET_ITEM(argdefs, 0);
3257 nd = ((PyTupleObject *)argdefs)->ob_size;
3258 }
Guido van Rossumac7be682001-01-17 15:42:30 +00003259 return eval_code2((PyCodeObject *)co, globals,
Jeremy Hylton52820442001-01-03 23:52:36 +00003260 (PyObject *)NULL, (*pp_stack)-n, na,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003261 (*pp_stack)-2*nk, nk, d, nd,
3262 closure);
Jeremy Hylton52820442001-01-03 23:52:36 +00003263}
3264
3265static PyObject *
Ka-Ping Yee20579702001-01-15 22:14:16 +00003266update_keyword_args(PyObject *orig_kwdict, int nk, PyObject ***pp_stack,
3267 PyObject *func)
Jeremy Hylton52820442001-01-03 23:52:36 +00003268{
3269 PyObject *kwdict = NULL;
3270 if (orig_kwdict == NULL)
3271 kwdict = PyDict_New();
3272 else {
3273 kwdict = PyDict_Copy(orig_kwdict);
3274 Py_DECREF(orig_kwdict);
3275 }
3276 if (kwdict == NULL)
3277 return NULL;
3278 while (--nk >= 0) {
3279 int err;
3280 PyObject *value = EXT_POP(*pp_stack);
3281 PyObject *key = EXT_POP(*pp_stack);
3282 if (PyDict_GetItem(kwdict, key) != NULL) {
Guido van Rossumac7be682001-01-17 15:42:30 +00003283 PyErr_Format(PyExc_TypeError,
Ka-Ping Yee20579702001-01-15 22:14:16 +00003284 "%.200s%s got multiple values "
Jeremy Hylton512a2372001-04-11 13:52:29 +00003285 "for keyword argument '%.200s'",
3286 get_func_name(func),
3287 get_func_desc(func),
3288 PyString_AsString(key));
Jeremy Hylton52820442001-01-03 23:52:36 +00003289 Py_DECREF(key);
3290 Py_DECREF(value);
3291 Py_DECREF(kwdict);
3292 return NULL;
3293 }
3294 err = PyDict_SetItem(kwdict, key, value);
3295 Py_DECREF(key);
3296 Py_DECREF(value);
3297 if (err) {
3298 Py_DECREF(kwdict);
3299 return NULL;
3300 }
3301 }
3302 return kwdict;
3303}
3304
3305static PyObject *
3306update_star_args(int nstack, int nstar, PyObject *stararg,
3307 PyObject ***pp_stack)
3308{
3309 PyObject *callargs, *w;
3310
3311 callargs = PyTuple_New(nstack + nstar);
3312 if (callargs == NULL) {
3313 return NULL;
3314 }
3315 if (nstar) {
3316 int i;
3317 for (i = 0; i < nstar; i++) {
3318 PyObject *a = PyTuple_GET_ITEM(stararg, i);
3319 Py_INCREF(a);
3320 PyTuple_SET_ITEM(callargs, nstack + i, a);
3321 }
3322 }
3323 while (--nstack >= 0) {
3324 w = EXT_POP(*pp_stack);
3325 PyTuple_SET_ITEM(callargs, nstack, w);
3326 }
3327 return callargs;
3328}
3329
3330static PyObject *
3331load_args(PyObject ***pp_stack, int na)
3332{
3333 PyObject *args = PyTuple_New(na);
3334 PyObject *w;
3335
3336 if (args == NULL)
3337 return NULL;
3338 while (--na >= 0) {
3339 w = EXT_POP(*pp_stack);
3340 PyTuple_SET_ITEM(args, na, w);
3341 }
3342 return args;
3343}
3344
3345static PyObject *
3346do_call(PyObject *func, PyObject ***pp_stack, int na, int nk)
3347{
3348 PyObject *callargs = NULL;
3349 PyObject *kwdict = NULL;
3350 PyObject *result = NULL;
3351
3352 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003353 kwdict = update_keyword_args(NULL, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003354 if (kwdict == NULL)
3355 goto call_fail;
3356 }
3357 callargs = load_args(pp_stack, na);
3358 if (callargs == NULL)
3359 goto call_fail;
3360 result = call_object(func, callargs, kwdict);
3361 call_fail:
3362 Py_XDECREF(callargs);
3363 Py_XDECREF(kwdict);
3364 return result;
3365}
3366
3367static PyObject *
3368ext_do_call(PyObject *func, PyObject ***pp_stack, int flags, int na, int nk)
3369{
3370 int nstar = 0;
3371 PyObject *callargs = NULL;
3372 PyObject *stararg = NULL;
3373 PyObject *kwdict = NULL;
3374 PyObject *result = NULL;
3375
3376 if (flags & CALL_FLAG_KW) {
3377 kwdict = EXT_POP(*pp_stack);
3378 if (!(kwdict && PyDict_Check(kwdict))) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003379 PyErr_Format(PyExc_TypeError,
Jeremy Hylton512a2372001-04-11 13:52:29 +00003380 "%s%s argument after ** "
3381 "must be a dictionary",
3382 get_func_name(func),
3383 get_func_desc(func));
Jeremy Hylton52820442001-01-03 23:52:36 +00003384 goto ext_call_fail;
3385 }
3386 }
3387 if (flags & CALL_FLAG_VAR) {
3388 stararg = EXT_POP(*pp_stack);
3389 if (!PyTuple_Check(stararg)) {
3390 PyObject *t = NULL;
3391 t = PySequence_Tuple(stararg);
3392 if (t == NULL) {
Jeremy Hylton512a2372001-04-11 13:52:29 +00003393 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3394 PyErr_Format(PyExc_TypeError,
3395 "%s%s argument after * "
3396 "must be a sequence",
3397 get_func_name(func),
3398 get_func_desc(func));
3399 }
Jeremy Hylton52820442001-01-03 23:52:36 +00003400 goto ext_call_fail;
3401 }
3402 Py_DECREF(stararg);
3403 stararg = t;
3404 }
3405 nstar = PyTuple_GET_SIZE(stararg);
3406 }
3407 if (nk > 0) {
Ka-Ping Yee20579702001-01-15 22:14:16 +00003408 kwdict = update_keyword_args(kwdict, nk, pp_stack, func);
Jeremy Hylton52820442001-01-03 23:52:36 +00003409 if (kwdict == NULL)
3410 goto ext_call_fail;
3411 }
3412 callargs = update_star_args(na, nstar, stararg, pp_stack);
3413 if (callargs == NULL)
3414 goto ext_call_fail;
3415 result = call_object(func, callargs, kwdict);
3416 ext_call_fail:
3417 Py_XDECREF(callargs);
3418 Py_XDECREF(kwdict);
3419 Py_XDECREF(stararg);
3420 return result;
3421}
3422
Guido van Rossum3b9c6671996-07-30 18:40:29 +00003423#define SLICE_ERROR_MSG \
3424 "standard sequence type does not support step size other than one"
3425
Guido van Rossumb209a111997-04-29 18:18:01 +00003426static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003427loop_subscript(PyObject *v, PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428{
Guido van Rossumb209a111997-04-29 18:18:01 +00003429 PySequenceMethods *sq = v->ob_type->tp_as_sequence;
Guido van Rossume59214e1994-08-30 08:01:59 +00003430 int i;
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003431 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003432 PyErr_SetString(PyExc_TypeError, "loop over non-sequence");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433 return NULL;
3434 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003435 i = PyInt_AsLong(w);
Guido van Rossume59214e1994-08-30 08:01:59 +00003436 v = (*sq->sq_item)(v, i);
3437 if (v)
3438 return v;
Barry Warsaw4249f541997-08-22 21:26:19 +00003439 if (PyErr_ExceptionMatches(PyExc_IndexError))
Guido van Rossumb209a111997-04-29 18:18:01 +00003440 PyErr_Clear();
Guido van Rossume59214e1994-08-30 08:01:59 +00003441 return NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442}
3443
Guido van Rossum20c6add2000-05-08 14:06:50 +00003444/* Extract a slice index from a PyInt or PyLong, the index is bound to
3445 the range [-INT_MAX+1, INTMAX]. Returns 0 and an exception if there is
3446 and error. Returns 1 on success.*/
3447
3448int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003449_PyEval_SliceIndex(PyObject *v, int *pi)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450{
3451 if (v != NULL) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003452 long x;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003453 if (PyInt_Check(v)) {
3454 x = PyInt_AsLong(v);
3455 } else if (PyLong_Check(v)) {
3456 x = PyLong_AsLong(v);
3457 if (x==-1 && PyErr_Occurred()) {
3458 PyObject *long_zero;
Guido van Rossumac7be682001-01-17 15:42:30 +00003459 int cmp;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003460
Guido van Rossumac7be682001-01-17 15:42:30 +00003461 if (!PyErr_ExceptionMatches(
3462 PyExc_OverflowError)) {
3463 /* It's not an overflow error, so just
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003464 signal an error */
Guido van Rossum20c6add2000-05-08 14:06:50 +00003465 return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003466 }
3467
Guido van Rossumac7be682001-01-17 15:42:30 +00003468 /* Clear the OverflowError */
3469 PyErr_Clear();
3470
3471 /* It's an overflow error, so we need to
3472 check the sign of the long integer,
3473 set the value to INT_MAX or 0, and clear
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003474 the error. */
3475
3476 /* Create a long integer with a value of 0 */
Guido van Rossumac7be682001-01-17 15:42:30 +00003477 long_zero = PyLong_FromLong(0L);
Guido van Rossum20c6add2000-05-08 14:06:50 +00003478 if (long_zero == NULL) return 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003479
3480 /* Check sign */
Guido van Rossumac7be682001-01-17 15:42:30 +00003481 cmp = PyObject_RichCompareBool(v, long_zero,
3482 Py_GT);
3483 Py_DECREF(long_zero);
3484 if (cmp < 0)
3485 return 0;
3486 else if (cmp > 0)
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003487 x = INT_MAX;
3488 else
3489 x = 0;
Andrew M. Kuchling2194b162000-02-23 22:18:48 +00003490 }
3491 } else {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003492 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003493 "slice indices must be integers");
Guido van Rossum20c6add2000-05-08 14:06:50 +00003494 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003495 }
Guido van Rossuma027efa1997-05-05 20:56:21 +00003496 /* Truncate -- very long indices are truncated anyway */
3497 if (x > INT_MAX)
3498 x = INT_MAX;
3499 else if (x < -INT_MAX)
3500 x = 0;
3501 *pi = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502 }
Guido van Rossum20c6add2000-05-08 14:06:50 +00003503 return 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504}
3505
Guido van Rossumb209a111997-04-29 18:18:01 +00003506static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003507apply_slice(PyObject *u, PyObject *v, PyObject *w) /* return u[v:w] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003509 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003510 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511 return NULL;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003512 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum04691fc1992-08-12 15:35:34 +00003513 return NULL;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003514 return PySequence_GetSlice(u, ilow, ihigh);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515}
Guido van Rossum3f5da241990-12-20 15:06:42 +00003516
3517static int
Guido van Rossumac7be682001-01-17 15:42:30 +00003518assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
3519 /* u[v:w] = x */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520{
Guido van Rossuma027efa1997-05-05 20:56:21 +00003521 int ilow = 0, ihigh = INT_MAX;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003522 if (!_PyEval_SliceIndex(v, &ilow))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003523 return -1;
Guido van Rossum20c6add2000-05-08 14:06:50 +00003524 if (!_PyEval_SliceIndex(w, &ihigh))
Guido van Rossum3f5da241990-12-20 15:06:42 +00003525 return -1;
Guido van Rossuma027efa1997-05-05 20:56:21 +00003526 if (x == NULL)
3527 return PySequence_DelSlice(u, ilow, ihigh);
3528 else
3529 return PySequence_SetSlice(u, ilow, ihigh, x);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530}
3531
Guido van Rossumb209a111997-04-29 18:18:01 +00003532static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003533cmp_outcome(int op, register PyObject *v, register PyObject *w)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534{
Guido van Rossumac7be682001-01-17 15:42:30 +00003535 int res = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003536 switch (op) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00003537 case IS:
3538 case IS_NOT:
3539 res = (v == w);
Guido van Rossum04691fc1992-08-12 15:35:34 +00003540 if (op == (int) IS_NOT)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003541 res = !res;
3542 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003543 case IN:
3544 case NOT_IN:
Guido van Rossum7e33c6e1998-05-22 00:52:29 +00003545 res = PySequence_Contains(w, v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003546 if (res < 0)
3547 return NULL;
Guido van Rossum04691fc1992-08-12 15:35:34 +00003548 if (op == (int) NOT_IN)
Guido van Rossum3f5da241990-12-20 15:06:42 +00003549 res = !res;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550 break;
3551 case EXC_MATCH:
Barry Warsaw4249f541997-08-22 21:26:19 +00003552 res = PyErr_GivenExceptionMatches(v, w);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003553 break;
3554 default:
Guido van Rossumac7be682001-01-17 15:42:30 +00003555 return PyObject_RichCompare(v, w, op);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003557 v = res ? Py_True : Py_False;
3558 Py_INCREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559 return v;
3560}
3561
Thomas Wouters52152252000-08-17 22:55:00 +00003562static PyObject *
3563import_from(PyObject *v, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003564{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003565 PyObject *x;
3566
3567 x = PyObject_GetAttr(v, name);
3568 if (x == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Thomas Wouters52152252000-08-17 22:55:00 +00003569 PyErr_Format(PyExc_ImportError,
3570 "cannot import name %.230s",
3571 PyString_AsString(name));
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003572 }
Thomas Wouters52152252000-08-17 22:55:00 +00003573 return x;
3574}
Guido van Rossumac7be682001-01-17 15:42:30 +00003575
Thomas Wouters52152252000-08-17 22:55:00 +00003576static int
3577import_all_from(PyObject *locals, PyObject *v)
3578{
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003579 PyObject *all = PyObject_GetAttrString(v, "__all__");
3580 PyObject *dict, *name, *value;
3581 int skip_leading_underscores = 0;
3582 int pos, err;
Thomas Wouters52152252000-08-17 22:55:00 +00003583
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003584 if (all == NULL) {
3585 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3586 return -1; /* Unexpected error */
3587 PyErr_Clear();
3588 dict = PyObject_GetAttrString(v, "__dict__");
3589 if (dict == NULL) {
3590 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
3591 return -1;
3592 PyErr_SetString(PyExc_ImportError,
3593 "from-import-* object has no __dict__ and no __all__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003594 return -1;
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003595 }
3596 all = PyMapping_Keys(dict);
3597 Py_DECREF(dict);
3598 if (all == NULL)
3599 return -1;
3600 skip_leading_underscores = 1;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003601 }
Guido van Rossum18d4d8f2001-01-12 16:24:03 +00003602
3603 for (pos = 0, err = 0; ; pos++) {
3604 name = PySequence_GetItem(all, pos);
3605 if (name == NULL) {
3606 if (!PyErr_ExceptionMatches(PyExc_IndexError))
3607 err = -1;
3608 else
3609 PyErr_Clear();
3610 break;
3611 }
3612 if (skip_leading_underscores &&
3613 PyString_Check(name) &&
3614 PyString_AS_STRING(name)[0] == '_')
3615 {
3616 Py_DECREF(name);
3617 continue;
3618 }
3619 value = PyObject_GetAttr(v, name);
3620 if (value == NULL)
3621 err = -1;
3622 else
3623 err = PyDict_SetItem(locals, name, value);
3624 Py_DECREF(name);
3625 Py_XDECREF(value);
3626 if (err != 0)
3627 break;
3628 }
3629 Py_DECREF(all);
3630 return err;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003631}
3632
Guido van Rossumb209a111997-04-29 18:18:01 +00003633static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003634build_class(PyObject *methods, PyObject *bases, PyObject *name)
Guido van Rossume9736fc1990-11-18 17:33:06 +00003635{
Guido van Rossumcd649651997-08-22 16:56:16 +00003636 int i, n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003637 if (!PyTuple_Check(bases)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003638 PyErr_SetString(PyExc_SystemError,
3639 "build_class with non-tuple bases");
Guido van Rossum25831651993-05-19 14:50:45 +00003640 return NULL;
Guido van Rossume9736fc1990-11-18 17:33:06 +00003641 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003642 if (!PyDict_Check(methods)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003643 PyErr_SetString(PyExc_SystemError,
3644 "build_class with non-dictionary");
Guido van Rossume9736fc1990-11-18 17:33:06 +00003645 return NULL;
3646 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003647 if (!PyString_Check(name)) {
Guido van Rossuma027efa1997-05-05 20:56:21 +00003648 PyErr_SetString(PyExc_SystemError,
Guido van Rossum7a5b7962000-03-31 13:52:29 +00003649 "build_class with non-string name");
Guido van Rossum25831651993-05-19 14:50:45 +00003650 return NULL;
3651 }
Guido van Rossumcd649651997-08-22 16:56:16 +00003652 n = PyTuple_Size(bases);
3653 for (i = 0; i < n; i++) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003654 PyObject *base = PyTuple_GET_ITEM(bases, i);
3655 if (!PyClass_Check(base)) {
Guido van Rossum150b2df1996-12-05 23:17:11 +00003656 /* Call the base's *type*, if it is callable.
3657 This code is a hook for Donald Beaudry's
3658 and Jim Fulton's type extensions. In
Thomas Wouters7e474022000-07-16 12:04:32 +00003659 unextended Python it will never be triggered
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003660 since its types are not callable.
3661 Ditto: call the bases's *class*, if it has
3662 one. This makes the same thing possible
3663 without writing C code. A true meta-object
3664 protocol! */
3665 PyObject *basetype = (PyObject *)base->ob_type;
3666 PyObject *callable = NULL;
3667 if (PyCallable_Check(basetype))
3668 callable = basetype;
3669 else
3670 callable = PyObject_GetAttrString(
3671 base, "__class__");
3672 if (callable) {
3673 PyObject *args;
3674 PyObject *newclass = NULL;
3675 args = Py_BuildValue(
3676 "(OOO)", name, bases, methods);
3677 if (args != NULL) {
3678 newclass = PyEval_CallObject(
3679 callable, args);
3680 Py_DECREF(args);
3681 }
Guido van Rossum730806d1998-04-10 22:27:42 +00003682 if (callable != basetype) {
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003683 Py_DECREF(callable);
Guido van Rossum730806d1998-04-10 22:27:42 +00003684 }
Guido van Rossum55b9ab51997-07-31 03:54:02 +00003685 return newclass;
Guido van Rossum150b2df1996-12-05 23:17:11 +00003686 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003687 PyErr_SetString(PyExc_TypeError,
Guido van Rossum25831651993-05-19 14:50:45 +00003688 "base is not a class object");
3689 return NULL;
3690 }
3691 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003692 return PyClass_New(bases, methods, name);
Guido van Rossum25831651993-05-19 14:50:45 +00003693}
3694
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003695static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003696exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals,
3697 PyObject *locals)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003698{
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003699 int n;
Guido van Rossumb209a111997-04-29 18:18:01 +00003700 PyObject *v;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003701 int plain = 0;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003702
Guido van Rossumb209a111997-04-29 18:18:01 +00003703 if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None &&
3704 ((n = PyTuple_Size(prog)) == 2 || n == 3)) {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003705 /* Backward compatibility hack */
Guido van Rossumb209a111997-04-29 18:18:01 +00003706 globals = PyTuple_GetItem(prog, 1);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003707 if (n == 3)
Guido van Rossumb209a111997-04-29 18:18:01 +00003708 locals = PyTuple_GetItem(prog, 2);
3709 prog = PyTuple_GetItem(prog, 0);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003710 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003711 if (globals == Py_None) {
3712 globals = PyEval_GetGlobals();
3713 if (locals == Py_None) {
3714 locals = PyEval_GetLocals();
Guido van Rossum681d79a1995-07-18 14:51:37 +00003715 plain = 1;
3716 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003717 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003718 else if (locals == Py_None)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003719 locals = globals;
Guido van Rossumb209a111997-04-29 18:18:01 +00003720 if (!PyString_Check(prog) &&
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003721 !PyUnicode_Check(prog) &&
Guido van Rossumb209a111997-04-29 18:18:01 +00003722 !PyCode_Check(prog) &&
3723 !PyFile_Check(prog)) {
3724 PyErr_SetString(PyExc_TypeError,
Guido van Rossumac7be682001-01-17 15:42:30 +00003725 "exec: arg 1 must be a string, file, or code object");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003726 return -1;
3727 }
Fred Drake661ea262000-10-24 19:57:45 +00003728 if (!PyDict_Check(globals)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003729 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003730 "exec: arg 2 must be a dictionary or None");
3731 return -1;
3732 }
3733 if (!PyDict_Check(locals)) {
3734 PyErr_SetString(PyExc_TypeError,
3735 "exec: arg 3 must be a dictionary or None");
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003736 return -1;
3737 }
Guido van Rossumb209a111997-04-29 18:18:01 +00003738 if (PyDict_GetItemString(globals, "__builtins__") == NULL)
Guido van Rossuma027efa1997-05-05 20:56:21 +00003739 PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
Guido van Rossumb209a111997-04-29 18:18:01 +00003740 if (PyCode_Check(prog)) {
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003741 v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003742 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003743 else if (PyFile_Check(prog)) {
Guido van Rossumb209a111997-04-29 18:18:01 +00003744 FILE *fp = PyFile_AsFile(prog);
3745 char *name = PyString_AsString(PyFile_Name(prog));
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003746 if (PyEval_GetNestedScopes()) {
3747 PyCompilerFlags cf;
3748 cf.cf_nested_scopes = 1;
3749 v = PyRun_FileFlags(fp, name, Py_file_input, globals,
3750 locals, &cf);
3751 } else {
3752 v = PyRun_File(fp, name, Py_file_input, globals,
3753 locals);
3754 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003755 }
3756 else {
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +00003757 char *str;
3758 if (PyString_AsStringAndSize(prog, &str, NULL))
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003759 return -1;
Jeremy Hyltonbc320242001-03-22 02:47:58 +00003760 if (PyEval_GetNestedScopes()) {
3761 PyCompilerFlags cf;
3762 cf.cf_nested_scopes = 1;
3763 v = PyRun_StringFlags(str, Py_file_input, globals,
3764 locals, &cf);
3765 } else
3766 v = PyRun_String(str, Py_file_input, globals, locals);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003767 }
Guido van Rossuma400d8a2000-01-12 22:45:54 +00003768 if (plain)
3769 PyFrame_LocalsToFast(f, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003770 if (v == NULL)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003771 return -1;
Guido van Rossumb209a111997-04-29 18:18:01 +00003772 Py_DECREF(v);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003773 return 0;
3774}
Guido van Rossum24c13741995-02-14 09:42:43 +00003775
Guido van Rossumac7be682001-01-17 15:42:30 +00003776static void
Paul Prescode68140d2000-08-30 20:25:01 +00003777format_exc_check_arg(PyObject *exc, char *format_str, PyObject *obj)
3778{
3779 char *obj_str;
3780
3781 if (!obj)
3782 return;
3783
3784 obj_str = PyString_AsString(obj);
3785 if (!obj_str)
3786 return;
3787
3788 PyErr_Format(exc, format_str, obj_str);
3789}
Guido van Rossum950361c1997-01-24 13:49:28 +00003790
3791#ifdef DYNAMIC_EXECUTION_PROFILE
3792
3793PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003794getarray(long a[256])
Guido van Rossum950361c1997-01-24 13:49:28 +00003795{
3796 int i;
3797 PyObject *l = PyList_New(256);
3798 if (l == NULL) return NULL;
3799 for (i = 0; i < 256; i++) {
3800 PyObject *x = PyInt_FromLong(a[i]);
3801 if (x == NULL) {
3802 Py_DECREF(l);
3803 return NULL;
3804 }
3805 PyList_SetItem(l, i, x);
3806 }
3807 for (i = 0; i < 256; i++)
3808 a[i] = 0;
3809 return l;
3810}
3811
3812PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003813_Py_GetDXProfile(PyObject *self, PyObject *args)
Guido van Rossum950361c1997-01-24 13:49:28 +00003814{
3815#ifndef DXPAIRS
3816 return getarray(dxp);
3817#else
3818 int i;
3819 PyObject *l = PyList_New(257);
3820 if (l == NULL) return NULL;
3821 for (i = 0; i < 257; i++) {
3822 PyObject *x = getarray(dxpairs[i]);
3823 if (x == NULL) {
3824 Py_DECREF(l);
3825 return NULL;
3826 }
3827 PyList_SetItem(l, i, x);
3828 }
3829 return l;
3830#endif
3831}
3832
3833#endif